C入門2 課題解答

1. 下には1行しか書いてありませんが、プログラムのつもりです。これはコンパイル・実行できるでしょうか?
  まず、考えてから、試してください。
  (「どうやって確かめればいいか」と手順を考えることも課題です。)

main(){}

 「#include <stdio.h>」は、「標準的な入出力のための情報を取り込むために必要」です。
 しかし、上記コードでは、何もしていないので、これはなくてもかまいません。
 mainの前のintは省略できます。
 mainの後の丸カッコ中にはvoid(など)を書くべきですが、省略もできます。
 Cでは改行を(比較的)自由にでき、逆に、改行を取り除いてもかまいません。
 mainの中カッコ内の最後には「return 0;」(かそれに相当するもの)を書くべきですが、
 多くのコンパイラではそれでもエラーになりません。

 以上より、たぶん、たいていのコンパイラで、コンパイルでき、実行もできるでしょう。
 それを確かめるためには、上記のコードを書いたファイルを作成し、コンパイル・実行してみればよいわけです。
 (ファイル名は問題中に指示していないので、たとえば、kadai2_1.cなどとしましょう。以下同様です。)
 ただし、mainの中に何も書いていないので、これは「何もしないプログラム」です。 

2. 次のように出力するプログラムを書いてください。ただし、printfは1回だけ使うことにします。
  いろいろな解答があると思いますが、1つ書けばよいことにします。
  (なお、バグとはプログラム中の誤った箇所のことです。)

五月晴れ
  プログラミング
    バグもなし

 たとえば、以下のようなものが考えられる。

#include <stdio.h>

int main(void)
{
    printf("五月晴れ\n  プログラミング\n    バグもなし\n");
    return 0;
}

3. 上のように出力するプログラムを、今度はprintfを3回使って書いてください。
  これも、ひねくれたものまでいれるといろいろな解答があると思います。

 たとえば、以下のようなものが考えられる。

#include <stdio.h>

int main(void)
{
    printf("五月晴れ\n");
    printf("  プログラミング\n");
    printf("    バグもなし\n");
    return 0;
}

4. 次のプログラムは、コンパイルするとエラーになります。
  まず、実際にコンパイルしてエラーになることを確かめ、次に、エラーが出ないように書き直してください。
  何箇所直す必要がありますか?

#include <stdioh>

int main(void)
{
    print("hello, world"\n)
    return 0;
}

 4箇所直して次のようにすればよい。
 (コンパイル時のエラーメッセージのすべてを信用することはできません。
 矛盾した内容にコンパイラが混乱するからです。
 エラーメッセージの上のほうから順番に直していくのがよいと思います。)

#include <stdio.h>

int main(void)
{
    printf("hello, world\n");
    return 0;
}

5. 次のプログラムはコンパイル・実行できるでしょうか?まず考えてから試してください。

#include <stdio.h>

int main(void)
{
    printf("printf");
    return 0;
}

 コンパイルも実行もできる。
 ""で囲まれたものはただの文字列と考えられるから、それが関数名でも問題ない。

6. 次のプログラムはコンパイル・実行できるでしょうか?まず考えてから試してください。

#include <stdio.h>

int main(void)
{
    printf("printf("printf")");
    return 0;
}

 コンパイルできない。
 文字列は「"」ではじまり「"」で終わる。
 printfの丸カッコ内の「"printf("printf")"」は、「"printf("」で文字列が終わってしまい、
 あとの「printf")"」が解釈不能になってしまう。

7. 次のプログラムはコンパイルするとエラーになります。
  それは、「printf」が空白でわけられているからですが、エラーメッセージはどうなるでしょう?
  実際に試して、なぜそのようなメッセージが出るか考えてください。

#include <stdio.h>

int main(void)
{
    pri ntf("hello, world\n");
    return 0;
}

 ファイル名をkadai2_7.cとしてBCCでコンパイルすると、次のようなエラーメッセージが出た。

 エラー E2451 kadai2_7.c 5: 未定義のシンボル pri(関数 main )
 エラー E2379 kadai2_7.c 5: ステートメントにセミコロン(;)がない(関数 main )

 1番目のメッセージは、「priが何かわからない」と言っている。
 コンパイラは、「人間がprintfの間に間違えて空白を入れたな」などと考えることはできない。
 2番目のメッセージは、最初のエラーの影響から出ていると考えられる。
 priとntfの間の空白を詰めれば、エラーは消える。
 (1つのエラーに2つエラーメッセージが出ていることに注意してください。
 エラーメッセージの数はあてにならないのです。)

8. コンパイルできるhello.cで、printf("hello, world\n");のあとに全角の空白を入れ、
  (保存してから)コンパイルし、エラーメッセージを見てください。
  そして、なぜそのようなメッセージが出るか考えてください。
  このようなバグを避ける方法を考えてください。

 ファイル名をkadai2_8.cとして、問題のようなプログラムをBCCでコンパイルすると、
 次のようなエラーメッセージが出た。

 エラー E2206 kadai2_7.c 5: 不正な文字 ' ' (0x8140)(関数 main )

 これは、「プログラムに使えない文字が使われている」という意味である。
 全角の空白文字はプログラム中では使えないからである。
 (""の間、つまり、文字列中では使える。)
 しかし、プログラムをよく見てもそのような文字は見えない。それは、「空白」の文字だから。
 このようなエラーに対処するには、

  1.""の間以外では、日本語入力モードを切るように習慣付ける。
  2.上記のエラーメッセージを覚える。(特に、「81」とか「40」という数字)

 などが考えられる。


課題2

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