第1編:プログラミングについて

第1章:まず初めに

更新:1998年10月8日23時32分

1.1 まず簡単なCプログラム

2+3=5

 もし読者の手元に計算機があってC言語の処理系(コンパイラ)があれば, [例題1.1] のプログラムを入力してコンパイルして実行してみて下さい. 結果は

  2 + 3 = 5

と出ると思います.処理系によっては

    2 +    3 =    5

と表示されるかもしれません.しかし,いずれで表示されても2たす3が5である ことを示しています.このプログラムの詳しい説明は3章以降に述べるとして, ここではたかが 2+3 の値を求めるのでさえこのように,普通の人にとっては大 変なC言語の言葉が必要な事が分かると思います.

文法エラーは恐くない

 また,プログラム入力して実行した方は, よほど好運でない限り何度かは,コンパイラからエラーだと怒られたと思います. 計算機に対する不信は大体このあたりから生じる事が多いようです. 心配する事はありません. このエラーはあなたが悪いのではなくて(少しは悪いのですが), 計算機に分かる言葉以外は受け付けないC言語のような計算機言語と コンパイラ等の処理系と呼ばれているものが悪いのです. 最近では,処理系が人間に対してフレンドリになってきて, 賢く注意してくれたり訂正してくれたりするようになっています. ですから,コンパイラに叱られていると思うよりは, 簡単な文法のチェックは計算機にさせて, 人はもっと高等なアルゴリズムやデータ構造の構成法に力を注ぐべきだと考えて下さい.


[例題1.1]

#include <stdio.h>

main()
{
    int add1 = 2;
    int add2 = 3;
    int sum;

    sum = add1 + add2;
    printf( "%d + %d = %d\n", add1, add2, sum );

    exit( 0 );
}

 最初からあらぬ方向に行きそうなので,プログラムに話を戻しましょう. [例題1.1] は 2+3 を計算して表示するものでした. それでは,4+2 はどうしましょう. 簡単には,プログラム中の2と3を,4と2に変えればいいのですが, もう少し頭を働かせて,[例題1.2] のプログラムを考えてみましょう.


[例題1.2]

addition( add1, add2 )
int add1, add2;
{
    int sum;

    sum = add1 + add2;
    return( sum );
}

 このプログラムはC言語では関数(function)と呼ばれるものです. 厳密な定義は後の章に譲るとして, C言語はこのような関数が集まって出来たものだと思っていただいて良いでしょう. この関数の addition を使うと[例題1.1]は


[例題1.3]

#include <stdio.h>

main()
{
    int add1 = 2;
    int add2 = 3;
    int sum;

    sum = addition( add1, add2 );
    printf( "%d + %d = %d\n", add1, add2, sum );

    exit( 0 );
}

となります.プログラムをみれば分かるように

    add1 + add2

が,

    addition( add1, add2 )

になったわけで,わざわざこのような関数を使わなくとも良さそうですが, ここでは取りあえずこのようにも書けると理解して下さい.


1.2 計算機とプログラム

プログラム言語とは

 なぜC言語を覚えるのでしょうか. 授業で必要だからとか,仕事で使うからとか返事が返ってきますが, 現在の計算機がC言語程度の言葉しか理解しないからと考えてもいいし, 逆に言うと,このようにここまで言ってやらないと 動作しないと思ってもらっても良いでしょう. ではなぜ計算機を使うのでしょうか. これには多くの答えが返ってきそうですが,私は

   「自分の考え方を表現する1つの道具」

だと思っています.前節では足し算を例にして説明しましたが,

   「2たす3の答えは」

という質問,または

   「2たす3は5である」

ことを表現するための手段としてC言語でプログラムを書いたものです. このことなら電卓でも出来ると言われれば,答えは「そうです」となります. では次の問題はどうでしょう.

手続き型言語

 与えられた自然数nに対して,nが100以下なら100を出力し, nが100より大きければ下2桁を切り捨てて出力しなさい.

 この問題ではnが85なら100が出力されますし,nが452なら400が出力されます. このような事はプログラム機能のない電卓では出来ないか難しいかでしょう. C言語は一般的には手続き型言語と言われて,

