この文書の URL は http://www.cc.kyoto-su.ac.jp/~mtkg/lecture/comp_B/2012/09.html です。
C とは
C (シー)は1972年に UNIX のために作られたプログラム言語で、現在でも非常に広く使われています。 【Wikipedia の説明をみる】
教科書・参考書
C言語の教科書や参考書は非常に多く出ていますが、当たり外れが大きいので、アマゾンなどの書評を参考にして選ぶことをお勧めします。 以下に挙げた柴田先生の教科書は大変丁寧に説明が書かれているので、プログラムを試しながら読み進めばしっかりマスターできるでしょう。
- [新版] 明解C言語・入門編(柴田望洋,ソフトバンククリエイティブ)
同じシリーズで「中級編」「実践編」があります。
次の本はC言語の「バイブル」です。 これで勉強するといった本ではありませんが、C を使うなら手元に置いておくべきでしょう。
- プログラミング言語C・第2版・ANSI規格準拠(B.W.カーニハン・D.M.リッチー,共立出版)
実際のプログラミングでは、言語の規格や文法を遵守するだけでなく、効率のよい計算方法(アルゴリズム)を選択することが非常に重要です。 アルゴリズムの解説も多く出版されているので、読んでみることをお勧めします。
- C言語による最新アルゴリズム事典(奥村晴彦,技術評論社)
- Numerical Recipes with Source Code CD-ROM 3rd Edition: The Art of Scientific Computing (Press et al., Cambridge University Press)
C or Fortran 90?
気に入った方を使えばよいでしょう。 物理の計算に使うなら Fortran 90 をお勧めしますが、コンピュータ業界に興味のある人には C をお勧めします。
計算結果の表示
まずは計算結果を表示させてみましょう。
エディタを使って次のプログラムをそのまま打ち込んでください。
ファイル名は work0901.c
とします。
C では .c
という拡張子が用いられます。
全角文字と半角文字は区別されるので注意してください。
/*
と */
で囲まれたコメント部分を除き、C のプログラムは基本的にすべて半角文字で書かれます。
また、C では大文字と小文字も区別されます。注意しましょう。
/* work0901.c 19 と 71 の和を表示する。 */ #include <stdio.h> int main(void) { printf("15 + 17 = %d\n", 15 + 17); return 0; }
プログラムの作成と実行
コンピュータに計算を実行させるには、まずソースプログラムをコンピュータが理解できる形式に変換する必要があります。 この変換作業のことをコンパイル (compile) といい、変換作業を行うプログラムのことをコンパイラ (compiler) といいます。 C コンパイラには有料のものを含め多くの種類があります。 Ubuntu (Linux) では無料で入手できる GNU C コンパイラ(コマンド名は gcc であることが多い)が用いられています。
ターミナルから次のコマンドを実行してください。
先頭の %
はシェルのプロンプトなので入力する必要はありません。
% gcc work0901.c
コンパイルが正常に終了すると a.out
という実行可能形式のファイルが作られます。
これを実行すると、ソースプログラムに記述した計算が行われます。
% ./a.out 15 + 17 = 32
コメント(注釈)
ソースプログラム中の /*
と */
で囲まれた部分はコメント(注釈)です。
work0901.c
の例では先頭の4行がコメントです。
コメントにはプログラムの説明などを簡潔に記述しましょう。
プログラム本体とは異なり、コメントの中では日本語を使っても構いません。
プログラムの構造
プログラムからコメントを取り除くと次のような構造をしています。
#include <stdio.h> int main(void) { プログラムの本体 return 0; }
当面は「プログラムの本体」の部分を書き換えて、いろいろなプログラムを作ることにしましょう。
printf 関数
画面に情報を出力するには printf 関数を用います。 書式は
printf(実引数1, 実引数2, ..., 実引数n);
です。
printf には任意の個数の実引数を与えることができ、それぞれカンマ ,
で区切って並べます。
最初の実引数1には出力の書式を与えます。
これを「書式文字列」といいます。
work0901.c
の例では "15 + 17 = %d\n"
が書式文字列です。
%d
は「変換指定」と呼ばれ、続いて与える実引数の値を10進数で表示することを意味します。書式文字列中の変換指定でない文字は、基本的にそのまま表示されます。- 最後の
\n
は「改行」を表す特別な表記(拡張表記)です。\
とn
で「改行文字」という特殊な1文字を表します。
文 (statement)
printf 関数の呼び出しにはセミコロン ;
がついています。
return 0;
にもやはりセミコロン ;
がついています。
C ではセミコロンを付けることによって正しい「文」となります。 付け忘れに注意しましょう。
練習問題
19 から 71 を引いた値を画面に出力するプログラムを作成し、正しくコンパイル、実行できることを確認せよ。
ファイル名は work0902.c
とする。
変数の利用
プログラムの中で複雑な計算を行うには「変数」 (variable) を使う必要がでてきます。 変数は数値などを格納するための「箱」だと考えればよいでしょう。
C で変数を使うにはプログラムの冒頭で「宣言」を行う必要があります。
int nx;
この宣言によって nx という変数が用意されます。 この変数には整数値のみを格納することができ、 nx は int 型の変数と呼ばれます。 int は integer (整数)の略です。
変数名は英数字 a-z
, 0-9
と下線 _
を組み合わせて自由につけることができます。
ただし、1文字目は英字でなければいけません。
また、C では大文字と小文字が*区別される*ことに注意してください。
(例えば sum
, Sum
, SUM
はすべて異なる変数を表します。)
int 型の表せる値の範囲
int 型の表せる値の範囲は処理系によって異なることに注意してください。 32 bit の Linux 環境では
- 最小値:
-2147483648
- 最大値:
+2147483647
の範囲の整数を表すことができます。
変数を使ったプログラム
変数に値を代入し、それを表示するプログラムを作成してみましょう。
ファイル名は work0903.c
とします。
/* work0903.c 変数を使ったプログラム */ #include <stdio.h> int main(void) { int nx, ny; /* int 型の2つの変数 nx, ny を宣言 */ nx = 15; /* nx に 15 を代入 */ ny = nx + 48; /* ny に nx + 48 を代入 */ printf("nx = %d\n", nx); /* nx の値を表示 */ printf("ny = %d\n", ny); /* ny の値を表示 */ return 0; }
複数の変数を宣言
nx
, ny
という2つの変数を宣言するには変数名をカンマ ,
で区切って
int nx, ny;
とします。 行数は多くなりますが
int nx; int ny;
としても構いません。 適宜使い分けてください。
代入
代入記号 =
は「右側の値を左側の変数に代入せよ」という意味です。
上の例では、まず nx
に 15 が代入され、次に ny
に 63 が代入されます。
文字列リテラル
C ではクオーテーション "
で囲んだ文字列が文字列リテラルとなります。
"
は文字列の境界を示すデリミタ (delimiter) と呼ばれ、文字列リテラルには含まれません。
文字列の中に漢字を含めることはできません。(含められる場合もありますが、一般的ではありません。)
"I have a pen" "This is an apple"
拡張表記
printf 関数の書式指定に \n
と書くと、そこで改行されます。
\n
は「改行文字」を表す特別な表記です。
このような特別な表記のことを「拡張表記」 (escape sequence) といいます。
拡張表記には次のようなものがあります。
\n
: 改行文字を表す\"
: デリミタであるクオーテーションを表す\\
: \ を表す\a
: 警報 (alert) を発する\t
: タブ (tab) を表す
練習問題
3つの int 型変数 nx, ny, nz の値を表示するプログラムを作成せよ。
ファイル名は work0904.c
とする。
ただし、それぞれの値は次のように定めるものとする。
nx = 16; ny = nx + 18; nz = ny - 41;
nx
, ny
, nz
の値はいくつになるか?
printf 関数で3つの変数の値を表示するには次のようにすればよい。
printf("%d %d %d\n", nx, ny, nz);
キーボードからの入力
決まった数字だけを表示しても面白くないので、こんどはキーボードから値を読み込んで表示するプログラムを作成してみましょう。
ファイル名は work0905.c
とします。
/* work0905.c */ #include <stdio.h> int main(void) { int nx; printf("Input an integer: "); scanf("%d", &nx); printf("nx * 12 = %d\n", nx * 12); return 0; }
コンパイルしてプログラムを実行すると、画面にメッセージ Input an integer:
が表示され、入力待ちの状態になります。
値を読み込ませるには、キーボードから数字を入力し、リターンキーを押してください。
以下の例では 8 を入力してリターンキーを押しています。
% ./a.out Input an integer: 8 nx * 12 = 96
複数の値を入力する場合は、数値や文字列を空白で区切って入力します。
scanf 関数
キーボードから数値や文字列を読み込むには scanf 関数を利用します。 呼び出し方法は次のようになります。
scanf(実引数1, 実引数2, ..., 実引数n);
実引数の並びの意味は printf 関数の場合とよく似ています。
最初の実引数には読み込む際の書式指定を書きます。
さきほどの例では "%d"
でした。
これは「キーボードから10進数を読み込んで、続いて指定する変数に格納する」ことを示します。
この場合、改行文字 \n
は必要ないことに注意しましょう。
scanf 関数の実引数に指定する変数には &
という記号を付けます。
これは変数の「アドレス」(メモリ上の位置)を表す表記方法で、書式指定に従って読み込んだ値をそのアドレスに格納せよという意味になります。
(いまはまだ意味がわからなくても構いません。)
積を求める
アスタリスク記号 *
は乗算を表します。
練習問題
キーボードから2つの整数を読み込み、その積を表示するプログラムを作成せよ。
ファイル名は work0906.c
とする。
本日の課題
1. Hello world
画面にメッセージ Hello world を表示するプログラムを作成せよ。
2. 和と差
キーボードから2つの整数を読み込み、それらの和と差を表示するプログラムを作成せよ。
3. 和と積
キーボードから3つの整数を読み込み、それらの和と積を表示するプログラムを作成せよ。
4. 文字列の表示
次のようなメッセージを画面に表示するプログラムを作成せよ。 ただし、printf 関数は1回だけ使うものとする。
This is a pen.
5. 実行形式ファイルの名前の変更
コンパイラに -o
オプションを指定すると、実行可能形式ファイルの名前を
a.out から変更することができる。
書式は
gcc -o 出力ファイル名 ソースファイル名
である。
例えば、次のようにコンパイルを行うと、出力される実行可能形式ファイルは work0902.exe
になる。
% gcc -o work0902.exe work0902.c
これを確認せよ。