2007 年度「計算機基礎論3B」 2007-10-19

§12 初めてのCプログラム

(12.1) プログラムを書くに当たっては テキストエディタで「ソースファイル」を作成し、 「コンパイラ」でそれを「コンパイル」し、「実行ファイル」を作る (のが普通である)。

(12.2) 「実行ファイル」はコンピュータが読んで実行するもので、 人間が読んでもまずわからない。 「ソースファイル」は文字だけが並んでいるテキストファイルで、 訓練をつめば読み書きができるようになる。 「コンパイル」はここでは「変換する」「翻訳する」ぐらいの意味である。 ソースファイルを書く際に用いる言語はいろいろあるが、 ここでは「C言語」(シーげんご)を用いる。 C言語で書かれたソースファイルを実行ファイルにコンパイルするコンパイラのことを 「Cコンパイラ」とも言う。 Cコンパイラの使い方は、この授業で扱う範囲では極めて簡単である。 よって、 これから学ぶことの中心はC言語によるソースファイルの書き方である。 以下、「プログラミング」と言ったらそれを指す。

(12.3) コンピュータにおいて、 バックスラッシュ「\」と円マーク「¥」 は半角文字では同じものと思ってよい。 スラッシュ「/」は別物である。向きが違う。混同しないように。 右手で文字を書く人にとって書きやすいほうがスラッシュ、 逆向きがバックスラッシュと覚えるとよい。 (「全角文字」とはほぼ正方形をしている「あいうえおABC123」などの文字。 「半角文字」はそれを縦に半分に割った大きさの、 「ABC123」などの文字。 この節の「\」「¥」「/」 はいずれも全角文字である。)

(12.4) 次の例は参考書としてあげておいたカーニハン/リッチー著・石田晴久訳「プログラミング言語C第2版」(共立出版) (以下 K&R2 と略す)の §1.1 とほとんど同じである。

#include <stdio.h>

main() {
    printf("hello, world\n");
}

(12.5) 1 行目。 きょうのところはこれは「決まり文句」と考えよう。 「#」は Shift しながら 3 のキーを打つ。 この記号は楽譜の中で使ったときの名称から 「シャープ」と呼んでおくが、正式名称は別にあったと思う。 include は英単語そのままだ。 この次にスペースを入れているが、入れなくてもよい。 stdio.h を囲む 「< >」は不等号をカッコの代わりに使っているもの。 Shift しながらカンマとピリオドのキーを打つ。

(12.6) 2 行目は空行である。見やすくするためにおいたもの。意味はない。

(12.7) 3 行目と 5 行目もCプログラムに必ずおくもの。 「main」の次にあるのは小カッコの開きと閉じ。 Shift しながら 8 と 9 のキーを打つ。 この次にスペースを入れているが、入れなくてもよい。 その次にあるのは中カッコの開き。 5 行目にあるのが中カッコの閉じ。 中カッコは、Shift しながら大カッコのキー(Enter のすぐ左にある)を打つ。 これらの中カッコは 4 行目を囲んでいる。つまり、 「main() { ... }」のことである。 こう書かずに上のようにする理由はそのうちわかってくる。 また、この中カッコの書き方は K&R2 とやや異なる。 この授業では一貫して私の書き方で教えるので、 すでに自分流のつけ方を編み出している人以外はとりあえずそれにならえ。

(12.8) よって、4 行目がこのプログラムのうちで最も意味のある部分だということになる。 この行は頭に空白がある。 この空白は Tab(タブ)キーを一度押すことでとる。 空白を置く理由はそのうちわかってくる。 このように行頭に空白を置くことを「字下げ」「インデント」という。 また、そこには tab という見えない文字があると考える。 (プログラムをホームページからコピーした場合には、 インデントの空白は tab ではなくスペース四つになるが、 コンパイル結果には影響しないので気にするな。)

(12.9) printf() は元々用意されている「関数」である。 「プリントエフ」と読むことが多いかと思う。 関数の原語は function で、ここでは本来の意味である「機能」に近い。 この関数の機能は後ろの小カッコの中の文字列を印字する(=画面に書く) ことである。 文字列は二重引用符「" "」 (Shift しながら 2 のキーを打つ)で囲む。 ここでは印字される文字列に「\n」が含まれている。 「\n」はこの二文字で「改行」を意味する。 すなわち、これを画面に書くとそこで改行する。 よって、「hello, world\n」を画面に書くということは、 「hello, world」を画面に書いて最後に改行する、 ということになる。

(12.10) 4 行目の最後にはセミコロン「;」がついている。 C言語では文はセミコロンで終わることになっているので、忘れるな。 また、この「セミコロン」などの名称もこの機会にきちんと覚えよ。

