電子計算機及び実習 第 12 回 (1/8)
12 C プログラミング
12.1 今日のテーマ
*サンプルプログラム
*簡単なプログラムの作成
**今日の課題
課題12.1,12.2で作成されたファイル,test.txt, prog1.cを添付したメールを,s-suzuki宛に署名をつけ て送信せよ.
12.2 はじめに
今回は C言語というプログラミング言語 によるプログラミングの基礎事項を概観するが,このレジュメだけ では説明しきれない部分が多くある.詳しいことは文献をあたってほしい.Cの参考書は数多く出版されており,
何を読んでも基本的には問題ないと思う.ここでは,Cの原作者による以下の本をあげておく:
カーニハン&リッチー「プログラミング言語 C第2版」
プログラミングは,計算機にやらせたいことを実行するプログラムを作成するための作業であり,主として,プ ログラムの設計・ソースファイルの作成・コンパイル・実行・デバッグの5つの作業からなる.
第1段階 のプログラムの設計は,文字通り,どのようなプログラムを作りたいのか,どのような仕様にするの かを考案する段階である.
第2段階 のソースファイル(プログラムリスト,プログラム,ソースなどともいう)の作成は,設計に基づい て,計算機にやらせたい命令をエディター上でプログラミング言語を用いて記述しファイルに保存する段階であ る.プログラミング言語は,その名の通り,プログラミングに使用する比較的人間に分かりやすい言語である.プ ログラミング言語には,BASIC, Pascal, java, C++, Fortranなどいくつもの種類があり今回使用するC言語も そのひとつである.
第3段階 のコンパイルとは,人間にわかる言葉で書かれたソースファイルを,計算機が実行できる形式に変換 する作業である.この変換に用いるコマンドをコンパイラーと呼ぶ.今回は Cのコンパイラーとして gccとい うコマンドを用いる.コンパイルの段階で,ソースファイルがプログラミング言語の文法に従っていない場合な どに,様々なエラーが出てコンパイルが完了しない場合がある.このようなエラーをコンパイルエラーとよぶ.
第4段階 の実行は,コンパイルして出来上がった実行形式のファイルを,実際に実行する段階である.実行し た結果,無限ループに陥る,0での割り算をするなど,様々な理由によるエラーや不具合が生じることもある.
第5段階 のデバッグとは,第3段階や第4段階で生じたエラーや不具合を修正する作業である.
コンパイルや実行の過程でエラーが出力されたり不具合が生じた場合は,その部分をエディター(Emacs)を 使って修正し,再びコンパイル・実行を行う.エディターを用いてソースファイルを作成し,コンパイラでコンパ イルし,出来たコマンドを実行する,というのがプログラミングの基本的な流れである.これは,すでにTEXの 原稿を作成するときにも,同様の流れを体験しているので,それと比較して考えればわかりやすいであろう.な お,通常,Cプログラムのソースファイルには.cという拡張子を付ける.
今日の作業は,ホームディレクトリ下に,srcというディレクトリを作って行うことにしよう.以下を実行し
なさい.
% cd
% mkdir src
% cd src
12.3 サンプルプログラム
情報教育環境には,Cの概要を学ぶためのサンプルプログラムが幾つか用意されている.まずは,それらをコ ンパイルして実行してみよう.「手引き」のPart III第9章も参照しながら,以下の作業を行いなさい.
srcディレクトリの下で,以下のコマンドを実行しなさい53.
% mksamp c
これによって,srcディレクトリに,7つのファイル(samp1.c,samp2.c,samp3.c,samp4.c,samp5.c,samp5.dat, samp6.c)が作成されるはずである.
% ls
として,これを確認しなさい.
以下を順次実行しなさい.
コンパイル
% less samp1.c
% gcc -o samp1 samp1.c
% ./samp1
第1行目で,samp1.cの中身を確認し,第2行目でsamp1.cをコンパイルしてsamp1 というコマンドを作成 し,第3行目でできたコマンドを実行している.gccのオプション-o samp1はsamp1という名前で実行形式の ファイルを作れと言う意味である.
コンパイルエラーを体験しよう.以下を順次実行しなさい.
コンパイルエラー
% less samp2.c
% gcc -o samp2 samp2.c
コンパイルエラーが出力されるはずである.このようなエラーが出力された場合には,ソースファイルを修正 して,再びコンパイルしなくてはならない.「手引き」を参考に,実際にEmacsでsamp2.cを修正して,コンパ イル・実行してみよ.
次に,実行時にエラーの出るプログラムの例を見てみよう.以下を順次実行しなさい.
実行時のエラー
% less samp3.c
% gcc -o samp3 samp3.c
% ./samp3
このプログラムは,標準入力(キーボード)から入力された整数で10を割った結果を標準出力(モニター)に 出力する.1,2,−4, . . . など0以外の(比較的小さい)整数を入力している場合にはエラーは生じないが,0を入 力するとエラーを生じることになる.実際に,標準入力から0を入力してみよ.
実行時にエラーが生じた場合にも,やはり,ソースファイルを変更して,エラーが生じないようにせねばなら ない.「手引き」では,samp3.cをsamp4.cのように修正している.以下を順次実行しなさい.
ソースファイルの修正
% less samp4.c
% gcc -o samp4 samp4.c
% ./samp4
0を入力してもエラーが生じないことを確かめなさい.
53このコマンド(% mksamp c)は教育環境で特別に用意されたコマンドであり,他のシステムでは通用しない.
上のsamp3.c,samp4.cでは,標準入力から数値を読みとって標準出力に数値を出しているが,ファイルから 入出力することもできる.その例がsamp5.c, samp6.cである.以下を順次実行せよ.
% less samp5.c
% less samp5.dat
% gcc -o samp5 samp5.c
% ./samp5
% less samp6.c
% gcc -o samp6 samp6.c
% ./samp6
% less samp6.out
12.4 簡単な C プログラムの作成
12.4.1 最も簡単なC プログラム
以下の内容を,Emacsを用いてhello.cというファイルに書き込みなさい.
#include <stdio.h>
main(){
printf("Hello, world.\n");
}
このソースファイルをコンパイルして実行してみよう.以下を行いなさい.
% gcc -o hello hello.c
% ./hello
第1行目でコンパイル,第2行目でプログラムの実行を行っている.gccがコンパイラの名前で,-o helloは,
hello という名前で実行形式のファイルを作れという意味である.
12.4.2 hello.c の説明
Cのプログラムは複数の関数と呼ばれる小さな機能のまとまりを組み合わせることで書かれる.ソースの第1
行目はstdio.hというファイルを読み込みなさいという意味で,この操作によって,Cで標準で用意されている
関数群の一部(printf もその一つである)が使えるようになる.Cプログラムを書く際必要なオマジナイだと思っ てもよい.
Cプログラム中の関数の中で,mainという関数は特別な関数である.mainは,一つのプログラムを作る際に 必ず一つ,ソースファイル中に用意されなくてはならず,main関数の中で,そのプログラムが実行する命令文が 順に書かれることになる.mainの中に限らず 一つの命令文の終わりには必ずセミコロン ;を付ける.
printfは,ダブルクオートで挟まれた部分をモニターに出力する.また,\nは改行文字を表す.
12.4.3 test.c
次に,以下の内容を,Emacsを用いてtest.cというファイルに書き込みなさい.
#include <stdio.h>
/* ここ以下がメイン関数 */
int main(){
int i,j; /* i,jはint型の変数である */
double x,y,z; /* x,y,zはdouble型の変数である */
i = 36; j = 7; /* i,jに数値を代入 */
x = 1.0; y = -2.0; z = 2.343e7; /* x,y,zに数値を代入 */
printf("i=%d j=%d x=%f y=%f z=%f\n", i, j, x, y, z);
printf("i+j=%d i*j=%d i/j=%d j/i=%d i mod j=%d\n", i+j, i*j, i/j, j/i, i%j);
printf("x+y=%f x*y=%10.8f x/y=%g 1000*y-z=%g\n", x+y, x*y, x/y, 1000*y-z);
for(i=1;i<=10;i++){
x += 3.14;
}
printf("%f\n", x);
return(0); /* 正しく終了したという意味.これは作法 */
}
このソースファイルをコンパイルして実行してみよう.以下を行いなさい.
% gcc -o test test.c
% ./test
課題 12.1 testの出力結果を,test.txtというファイルに保存せよ(リダイレクト(>)を使えばよい).
12.4.4 test.c の説明
簡単にtest.cの内容を説明しよう.
/*と */で囲まれた部分はコメントとして扱われる.
Cには何種類かの変数の型があり,char, int, float, doubleなどがそれである.char, intは整数型,float, double は実数型であり,データのサイズは,charが1バイト,intが4バイト,floatが4バイト,doubleが8バイトと なっている.cahrは1バイト文字を,intは整数を,float, doubleは実数を表す変数に用いられる.また,変数 の名前に用いることができる文字は,A–Z, a–z, 0–9, (アンダーライン)であり,変数名の長さに制限はない.int
main()の intというのは関数main の返り値がint型であるという意味である.また,
int i,j; /* i,jはint型の変数である */
double x,y,z; /* x,y,zはdouble型の変数である */
は,変数宣言とよばれる箇所であり,main 関数中で使われる変数を全て列挙し,その変数がどういう種類のもの であるかを定義している.このプログラムでは,i, jはint型,x, y, zはdouble型であると宣言している.
i = 36; j = 7; /* i,jに数値を代入 */
x = 1.0; y = -2.0; z = 2.343e7; /* x,y,zに数値を代入 */
=は代入を表す.i, jに整数を代入し,x, y, zに実数を代入している.実数の表現としては,2.343e7 (= 2.343×107) のようなものも使える.
printf("i=%d j=%d x=%f y=%f z=%f\n", i, j, x, y, z);
printf("i+j=%d i*j=%d i/j=%d j/i=%d i =%d (mod j) \n", i+j, i*j, i/j, j/i, i%j);
printf("x+y=%f x*y=%10.8f x/y=%g 1000*y-z=%g\n", x+y, x*y, x/y, 1000*y-z);
というのが,test.cの主内容である.標準出力54に順に,i, j, x, y, zの値,i+j, ij, i/jの整数部, j/iの整 数部, i/jの余り,x+y, xy, x/y, 1000y-zを書き出せという意味である.printfは標準出力への書き出しを行 う関数であった.最初の引数で,標準出力に出力する2番目以降の引数の型と出力フォーマットを指定する.%d は int,%f, %gはfloatもしくは doubleであり,例えば,%10.8fは実数を小数点以下8桁の全10桁で表示せよ という意味になる.
for(i=1;i<=10;i++){
x += 3.14;
}
printf("%f\n", x);
の部分は,i が 1 から 10 になるまで,x+ = 3.14 を実行し,その結果を出力せよという意味である.ただし,
x+ = 3.14とは,変数xに 値x+ 3.14を代入する,という意味である.
課題 12.2 キーボードから整数値kを入力したら,
∑k
n=1
1
n2 の値を標準出力またはファイルに出力するプログラム
prog1.cを作りコンパイルして,実行せよ.また,k= 10の場合の結果をメモしなさい.
ヒント. Cを初めて扱う者は,なかなか思い通りに動くプログラムは作れないだろう. 本節の説明を良く読み,こ れまでのサンプルプログラムの挙動を良く理解すれば,上記のプログラムは作れるはずである.
12.5 本日の課題
課題12.1,12.2で作成されたファイル,test.txt, prog1.cを添付したメールを,s-suzuki宛に署名をつけ て送信せよ.ただし,Subjectは 「学籍番号+Jan08」とせよ.また,メールの本文に,課題12.2でメモした値 および添付したファイルの名前を明記しなさい.
54UNIXには標準入力(stdin,通常キーボード),標準出力(stdout,通常ディスプレー),標準エラー出力(stderr,通常ディスプレー)と いう3種類の入出力が用意されている.