まず手始めに、データ入力も算術式計算もなく、決められた文字列を出力するだけのプ ログラムを例示しよう。
例題 5.1 (決められた文字列を出力) 単に
Introduction to C Programming と出力するだけのCプログラムを作成せよ。
この処理のためのアルゴリズムは至って簡単で、
右図の通りである。この処理を行うCプログラム と、これをコンパイル/実行している様子を次に示
す。 (下線部はキーボードからの入力を表す。)
開始
終了 出力
"Introduction to C Programming"
[motoki@x205a]$ nl output-constant-string.c Enter... (ファイル表示) 1 /* 決められた文字列 "Introduction to C Programming" */
2 /* を出力するだけのCプログラム */
3 #include <stdio.h>
4 int main(void) 5 {
6 printf("Introduction to C Programming\n");
7 return 0;
8 }
[motoki@x205a]$ gcc output-constant-string.c Enter... (コンパイル) [motoki@x205a]$ ./a.out Enter... (実行)
Introduction to C Programming [motoki@x205a]$
ここで、
• “[motoki@x205a]$ ”はコマンドラインに表示されるプロンプト(i.e.キーボードから
の入力を促す文字列)である。'
&
$
% 注意:
この講義ノートで提示するプログラム実行はほとんどが実習室 外の計算機によるものです。 そのため、プログラムによっては 実行結果が実習室でのものと少し違うこともあり得ます。
• nl は文書ファイルを行番号付きで表示するためのコマンドです。行番号はプログラ ムの各行を説明するために付けただけで、実際のプログラムは次の部分になります。
/* 決められた文字列 "Introduction to C Programming" */
/* を出力するだけのCプログラム */
#include <stdio.h>
int main(void) {
printf("Introduction to C Programming\n");
return 0;
}
• プログラムは100文字程度以内の行を縦に並べて表示されることが多いので、プログ ラムは2次元的な構造を持つように見える。 しかし、Cプログラムは1次元的な文字 の並びとして読み込まれ処理されるだけである。 実際、#で始まる行、2重引用符
(")で囲まれた部分を除いて、空白(半角), Tab文字, 改行文字 が多数連なっていて
もそれらは両側を区切る働きしかしない。 それゆえ、例えばプログラムの4〜8行目 の部分は、1行にまとめて
int main(void){printf("Introduction to C Programming\n");return 0;}
と書いても実行結果は変わらない。
'
&
$
% 字下げ(indent):
では、なぜ余分な 半角空白, Tab文字, 改行文字 をプログラムの中に挿入するの かと言うと、それは我々人間のプログラムの見易さのためである。 コンピュータ にとっては1次元的なものであっても、コンピュータが実行するアルゴリズム/
処理手順は元々は構造を持ったものであるので、その構造を 改行 や空白を用い て2次元的に表す。例えば、
3 2つ以上の基本処理を1行の中に詰めることはしない。
3 処理手順の中に条件分岐があれば、その分岐の構造をすぐにプログラムから 読み取れるように、分岐後の処理の部分を一律に何文字分か右にずらして表 示する。
3 処理の繰り返しがあれば、その繰り返し構造をすぐにプログラムから読み取 れるように、繰り返し部分を一律に何文字分か右にずらして表示する。
この「何文字分か右にずらして表示する」ことを字下げ(indent)と呼ぶ。字下 げの仕方には、プログラムを書いた人がプログラムの構造をどう見ているかが反 映される。
=⇒字下げのちゃんと出来ていないプログラムに関しては、それを書いた 人がちゃんとアルゴリズムを理解しているかどうかが疑わしくなる。
半角空白, Tab文字, 改行文字 等を総称して空白類と呼ぶ。
5.1. 決められた文字列の出力 35
• プログラムの1〜2行目 は注釈。 (“/*”と “*/”で囲まれている。)
• プログラムの4〜8行目 はひとまとまりの処理を表す。このうち4行目は処理の名前 等を明示した部分、5〜8行目は処理の中身の部分である。 C言語においては、こ の様な「ひとまとまりの処理」のことを関数(function)と呼び、それを記述した4〜8 行目の様な部分を関数定義と呼ぶ。そして、この様な関数の定義を並べたもの(に何 行か追加したもの)がプログラムになる。プログラム起動の際は main という名前の 関数から実行を始めることになっている。
• プログラムの4行目 には、関数の名前が mainであることと共に、関数の処理を実行 する前に予め受け渡されるデータがないこと(”void” の部分)、関数の処理結果とし て整数データがプログラムを起動した側に報告されること(最初の ”int” の部分)が 明示されている。
• プログラムの3行目 は、/usr/include/stdio.h というファイルの中身をこの場所 に挿入してコンパイル作業を行うことを指示する。 stdio.h が標準に用意されて
いる(ヘッダ)ファイルであることを示すために< と > でファイル名を囲っている。
[/usr/include/stdio.hの中に、6行目で呼び出される出力関数 printf の引数の型
(i.e.括弧内で与えるデータの内部表現方式)、関数値の型等の情報が入っているので、
それを読み込む。]
• プログラムの6行目 は、標準ライブラリの中に用意されている書式付き出力の関数
printf を呼び出している。2重引用符で囲まれた部分が出力書式になっており、6行
目の様にこの中に%文字が現れない場合は、この部分の文字列がそのまま出力される。
但し、出力書式中の \n は改行を意味する。
• プログラムの7行目 は、プログラムが正常終了したことを報告するために、main() 関数を起動した側に整数値 0 を戻している。(戻り値 0が正常終了を、0 以外が異常 終了を表す。)
• gcc はC言語のコンパイラ(compiler;i.e.人間に分かり易い言語で書かれたプログラ ムを機械語のプログラムに翻訳するソフトウェア)を起動するコマンドです。-oオプ ション で実行ファイルの名前を指定しなければa.out という名前の実行ファイルが デフォルトで作られます。
補足:
実習室ではgccの他にccコマンドも使えます。
• コマンドライン上の./a.out は出来上がった(a.outという名前の)機械語プログラ ムを起動している所です。
□演習 5.2 (文字列の出力) ”Hello World!”と画面に出力するだけのCプログラムを作成 せよ。