のように順に処理(逐次処理)したり,

という風に選択して処理(選択処理)したり,

のような繰り返し処理を動作の基本としています.

 この三つの組合せに,更に制限されたジャンプを許しながら, 要求したものを計算機に実現してもらおうとして, 人と計算機の間で計算機用言語として取り決められた言語の一つがC言語です.

普通の言葉とは違う

 計算機用言語であって, いわゆる自然言語と計算機の世界で呼ばれる普通の言語ではありませんから, 言われたことしか出来ない (但し,故障しない限り間違わない)計算機のために, 人間よりは計算機の都合に良いように 文法が記述されているのはしかたがないことです.

構造化言語

 機械語--アセンブリ言語--COBOL・FORTRANと進化した計算機用言語が, PascalやC言語の出現を許したのは,COBOLやFORTRANが, プログラマの考え方の混乱をそのままプログラムに許す 無条件ジャンプを使わなければ書きづらくなっているからです (そのようなプログラムをスパゲッティ・プログラム \index{スパゲッティ・プログラム}と呼びます).

 上に述べた三つの基本的な処理の組合せから プログラムを構成しようとしたのはPascal言語ですが, 教育用として当初考えられており文法が定義されているので, このPascalの良いとこ取りをして簡潔に, かつハードウェアを意識して記述出来るようにしたのがC言語だと言えます.

オブジェクト指向言語

 また,手続き型言語の不備を補うために, 最近ではオブジェクト指向言語も出てきています. C言語もその流れを沿って進化させるため,C++と言う言語が提案され 現実に使われています. この本の範囲はそこまで及びませんが, 9章でオブジェクト指向の持つ性質の1つである 抽象データ型について簡単に述べることにします.

目的に合わせたプログラミング

 プログラムは既に目的に合わせて選ぶ時代になっています. 更に言うなら,計算機は目的に合わせてマシンやソフトウェアを 選ぶ時代になっており,いずれはCプログラムは 本当に専門の人以外には書かないようになるでしょうが, 手続き型の考え方の基本や計算機の仕組みを知るにはC言語は 良い言語だと言えます.


1.3 データと手続き型言語

データの名前

 手続き型言語では処理の手順が考え方の基本ですが, プログラムを構成する上でもう1つの大切なものはデータです. もう1度,[例題1.1] のプログラムに帰ってみましょう.このプログラムでは,

   int add1; 足される数
   int add2; 足す数
   int sum;  合計

の3つのデータがあります. このデータは処理がなければ単に三つの整数です. [例題1.1] のプログラムはこの三つの整数にそれぞれ, 足される数,足す数,合計の意味を与えています.C言語の文法では

   int x;
   int y;
   int z;

としても間違いではありません.また,

   int i;
   int ii;
   int iii;

とFORTRANをやっていた人はするかも知れません. 理由はキーインが速いことだと言うかも知れません. しかし,プログラムの理解から考えればとんでもない話しです. 文法としては正しくて計算機がどの場合でも正しい答えを出してしまうのが, C言語などの計算機用言語の限界です.


1.4 考え方を自然に表現する

心が計算機になっていませんか!

 プログラム言語を習うときに文法から入り, とにかく正しく動作するプログラムを作ろうとしたり, 作らせようとするのは余り良いやり方ではありません. たとえば,[例題1.2] の代わりに [例題1.4] のようにしても関数名が変わって, 内部の変数名も変わっただけで, 計算機からの処理から見て何も変わっていないのですが, 人間の目からは, このCのプログラムを見たときには全然違うと言う気持ちが大事です. 同じだと言う人は 既に心が少し計算機になっているかも知れませんから注意して下さい.:-)


[例題1.4]

a( i, j )
int i, j;
{
    int k;

    k = i + j;
    return( k );
}

考え方を自然に

 考え方を自然に表わすには, 日本語なり英語なり自然語で記述すれば良いわけで, それが論理的に記述されていればプログラムに直すにはそれほど難しくはありません. これはプログラムにおいて,変数名や関数名を分かりやすくしたり, 単なる数ではなくて定数表現を使ったり,コメントをうまく付けることで実現で きます.

