C入門5 課題解答例
1. ユーザに入力してもらった数だけ、あなたが好きな言葉を繰り返すプログラムを書いてください。
/* kadai5_1.c */
#include <stdio.h>
int main(void)
{
int i, n;
printf("好きな整数を入力してください。\n");
printf("その数だけ、私の今の気持ちを繰り返します。\n");
scanf("%d", &n);
for(i = 0; i < n; i++){
printf("眠いよ ");
}
return 0;
}
2. 下のプログラムはコンパイル・実行できるでしょうか。できたとすると結果はどうなるでしょう。
(実験してみてください。)
#include <stdio.h>
int main(void)
{
int i;
for(i = 0; i < 0; i++){
printf("まあ好きかな\n");
}
return 0;
}
コンパイルでき、実行もできる。
しかし、for文では、最初にiを0にするが、その段階で「i
< 0」が成り立たなくなる。
そのため、for文内の処理は一度も実行されない。
したがって、実行しても、何も表示されない。
何も表示されないので、「実行できなかった」と考えた人もいたようです。
しかし、「何も表示しないプログラム」が実行できたのです。
3. 下のプログラムはコンパイル・実行できるでしょうか。できたとすると結果はどうなるでしょう。
(ちょっと危険なプログラムです。実行はちょっと待ちましょう。)
#include <stdio.h>
int main(void)
{
int i;
for(i = 0; i >= 0; i++){
printf("まあ好きかな\n");
}
return 0;
}
前問と同様に、コンパイルでき、実行もできる。
しかし、for文では、最初にiを0にし、条件を「i >= 0」としている。
「変数の更新」ではiを増やすだけなので、(論理的には)無限ループになってしまう。
ただし、実際には、iに格納できる整数の大きさに限界があるため、限界を超えると
(不思議かもしれませんが)マイナスの数になってループが終了するかもしれません。
しかし、そういうプログラムは邪悪です。
4. 問題3のプログラムは、(論理的には)無限ループになります。
プログラムが実行時に無限ループになった場合、強制終了で止めるしかありません。
どのような方法があるか、調べてください。
そして、「大丈夫だ」と思った場合のみ、自己責任で、実験してみてください。
(書きかけのレポートなどは保存・終了してからにしましょうね。)
Windows XPの場合、「Ctrl + C」、「コマンドプロンプトの窓を閉じる」、「Ctrl + Alt + Del」などがある。
5. ユーザに好きな整数を10個入力させ、その最小値と最大値を出力するプログラムを書いてください。
(if文を使いましょう。これは頭の体操です。)
/* kadai5_5.c */
#include <stdio.h>
int main(void)
{
int min, max, i, x;
printf("好きな整数を10個入力してください。\n");
printf("整数を入力 : ");
scanf("%d", &x);
min = x;
max = x;
for(i = 0; i < 9; i++){
printf("整数を入力 : ");
scanf("%d", &x);
if(x > max){
max = x;
}
else if(x < min){
min = x;
}
}
printf("あなたが入力した値の最小値は%dです。\n", min);
printf("あなたが入力した値の最大値は%dです。\n", max);
return 0;
}
はじめに入力した値をmin、maxとし、入力される値と比較していきます。
そして、現在のminより小さい値が入力されればそれを新しいminにし、
現在のmaxより大きい値が入力されればそれを新しいmaxにします。
6. クイズを出し、ユーザが正解を入力するまで、そのクイズを繰り返すプログラムを書いてください。
(whileかdo-whileが使いやすいと思います。これは発想の問題です。)
/* kadai5_6.c */
#include <stdio.h>
int main(void)
{
int ans = 0;
printf("クイズです。答を半角整数を入力してください。\n");
while(ans != 3){
printf("問題 世界一長い川は? \n");
printf("1 信濃川 2 アマゾン川 3 ナイル川\n");
scanf("%d", &ans);
switch(ans){
case 1:
printf("日本一ですが、違います。\n");
break;
case 2:
printf("そんな気もしますが、違います。\n");
break;
case 3:
printf("おめでとう。正解です!\n");
break;
default:
printf("誤入力。入力は1か2か3です。\n");
}
}
printf("ご苦労さん。\n");
return 0;
}
最初にansを0(正解の3以外ならなんでもよい)に設定したので、while内の処理が実行されます。
そして、それ以後は、ansに3が格納されるまで処理が続けられるのです。これでもよいでしょう。
ほぼ上のように書いて、ansの初期化(はじめに値を入れること)を忘れている人がかなりいました。
変数は、初期化しないと、どんな値を持つかわからないことになっています。
たまたま3になっていることもあるでしょう。
初期化を忘れないでください。
ただし、「クイズ」は必ず1度実行する必要があるので、whileより、do-whileの方がよさそうです。
/* kadai5_6.c */
#include <stdio.h>
int main(void)
{
int ans;
printf("クイズです。答を半角整数を入力してください。\n");
do{
printf("問題 世界一長い川は? \n");
printf("1 信濃川 2 アマゾン川 3 ナイル川\n");
scanf("%d", &ans);
switch(ans){
case 1:
printf("日本一ですが、違います。\n");
break;
case 2:
printf("そんな気もしますが、違います。\n");
break;
case 3:
printf("おめでとう。正解です!\n");
break;
default:
printf("誤入力。入力は1か2か3です。\n");
}
}while(ans != 3);
printf("ご苦労さん。\n");
return 0;
}
この場合、ユーザが入力したあとで、ansの中身をチェックすることになるので、
特にansを初期化する必要はありません。
なお、私が好きなのは、ユーザが間違いとわかっていながら同じ答えを入力し続けた場合、
「いいかげんにしろよ。コンピュータだってひまじゃねえんだ」みたいな表示をするやつです。
元気の残っている人はそのように改良してください。できるはずです。
7. ユーザに好きな整数を10個入力させ、その合計を出力するプログラムを書いてください。
「変数xの値に変数aの値を足す」は「x += a;」でできます。
「x += a;」を実行すると、xの値が「もとのxの値 +
aの値」になるのです。
ちなみに、「変数xの値から変数aの値を引く」は「x -=
a;」です。
(これは、文章読解の練習です。)
/* kadai5_7.c */
#include <stdio.h>
int main(void)
{
int sum, i, x;
sum = 0;
printf("好きな整数を10個入力してください。\n");
for(i = 0; i < 10; i++){
printf("整数を入力 : ");
scanf("%d", &x);
sum += x;
}
printf("あなたが入力した値の合計は%dです。\n", sum);
return 0;
}
とてもよくあるパターンです。
変数を10個用意した人もいるようです。現段階では、むしろ、その根性をほめたいところです。
しかし、100個だと困りますよね。上のような方法を理解してください。