2015 年度 プログラミング演習 II 中間試験(2015/06/03)【表面】解答例 学籍番号: ※ I. 氏名: 裏面と表面に問題があります.両面ともに,学生番号および氏名を記入してください. 右に示したプログラムの実行結果を,忠実に下の空欄へ示しなさ い.(10 点) #include<stdio.h> void main(void){ (実行結果) int dan=5; 1 1 2 1 2 3 1 2 3 4 2 3 4 5 int i,k,j; for(i=1;i<=dan;i++){ for(k=1;k<=dan-i;k++){printf(" ");} 1 for(j=1;j<=i;j++){printf("%d",j);} printf("¥n"); } } II. 書き込みを行うための output.txt のファイル生成を #include<stdio.h> 行うプログラムを右のように作成した.ただし, #include<process.h> output.txt のメモリ上のアドレスは 12FF84 とする. void main(void){ 以下の問いに答えなさい.(各 10 点×3) FILE *fp1; if((fp1=fopen("output.txt","w")) ① NULL){ (1) このプログラムが期待通りに動作するように,①の部 printf("output.txt のオープンに成功.¥n"); 分に対して適切なものを答えなさい. }else{ printf(fp1,"output.txt のオープンに失敗.¥n"); != printf("プログラムを強制終了します.¥n"); exit(1); (2) fopen 関数が正常に動作したとき,ファイルポイン } タ fp1 には何が格納されているか答えなさい. fclose(fp1); 12FF84 } (3) 「#include<process.h>」を記述している理由を簡潔に述べなさい. exit(1)を動作させるため. III. 右に示したプログラムの実行結果を,忠実に下の空欄へ示しなさい.(15 点) (実行結果) #include<stdio.h> 実行画面 void main(void){ int a[]={55,32,48,92,74,85,91}; a[0]=92 int i,j,temp; a[1]=91 for(i=1;i<7;i++){ a[2]=85 for(j=1;j<=7-i;j++){ a[3]=74 if(a[j-1]<a[j]){ a[4]=55 temp=a[j-1]; a[5]=48 a[j-1]=a[j]; a[6]=32 a[j]=temp; } } } for(i=0;i<7;i++){printf("a[%d]=%d¥n",i,a[i]);} } IV. 【while 文・配列・ファイル操作】data.txt に保存された中間試験の点数(受験者数は最大 36 名)をファイル操作に より入力して,データ数(受験者数),最高得点,最低得点,平均得点および標準偏差を計算・出力するプログラムを作成 したい.プログラム中の空欄を適切に埋めなさい.(各 5 点×6 問=30 点) #include<stdio.h> #include<process.h> #include< ① > void main(void){ FILE *fp1; int point[36],DataNo=0,Total=0,SqTotal=0,Max,Min; int i; printf("受験者数,最高得点,最低得点,平均得点および標準偏差を計算します.¥n"); if( ② ){ printf("入力用ファイル data.txt のオープンに成功しました.¥n"); }else{ printf("入力用ファイル data.txt のオープンに失敗しました.¥n"); printf("プログラムを強制的に終了します.¥n"); exit(1); } while( ③ ){ Total=Total+point[DataNo]; SqTotal= ④ ; DataNo++; } Max=point[0]; Min=point[0]; for(i=1;i<DataNo;i++){ if( ⑤ ){Max=point[i];}else if( } ⑥ ){Min=point[i];} printf("データの処理結果を出力します.¥n"); printf("受験者数--->%d¥n",DataNo); printf("最高得点--->%d¥n",Max); printf("最低得点--->%d¥n",Min); printf("平均得点--->%6.2lf¥n",(double)Total/DataNo); printf(" 標 準 偏 --->%6.2lf¥n",sqrt((double)SqTotal/DataNo-pow((double)Total/DataNo,2.0))); 差 fclose(fp1); } (解答欄) ① math.h ② (fp1=fopen("data.txt","r"))!=NULL ③ (fscanf(fp1,"%d",&point[DataNo]))!=EOF ④ SqTotal+pow(point[DataNo],2.0) ⑤ Max<point[i] ⑥ Min>point[i] ※ 裏面にも問題があります. 2015 年度 プログラミング演習 II 学籍番号: V. 中間試験(2015/06/03)【裏面】解答例 氏名: 【2次元配列,ファイル処理,応用】3 行 6 列(以後,3×6 と表記)の2次元倍精度実数型(double 型)配列 a[][]の 各要素(添え字番号は,1 から使用)に,a[i][j]=2.1×i-0.1×j (i は 1∼3,j は 1∼6)を代入する.さらに,そ の生成された行列の転置行列を,ファイル transposed.txt に出力するプログラムを作成しなさい.要素 a[i][j]の出 力書式は,全体で 8 桁,小数部分を 2 桁とする.また,ファイルオープン時にオープンに失敗したときは『transposed.txt のオープンに失敗しました.プログラムを強制的に終了します.』と実行画面に表示してプログラムを強制終了させ,成功 したときは『transposed.txt のオープンに成功しました.』と表示する処置も講ずること. (25 点) #include<stdio.h> #include<process.h> void main(void){ FILE *fp1; double a[3+1][6+1],transposed[6+1][3+1]; int i,j; if((fp1=fopen("transposed.txt","w"))!=NULL){ printf("transposed.txt のオープンに成功しました.¥n"); }else{ printf("transposed.txt のオープンに失敗しました.¥n"); printf("プログラムを強制的に終了します.¥n"); exit(1); } for(i=1;i<=3;i++){ for(j=1;j<=6;j++){ a[i][j]=2.1*i-0.1*j; printf("%8.2lf",a[i][j]); } printf("¥n"); } for(i=1;i<=6;i++){ for(j=1;j<=3;j++){ transposed[i][j]=a[j][i]; fprintf(fp1,"%8.2lf",transposed[i][j]); } fprintf(fp1,"¥n"); } } ※ ここまでの「プログラミング演習 II」の講義に対する疑問点および感想を書いて下さい.
© Copyright 2025 ExpyDoc