コンピュータプログラミング演習(CPII) 中間テスト(最終)(2007/1/17)

制限時間90分 20点満点
http://www.tuat.ac.jp/~kamelab/gcc/test070117.html
教科書、ノート、配布資料持ち込み可。PC使用可。
解答は解答用紙の各欄に記述すること。

第1問

整数乱数を5つ発生させ、小さい順に並べ替えるプログラムを作る。

問1
関数time()を本プログラム中で利用する場合に必要なヘッダーファイル名を [空欄1]に書きなさい。

問2
関数int myrand()は、呼び出されるたびに整数乱数を一つ発生し、返り値(戻り値)とする関数です。題意に沿うよう[空欄2]を埋めなさい。なお、必要ならば複数行記入してよい。

問3
5個のint型成分を持つ配列a[]を宣言します。題意に沿うよう[空欄3]を埋めなさい。

問4
関数myrand()を5回呼び出し、発生した整数乱数の値を配列a[]の各成分に代入します。題意に沿うよう[空欄4]を埋めなさい。

問5
関数void mysort()は、配列を受け取り、小さい順に並べ替えを行う関数です。仮引数として、int型成分を持つ配列DATA[]、及び、配列の成分数としての整数値Nを取ります。本プログラムでは、配列a[]を実引数として渡し、各成分を小さい順に並べ替えます。題意に沿うよう[空欄5]を埋めなさい。

問6
関数mysort()の仮引数を

void mysort(int *DATA,int N)

と、ポインタ変数*DATAで受け取るよう書き換えます。関数中の配列成分DATA[i](iは任意)を、すべてポインタ変数を用いて書き換えなさい。

(プログラム内左端の行番号は便宜上付けたにすぎません。第2問も同様)

1: /*整数乱数を小さい順に並べ替えるプログラム例*/
2: #include<stdio.h>
3: #include<stdlib.h>
4: #include<[空欄1]>
5: int myrand()/*乱数発生*/
6: {
7:	[空欄2]
8: }
9: void mysort(int DATA[],int N)/*小さい順に並べ替え*/
10: {
11:	int i,j,min,num1,num2;
12:	for(i=0;i<N-1;i++){
13:		min=DATA[i];
14:		num1=i;
15:		num2=num1;
16:		for(j=i+1;j<N;j++){
17:			if(min > DATA[j]){
18:			min=DATA[j];
19:			num2=j;
20:			}
21:		}
22:	DATA[num2]=DATA[num1];
23:	DATA[num1]=min;
24:	}
25: }
26: main()
27: {
28:	int i,n;
29:	[空欄3] /*配列利用宣言*/
30:	srand((unsigned)time(NULL));
31:	n=5;
32:	printf("乱数5個表示\n");
33:		for(i=0;i<n;i++){
34:		[空欄4]
35:		printf("a[%d]:%d\n",i,a[i]);
36:		}
37:	printf("小さい順に並べ替え\n");
38:	mysort([空欄5]);
39:		for(i=0;i<n;i++){
40:		printf("a[%d]:%d\n",i,a[i]);
41:		}
42: }

***実行例***
$ cc test1.c
$ ./a.out
乱数5個表示
a[0]:463365376
a[1]:590819641
a[2]:1519747966
a[3]:1361940703
a[4]:503632172
小さい順に並べ替え
a[0]:463365376
a[1]:503632172
a[2]:590819641
a[3]:1361940703
a[4]:1519747966
***実行例ここまで***

第2問

あらかじめテキスト文字列(例:JABBERWOCKY)が記入されたファイルinput.txtを読み込み、画面に文字列を表示、かつ、文字列中の大文字Aの個数を数えてファイルoutput.txtに書き出すプログラムを作成します。

問1
char型ポインタ変数*pを宣言します。題意に沿うよう[空欄1]を埋めなさい。

問2
ファイルinput.txtを読み込みモードでオープンします。題意に沿うよう[空欄2]を埋めなさい。

問3
関数fscanf()を使い、ファイルinput.txtから文字列を読み込み、配列a[]へ格納します。題意に沿うよう[空欄3]を埋めなさい。

問4
ポインタ変数*pに配列a[]の基底アドレスを代入します。題意に沿うよう[空欄4]を埋めなさい。

問5
ポインタ*pが指し示す値(すなわち配列a[]の各成分)がヌル文字('\0')と等しくなければ、ポインタのアドレスをひとつづつ進めます。また、大文字のA('A')に等しければcountの値を1増加(インクリメント)させます。題意に沿うよう[空欄5][空欄6][空欄7]を埋めなさい。

問6
ファイルoutput.txtを書き込みモードでオープンします。題意に沿うよう[空欄8]を埋めなさい。

問7
関数fprintf()を用いて得られた結果("Aは***個")をファイルoutput.txtへ書き出します。題意に沿うよう[空欄9]を埋めなさい。

1: /*ファイルから入力された文字列からAの個数を数える*/
2: #include<stdio.h>
3: #include<stdlib.h>
4: main()
5: {
6: FILE *fp1,*fp2;/*ファイルポインタ*/
7: char fname1[30]="input.txt"; /*入力ファイル名はinput.txt*/
8: char fname2[30]="output.txt"; /*出力ファイル名はoutput.txt*/
9: char a[100];
10: [空欄1] /* char型ポインタ変数*p利用宣言 */
11: int count;
12: fp1=fopen([空欄2]); /*input.txtを読み込みモードでオープン*/
13:	if(fp1==NULL){
14:	printf("Can not open file");
15:	exit(1);
16:	}
17: fscanf([空欄3]); /*input.txtから読み込み、配列a[]へ格納*/
18: fclose(fp1);/*ファイルクローズ*/
19: count=0;
20: [空欄4]
21:	while([空欄5]){
22:	printf("%c",*p);
23:		if([空欄6]){
24:		count++;
25:		}
26:	[空欄7]
27:	}
28: printf("\n");
29: printf("Aは%d個\n",count);
30: fp2=fopen([空欄8]);/*output.txtを書き込みモードでオープン*/
31:		if(fp2==NULL){
32:		printf("Can not open file");
33:		exit(1);
34:		}
35:	fprintf([空欄9]);/*output.txtへ結果を書き出す*/
36:	fclose(fp2);/*ファイルクローズ*/
37: }
***問題文ここまで***

http://www.tuat.ac.jp/~kamelab/gcc/index.html コンピュータプログラミング演習II 亀田・佐藤クラスのページへ