プログラムを読み易く

 逆に言うと,プログラムを読み易くすることが良いプログラムだと言えます. 読み易いと言うことは,他人から分かり易いと言うことだけでなくて, 自分に取っても読み易いことが大事です. 自分だけが読むから何でも良いと言うのは間違った考え方で, たとえ自分のプログラムでも1カ月以上経てば 細かいところまでは覚えていないものですから困ることがあるでしょう.

簡単すぎる名前

 よく学生のプログラムを見ていると, i だとか i1 だとか, x だとか xxx のような変数名を使っています. キーを打つのが簡単だと言うのも理由の1つですが, そのときは,打つのは1度だが見直すのは 数度とか数十度だから分かりやすい方が良いし, それに最近のエディタは優秀だから,名前の変換ぐらい簡単にやってくれます. もっともなかなか英語の名前が浮かばないという理由もあるようですが.


1.5 C言語の特徴

 C言語の特徴は

等,Pascalと同じように,FORTRANやCOBOLにない新しい機能を持っていますが, これらは今では当然の機能です.

C言語とアセンブリ言語

 C言語はアセンブリ言語をやった人には分かり易いと言われています. これはCのプログラムがどのような機械語に変換されるかが, アセンブリ言語でプログラムした人には直感的に分かるようです. これは,もともとアセンブリ言語でプログラムする人も, 選択処理や繰り返し処理は頭に描いて, もっと言えばC言語程度の簡単な制御構造は考えているわけです. また,ポインタやアドレスの考え方は, アセンブラでは変数の処理には必須ですから分かりやすいでしょう.

計算の効率

 C言語は機械語を効率よく生成するために, 多くの演算子を用意しており, 分かり易さを犠牲にしても効率を上げようとする所があるので, その点については十分に配慮したほうが良いでしょう. 少々の効率を上げることを考えても実はほとんど効率が上がっていないことは, 現在の計算機技術の急速な進歩を見ていると良くありそうです. アルゴリズムやデータ構造の効率化はこの本の範囲ではありませんが, ぜひこの本と併読して欲しいものです
simpleかtrickyか

 Cのプログラムはコンパクトにも分かり易くも書けます. コンパクトなCプログラムはある意味でトリッキー(技巧的過ぎ)です. 良い意味では,コンパクトな記述は人間の知的探求心の現れだと思いますが, 他人からも理解しにくい場合が多く, C言語で始めてプログラムをする人はまず 分かり易くプログラムを書くことを心掛けたほうが良いと思います.


1.6 この本の構成について一言

 本書は,この部も含めて4つの部から成り立っています. この部はC言語も含めて計算機言語やプログラミングについて 一般的な事について書きました. すべての読者が,初心者は最初に, 計算機言語に慣れた人は適当な時に読めば良いでしょう. いずれにしても全員に読んで欲しい所です.

 C言語自体の入門と,その高度な使い方については, 第2部と第3部に分けて書きました. プログラムが最初の方は最低の線として 第2部は理解してもらえるようにして欲しいからです. 第3部は,ポインタと構造体等について書きました. C言語やPascalの演習ではかなりの(ほどんどとも言われますが) 学生が理解できずに落ちこぼれて行くからです. 第3部では更に抽象データ型の考え方もC言語と絡めて簡単に書いてみました. プログラムの構造化が既に当然となった今, 言語はオブジェクト指向の考えも当然の考え方として取り入れてくると思われます. C言語の手続き型言語の不備を埋める意味でも,是非一読して欲しい箇所です.

 第4部は,必要な時に読んで頂くために, ANSIに準拠したC言語の文法と標準ライブラリの関数を説明しました. ある程度プログラムのなんたるかを理解し, 更にC言語のあらましが分かった方(第2部と第3部が理解できて演習も出来た人)には, 必要なのはマニュアルになります. 簡単なマニュアルとしても使えるように, 索引や相互参照の印をしっかり入れたつもりです.