(12.11) これを作成し、コンパイルし、実行する際の流れは次の通り。 (すべて、ターミナルの中で、プロンプトが出ているところに打ち込む。)

  1. 「emacs hello.c」としてソースファイル hello.c を作る。 内容は上の通り。
  2. 「gcc hello.c」としてコンパイルする。 何も出力されずにプロンプトが出れば成功である。 そのときは実行ファイル a.out ができている。
  3. 「./a.out」でプログラムを実行する。

(12.12) 注意:

  1. C言語のソースファイルは「.c」で終わる名前でなければならない。
  2. K&R2 には cc とあるがここのシステムでは gcc である。 実行の際、a.out の前の ./ に注意。
  3. a.out の内容は、コンパイルが成功するごとに書き換わる。(確認してみよ。)
  4. a.out から(たとえば)hello という名前に改名した場合は、 「./hello」として実行する。

(12.13) 練習問題(第〇部)

  1. 上のサンプルプログラムを内容とするファイル hello.c を作り、コンパイルし、できた実行ファイル a.out を実行せよ。 ソースファイルは、自分で打ち込むのと、ホームページからコピーするのと、 両方やってみるとよい。
  2. 上でできた実行ファイル a.out を hello と改名してから実行してみよ。

(12.14) 以下の練習ではソースファイル名は指定しない。適当につけること。 hello.c の内容を次々と変更していっても構わない。

(12.15) ※ プロンプトが出ているところで「↑」キーを何度か押すと、 以前に打ち込んだコマンドが出てくる。 行きすぎたら「↓」で戻れる。 それを編集してから実行することもできる。

(12.16) 練習問題(第一部)

  1. 上のサンプルプログラムから「;」 を抜かすと正しいプログラムでなくなり、コンパイル時にエラーメッセージが出る。 これを体験せよ。 閉じるほうの二重引用符を抜かしたらどうなるか。
  2. 同様に、最後の中カッコ閉じを抜かしてみよ。
  3. 上のサンプルプログラムから \n を取り除いたプログラムを作れ。 (作って終わり、ではない。コンパイルし、実行し、結果を確認すること。 以下同様。)
  4. 「hello, 」と「world\n」 の二度に分けて出力したらどうなるか。プログラムは
        printf("hello, ");
        printf("world\n");
    
    のようになる。
  5. 「hello, world\n\n」と出力し、 次に「hello, world\n」を出力するようなプログラムを実行したら、 全体の出力結果はどうなるか。 プログラムを書きながら予想し、 それからプログラムを実行して、納得するまでよく考えよ。

(12.17) 練習問題(第二部)

  1. 「こんにちは、世界」のような、 適当な日本語を出力するプログラムを書け。
  2. printf の前のあきは半角スペースかタブでなければならないが、 もしも間違えて全角スペース 「 」にしてしまったらコンパイラはどのようなエラーメッセージを出すか、 試してみよ。
  3. 文字列を囲む二重引用符は半角でなければならないが、 (いわゆる)日本語(←全角文字のこと) を入力した直後には間違えて全角の二重引用符を打ってしまうことがある。 そうしたらコンパイラはどのようなエラーメッセージを出すか、 試してみよ。
  4. 最後の中カッコ閉じは半角でなければならないが、 もしも全角(「}」)だったらどうなるか。

§13 これから学ぶいろいろな要素を取り込んだプログラム

(13.1) プログラムの実行を中止してプロンプトに戻りたいときは Ctrl+C を押す。 途中でいったんとめて様子をみるときは Ctrl+S を押す。 任意のキーで再開する。

(13.2)

#include <stdio.h>

main() {
    int i;

    for (i = 0; i < 10; i++) {
        printf("%d の二乗は %d です.\n", i, i*i);
    }
}
(13.3) まずこのプログラムをざっと理解したうえで、 実行してみよう。(ソースファイル名は適当に。)

(13.3) 「int i;」とあるのは int 型変数の宣言。 整数に値をとる変数 i を使うよ、と宣言している。

(13.4) for( ; ; ) は繰り返し。 「i が 0 から始めて」 「i が 10 未満である限り」 「i を一ずつ増やしながら」、次の中カッコの中の文を繰り返す。

(13.5) printf() の " " の中の %d は 後ろの式の値で置き換わって出力される。

(13.6) 次に、これを改造してみよう。

やり方でわからないことは担当教員に聞くこと。

(13.7) 注意: プログラムの実行時に 「セグメントエラー (coreを出力しました)」というエラーメッセージが出たら、 core.????(「?」は数字)という名前のファイルができている。 このファイルは場所ふさぎなだけなので、 なるべく早く削除すること。 このエラーはコンピュータに害をおよぼすものではないが、 プログラムに重大なミスがある、ということである。


岩瀬順一