=============================================================================== 2002 年 05 月 08 日(水) (配布:2002 年 05 月 22 日(水)) 2002 年度「応用数理C3」「計算数学1」 岩瀬順一 =============================================================================== == 020508a.c == /****************************************************************************** ファイルから配列にデータを読み込む ファイル名はコマンドラインで指定する。ファイルは一行につきデータ一つであり、 文字列と数値の間はタブ(一つとは限らない)で区切られているとする。 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N]; /* Data 型の配列 */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_read(Data *p, FILE *in); int Data_read2array(Data *p, FILE *in, int size); void Data_printarray(Data *p, int size); void Data_print(Data *p); int main(int argc, char *argv[]) { FILE *in; if (argc != 2) { fprintf(stderr, "引数の数が違います.\n"); return 1; } in = fopen(argv[1], "rt"); if (in == NULL) { fprintf(stderr, "ファイル \"%s\" を開けません.\n", argv[1]); return 1; } arraysize = Data_read2array(a, in, N); /* 配列に読み込んで */ Data_printarray(a, arraysize); /* それを印字 */ return 0; } /* in から配列 p に最大 size 個読み込み、読めた個数を返す */ int Data_read2array(Data *p, FILE *in, int size) { int i; for (i=0; istring = malloc(j+1); /* メモリを要求 */ if (p->string == NULL) { fprintf(stderr, "メモリが足りません.\n"); return NO; } buf[j] = '\0'; strcpy(p->string, buf); /* 文字列をコピー */ while (buf[++j] == '\t') { /* タブをスキップ */ ; } p->number = atoi(buf+j); /* 数値データを読み込む */ return OK; } /* Data の配列 p[0], ..., p[size-1] を印字 */ void Data_printarray(Data *p, int size) { int i; for (i=0; istring, p->number); } == 020508b.c == /****************************************************************************** ファイルから配列にデータを読み込み、検索する ファイル名、キーはコマンドラインで指定する。ファイルは一行につきデータ一つで あり、文字列と数値の間はタブ(一つとは限らない)で区切られているとする。 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N]; /* Data 型の配列 */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_read(Data *p, FILE *in); int Data_read2array(Data *p, FILE *in, int size); int Data_arraysearchstring(Data *p, int arraysize, char *s); int Data_stringcmp(Data *p, char *s); void Data_print(Data *p); int main(int argc, char *argv[]) { int i; FILE *in; if (argc != 3) { fprintf(stderr, "引数の数が違います.\n"); return 1; } in = fopen(argv[1], "rt"); if (in == NULL) { fprintf(stderr, "ファイル \"%s\" を開けません.\n", argv[1]); return 1; } arraysize = Data_read2array(a, in, N); /* 配列に読み込んで */ i = Data_arraysearchstring(a, arraysize, argv[2]); /* argv[2] を探す */ if (i == -1) { printf("見つかりません.\n"); } else { Data_print(a+i); } return 0; } /* in から配列 p に最大 size 個読み込み、読めた個数を返す */ int Data_read2array(Data *p, FILE *in, int size) { /* 前と同じにつき省略 */ } /* FILE *in から Data *p へ Data 型オブジェクトを読み込む。成功 OK / 失敗 NO */ int Data_read(Data *p, FILE *in) { /* 前と同じにつき省略 */ } /* サイズ arraysize の Data 型の配列 p から string が s であるものを探し */ /* 添字(見つからなければ -1)を返す */ int Data_arraysearchstring(Data *p, int arraysize, char *s) { int i; for (i=0; istring, s); } /* Data 型オブジェクト *p を印字 */ void Data_print(Data *p) { printf("%s\t%d\n", p->string, p->number); } == 020508c.c == /****************************************************************************** 配列へのデータの追加・配列からのデータの削除 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N]; /* Data 型の配列 */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_addarray(Data *p, int *arraysize, Data *q); void Data_deletearray(Data *p, int *arraysize, int i); int Data_read(Data *p, FILE *in); void Data_printarray(Data *p, int size); void Data_print(Data *p); int main() { static char buf[BUFSIZE+1]; do { printf("> "); /* プロンプト */ fgets(buf, BUFSIZE, stdin); /* ユーザがキーボード入力 */ if (buf[0] == 'q') { /* 一文字目が q なら終了 */ break; } else if (buf[0] == 'p') { /* p なら全体を印字 */ Data_printarray(a, arraysize); } else if (buf[0] == 'a') { /* a ならデータ追加 */ Data tmp; printf("「作曲家名tab生年」のスタイルで入力せよ.\n"); Data_read(&tmp, stdin); if (Data_addarray(a, &arraysize, &tmp) == NO) { fprintf(stderr, "配列がいっぱいです.\n"); } } else if (buf[0] == 'd') { /* d ならデータ削除 */ int t; printf("何番目?\n"); fgets(buf, BUFSIZE, stdin); /* ユーザが入力 */ t = atoi(buf); if (t >= arraysize) { printf("範囲外です.\n"); } else { Data_deletearray(a, &arraysize, t); } } else { printf("入力エラーです.\n"); } } while (1); return 0; } /* FILE *in から Data *p へ Data 型オブジェクトを読み込む。成功 OK / 失敗 NO */ int Data_read(Data *p, FILE *in) { /* 前と同じにつき省略 */ } /* 配列 p に *p を加える。配列がいま保持しているデータ数は *arraysize 個。*/ int Data_addarray(Data *p, int *arraysize, Data *q) { if (*arraysize == N) { return NO; /* いっぱいのとき */ } else { p[(*arraysize)++] = *q; return OK; } } /* 配列 p の i 番目の要素を削除。それ以降のデータは前につめる */ void Data_deletearray(Data *p, int *arraysize, int i) { free(p[i].string); /* malloc() で割り当てたメモリの解放 */ (*arraysize)--; while (i < *arraysize) { p[i] = p[i+1]; i++; } } /* Data の配列 p[0], ..., p[size-1] を印字。何番目かも印字する */ void Data_printarray(Data *p, int size) { int i; printf("%d 個あります.\n", arraysize); for (i=0; istring, p->number); } == 020508d.c == /****************************************************************************** ファイルから配列にデータを読み込み、検索する --- 番兵バージョン ファイル名、キーはコマンドラインで指定する。ファイルは一行につきデータ一つで あり、文字列と数値の間はタブ(一つとは限らない)で区切られているとする。 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ(番兵の分は含まず) */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N+1]; /* Data 型の配列(+1 は番兵の分) */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_read(Data *p, FILE *in); int Data_read2array(Data *p, FILE *in, int size); int Data_arraysearchstring(Data *p, int arraysize, char *s); int Data_stringcmp(Data *p, char *s); void Data_print(Data *p); int main(int argc, char *argv[]) { /* 020508b.c と同じ */ } /* in から配列 p に最大 size 個読み込み、読めた個数を返す */ int Data_read2array(Data *p, FILE *in, int size) { /* 020508b.c と同じ */ } /* FILE *in から Data *p へ Data 型オブジェクトを読み込む。成功 OK / 失敗 NO */ int Data_read(Data *p, FILE *in) { /* 020508b.c と同じ */ } /* サイズ arraysize の Data 型の配列 p から string が s であるものを探し */ /* 添字(見つからなければ -1)を返す。番兵バージョン */ int Data_arraysearchstring(Data *p, int arraysize, char *s) { int i; p[arraysize].string = s; /* 番兵 */ for (i=0; Data_stringcmp(p+i, s) != 0; i++) { ; } return i == arraysize ? -1 : i; } /* Data 型オブジェクト *p の string と文字列 s を比較。一致すれば 0 */ int Data_stringcmp(Data *p, char *s) { return strcmp(p->string, s); } /* Data 型オブジェクト *p を印字 */ void Data_print(Data *p) { printf("%s\t%d\n", p->string, p->number); }