C入門3 課題解答例
1. Cの授業をすると、決まって、「次のようなプログラムを書いたけど様子がおかしい」という質問を受けます。
教員はなんと答えるとよいでしょう。
#include <stdio.h>
int main(void)
{
int x = 10;
printf("変数の中身は%dです。\n", x);
return 0;
}
A printfのあたりをよく見てみましょう。
B %dが全角ですぜ。(こういうのは半角で書こうね。)
C よくあることだよ。
D その他(どうせなら、おもしろい解答募集)
とてもよくある間違いです。同じようなものに、「¥n」というのもあります。
2. Cの授業をすると、決まって、「次のようなプログラムを書いたけど様子がおかしい」という質問を受けます。
教員はなんと答えるとよいでしょう。(ちなみに、これは危険なプログラムです。)
#include <stdio.h>
int main(void)
{
int x;
printf("整数を入力してください:");
scanf("%d", x);
printf("入力した整数は%dですね。", x);
return 0;
}
A scanfのあたりをよく見てみましょう。
B &が抜けてやすぜ。
C これもよくあることなんだ。
D その他
詳しくはあとで説明しますが、scanfに書く「&x」は、「xがどこにあるか」を示すことになるのです。
これを「x」とすると、全然違う場所に、データが書き込まれることになり、危険です。
3. Cの授業をすると、決まって、「コンパイルしたら、エラーメッセージが20個もでました」
「もういやです」という質問(?)を受けます。
教員はなんと答えるとよいでしょう。
A エラーを出さないプログラマなんかいないよ。
B 一箇所のミスが複数のエラーに数えられてるだけで、そんなにエラーはないと思うよ。
まず、一番上のエラーメッセージを見て、そこら辺を直してみましょう。
C 私はいつも「エラーが200個を超えたのでこれ以上コンパイルできません」というメッセージを出してるよ。
そういうの見たことある?
D コンパイルエラーってかわいいじゃん。(実行時エラーは怖い。)
まあ、あんまり簡単にあきらめないでください。言いたいことは、それだけです。
4. 次のプログラムをコンパイルするとエラーになります。どうしてでしょうか。
答がわかっても、一度、コンパイルしてエラーを見ておいてください。
#include <stdio.h>
int main(void)
{
printf("整数を入力してください:");
int x;
scanf("%d", &x);
printf("あなたが入力した値は%dですな。\n",
x);
return 0;
}
変数の定義は、ブロックのはじめになければなりません。
(ブロックとは、簡単には、中カッコで囲まれた場所と考えてください。)
実は、C++やJavaでは、変数の定義の場所がブロックの途中でもかまいません。
C++プログラマ、Javaプログラマは気をつけてください。
5. 次のプログラムは、コンパイル・実行できるでしょうか?
実行できた場合、どのようになるでしょうか?
まず、考えてから、試してください。
このようなコメントをどう思いますか?
/***********************************
プログラム名 :sum.c
用途 :足し算
Copyright (c):Ken Kobayashi
************************************/
#include <stdio.h>
int main(void)
{
int a, b;
printf("整数を入力してください:");
scanf("%d", &a);
printf("整数を入力してください:");
scanf("%d", &b);
printf("和:%d", a + b);
return 0;
}
上の
/***********************************
プログラム名 :sum.c
用途 :足し算
Copyright (c):Ken Kobayashi
************************************/
は、よく見ると、「/*」と「*/」に囲まれているので、コメントです。
したがって、プログラム中にあってもよいのです。
このプログラムは、ユーザに2回整数を入力させ、その和を出力するプログラムです。
私は、このようなコメントは見やすくてよいと思います。
(今のプログラムではおおげさですが。)
6. 「コメントのないプログラムはバグだ」という人がいます。
一方で、「コメントはなるべくいれない方がよい」という人もいます。
以下の例を参考に(しなくてもいいです)、両者の主張の理由を推測し、自分の考えを述べてください。
/***********************************
プログラム名 :sub.c
用途 :引き算
Copyright (c):Ken Kobayashi
************************************/
#include <stdio.h>
int main(void)
{
/* int型変数aとbを用意する */
int a, b;
/* 整数入力をうながす */
printf("整数を入力してください:");
/* ユーザの入力を変数aに受け取る */
scanf("%d", &a);
/* 整数入力をうながす */
printf("整数を入力してください:");
/* ユーザの入力を変数bに受け取る */
scanf("%d", &b);
/* 和を出力する */
printf("差:%d", a - b);
return 0;
}
コメントに対する考え方は人それぞれですが、以下のように考えます。
プログラムは、一度書いたらそれで終わりということはなく、何度も変更や改良をするものです。
したがって、そのプログラムをあとで読んで改良する「将来の自分」や後任者のために、わかりやすいコメントが
あった方がよいと思います。
しかし、コメントが多すぎると目障りと感じられることもあります。たとえば、
/*
整数入力をうながす */
printf("整数を入力してください:");
などというコメントは不要ではないでしょうか。コードはプログラマが読むものですから。
また、コメントはプログラムの動作に関係ないので、コメント自身がまちがっていても、
気が付かないということもあります。たとえば、
/* 和を出力する
*/
printf("差:%d", a - b);
は、コメントとコードが矛盾しています。
これは簡単な例ですが、このような誤ったコメントは、後から読むプログラマを混乱させ、有害です。
それで、「コメントは間違えずに書け」ということになるわけですが、人間は間違える生き物です。
したがって、「間違いを減らすためには、コメントはあまり書かない方がよい」とも言えるのです。
結局、「プログラムには短く適切なコメントを入れるのがよい」ということになると思います。
また、「なるべくなら、コメントがなくてもわかるような、わかりやすいコードを書くべき」ということも言えます。
なお、私のHPなどでは、意図的にコメントを多く入れています。
これは、本文を補足するためのものです。
7. ユーザに現在の年齢を入力してもらい、
現在の年齢 :(現在の年齢)
5年後の年齢 :(5年後の年齢)
10年後の年齢:(10年後の年齢)
のように出力するプログラムを書いてください。ただし、「(現在の年齢)」などには、実際の数値が入るとします。
#include <stdio.h>
int main(void)
{
int x;
printf("現在の年齢を入力:");
scanf("%d", &x);
printf("現在の年齢 :%d\n", x);
printf("5年後の年齢 :%d\n", x + 5);
printf("10年後の年齢:%d\n", x + 10);
return 0;
}
8. 本文解説(C入門3)で見たように、足し算は「+」で表わされます。引き算は「-」、掛け算は「*」、割り算は「/」です。
つまり、aとbを数値型の変数(数値をいれる変数)としたときに
a + b :aとbを足したもの
a - b :aからb引いたもの
a * b :aとbを掛けたもの
a / b :aをbで割ったもの
という意味になります。(ただし、整数の場合、割り算の答は、小数点以下切り捨てになります。)
これから、問5のプログラムを改造して、ユーザが入力した2つの整数の和差積商を計算して表示するものにしてください。実行結果は、次のようになるようにします。
和:(足し算の答)
差:(引き算の答)
積:(掛け算の答)
商:(割り算の答)
ただし、「(足し算の答)」などには、実際に計算した答の数値が入るものとします。
#include <stdio.h>
int main(void)
{
int a, b;
printf("整数を入力して下さい:");
scanf("%d", &a);
printf("整数を入力して下さい:");
scanf("%d", &b);
printf("和:%d\n", a + b);
printf("差:%d\n", a - b);
printf("積:%d\n", a * b);
printf("商:%d\n", a / b);
return 0;
}