第5回 プログラミング入門 演習(解答)
制御構造(2)
【主な内容】
制御構造の中の条件分岐及び繰り返し処理の動作を理解する
演習課題
初級レベル
(A-1)
以下のプログラムが指定の動作となるように修正しなさい。
指定の動作: キーボードから入力された変数 a と b が等しいか否かを判定し、等しいとき「a と b は等しい」と出力する。また、等しくないときは何も出力しない。
ファイル名: ex05a1.c
[修正前の実行例]
例(1)
% ./a.out
a と b を入力してください> 1 1
a=1, b=1
a と b は等しい
例(2)
% ./a.out
a と b を入力してください> 0 0
a=0, b=0
<--- 何も出力されません
[修正後の実行例]
例(1)
% ./a.out
a と b を入力してください> 1 1
a=1, b=1
a と b は等しい
例(2)
% ./a.out
a と b を入力してください> 0 0
a=0, b=0
a と b は等しい
例(3)
% ./a.out
a と b を入力してください> 0 1
a=0, b=1
<--- 何も出力されません
解答
ex05a1.c
(A-2)
以下のプログラムが指定の動作となるように修正しなさい。
指定の動作: キーボードから入力された変数 a と b が等しいか否かを判定し、等しくなければ入力された値を出力した上で、「a と b は等しくない」と出力する。また、等しいときは何も出力しない。
ファイル名: ex05a2.c
[修正前の実行例]
例(1)
% ./a.out
a と b を入力してください> 1 0
入力された値はa=1, b=0
a と b は等しくない
例(2)
% ./a.out
a と b を入力してください> 1 1
a と b は等しくない
[修正後の実行例]
例(1)
% ./a.out
a と b を入力してください> 1 0
入力された値はa=1, b=0
a と b は等しくない
例(2)
% ./a.out
a と b を入力してください> 1 1
<--- 何も出力されません
解答
ex05a2.c
(A-3)
以下のプログラムが指定の動作となるように修正しなさい。
指定の動作: キーボードから入力された変数 weatherが1 の時は「晴れ」、2 の時は「雨」、 それ以外の時は「そんな天気知らない」と出力する。
ファイル名: ex05a3.c
[修正前の実行例]
例(1)
% ./a.out
天候を入力しなさい (「晴れ」は 1, 「雨」は 2 ) > 1
晴れ
雨 <--- 「晴れ」を指定したのに「雨」も出力してしまう
例(2)
% ./a.out
天候を入力しなさい (「晴れ」は 1, 「雨」は 2 ) > 2
雨
[修正後の実行例]
例(1)
%./a.out
天候を入力しなさい (「晴れ」は 1, 「雨」は 2 ) > 1
晴れ
例(2)
% ./a.out
天候を入力しなさい (「晴れ」は 1, 「雨」は 2 ) > 2
雨
例(3)
% ./a.out
天候を入力しなさい (「晴れ」は 1, 「雨」は 2 ) > 3
そんな天気知らない
解答
ex05a3.c
(A-4)
変数 a にある初期値(正の整数とする)を代入してから、最初は1を引き、次は2を引き、と順に1づつ大きい数を引いていく。計算の途中経過を表示するとともに、結果が0以下となったところで計算を停めたい。以下のプログラムの下線部を埋めて完成させなさい。
ファイル名: ex05a4.c
[実行例]
% ./a.out
初期値を入力して下さい。
100
ループ1回目 a = 99
ループ2回目 a = 97
ループ3回目 a = 94
ループ4回目 a = 90
ループ5回目 a = 85
ループ6回目 a = 79
ループ7回目 a = 72
ループ8回目 a = 64
ループ9回目 a = 55
ループ10回目 a = 45
ループ11回目 a = 34
ループ12回目 a = 22
ループ13回目 a = 9
ループ14回目 a = -5
14回目のループで 0 以下になりました
解答
ex05a4.c
中級レベル
(B-1)
学生を学籍番号に応じて、次のように4つの班に分けるとする。
1160001 -> 第1班
1160002 -> 第2班
1160003 -> 第3班
1160004 -> 第4班
1160005 -> 第1班
1160006 -> 第2班
1160007 -> 第3班
以下のプログラムは、学籍番号の下三桁を入力すればどの班に所属するのかが出力されるようになっている。
空欄を埋めて、実行例のような動作をするようにプログラムを完成させなさい。
ヒント:4で割った余りに応じて場合分けを行えば良い
ファイル名: ex05b1.c
[実行例]
% ./a.out
学籍番号の下三桁を入力してください(例: 400)> 001
この人は第1班です
% ./a.out
学籍番号の下三桁を入力してください(例: 400)> 002
この人は第2班です
% ./a.out
学籍番号の下三桁を入力してください(例: 400)> 100
この人は第4班です
解答
ex05b1.c
(B-2)
以下のプログラムを指定の動作をするように完成させなさい。
指定の動作:
(1) 晴れであり温度が15度以上30度以下であれば「快適」、それ以外は「ほぼ快適」と表示する。
(2) 雨であり温度が12度以上18度以下であれば「やや快適」、それ以外は「ちょっと不快」と表示する。
(3) 天候がそれ以外の場合は「不快」と表示する。
変数 weather が 1 の時は「晴れ」、2 の時は「雨」とします。
晴れ/雨の条件の判定を if で実現する方法と switch で実現する方法と2通り作成しなさい。
以下のプログラム例で示すように if で実現する方法において出力文の最後に (if) を、switch で実現する方法において出力文の最後に (switch) をつけて区別すること。
printf("快適 (if) \n");
printf("ほぼ快適 (switch)\n");
ファイル名: ex05b2.c
[プログラム例]
[実行例]
% ./a.out
天候を入力しなさい(「晴れ」は 1, 「雨」は 2)> 1
温度を入力しなさい 23
快適(if)
快適(switch)
解答
ex05b2.c
(B-3)
条件式中((1),(2)の if 文)に使われているカッコを使わない書き方で
同じ結果を得られるように書き直しなさい。
ファイル名: ex05b3.c
解答
ex05b3.c
上級レベル
(C-1)
以下の指定の動作をするプログラムを作成せよ。
指定の動作:
(1) 月の数を表す変数を用意し,キーボードからその変数に月の数を入力する。
(2) キーボードから入力された月の日数を出力する。
(3) 入力された整数が 0
以下だったり 13
以上の時には「そんな月はありません」と出力する。
簡単化して2月については閏年でないとする。
(ヒント)
switch 文で case を共通化するテクニックを使うとスマートに書ける
ファイル名: ex05c1.c
[実行例]
% ./a.out
月を入れて下さい > 1
答え: 1月は31日あります。
% ./a.out
月を入れて下さい > 13
答え: そんな月はありません
解答
ex05c1.c
(C-2)
本日の講義資料 (Lec05-8) の if else を用いたプログラム
/home/course/prog0/public_html/2008/lec/source/lec05-3c.c に、
同じ動作をする switch 文を用いたプログラムを追加せよ。
以下の例に示すように if を用いた出力文には (if) を、
switch を用いた出力文には (switch) を入れて区別できるようにせよ。
ファイル名: ex05c2.c
[実行例]
例(1)
% ./a.out
年月日を空白で区切って入力してください : 2000 2 29
2000年2月29日は月の最後の日である (if)
2000年2月29日は月の最後の日である (switch)
例(2)
% ./a.out
年月日を空白で区切って入力してください : 2004 5 16
2004年5月16日は月の最後の日ではない (if)
2004年5月16日は月の最後の日ではない (switch)
解答
ex05c2.c
(C-3)
以下の指定の動作をするプログラムを作成せよ。
指定の動作:
(1)整数で西暦と月の数を入力する。
(2)閏年の判定を行ない閏年を考慮したその月の日数を出力する。
(3)整数が 0 以下だったり 13 以上の時には「そんな月はありません」と出力する。
閏年の判定は (C-2) を参考にせよ。
ファイル名: ex05c3.c
[実行例]
例(1)
% ./a.out
西暦を入れて下さい > 2001
月を入れて下さい > 2
答え: 西暦2001年の2月は28日あります
例(2)
% ./a.out
西暦を入れて下さい > 2004
月を入れて下さい > 2
答え: 西暦2004年の2月は29日あります
解答
ex05c3.c
何か疑問や間違いがあれば以下に連絡して下さい。
プログラミング入門演習問題担当(prog0)