x86/Debian linux/gcc
Figure1. array.dat例
/*Filename: main.c *Function: Call define functions by main() *Author: One fish *Date: 2014.11.8 Sat *Last Modifid: 2014.11.9 Sun */ #include <stdio.h> #include <stdlib.h> #include "cfun.h" /*-----------Function Decalre-------------*/ void main_usage(const int argc); void free_pp(int **pp, const int r, const int c); /*@main() *@Use argc and argv arguments of main() *@Return 0 when OK, not 0 when except ocurr */ int main(int argc, char *argv[]) { main_usage(argc); myrc rc; int re; int num; int **pp; num = 0; re = FLASE; pp = NULL; //Get row and column of argv[1] get_file_row_column(argv[1], &rc); //Allocate memory for data pp = allocate_mm(rc.r, rc.c); //Read data of argv[1] into momory allocate just now if (pp) { re = read_data_in(argv[1], pp, rc.r, rc.c); } //Find the number argv[2] if (TRUE == re) { num = atoi(argv[2]); re = find_num_in_array(pp, rc.r, rc.c, num); if (TRUE == re) printf("^_^\n"); else printf("Not ^_^\n"); } //Free memory by pp pointed to if (pp) { free_pp(pp, rc.r, rc.c); } return 0; } /*@main_usage: Give tips for users *@arg: argc is the number of the command-line *@exit(1) when users use the program incorrectly */ void main_usage(const int argc) { if (3 != argc) { printf("Usage: ./execute arrary.txt number\n"); exit(1); } } /*@free_pp: free allocate memory in order *@arg: pp is the address of the memory, r, c is the row and column of the allocate memory */ void free_pp(int **pp, const int r, const int c) { int i; printf("\n----In fre_pp() function----\n"); for ( i = 0; i < r; i++) { printf("Now free pp[%d]: %p\n", i, pp[i]); free(pp[i]); } free(pp); }
/*@Filename: cfun.h *@Function: Decalre functions, varibles, macros *@Author: One fish *@Date: 2014.11.8 Sat *@Last modified: 2014.11.9 Sun */ /*-----------Macro definition------------*/ #define TRUE 1 #define FLASE 0 /*Golbal varibles definiton*/ typedef struct rc { unsigned int r; unsigned int c; }myrc; /*----------Function decalration---------*/ //int find_c_in_array(int arry[][ARRAY_SIZE], int c); /*@Function: Get the rows and columns of the path(file) *@arg: path is the special file, rc is the pointer of the type of struct myrc *@revl: none when sucess, otherwise exit(1) */ void get_file_row_column(const char *path, myrc *rc); /*@Function: allocate memory dynamicly accordding to the row, column of one file *@arg: r is the number of the second class pointer, c is the number of the first class pointer r is the row of one file, c is the column of one file *@rel: Address of the memory allocated when success, NULL when fail */ int **allocate_mm(const int r, const int c); /*@Function: Read data fromm path to pp @arg: path is the location of file, pp is the address of the memory r and c is row and column of memory pointed by pp, respectlly @rel: TURE when read success, oterwise FLASE. When pp is NULL exit(1) */ int read_data_in(const char *path, int **pp, const int r, const int c); /*@find_c_in_array: if num if pp memory, find it @arg: pp is the memory address of the array r, c is the row and column of file, respectlly num is the number will be find @rel: TRUE if find num in pp, FLASE if not find */ int find_c_in_array(int **pp, const int r, const int c, const int num);
/*@Filename: get_file_row_column.c *@Function: Get the special file's rows and columns *@Author: One fish *@Date: 2014.11.4 Thu *@Last modified: 2014.11.9 Sun */ #include <stdio.h> #include <errno.h> #include <stdlib.h> #include "cfun.h" /*Macro definition*/ #define LINE_SIZE 165 /*@Function: Get the rows and columns of the path(file) *@arg: path is the special file, rc is the pointer of the type of struct myrc *@revl: none when sucess, otherwise exit(1) */ void get_file_row_column(const char *path, myrc *rc) { FILE *fp; char buf[LINE_SIZE]; fp = NULL; rc->r = 0; rc->c = 0; if ( !(fp = fopen(path, "r")) ) { perror("fopen()"); exit(1); } //Get columns, fp will point to the end of first line while ( '\n' != fgetc(fp) ) rc->c++; rc->c = (rc->c + 1) / 2; //Get rows while ( fgets(buf, LINE_SIZE - 1, fp) ) rc->r++; //Add the first line rc->r++; printf("\n----In get_file_row_column() function----\n"); printf("The %s file has %d rows, %d columns\n", path, rc->r, rc->c); fclose(fp); }
/*Filename: allocate_mm.c *Function: allocate memory dynamicly accordding to the row, column of one file *Author: One fish *Date: 2014.11.8 Sat *Last Modified:2014.11.9 Sun */ #include <stdio.h> #include <stdlib.h> /*@Function: allocate memory dynamicly accordding to the row, column of one file *@arg: r is the number of the second class pointer, c is the number of the first class pointer r is the row of one file, c is the column of one file *@rel: Address of the memory allocated when success, NULL when fail */ int **allocate_mm(const int r, const int c) { int i, j; int **pp = NULL; void show_memory_adds(int **, const int, const int); pp = (int **)malloc(r * sizeof(int)); if ( !pp ) { printf("Allocat memory for pp failed\n"); return NULL; } for (i = 0; i < r; ++i) { pp[i] = (int *)malloc(c * sizeof(int)); if ( !pp[i] ) { //Free the heap pointed by p[j] for (j = i - 1; j >= 0; --j) { free(pp[j]); } //Free the heap pointed by p free(pp); printf("Allocate pp[%d] failed\n", i); return NULL; } } show_memory_adds(pp, r, c); return pp; } //Show the allocated memory information void show_memory_adds(int ** pp, const int r, const int c) { int i, j; printf("\n----In allocate_mm() function----\n"); printf("----Allocate success, Allocate memory %d rows, they are:\n", r); for ( i = 0; i < r; i++) { printf("pp[%d]: ", i); for ( j = 0; j < c; j++) { printf("pp[%d][%d]%p\t", i, j, &pp[i][j]); } printf("\n"); } }
/*@Filename: read_data_in.c *@Function: Read data from file into memory *@Author: One fish *@Date: 2014.11.8 Sat *@Last modified:2014.11.9 Sun */ #include <stdio.h> #include <stdlib.h> #include "cfun.h" /*@Function: Read data fromm path to pp @arg: path is the location of file, pp is the address of the memory r and c is row and column of memory pointed by pp, repectlly @rel: TURE when read success, oterwise FLASE. When pp is NULL exit(1) */ int read_data_in(const char *path, int **pp, const int r, const int c) { int i, j; char ch; int intg; FILE *fp; ch = 0; intg = 0; fp = NULL; if (!pp) { printf("Pointer is NULL. In %s, line: %d\n", __FILE__, __LINE__); exit(1); } if ( !(fp = fopen(path, "r")) ) { perror("fopen"); return FLASE; } printf("\n----In read_data_in() function----\ndata in memory:\n"); for (i = 0; i < r; i++) { printf("pp[%d] line: ", i); j = 0; while ( (j < c) && (2 == fscanf(fp, "%d%c", &intg, &ch)) ) { pp[i][j] = intg; j++; printf("%d\t", intg); if ( j % c == 0) printf("\n"); } } fclose(fp); if ( i != r) { printf("Read data error\n"); return FLASE; } return TRUE; }
/*Filename: find_num_in_array.c *Function: find the special number in arrar.dat *Author: One filsh *Date: 2014.11.4 Thu *Last Modified:2014.11.9 Sun */ #include <stdio.h> #include "cfun.h" /*@find_c_in_array: if num if pp memory, find it @arg: pp is the memory address of the array r, c is the row and column of file, respectlly num is the number will be find in pp @rel: TRUE if find num in pp, FLASE if not find */ int find_num_in_array(int **pp, const int r, const int c, const int num) { int i, j; for ( i = 0, j = c - 1; i < r, j >= 0; ) { if (num == pp[i][j]) { printf("\n----In find_num_in_array()----\n%d in palce pp[%d][%d]\n", num, i, j); return TRUE; } else if (num < pp[i][j]) { j--; } else if (num > pp[i][j]) { i++; } } printf("i=%d, j=%d\n", i, j); if (i >= r - 1 && j <= 0) { printf("\n----In find_num_in_array()----\n%d not in array\n", num); return FLASE; } }
main: main.o get_file_row_column.o allocate_mm.o read_data_in.o find_num_in_array.o $(CC) main.o get_file_row_column.o allocate_mm.o read_data_in.o find_num_in_array.o $(OFLAGS) main main.o: main.c cfun.h $(CC) $(CFLAGS) main.c get_file_row_column.o: get_file_row_column.c cfun.h $(CC) $(CFLAGS) get_file_row_column.c allocate_mm.o: allocate_mm.c $(CC) $(CFLAGS) allocate_mm.c read_data_in.o: read_data_in.c cfun.h $(CC) $(CFLAGS) read_data_in.c find_num_in_array.o: find_num_in_array.c cfun.h $(CC) $(CFLAGS) find_num_in_array.c .PHONY:clean clean: -rm *.o CC=gcc OFLAGS=-o CFLAGS=-c
使用make命令编译整个程序:
lly@debian:~/Sword_Offer/14Ten$ make gcc -c main.c gcc -c get_file_row_column.c gcc -c allocate_mm.c gcc -c read_data_in.c gcc -c find_num_in_array.c gcc main.o get_file_row_column.o allocate_mm.o read_data_in.o find_num_in_array.o -o main lly@debian:~/Sword_Offer/14Ten$ |
给定命令行参数执行main:
lly@debian:~/Sword_Offer/14Ten$ ./main array.dat 7
----In get_file_row_column() function---- The array.dat file has 4 rows, 4 columns
----In allocate_mm() function---- ----Allocate success, Allocate memory 4 rows, they are: pp[0]: pp[0][0]0x9aed020 pp[0][1]0x9aed024 pp[0][2]0x9aed028 pp[0][3]0x9aed02c pp[1]: pp[1][0]0x9aed038 pp[1][1]0x9aed03c pp[1][2]0x9aed040 pp[1][3]0x9aed044 pp[2]: pp[2][0]0x9aed050 pp[2][1]0x9aed054 pp[2][2]0x9aed058 pp[2][3]0x9aed05c pp[3]: pp[3][0]0x9aed068 pp[3][1]0x9aed06c pp[3][2]0x9aed070 pp[3][3]0x9aed074
----In read_data_in() function---- data in memory: pp[0] line: 1 2 8 9 pp[1] line: 2 4 9 12 pp[2] line: 4 7 10 13 pp[3] line: 6 9 11 15
----In find_num_in_array()---- 7 in palce pp[2][1] ^_^
----In fre_pp() function---- Now free pp[0]: 0x9aed020 Now free pp[1]: 0x9aed038 Now free pp[2]: 0x9aed050 Now free pp[3]: 0x9aed068 lly@debian:~/Sword_Offer/14Ten$ ./main array.dat 5
----In get_file_row_column() function---- The array.dat file has 4 rows, 4 columns
----In allocate_mm() function---- ----Allocate success, Allocate memory 4 rows, they are: pp[0]: pp[0][0]0x9703020 pp[0][1]0x9703024 pp[0][2]0x9703028 pp[0][3]0x970302c pp[1]: pp[1][0]0x9703038 pp[1][1]0x970303c pp[1][2]0x9703040 pp[1][3]0x9703044 pp[2]: pp[2][0]0x9703050 pp[2][1]0x9703054 pp[2][2]0x9703058 pp[2][3]0x970305c pp[3]: pp[3][0]0x9703068 pp[3][1]0x970306c pp[3][2]0x9703070 pp[3][3]0x9703074
----In read_data_in() function---- data in memory: pp[0] line: 1 2 8 9 pp[1] line: 2 4 9 12 pp[2] line: 4 7 10 13 pp[3] line: 6 9 11 15
----In find_num_in_array()---- 5 not in array Not ^_^
----In fre_pp() function---- Now free pp[0]: 0x9703020 Now free pp[1]: 0x9703038 Now free pp[2]: 0x9703050 Now free pp[3]: 0x9703068 lly@debian:~/Sword_Offer/14Ten$ |
[2014.11.9 --23:09]
R《Sword to Offer》 Note Over.