Microsoft Word - cpro_m_13.doc

Similar documents
Taro-ファイル処理(公開版).jtd

ファイル入出力

ファイル入出力

2006年10月5日(木)実施

Prog1_12th

Microsoft PowerPoint - kougi6.ppt

Microsoft Word - Cプログラミング演習(9)

gengo1-12

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

情報処理演習 B8クラス

gengo1-12

プログラミング基礎

演算増幅器

gengo1-12

計算機プログラミング

C言語講座 ~ファイル入出力編~

PowerPoint Presentation

Microsoft Word - no103.docx

Microsoft Word - no15.docx

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - 第3回目.ppt [互換モード]

PowerPoint プレゼンテーション

ポインタ変数

DVIOUT

スライド タイトルなし

02: 変数と標準入出力

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft Word - Cプログラミング演習(10)

PowerPoint プレゼンテーション

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

02: 変数と標準入出力

Microsoft PowerPoint - 14th.ppt [互換モード]

プログラミング基礎

PowerPoint プレゼンテーション

プログラミング演習3 - Cプログラミング -

Microsoft Word - 06

memo

練習&演習問題

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint pptx

slide4.pptx

memo

Microsoft Word - no204.docx

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft PowerPoint - prog06.ppt

ポインタ変数

ポインタ変数

Microsoft PowerPoint - kougi4.ppt

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

ゲームエンジンの構成要素

V

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - kougi2.ppt

Prog1_15th

Microsoft PowerPoint - CproNt02.ppt [互換モード]

※ ポイント ※

ポインタ変数

Taro-リストⅢ(公開版).jtd

Prog1_10th

プログラミング演習3 - Cプログラミング -

講習No.12

PowerPoint Presentation

ポインタ変数

データ構造

02: 変数と標準入出力

データ構造

C言語入門

Microsoft PowerPoint - kougi8.ppt

Taro-リストⅠ(公開版).jtd

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(8)

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

卒 業 研 究 報 告.PDF

2

02: 変数と標準入出力

Microsoft Word - no12.doc

Microsoft Word - Cプログラミング演習(3)

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

b,c に関する解答群ア cur_w += space_w イ cur_w += str_w ウ cur_w = 0 エ cur_w = space_w オ cur_w = space_w + str_w カ cur_w = str_w d に関する解答群ア *str!= *char_list[id

PowerPoint プレゼンテーション

Taro-ポインタ変数Ⅰ(公開版).j

02: 変数と標準入出力

memo

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

02: 変数と標準入出力

Microsoft Word - no202.docx

Cプログラミング1(再) 第2回

gengo1-8

PowerPoint Presentation

数値計算

slide5.pptx

memo

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

< F2D837C E95CF CF68A4A94C5816A2E6A>

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

2

PowerPoint プレゼンテーション

Transcription:

第 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