2004 年度「計算機基礎論3B」 2004-10-15

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

emacs の設定

emacs hello.c &」としてみよ。 起動された emacs の一番下に 「Loading cc-mode...done」と出たであろう。 そのうえの灰色の帯状の部分には hello.c というファイル名のほかに「C Abbrev」と書かれている。 いったん emacs を終了する。

次に 「cp -ip ~cf5326/.emacs .」を一度だけ実行する。

次に「emacs hello.c &」として、 「Loading cc-mode...done」が出ず、 「C Abbrev」の代わりに「Fundamental」と書かれていれば成功である。

注: これは、ユーザ cf5326 の設定ファイル .emacs を諸君のところへコピーしたことにあたる。 ほかにも変わった点がいくつかあるのだが、何だろうか?

ファイルマネージャについて

デスクトップの左上にある「... のホーム」 をダブルクリックすると File Manager が起動する。 この中でファイルのコピー、改名、削除などができる。 それぞれのやりかたは順に説明してゆく。

初めてのCプログラム

== hello.c =====================================================================
#include <stdio.h>

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

「ソースファイル」「実行ファイル」「コンパイル」「コンパイラ」 「字下げ」「インデント」については口頭で説明する。 バックスラッシュ「\」と円マーク「¥」は、 半角文字では同じものと思ってよい。

  1. 上を内容にもつ、hello.c という名前のファイルを作る。 (具体的に言えば「emacs hello.c &」として emacs を起動し、 上の内容を打ち込み、保存・終了する。)
  2. gcc hello.c」としてコンパイルする。 うまくゆけば a.out ができる。
  3. ./a.out」でプログラムを実行する。

K&R2 の §1.1 を合わせて読むこと。

注意: 教科書では cc とあるがここのシステムでは gcc である。 実行させる際、a.out の前の ./ に注意。 a.out から(たとえば)hello という名前に改名した場合は、 「./hello」として実行する。 (改名は、File Manager 内で「選択」 (=そのファイルのアイコンをクリックしてアイコンの色を変えること) し、それから「編集」「名前変更」。)

注意: インデントは Tab キーを押してタブを挿入して行なうのが最も簡単である。 ホームページではスペース四つがはいっているので、 ホームページからコピー&ペーストした場合はスペース四つになるが、 コンパイル結果には影響しないので気にしなくてよい。

練習問題(第一部)

  1. 上のサンプルプログラムを内容とするファイル hello.c を作り、コンパイルし、できた実行ファイル a.out を実行せよ。 (以下ではソースファイル名は指定しない。適当につけること。 hello.c の内容を次々と変更していっても構わない。)
  2. 上でできた実行ファイル a.outhello と改名してから実行してみよ。
  3. 上のサンプルプログラムから「;」 を抜かすと正しいプログラムでなくなり、コンパイル時にエラーメッセージが出る。 これを体験せよ。 閉じるほうの二重引用符を抜かしたらどうなるか、などもやってみよ。 (emacs をいちいち終了しないやり方にも慣れるとよい。 保存は「File」「Save (current buffer)」で行なえる。)
  4. 同様に、最後の中カッコ閉じを抜かしてみよ。
  5. 上のサンプルプログラムから \n を取り除いたプログラムを作れ。 (作って終わり、ではない。コンパイルし、実行し、結果を確認すること。 以下同様。)
  6. 上のサンプルプログラムを元に、 「hello, 」と「world\n」 の二度に分けて出力するプログラムを作れ。 (ヒント:
      printf("...");
      printf("...");
    
    のようになる。)
  7. hello, world\n\n」と出力し、 次に「hello, world\n」を出力するようなプログラムを実行したら、 全体の出力結果はどうなるか。 プログラムを書きながら予想し、 それからプログラムを実行して、納得するまでよく考えよ。

練習問題(第二部)

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

ごく簡単な計算

== tasizan.c ===============================================
    /* たし算  1990-04-28, written by Iwase */

#include <stdio.h>

main() {
    int a, b, sum;                /* 変数の宣言 */

    a = 2;                        /* 代入 */
    b = 3;
    sum = a + b;

    printf("%d たす %d は %d です.\n", a, b, sum);
}
============================================================

よって、出力は「2 たす 3 は 5 です.」のあと改行、となる。

練習: 0 で割り算をするとどうなるか、試しなさい。 具体的には、次をやってみなさい。

注意:「core を出力しました」と言われたら、 core.????(「?」は数字)という名前のファイルができている。 このファイルは場所ふさぎなだけなので、 なるべく早く削除すること。 (削除は、File Manager 内で「選択」してから「編集」「ゴミ箱へ移動」。 これでは単にゴミ箱に移動しただけなので、 デスクトップの「ゴミ箱」をダブルクリックして開き、 本当に削除してよいことを確認してから「ファイル」「ゴミ箱を空にする」 とすれば本当に削除される。)

ユーザに数を入力させる

============================================================
#include <stdio.h>

main() {
    int a, b;

    printf("数を入れてください.\n");
    scanf("%d", &a);                        /* 数の入力 */
    printf("もう一つ数を入れてください.\n");
    scanf("%d", &b);
    printf("%d たす %d は %d です.\n", a, b, a+b);
}
============================================================

「数の入力」の行。 ここでプログラムは止まってキーボードからの入力を待つ。 変数名 a の前に & がついて &a となっていることに注意。 なぜ & が必要かは、いまは説明できない。

scanf() は K&R2 §7.4 でくわしく論じられているが、 いま読んでもむずかしいだろう。

分岐

============================================================
#include <stdio.h>

main() {
    double a, b;

    printf("数を入力してください.\n");
    scanf("%lf", &a);
    printf("もう一つ数を入力してください.\n");
    scanf("%lf", &b);
    if (b == 0) {                               /* if による分岐 */
        printf("0 では割れません.\n");
    } else {
        printf("%f 割る %f は %f です.\n", a, b, a/b);
    }
}
============================================================

double 型は浮動小数点数(i.e. 小数点以下がある数) を格納する型のうちの代表的なものである。 intdouble について、 入出力のしかたをまとめておく。

入力出力
intscanf("%d", &a);printf("%d", a);
doublescanf("%lf", &a);printf("%f", a);

if による分岐」の行からの5行。

    if (条件1) {
        文1
    } else {
        文2
    }
は次のように動作する。 「条件1をまずチェック。 それが真ならば文1を実行し、文2は飛ばして先へ進む。 条件1が偽ならば文1は飛ばし、文2を実行して先へ進む」。

    if (条件1) {
        文1
    } else if (条件2) {
        文2
    } else if (条件3) {
        文3
    } else {
        文4
    }
は次のように動作する。 「条件1が真ならば文1だけを実行する。 条件1が偽で条件2が真なら文2だけを実行する。 条件1も条件2も偽で条件3が真ならば文3だけを実行する。 条件1も条件2も条件3も偽なら文4だけを実行する」。 文のうち一つだけが実行されることに注意。

(この項、続く)


岩瀬順一