第 13 章ファイル入出力 問題 13-1 ファイルのアクセスに関する次の記述中の (1)~(8) にあてはまる適切な字句を解答群 から選び, 解答欄に記号で記入しなさい ファイルを扱う場合, まず使用するファイルをfopen 関数でオープンする この関数 には引数が二つあり, 最初の引数には (1) が格納されている領域へのポインタ を指定するが, このポインタは (2) 型のポインタである また,2 番目の引数 には (3) を指定する この関数はファイルにアクセスするために (4) を返すが, この (4) を格納する変数の型は (5) 型である (3) は, ファイルにアクセスするための方法を指定する テキストファイル に対して, 入力専用でファイルを開く場合は (6) を指定し, 出力専用で開く場 合は (7) を, ファイルに追加書込みする場合は (8) を指定する (1),(3),(4) の解答群アファイル イファイル名 ウファイルモード エファイルポインタ オオープンモード (2),(5) の解答群ア int イ char ウ FILE エ FILE * (6)~(8) の解答群ア 'a' イ 'b' ウ 'r' エ 'w' オ "a" カ "b" キ "r" ク "w" 解答欄 (1) (2) (3) (4) (5) (6) (7) (8) 問題 13-2 ファイルの入出力に関する次の記述に最も関係のある関数の使用例を解答群から選び, 解答欄に記号で記入しなさい (1) ファイルを読書き ( 更新 ) モードでオープンする ただし, 処理するファイルが存 1
在しないときは,NULL を返す (2) ファイルポインタで指定したファイルをクローズする (3) ファイルポインタで指定したファイルへ, 変数に格納された文字を出力する (4) ファイルポインタで指定したファイルから 1 文字取得する 解答群 ア close(fp) ウ getc(fp) オ putc(fp) キ fopen(" ファイル名 ", 'r+') ケ fopen(" ファイル名 ", 'w+') イ fclose(fp) エ getc(c, fp) カ putc(c, fp) ク fopen(" ファイル名 ", "r+") コ fopen(" ファイル名 ", "w+") 解答欄 (1) (2) (3) (4) 問題 13-3 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(4) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい <プログラムの説明 > ファイル a( ファイル名 :original.txt) を読み込み, そのままファイル b( ファイル名 :detect.txt) に複写コピーする ファイルがオープンできない場合, エラーメッセージを出力し, 返却値として 1 を返す <プログラム> #include <stdio.h> int main(void) { FILE *fp, *fq; int c; if ((fp = (1) ) == NULL) { /* 入力ファイルのオープンエラー */ printf(" 入力ファイルがオープン不能 n"); return 1; if ( (2) ) { /* 出力ファイルのオープンエラー */ printf(" 出力ファイルがオープン不能 n"); return 1; 2
while ( (3) ) /* 1 文字ずつ取り出して複写 */ (4) ; fclose(fp); fclose(fq); return 0; (1) の解答群ア fopen(original.txt, 'a') ウ fopen(original.txt, "a") オ fopen("original.txt", "w") イ fopen("original.txt", 'r') エ fopen("original.txt", "r") (2) の解答群ア fq = fopen("detect.txt", "w") == EOF イ fq = fopen("detect.txt", "a") == NULL ウ (fq = fopen("detect.txt", "w"))!= EOF エ (fq = fopen("detect.txt", "a"))!= NULL オ fq = fopen("detect.txt", "a") == EOF カ fq = fopen("detect.txt", "w")!= NULL キ (fq = fopen("detect.txt", "a"))!= EOF ク (fq = fopen("detect.txt", "w")) == NULL (3) の解答群ア getc(c, fp)!= EOF ウ scanf(fp, "%c", c)!= NULL オ (c = getc(fp))!= NULL イ getc(c, fp)!= NULL エ (c = getc(fp))!= EOF カ scanf("%c", c, fp)!= EOF (4) の解答群ア putc(c) イ putc(fq) ウ putc(c, fq) エ putc(fq, c) オ fq = c カ printf(fq, "%c", c) キ printf("%c", c, fq) 解答欄 (1) (2) (3) (4) 3
問題 13-4 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(5) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい <プログラムの説明 > 1 行 80 文字からなるテキストファイルを読み込み, 他のファイルに複写する ファイル名は, 次のようにコマンドラインから入力する なお, ファイルがオープンできない場合, エラーメッセージを出力し, 返却値として 1 を返す コマンド入力ファイル名出力ファイル名 < プログラム > #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp, *fq; char s[82]; if ((1) ) { printf(" コマンドパラメータエラー n"); return 1; if ((fp = (2) ) == NULL) { printf(" 入力ファイルオープンエラー n"); return 1; if ((fq = (3) ) == NULL) { printf(" 出力ファイルオープンエラー n"); return 1; while ( (4) ) (5) ; fclose(fp); fclose(fq); return 0; (1) の解答群 ア argc!= 3 イ argv!= 3 ウ argc < 3 エ argv < 3 オ argv[0]!= 3 4
(2) の解答群ア fopen(argv[0], "r") ウ fopen(argv[2], "r") オ fopen(argv[2], "w") (3) の解答群ア fopen(argv[0], "w") ウ fopen(argv[2], "w") オ fopen("argv[2]", "r") (4) の解答群ア (s = fgetc(fp))!= EOF ウ fgets(s, 81, fp)!= NULL オ fgets(fp, "%s", s)!= NULL イ fopen(argv[1], "r") エ fopen(argv[1], "w") カ fopen("argv", "w") イ fopen(argv[1], "w") エ fopen("argv[3]", "w") カ fopen("argc", "w") イ fgets(s, 80, fp)!= NULL エ fgets(s, 82, fp)!= NULL カ fscanf(s, 81, fp)!= EOF (5) の解答群 ア putc(s) イ putc(fq, s) ウ fputs(s, fq) エ fq = s オ printf(fq, "%s", s) 解答欄 (1) (2) (3) (4) (5) 問題 13-5 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(5) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい < プログラムの説明 > 次のような構造をもつファイルがある 商品コード商品名商品単価 商品コードで昇順に整列済みの二つのファイルfile1,file2 を入力して, 一つのファイルfile3 に併合する なお, 商品コードは英数字 5 桁の固定長である <プログラム> #include <stdio.h> #include <string.h> #define END_F "zzzzz" struct record { /* レコードの構造 */ char scode[6]; /* 商品コード */ char sname[20]; /* 商品名 */ 5
int tanka; /* 商品単価 */ ; void get_file(struct record *, FILE *); void put_file(struct record, FILE *); int main(void) { FILE *fp1, *fp2, *fout; struct record record1, record2, *rec1, *rec2; strcpy(record1.scode, ""); strcpy(record1.sname, ""); record1.tanka = 0; strcpy(record2.scode, ""); strcpy(record2.sname, ""); record2.tanka = 0; rec1 = &record1; rec2 = &record2; fp1 = fopen("file1", "r"); fp2 = fopen("file2", "r"); fout = fopen("file3", "w"); get_file(rec1, fp1); /* ファイル 1 を読む */ get_file(rec2, fp2); /* ファイル 2 を読む */ while ( (1) ) { /* 二つのファイルが終了するまで繰り返す */ if (strcmp(rec1->scode, rec2->scode) <= 0) { (2) ; /* ファイル 3 に書き出す */ (3) ; /* ファイルを読む */ else { (4) ; /* ファイル 3 に書き出す */ (5) ; /* ファイルを読む */ fclose(fp1); fclose(fp2); fclose(fout); return 0; void get_file(struct record *rec, FILE *p) /* ファイルの読込み */ 6
{ if (fscanf(p, "%s", rec->scode) == EOF) strcpy(rec->scode, END_F); /* ファイル終了後の処理 */ else { fscanf(p, "%s", rec->sname); fscanf(p, "%d", &rec->tanka); void put_file(struct record rec, FILE *p) /* ファイルへの書出し */ { fprintf(p, "%s %s %d n", rec.scode, rec.sname, rec.tanka); (1) の解答群ア strcmp(rec1.scode, END_F)!= 0 strcmp(rec2, scode, END_F)!= 0 イ strcmp(rec1->scode, END_F)!= 0 strcmp(rec2->scode, END_F)!= 0 ウ strcmp(rec1.scode, EOF)!= 0 strcmp(rec2, scode, EOF)!= 0 エ strcmp(rec1->scode, EOF)!= 0 strcmp(rec2->scode, EOF)!=0 オ rec1->scode!= END_F rec2->scode!= END_F カ rec1->scode!= EOF rec2->scode!= EOF (2) の解答群ア fputs(rec1, fout) イ fprintf(fout, "%s", rec1) ウ put_file(*rec1, fout) エ fputs(rec2, fout) オ fprintf(fout, "%s", rec2) カ put_file(*rec2, fout) (3) の解答群ア fgets(rec1, 27, fp1) ウ get_file(rec1, fp1) オ fscanf(fp2, "%s", rec2) イ fscanf(fp1, "%s", rec1) エ fgets(rec2, 27, fp2) カ get_file(rec2, fp2) (4) の解答群ア fputs(rec1, fout) イ fprintf(fout, "%s", rec1) ウ put_file(*rec1, fout) エ fputs(rec2, fout) オ fprintf (fout, "%s", rec2) カ put_file(*rec2, fout) (5) の解答群ア fgets(rec1, 27, fp1) ウ get_file(rec1, fp1) オ fscanf(fp2, "%s", rec2) イ fscanf(fp1, "%s", rec1) エ fgets(rec2, 27, fp2) カ get_file(rec2, fp2) 7
解答欄 (1) (2) (3) (4) (5) 問題 13-6 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(4) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい <プログラムの説明 > 受験者別の獲得正解数を格納したデータを入力して, 得点の計算を行い,20 点刻みの得点分布表を作成するプログラムである (1) プログラムは, 正解数ファイル (SEIKAI) から, データを 1 件ずつ入力し, 各問に対応した配点から受験者の得点の計算を行い, 得点の範囲別に集計し, その結果を表示する (2) 正解数ファイルは,1 人分のテストの正解数を 1 レコードとして格納している 1 レコード様式は図 1 のとおりである また, レコードの区切りには, 改行コードが格納されている 生徒番号 空白 問 1 問 2 問 3 改行コード 6 けた 1けた 2 けた 2けた 1 けた n 図 1 正解数ファイルのレコード様式 2 各問の設問数は, 問 1 が 20 設問, 問 2 が 10 設問, 問 3 が 3 設問で, 正解数がそれぞれ 10 進文字で格納されている (3) 各問の1 設問あたりの配点は, 問 1 が 1 点, 問 2 が 5 点, 問 3 が 10 点で, 合計 100 点となる (4) 集計は,20 点刻みで行い, 図 2 に示す六つの範囲で集計される 0~19 点 20~39 点 40~59 点 60~79 点 80~99 点 100 点 図 2 集計範囲 8
(5) 得点分布表は, 図 3 のように出力される I---------I---------------------------- I tokuten I bunpu I------- -I----5---10---15---20---25---- I 0 19 I... I 20 39 I...*. I 40 59 I...*...*... I 60 79 I...*...*...*...*... I 80 99 I...*...*...*... I 100 I...* I---------I----5---10---15---20---25---- 図 3 得点分布表出力例 <プログラム> #include <stdio.h> #define HANISU 6 #define RECLEN 14 #define P1 1 #define P5 5 #define P10 10 int main(void) { FILE *fp; int bunp[hanisu]; char rdata[][10] = { {" 0 19 ", {" 20 39 ", {" 40 59 ", {" 60 79 ", {" 80 99 ", {" 100 " ; char buf[reclen], gno[7]; int ten1, ten2, ten3; int tokuten; int i, j, k; /* 初期値設定 */ for ( i = 0; i < HANISU; i++ ) 9
bunp[i] = 0; fp = fopen("seikai", "r"); /* データ集計 */ while (fgets( buf, RECLEN, fp)!= NULL ){ sscanf( (1) ); tokuten = ten1 * P1 + ten2 * P5 + ten3 * P10; (2) ; fclose(fp); /* 分布表表示 */ printf("i---------i---------------------------- n"); printf("i tokuten I bunpu n"); printf("i---------i----5---10---15---20---25--- n"); for ( i = 0; i < HANISU; i++ ){ k = 5; printf("i%si", rdata[i]); (3) { if ( j >= k ){ printf("*"); (4) ; else printf("."); printf(" n"); printf("i---------i----5---10---15---20---25---- n"); return 0; (1) の解答群ア buf, "%6s %s%s%s", gno, &ten1, &ten2, &ten3 イ buf, "%s %d%d%d", &gno, &ten1, &ten2, &ten3 ウ buf, "%6s %2d%2d%1d", &gno, &ten1, &ten2, &ten3 エ buf, "%s %2d%2d%1d", gno, &ten1, &ten2, &ten3 10
(2) の解答群ア bunp[tokuten]++ イ bunp[tokuten % 20]++ ウ bunp[tokuten / 20]++ エ bunp[atoi(tokuten)]++ (3) の解答群ア for ( j = 0; j < bunp[i]; j++ ) イ for ( j = 0; j <= bunp[i]; j++ ) ウ for ( j = 1; j < bunp[i]; j++ ) エ for ( j = 1; j <= bunp[i]; j++ ) (4) の解答群ア k++ イ k-- ウ k += 5 エ k -= 5 解答欄 (1) (2) (3) (4) 問題 13-7 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(4) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい <プログラムの説明 > 試験の点数が格納された得点ファイルを読み込み, 平均と標準偏差を求めるプログラムである (1) 得点ファイルのレコード様式は, 図 1 のとおりである 得点ファイルでは,1 人分の 3 科目の得点を 1 レコードとして格納している また, レコードの区切りには, 改行コードが格納されている 受験番号空白国語空白英語空白数学改行コード ( n) 6 けた 1 けた 3 けた 1 けた 3 けた 1 けた 3 けた 1 けた 図 1 得点ファイルのレコード様式 (2) プログラムは, 得点ファイルのレコード (tokuten.txt) より, データを 1 件ずつ入力し, 受験者の 3 科目の合計得点を求める (3) 各受験者の合計得点から全受験者の合計得点を集計し, 平均点と標準偏差を求める 1 平均は, 集計結果を受験者数で割った値である 2 標準偏差は, 分散の平方根 ( 0) である また, 分散は, 次の式で計算する 11
s = 1 n {(x1 - X) 2 + (x2 - X) 2 + + (xn - X) 2 n : 受験者数 x1 ~ xn: 各受験者の得点 s : 分散 X :(x1 ~ xn) の平均 (4) 受験者数は 500 人以内とし,500 件を越えるレコードが読み込まれた場合は, エラーメッセージを表示し, プログラムを終了させる (5) 得点ファイルのレコードは,1 以上あるものとする (6) 得点ファイルのレコードの内容が, 図 2 で示すとおりであった場合の処理結果は, 次のとおりである ( 処理結果例 ) 受験者数 :20 平均 :235.050000 標準偏差 :29.700968 000001 085 050 094 000002 071 075 075 000003 096 098 068 000004 100 074 094 000005 043 055 036 000006 085 100 076 000007 069 073 100 000008 035 094 085 000009 045 084 074 000010 086 100 076 000011 070 098 066 000012 100 058 100 000013 068 090 066 000014 092 074 074 000015 087 042 090 000016 088 076 087 000017 097 088 072 000018 065 064 095 000019 077 090 070 000020 063 098 100 <プログラム> #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 500 #define LNG 20 図 2 得点ファイルの内容例 int main(void) 12
{ FILE *fp; int i, n; int kokugo, eigo, sugaku; double s1, s2, wkd; double dat[max]; char buf[lng], wkc[8]; n = 0; s1 = s2 = 0; fp = fopen("tokuten.txt", "r"); while ( fgets(buf, LNG, fp)!= NULL ){ if ( (1) ){ printf("data Over!! n"); return 1; sscanf(buf, "%s %d %d %d", wkc, &kokugo, &eigo, &sugaku); wkd = kokugo + eigo + sugaku; (2) ; s1 += wkd; s1 /= n; for ( i = 0; i < n; i++ ){ (3) ; s2 += wkd * wkd; (4) ; printf(" 受験者数 :%d 平均 :%f 標準偏差 :%f n", n, s1, s2); return 0; (1) の解答群 ア n < 0 ウ n > MAX イ n <= MAX エ n >= MAX (2) の解答群 ア dat[n] = wkd ウ dat[n++] = wkd イ dat[n] += wkd エ dat[++n] = wkd 13
(3) の解答群 ア wkd = dat[i] ウ wkd = dat[i] - s1 イ wkd = dat[i] / n エ wkd = dat[i] % s1 (4) の解答群 ア s2 = sqrt( s1 / n ) イ s2 = sqrt( s1 / (n + 1) ) ウ s2 = sqrt( s2 / n ) エ s2 = sqrt( s2 / (n + 1) ) 解答欄 (1) (2) (3) (4) 問題 13-8 次のプログラムの説明及びプログラムを読んで, プログラム中の (1)~(6) にあてはまる適切な字句を解答群から選び, 解答欄に記号で記入しなさい < プログラムの説明 > テキストファイル (file.txt) に格納された英文を読み込んで単語に分割し, その頻度と共にアルファベット順に出力するプログラムである (1) 英文は1 行最大 255 文字で, 行の最後は改行文字である (2) 英文は英字及び区切文字 (,,., 空白文字, 改行文字のみ ) からなり, 各単語は区切り文字によって区切られている すなわち, 単語が複数行にまたがって格納されていることはない また, 英字と区切文字以外の文字は格納されていない (3) 各行の先頭は, 英字又は空白文字である また, 空白文字は連続することがある ただし,, と. は連続して現れることはない (4) 英字は大文字と小文字が混在するため, すべて小文字に変換して処理する (5) 単語は次のような構造体配列に格納する なお, 単語の長さは 20 文字以内とし, 単語の個数は 200 個以内とする struct tango { char word[21]; /* 単語 */ int count; /* 頻度 */ tbl[200]; (6) すべての英文を単語に分割後, アルファベット順に並べ替えてその頻度と共に出力する 14
<プログラム> #include <stdio.h> #include <string.h> #include <ctype.h> struct tango { char word[21]; int count; tbl[200]; int main(void) { FILE *fp; char work[21]; int ch, i, j = 0, k = 0; struct tango stwk; fp = fopen("file.txt", "r"); while ( (1) ) { /* 1 文字ずつ読み込む */ if (isalpha(ch)) { if (isupper(ch)) ch = tolower(ch); /* 小文字に変換 */ (2) ; else { if ( j == 0 ) continue; (3) ; for ( i = 0; i < k; i++ ) /* 既出単語かどうか */ if ( (4) ) { tbl[i].count++; break; if ( i == k ) { strcpy(tbl[k].word, work); tbl[k].count = 1; k++; (5) ; 15
for ( i = 0; i < k - 1; i++ ) { /* 整列処理 */ for ( j = i + 1; j < k; j++ ) { if ( (6) ) { stwk = tbl[i]; tbl[i] = tbl[j]; tbl[j] = stwk; for ( i = 0; i < k; i++ ) printf("%20s : %2d n", tbl[i].word, tbl[i].count); return 0; (1) の解答群ア (ch = getchar())!= EOF ウ (ch = fgetc(fp))!= EOF イ (ch = getchar())!= NULL エ (ch = fgetc(fp))!= NULL (2),(3),(5) の解答群 ア work[j] = ch イ work[++j] = ch ウ work[j++] = ch エ work[j] = ' 0' オ work[++j] = ' 0' カ j = 0 キ j++ ク j = k (4),(6) の解答群ア strcmp(tbl[i].word, work) < 0 イ strcmp(tbl[i].word, work) == 0 ウ strcmp(tbl[i].word, work) > 0 エ strcmp(tbl[i].word, tbl[j].word) < 0 オ strcmp(tbl[i].word, tbl[j].word) == 0 カ strcmp(tbl[i].word, tbl[j].word) > 0 解答欄 (1) (2) (3) (4) (5) (6) 16
第 13 章ファイル入出力解答 問題 13-1 (1) イ (2) イ (3) オ (4) エ (5) エ (6) キ (7) ク (8) オ fopen 関数の書式は, 次のとおりである FILE *fopen(const char *filename, const char *openmode) (1),(2) 最初の引数は, ファイル名を示すポインタで, データ型はcharである (3) 2 番目の引数は, オープンモードを指定する (4),(5) この関数はファイルにアクセスするためにファイルポインタを返す このファイルポインタは FILE * 型であり, ファイルのオープンに失敗した場合は, NULL を返す (6)~(8) オープンモードには, 次のようなモード指定がある "r" 読込み "w" 書込み "a" 追加書込み "r+" 読書き ( 更新 ) "w+" 読書き ( 更新 ) "a+" 追加のための読書きバイナリファイルに対して行う場合には各モードに b を付ける 問題 13-2 (1) ク (2) イ (3) カ (4) ウ (1) ファイルのオープンはfopen 関数で行い, 読書き ( 更新 ) モードでオープンするには, モード r+ を指定する モードはダブルクォーテーションで囲む (2) ファイルをクローズするにはfclose 関数を使用する fclose 関数は, 引数で渡したファイルポインタが示すファイルをクローズする ファイルへのアクセスが終了したときには, 割り当てられたバッファを解放する ファイルポインタは FILE * 型であり, ファイルのクローズに失敗した場合は, EOF を返す (3) ファイルへ 1 文字出力するには,putc 関数を使用する putc 関数は, 出力する文字とファイルポインタを引数で渡し, 引数で指定した文字をファイルポインタの示すファイルへ出力する 変数に格納された文字を出力する ので, putc(c, fp) となる (4) ファイルから 1 文字取得するには,getc 関数を使用する getc 関数は, ファイルポインタを引数で渡し, そのファイルポインタの示すファイルから 1 文字取得 17
し, 文字を整数型の戻り値で返すので, getc(fp) となる 問題 13-3 (1) エ (2) ク (3) エ (4) ウ (1) 入力ファイルをオープンするには fopen 関数を使用し, 入力ファイル名 original.txt とモード r を引数で渡す (2) fopen 関数は, ファイルのオープンに失敗した場合, NULL を返す 出力ファイルをオープンするには fopen 関数を使用し, 出力ファイル名 detect.txt とモード w を引数で渡す (3) ファイルから 1 文字取得するには,getc 関数を使用する getc 関数は, ファイルポインタを引数で渡し, そのファイルポインタの示すファイルから 1 文字取得し, 文字を整数型の戻り値で返す 読み込んだ文字が EOF でなければ, 繰返し処理を行う (4) ファイルへ 1 文字出力するには,putc 関数を使用する putc 関数は, 出力する文字とファイルポインタを引数で渡し, 引数で指定した文字をファイルポインタの示すファイルへ出力する 問題 13-4 (1) ア (2) イ (3) ウ (4) エ (5) ウ (1) コマンドラインでの入力が, コマンド入力ファイル名出力ファイル名 であるから, 入力文字数が 3 以外はパラメータエラーとなる (2) 入力ファイルをオープンするには fopen 関数を使用し, コマンドラインから入力された入力ファイル名と OPEN モード r を引数で渡す なお,fopen 関数は, ファイルのオープンに失敗した場合, NULL を返す (3) 出力ファイルをオープンするには fopen 関数を使用し, コマンドラインから入力された出力ファイル名と OPEN モード w を引数で渡す (4) ファイルからデータの入力を行うには fgets 関数を使用し, 文字列の格納先と 1 行の最大文字数とファイルポインタを引数で渡し, そのファイルポインタの示すファイルから 1 行分の文字列を取得し指定された場所へ格納する 1 行分の文字列は末尾の改行文字を含めると 81 となるが,fgets 関数が読み込むのはn-1 文字なので, 最大文字数には 82 を指定する なお, 入力する際, 最後に ' 0' が付加されるため,82 文字分の領域を確保している (5) ファイルへデータの出力を行うには fputs 関数を使用し, 文字列とファイルポインタを引数で渡し, そのファイルポインタの示すファイルに文字列を出力する 引数の順序は, 文字列, ファイルポインタの順であり, fputs(s, fq) となる 18
問題 13-5 (1) イ (2) ウ (3) ウ (4) カ (5) カ (1) ファイルポインタを宣言するには, FILE * ポインタ名 ; と記述する 二つのファイルからそれぞれ 1 データずつ取得し, 両方のscodeの値がEND_Fにならない間は繰返し処理する なお, ファイルが終了したら, 商品コードに最大値 ( ここでは "zzzzz") を格納し, 商品コードの比較に備える (2) scodeの大小比較を行い,file1 のscodeが小さいとき, 出力ファイルfile3 へデータを出力する (3) 出力した直後に, 出力した方のfile1 のレコードを読み込む (4) file2 のscodeが小さいので, 出力ファイルfile3 へデータを出力する (5) 出力した直後に, 出力した方のfile2 のレコードを読み込む 問題 13-6 (1) エ (2) ウ (3) エ (4) ウ (1) 図 1 の正解数ファイルのレコード形式にあわせて, 読み込まれたレコード内容を buf に格納する sscanf 関数を使用して, 指定された書式に従って, 変数にデータを読み込む コード形式は,"%s %2d%2d%1d", gno, &ten1, &ten2, &ten3 となる (2) 3 科目の得点合計を算出する その後, 得点分布の集計を行うため,20 点刻みの添字を求め, 該当する集計エリアにカウントアップする (3) ヒストグラムを表示する処理である 各得点の縦見出しを表示した直後から, 各範囲の集計数を. と * で表示する 変数 j を 1 から bunp[i] 以下の間, 各範囲の集計数の表示処理を繰り返す (4) * の表示は,5 の倍数の値のときに表示する 変数 k の初期値を 5 として,5 の倍数になるように, 値を操作する 問題 13-7 (1) エ (2) ウ (3) ウ (4) ウ (1) 受験者数は 500 人以内であるため,500 件を超えるレコードが読み込まれた場合は, エラーメッセージを表示してプログラムを終了する ここでは,500 件を超えるレコードが読みまれたか否かの判定である (2) 各受験者の 3 科目の合計を求め, 配列 dat へ順に格納する (3) 標準偏差を求める公式中の各受験者の合計得点から全受験者の平均を差し引く処理である (4) 分散を求めた直後の処理である 標準偏差は, 分散の平方根であることから, 標準ライブラリ関数である sqrt 関数で平方根を求める 19
問題 13-8 (1) ウ (2) ウ (3) エ (4) イ (5) カ (6) カ (1) テキストファイルから 1 文字ずつ取り出すので,fgetc 関数 ( 又はgetc 関数 ) を使う テキストファイルが終了した場合は,EOFを返す (2) 取り出した英字を配列 workに格納するが, 添字 jはインクリメントしておく必要がある このとき,work[0] から格納するのでj++ となる ++jとした場合は, work[1] から格納されてしまう (3) 区切文字を検出したら, 配列 workに保存した文字列を単語として登録するため, 配列 workの最後に ' 0' を格納しておく必要がある (4) 既出の単語かどうかを構造体配列 tbl 内の単語と比較する (5) 見つけた単語を構造体に登録したら, 次の単語を配列 workに格納するため, 添字 jを 0 にしておかなければならない (6) 構造体配列内の単語をアルファベット順に整列するため,i 番目の単語とj 番目の単語の順番を入れ換えるかどうかを調べる必要がある そのためにstrcmp 関数を使うが, 入替えが必要なのは strcmp(tbl[i].word, tbl[j].word) > 0 の場合である なお, 数値データと同様に, 構造体は丸ごとコピーすることが可能である 20