1 / 2 2J プログラミング言語 前期末試験 July 2014 担当小坂 1.次の

2J プログラミング言語 前期末試験
2J プログラミング言語 前期末試験 July 2014 担当小坂
1.次のプログラムの画面に現れる実行結果を予
測して書きなさい。ただし#include <stdio.h>は
省略されており,
「main() {」と「return 0; }」
も省略されているものとする。
(1)
int i;
for (i=4; i<10; i++) {
if (i<5) {
printf("tokyo ");
} else if (i<=6) {
printf("osaka ");
} else if (i<9) {
printf("kobe ");
} else {
printf("nagoya ");
}
if (i<=5) {
printf("hi ");
}
if (i<=6) {
printf("hello ");
}
if (i<10) {
printf("bye ");
}
printf("\n");
}
1.の問題では,プロ
グラムとして不自然な
ものもある。デバッグ
途中のプログラムを想
定しているので,その
まま答えなさい。
(2)
int n,i,j;
n=5;
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
if (i==0||n-2<=i||j==0||n-2<=j) {
printf("*");
} else {
printf("+");
}
}
printf("\n");
}
(3)
int x,y;
x=6;
y=10;
while (y<25) {
y=y+x;
x++;
}
printf("%d %d\n",x,y);
for (x=1; x<4; x++) {
y=y+x;
}
printf("%d %d\n",x,y);
(4)
int x=20;
do {
printf("x=%d\n",x);
if (x%2==0) {
x=x/2;
} else {
x=5*x+1;
}
} while (x<100);
printf("x=%d\n",x);
(5)
int day, sum;
sum=0;
for ( day=1; day<=7; day++ ) {
if
(day<3)
{
sum=sum+5;
} else
if (day<5) {
sum=sum+10;
} else
if (day<7) {
sum=sum+4;
} else
{
sum=sum+2;
}
printf("day= %d sum= %4d\n",day,sum);
}
printf("day= %d sum= %4d\n",day,sum);
(6)
int day,sum;
sum=0;
for ( day=1; day<=7; day++ ) {
switch
(day) {
case 2:
sum=sum*2;
break;
case 5:
sum=sum+10;
break;
default:
sum=sum+2;
break;
}
printf("day= %d sum= %4d\n",day,sum);
}
printf("day= %d sum= %4d\n",day,sum);
1/2
2J プログラミング言語 前期末試験
(7)
int ary[10]={25,20,12,50,10,30,40};
int i;
int y=0;
for (i=1;i<5;i++) {
printf("array[%d]=%d\n",i,ary[i]);
y+=ary[i]; /*y=y+ary[i]と同じ意味*/
printf("y=%d\n",y);
}
printf("yfinal=%d\n",y);
と 10000 の間に空白が 1 つあるようになっている。
「 Good morning. 」 が 解 答 の 場 合 は 「 Good △
morning.」のように空白を△で示せ。
(2)
x
y=e の表を作りたい。実行結果のような表を作る
には,四角の中にどのように記述すればよいか答
えなさい。
int i;
double x;
double y;
printf("
x
y=exp(x)\n");
for (i=1; i<=100; i++) {
x=(double)i/10.0;
y=exp(x);
printf("%6.3lf %13.6lf\n",x,y);
}
(8)
int ary[10]={55,34,25,64,12,50,10,8};
int i;
int y=ary[0];
int z=ary[0];
for (i=0;i<6;i++) {
if (y<ary[i]) y=ary[i];
if (ary[i]<z) z=ary[i];
printf("ary[%d]=%d, y,z=%d %d\n",i,ary[i],y,z);
}
printf("yfinal=%d\n",y);
printf("zfinal=%d\n",z);
実行結果
x
y=exp(x)
0.100
1.105171
0.200
1.221403
0.300
1.349859
0.400
1.491825
途中省略
9.600 14764.781566
9.700 16317.607198
9.800 18033.744928
9.900 19930.370438
10.000 22026.465795
2.次の問いに答えなさい[10]
ただし,1と同様に,プログラムは実行部分だけ
表現されており,そのほかは省略されていること
とする。
(1)
2
y=x の表を作りたい。実行結果のような表を作る
には,四角の中にどのように記述すればよいか答
えなさい。
ただし,実行結果のように,桁位置をそろえる。
また最終行では,10.000 の前には空白がなく,
10.000 と 22026.465795 の間に空白が 2 つあるよ
うになっている。
「 Good morning. 」 が 解 答 の 場 合 は 「 Good △
morning.」のように空白を△で示せ。
int x;
int y;
printf(" x y=x*x\n");
for (x=1; x<=100; x++) {
y=x*x;
printf("%3d %5d\n",x,y);
}
3.while 文,do-while 文あるいは if 文では条件
式を括弧の中に書くことになっている。
次の条件の時,プログラムではどのような表現に
なるか書きなさい。条件だけ書けばよい。
[10]
x y=x*x
1
1
2
4
3
9
4
16
途中省略
96 9216
97 9409
98 9604
99 9801
100 10000
(1)int 型変数 a の一の位は 0 である
(2)int 型変数 a も b も両方とも正の値である
(3)int 型変数 a,b は少なくとも片方が正の値で
ある(両方とも正であることもある)
(4)int 型変数 x は 0 以上 100 未満である
(5)int 型変数 y は 10 未満か,または 100 以上の
値である
ただし,実行結果のように,桁位置をそろえる。
また最終行では,100 の前には空白がなく,100
例
2/2
int 型変数 xxx =は 0 である → xxx == 0
プログラミング言語前期末試験解答用紙
2J( )名前( 1. (1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
2. (1)
(2)
3. (1)
(2)
(3)
(4)
(5)
)
試験対策の仕方(試験前の勉強方法)小坂
1.必ず紙と鉛筆で試験時と同じように過去問題を解き,答え合わせする。
(1) 全くわからなかった場合
例題も含めた説明を読みなおす。友人に解説してもらう。先生に解説してもらう。
(2) 間違えた場合(自分の考え方では間違えているとは思えない場合)
例題も含めた説明を読みなおす。友人に解説してもらう。先生に解説してもらう。
(for ルー
プの動作への誤解,while ループの動作の誤解はこの種類の誤りである。
)
(3) 間違えた場合(ケアレスミス)
どういう場合にケアレスミスをするのか,ケアレスミスリストを作り,ケアレスミスに応じ
たチェック方法を考え,本番に生かす。
2.小坂の感想
前期末試験問題1.
(3)では,printf の表示は,x,yの順になるはずだが,y,,x の順に書いて
しまって,不正解になってしまった解答が 1/4 ほどあった。類似の問題が昨年度の問題にあったの
で,
「必ず紙と鉛筆で試験時と同じように過去問題を解き,答え合わせする。
」という試験準備をして
いれば,この間違いを試験準備中に犯しているはずで,上記の反省をしているはずだから,本番では
間違えないはずである。
前期末試験問題2.では,
「\n」を忘れるというケアレスミスが多発した。これも類似の問題が昨年
度の問題にあったので,
「必ず紙と鉛筆で試験時と同じように過去問題を解き,答え合わせする。
」と
いう試験準備をしていれば,この間違いを試験準備中に犯しているはずで,上記の反省をしているは
ずだから,本番では間違えないはずである。
小坂が「必ず紙と鉛筆で試験時と同じように過去問題を解き,答え合わせする。
」という指示が守ら
れていないと判断する根拠である。
3.printf に関するケアレスミスをなくすためのチェックポイント
(1) 改行すべきところで改行していない。または,その逆。printf 中の「\n」の有無に注意する
(2) printf(“x= %d y=%d\n”,x,y); と な っ て い る に 「 x= 」「 y= 」 を 忘 れ る 。 あ る い は ,
printf(“ %d %d\n”,x,y); となっているのに,「x=」「y=」を書いてしまう。
(3) printf(“%d %d %d\n”,c,b,a); となっているのに,a,b,c の順に値を書いてしまう。
プログラミング言語前期末試験解答用紙
2J( )名前( 1. (1) tokyo hi hello bye
osaka hi hello bye
osaka hello bye
kobe bye
kobe bye
nagoya bye
(3) 9 31
4 37
(5) day=
day=
day=
day=
day=
day=
day=
day=
(2) *****
*++**
*++**
*****
*****
(4) x=20
x=10
x=5
x=26
x=13
x=66
x=33
x=166
1
2
3
4
5
6
7
8
sum=
sum=
sum=
sum=
sum=
sum=
sum=
sum=
5
10
20
30
34
38
40
40
(7) array[1]=20
y=20
array[2]=12
y=32
array[3]=50
y=82
array[4]=10
y=92
yfinal=92
(6) day=
day=
day=
day=
day=
day=
day=
day=
3. (1)
(3)
(5)
1
2
3
4
5
6
7
8
sum=
sum=
sum=
sum=
sum=
sum=
sum=
sum=
(8) ary[0]=55,
ary[1]=34,
ary[2]=25,
ary[3]=64,
ary[4]=12,
ary[5]=50,
yfinal=64
zfinal=12
%3d△%5d\n
a%10 == 0
0<a || 0<b
y<10 || 100<=y
2
4
6
8
18
20
22
22
y,z=55
y,z=55
y,z=55
y,z=64
y,z=64
y,z=64
55
34
25
25
12
12
%6.3f%14.6f¥n
%6.3lf△%13.6lf¥n
%6.3lf%14.6lf¥n でも可
%3d%6d¥nでも可
2. (1)
)
(2)
(2)
(4)
%6.3f△%13.6f\n
0<a && 0<b
0<=x && x<100