2015 年度 プログラミング演習 II 中間試験(2015/06/03)【表面】解答例

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」の講義に対する疑問点および感想を書いて下さい.