このページでは、C言語を使ったプログラミングの基礎を学びます。具体的には、基本的なコードの書き方、コンパイル方法、そしてプログラムの実行方法について説明します。また、四則演算、forループ、if文など、数値計算の基本も取り上げます。
最近では、AIを利用してプログラミングの学習を効率的に進める方法が注目されています。当サイトの特集記事「ChatGPTを活用したプログラミング学習の効率化」もぜひご覧ください。
まず最初に、C言語プログラムをコンピュータ上で実行するための基本的な手順について見ていきましょう。C言語のプログラムは次の手順で実行できます。
.c
という拡張子を持つコードを書く。C言語プログラムの実行手順を学ぶために、「Hello World」プログラムと呼ばれる有名なプログラムのコードを書いて実行してみましょう。「Hello World」プログラムは、プログラミングを新しく学ぶ際によく用いられる典型的なプログラムで、最も有名な例の一つです。(参考: Wikipedia)
.c
を拡張子に持つコードを書く。最初に、お好みのエディター(Emacs, Vim, メモ帳やサクラエディタなど)を使用して、次のC言語のコードを書き、ファイル名をlesson0_1.c
として保存してください。
#include
int main() {
printf("Hello world!!\n");
return 0;
}
プログラムの最初の行である#include <stdio.h>
は、C言語の標準入出力(I/O)ライブラリを読み込み、データの入出力を行うための準備をしています。次に、int main() {}
でプログラムのメイン関数main()
を定義しています。この関数定義の中括弧{}内には、メインプログラムの処理内容が記述されます。今回のプログラムでは、printf
関数を用いて「Hello World」という文字列を画面に出力します。末尾の\n
は文字列の後に改行を挿入することを意味しています。メイン関数の最後には、return
文を用いてプログラムを終了し、戻り値として0が返されます。戻り値については、後ほど関数の定義を学ぶ際に詳しく説明します。
上記のC言語のコード(lesson0_1.c
)を準備した後、このコードをコンパイルしてコンピュータが実行可能な実行ファイルを生成します。以下のコマンドを端末で実行してください:
gcc lesson0_1.c -o hello -lm
ここではgcc
コンパイラが使用されていますが、他のコンパイラでも構いません。上記のコマンドにより、C言語のソースファイル(lesson0_1.c
)がコンパイルされ、実行ファイル(hello
)が生成されます。実行ファイルの名前はコンパイル時のオプション(-o
)を使用して指定できます。また、オプション(-lm
)は数値計算を行う際に必要なライブラリをリンクするために使用されるので、必要に応じて付け加えてください。
上記で準備した実行ファイル(hello
)を実行するには、以下のコマンドを端末に入力します:
./hello
実行すると、「Hello World!!」という文字列が端末上に表示されます。
この出力は、lesson0_1.cのコードの2行目にあるprintf("Hello World!!\n");
によって生成されています。
ここで学んだC言語プログラミングのプロセスをおさらいしましょう。C言語プログラムを実行するためには、次の3つのステップが必要です: 1) C言語で.c
拡張子のコードを書く。2) そのソースコードをコンパイルして実行ファイルを生成する。3) 生成された実行ファイルを実行して結果を得る。これが一般的なC言語プログラミングの流れです。
ほとんどの数値計算手法やコードは、四則演算(加減乗除)などの基本的な数学演算の組み合わせによって実現されています。ここでは、これらの基本的な数学演算(四則演算とべき乗)について学びます。まずは、次のサンプルプログラムを見てみましょう。
#include
#include
int main() {
double a, b, c, d, e, f, g;
a = 2.0;
b = 3.0;
printf("a=%.1f\n", a);
printf("b=%.1f\n", b);
c = a + b;
d = a - b;
e = a * b;
f = a / b;
g = pow(a, b);
printf("a+b =%.1f\n", c);
printf("a-b =%.1f\n", d);
printf("a*b =%.1f\n", e);
printf("a/b =%.1f\n", f);
printf("a**b=%.1f\n", g);
return 0;
}
このプログラムでは、変数a
とb
に対して、四則演算(足し算、引き算、掛け算、割り算)に加えて、べき乗の計算を行っています。前のLesson 0-1で見たように、このプログラムも#include <stdio.h>
文から始まり、C言語の標準入出力ライブラリを読み込んでいます。さらに、#include <math.h>
を使用して数学演算用のライブラリを読み込み、数値計算の準備を行っています。また、Lesson 0-1と同様に、int main(){}
でメイン関数を定義し、この関数内のコードが順番に実行されます。
メイン関数の冒頭で、double a, b, c, d, e, f, g;
を使って、変数a
からg
までを実数型のdouble
として定義しています。
変数の型double
は倍精度実数と呼ばれ、約16桁の精度を持つ実数として扱われます。上記の宣言文では、7つの変数(a
からg
まで)が倍精度実数型のdouble
として宣言されています。
このほかにも、整数型int
や文字列型char
などのデータ型を使用することができます。
上記の変数の型宣言の後、次のようなコードが続きます:
a = 2.0;
b = 3.0;
C言語では、等号記号(=
)は等価性を示すものではなく、代入操作の演算子として用いられます。
プログラムの10行目と11行目では、変数a
とb
に代入した数値を画面に出力しています:
printf("a=%.1f\n", a);
printf("b=%.1f\n", b);
ここでは、printf
文を用いて変数の出力を行っています。このprintf文は、上のLesson 0-1でも用いられています。上記のHello Worldプログラムの例とは異なり、ここでは実数変数の出力が行われています。関数printf
内の%.1f
は小数点以下一桁まで表示するという意味です。
次に、実際に計算を行っている部分のコードを見てみましょう。上のプログラムの13行目から17行目では、変数a
とb
を用いて四則演算やべき乗の計算を行っています。
c = a + b;
d = a - b;
e = a * b;
f = a / b;
g = pow(a, b);
ここでは、倍精度実数変数に対して基本的な数学演算が行われており、計算結果を同じく倍精度実数の変数c
、d
、e
、f
、g
に代入しています。C言語では、+
記号は加算を、-
記号は減算を、*
記号は乗算を、/
記号は除算を表します。また、pow
関数はべき乗を計算する際に用いられます。これらの演算を行った後、本例題ではprintf
文を使ってその結果を出力しています。
次に、プログラムをコンパイルし実行してみましょう。コンパイルを行うために、ターミナル上で次のコマンドを実行します:
gcc lesson0_2.f90 -o lesson0_2 -lm
コンパイルが終了した後、実行ファイルを次のように実行します:
./lesson0_2
すると、次のような計算結果が画面に出力されるはずです:
a=2.0
b=3.0
a+b =5.0
a-b =-1.0
a*b =6.0
a/b =0.7
a**b=8.0
これらの結果は、あなたが予想した通りでしょうか?また、上記のプログラムで倍精度実数変数a
やb
に別の数値を代入して、結果がどのように変わるか試してみましょう。
多くの数値計算法では、特定の手順を繰り返し実行する必要がしばしばあります。C言語では、このような反復処理を効率的に行うためにfor
ループという機能が提供されています。本節では、for
ループの使い方について学んでいきます。
ここでは、for
ループの使用方法を理解するために、\(1\)から\(10\)までの整数の和を計算するプログラムを例にします。この問題は次のような簡単な公式で解くことができます:
\[ S=1+2+3+\cdots+n = \frac{1}{2}n(n+1). \tag{1} \]
しかし、私たちはこの和をfor
ループを使用して数値的に求めるプログラムを作成してみましょう。
#include
int main() {
int i, n, sum;
n = 10;
sum = 0;
for (i = 1; i <= n; i++) {
sum += i;
}
printf("calculated sum = %d\n", sum);
printf("expected sum = %d\n", n * (n + 1) / 2);
return 0;
}
上のコードでは、まず#include <stdio.h>
で標準ライブラリを読み込み、int main()
でメイン関数の定義を行っています。コードの4行目で、整数型の変数 i
(ループカウンタ用)、n
(上限値)、sum
(合計値を保存)を定義しています。
ここでは、n
を10
と設定し、1から10までの和を計算します。
さらに、7行目で和を計算した値を格納する変数sum
をsum = 0;
で初期化しています。変数は宣言されただけでは不定な値を持つことがあります。したがって、明示的に値を代入することで変数の初期化を行う必要があります。
次に8行目から、for
ループのブロックに移ります。このfor
ループは{}
で囲まれた領域内で反復処理を行います。示されているように、for
文は次の形式で書かれます:
for (i = 1; i <= n; i++) {}
ここで、i
はループカウンタとして用いられる整数型変数です。この行で、i
を1
に初期化し、i <= 10
の条件が満たされている間、{}
内の処理を反復します。ループの各反復後、i
に1を加えて再び条件を評価します。このプロセスを繰り返し、i
の値がn
より大きくなるまでループを続けます。反復処理部分で、sum += i;
によって、整数変数sum
にi
の値を加算していきます。
それでは、上のプログラム(lesson0_3.c)をコンパイルし実行してみましょう。次のような結果が得られるはずです。
calculated sum = 55
expected sum = 55
ここで、calculated sum
はプログラムによって1
から10
までの数値を足した結果を示しており、expected sum
は公式(\(1\))によって計算された値を示しています。この結果から、プログラムによる計算が数学的に導かれた公式の値を正確に再現していることが確認できます。
数値計算を実行する際に、与えられた条件に応じて異なる処理をする必要があることがよくあります。そのためには、if
文を使って条件分岐を行います。このif
文の機能を理解するために、次に示すC言語のコードを見てみましょう。
#include
int main() {
double a, b;
a = 2.0;
b = 3.0;
printf("a=%.1f\n", a);
printf("b=%.1f\n", b);
if (a == b) {
printf("a==b\n");
} else if (a > b) {
printf("a>b\n");
} else {
printf("a<b\n");
}
return 0;
}
上記のプログラムでは、12行目のif (a == b) {}
文によってa
とb
が等しいか否かを判定し、等しい場合には次のprintf("a==b\n");
を用いて画面に"a==b"と表示します。この場合、if
文の他の処理は行われず、条件分岐の処理が終わります。
最初のif (a == b)
文の条件に当てはまらない場合、次の条件文else if (a > b)
に移ります。ここでは、a
がb
より大きいかを判定し、そうであればprintf("a>b\n");
文で"a>b"と出力し、if
文を終了します。このようにelse if
を用いることで、複数の条件を順に判定することが可能です。
ここまでの説明で、条件に合致した場合の処理を見てきましたが、合致しない場合の処理もプログラミングでは重要です。プログラムの例では、if (a == b)
やelse if (a > b)
の後にelse
文が続きます。このelse
文は、上述のいずれの条件にも当てはまらなかった場合に実行される処理を記述し、ここではa
がb
より小さいと判断して、"a<b"と画面に出力しif
文の処理を終えます。
if
文では、以下のような条件式を用いることができ、これらを知っていれば多くのプログラミングタスクが可能になります。
a==b
: a
とb
が等しい。a>b
: a
がb
より大きい。a: a
がb
より小さい。
a>=b
: a
がb
より大きい、または等しい。a<=b
: a
がb
より小さい、または等しい。a!=b
: a
とb
が等しくない。このページではC言語プログラミングの基礎について学びました。次のページではC言語を用いた数値微分について学びます。