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;
}


課題3

C入門3
C入門目次
ホーム