C言語は、UNIX(OSの種類の名前です。)の開発者がUNIXのために開発したプログラミング言語です。言語規格では プログラミング言語Cという名称ですが、C言語という名前が主流です。C言語は世界でも非常にプログラマ人口が高く、一番最初に学ぶプログラミング言語にする人も、非常に多いです。やろうと思えば、ゲームを作ったり、ソフトウェアや、OSを作ることもできます。
C言語はコンパイラというプログラムのソース(プログラムの元となるテキストデータ)を機械語(コンピュータが認識できる言葉)に変換するものが必要です。コンパイラにはいくつか種類がありますが、Windows環境で動作させることを考えて、Borland C++Compiler(略してBCC)を使うことにします。<http://www.codegear.com/jp/downloads/free/cppbuilder>
また、C言語用のエディタとして、CPad for Borland C++Compiler(略してBCPad)を使うことにします。<http://hp.vector.co.jp/authors/VA017148/>
これは送金義務のないシェアウェアなので、無料で使用できます。詳細はこちらで→BCPadシェアウェアについての考え
ちなみにこの環境はラボには既にあります。家でやってみたいという人はぜひ、入れてみてください。(入れ方がわからない場合は僕、または他の先輩にきいてみてください。ノートPCなら、誰かいるときにラボに持ってきてもらえれば、入れることも可能です。)
まずは基本的なプログラムを見てみましょう。このプログラムを実行(BCPadでF9を押す。)すると、Hello, world!と表示されます。(保存するときの拡張子は.cです。)
#include<stdio.h> int main(void); int main(void){ printf("Hello, World!\n"); return(0); }
では、1行1行見ていきましょう。
とりあえず、1、3、4、8、9行にあるものは必須です。何回もプログラムを書けば自然と覚えられるので、少しずつ覚えていってください。
また、文の区切りには;(セミコロン)をつける必要があります。これをつけ忘れるようなミスで、コンパイルエラーになったりします。
改行にはソースコードを読みやすくする等の意味合いが含まれています。
#include<stdio.h> int main(void);int main(void){printf("Hello, World!\n");return(0);}
#include<stdio.h>int main(void);int main(void){printf("Hello, World!\n");return(0);}
つまり、このように改行をするのを減らすことも可能ですが、非常にソースコードが読みにくいです。 そのため、改行をつけるようにしましょう。
では、C言語で何かを表示することについて説明します。とは言え、文字を表示する関数は複数個あります。それぞれ、場合によって使い分ける必要があります。 文字を表示する関数は3つあります。printf関数、puts関数、putchar関数です。
printf関数は文字の表示、文字列の表示、さらにprintf("%d", 1);のようにして1を引数に渡す(関数に値を与える)ようなことも可能です。他にも文字や、文字列も同じようにして値を渡すことも可能です。はっきり言って、これが3つのうち一番使用する関数です。"(ダブルクォーテーション)で文字列を括って使用します。
puts関数は文字の表示、文字列の表示が可能な関数です。また、改行文字を入れなくても、最初から末尾に改行が含まれています。printf関数のように引数に渡すようなことはできません。こちらも、"で文字列を括って使用します。
putchar関数は文字の表示ができる関数です。文字列の表示や、引数に渡す等はできません。これは'(シングルクォーテーション)で文字を括ります。
ではこれら3つで"RCC"と表示することにします。(改行含む)
下のプログラムは3つの関数で順番に表示したものです。
#include<stdio.h> int main(void); int main(void){ printf("RCC\n"); puts("RCC"); putchar('R'); putchar('C'); putchar('C'); putchar('\n'); return(0); }
RCC RCC RCC
printfは変数を使うときに使います。そして、一番使い勝手がよいです。基本的にはこれを使用していればいいです。
putsは最後に改行をつける文字列を書きたいときに使います。とはいえ、printf関数があるので、あまり使う機会はないと思います。
putcharは1文字ずつ出力したいときに使います。後述する変数のchar型の変数を入れたりするときに使います。
次にprintf関数の引数に渡した時について少し説明します。
printf関数は、いくらでも引数を持つことができます。つまり、printf("%d %d %d %d %d %d %d %d %d %d\n", 1, 5, 4, 2, 7, 9, 6, 8, 10, 3);ということも可能です。
%dを含む、いろいろなものが引数に渡したものを表示する方法です。%cや、%xなどなど…その中でよく使うものを書いておきます。
%d | 引数には数字、もしくは文字しか入れることができません。数字の場合はそのまま10進数の整数が出て、文字を入れた場合は文字コードの数字が表示されます。 |
%x | 入れた数字が16進数になって表示されます。 |
%c | 文字しか入れることができません。文字列は不可です。文字の'1'などは入れることができます。('1'を%dで表示した場合、文字コードの49が表示されます。) |
%s | 文字列(""で括られていればよい)ならなんでも表示してくれます。 |
%f | 10進数の小数点以下があるものが表示できます。 |
以下にソースと実行結果を載せておきます。
#include<stdio.h> int main(void); int main(void){ printf("1→%d\n", 1); printf("'a'→%d\n", 'a'); printf("5→%x\n", 5); printf("11→%x\n", 11); printf("'a'→%c\n", 'a'); printf("\"a\"→%s\n", "a"); printf("\"1\"→%s\n", "1"); printf("\"abc123\"→%s\n", "abc123"); printf("RCC→%s\n", "RCC"); printf("3.141592→%f\n", 3.141592); return(0); }
1→1 'a'→97 5→5 11→b 'a'→a "a"→a "1"→1 "abc123"→abc123 RCC→RCC 3.141592→3.141592
軽く触れましたが、\nのような通常は表記できないもの(エスケープシーケンスといいます)は他にもあります。以下に記しておきます。
\n | 改行の意味があります。 |
\t | タブコードです。 |
\0 | 文字列終了の意味があります。 |
\\ | \を表示します。 |
\a | 警報音を出します。 |
\% | %を表示します。%%でも%を表示できます。 |
他にもありますが、特に使うのはこれくらいです。興味のある人は調べてみてください。
では次に演算について説明します。演算は+-×÷なら…いいんですが、プログラムの場合は少し違います。
+→+また、剰余(割り算をしたときのあまりの数)を求めるための%というものもあります。優先順位は数学と一緒です。(剰余は*や/と同じ優先度)しかし、小数点の演算は数学とは少し違います。
では単純な四則演算と剰余の例のプログラムを書きます。#include<stdio.h> int main(void); int main(void){ printf("1 + 1 = %d\n", 1 + 1); printf("4 - 1 = %d\n", 4 - 1); printf("2 * 3 = %d\n", 2 * 3); printf("12 / 3 = %d\n", 12 / 3); printf("3÷2の余剰は%d\n", 3 % 2); return(0); }
1 + 1 = 2 4 - 1 = 3 2 * 3 = 6 12 / 3 = 4 3÷2の余剰は1
また、割り算の時の要注意として、割った結果を%dで表示するのと%fで表示するのでは大きく変わります。また、%fで表示する場合、 小数点で演算を行わないと、正常な数値が返ってきません。以下は例です。
#include<stdio.h> int main(void); int main(void){ printf("%%dで3 / 2 = %d\n", 3 / 2); printf("%%fで3 / 2 = %f\n", 3 / 2); printf("%%dで3.0 / 2.0 = %d\n", 3.0 / 2.0); printf("%%fで3.0 / 2.0 = %f\n", 3.0 / 2.0); return(0); }
%dで3 / 2 = 1 %fで3 / 2 = 0.000000 %dで3.0 / 2.0 = 0 %fで3.0 / 2.0 = 1.500000
今回の最後の話になりました。変数です。変数とは値を入れる箱のようなものです。 これはかなり重要なものです。まず、参考プログラムを用意しましたので、見てみましょう。
#include<stdio.h> int main(void); int main(void){ int x; return(0); }
このプログラムの場合、xが変数です。int x;は変数の型宣言と言って、この名前の変数をこの型(この場合はint)で使うという意味合いがあります。
変数宣言は、C言語の場合は、関数の一番最初にしか書くことはできません。つまり、演算や代入等を行った後に宣言はできないです。
それでは次は型について説明します。型にはいろいろと種類がありますが、その中でもよく使うものを挙げますと、int型、char型、float型です。
int型は整数を扱いたい時に使います。int x = 1;と入れると、xに1が代入されます。また、int x = 2.5;と入れてもxには2しか入りません。int x = 'a';と代入すると、aの文字コードの数字(97)が入り、%cで表示するとaが表示されます。printfの引数に入れる場合は、%dや、%xを用いる必要があります。
char型は文字を扱いたい時に使います。char c = 'a';や、char c = '1';と入れると、しっかりと代入されますが、char c = "RCC";は入りません。ちなみに、char c = '1'と代入して%dで表示すると文字コードが代入されます。 printfの引数に入れる場合は、%cを用いる必要があります。
しかし、char型の配列(第五章でやります)を使うと文字列を代入することができるようになります。 この場合はprintfに%sを用いる必要があります。
float型は小数点を扱いたい時に使います。float f = 1;や、float f = 3.14;と入れると代入されますが、文字を入れると、int型と同様にその文字の文字コードが入ります。printfの引数に入れる場合は、%fを用いる必要があります。
double型はfloat型よりもより精密な小数点を扱いたい時に使います。他はfloat型と一緒です。
代入はx = 1;のような形で代入することができます。これで、xという変数に1が代入されたことになります。
注意としては = は数学のように左辺と右辺が等しいことをさしているわけではなく、代入をさしています。この=を代入演算子と呼びます。
ちなみに、2 = x;や、a * b = 10;等では代入はできません。
変数の初期化は重要です。変数の初期化とは変数の宣言時に最初から値を入れておくということです。例としては、int x = 7; といった感じです。 もし、変数の初期化を行わなかった場合、何が最初に代入されているかわからないので表示した場合の値は不定です。(静的変数staticや外部変数を除く)
変数名は基本的に自由につけることができますが、使えないものとして、型名(charや、intなど)や、_(アンダースコア)を除いた記号(-や、@、.など)、数字が名前の最初にあるもの(3paiや、2008yearsなど)があります。
型や変数の代入、変数名の例としてプログラムを用意しましたので、見てみましょう。
#include<stdio.h> int main(void); int main(void){ int x; char c; float f; x = 7; printf("%d\n", x); x = 'a'; printf("%d\n", x); x = 14; printf("%x\n", x); c = 'a'; printf("%c\n", c); c = '1'; printf("%c\n", c); f = 1.5; printf("%f\n", f); f = 'a'; printf("%f\n", f); f = 1; printf("%f\n", f); return(0); }
7 97 e a 1 1.500000 97.000000 1.000000
変数の初期化を怠った場合、何が表示されるかみてみましょう。
#include<stdio.h> int main(void); int main(void){ int x; float f; char c; printf("x = %d\n", x); printf("f = %f\n", f); printf("c = %c\n", c); return(0); }
x = 1 f = 0.000000 c =
printfの引数内で変数同士の演算をすると、そのときの演算結果は表示されますが、変数の中身は変化しません。(中で変数に代入した場合を除く)しかし、例えば、xとyという変数があったとして、x = x + y;と書くと、xの中にxとyの加算をした結果が代入されます。
以下に例のプログラムを用意しました。
#include<stdio.h> int main(void); int main(void){ int x = 1, y = 2; printf("x + y = %d\n", x + y); printf("x = %d\ny = %d\n", x, y); x = x + y; printf("x + y = %d\n", x); printf("x = %d\ny = %d\n", x, y); x = x - y; printf("x + y = %d\n", x + y); printf("x = %d\ny = %d\n", x, y); return(0); }
x + y = 3 x = 1 y = 2 x + y = 3 x = 3 y = 2 x + y = 3 x = 1 y = 2
x = x + y;でxにyを足したものが代入できると説明しましたが、これは面倒です。それを解決したのが複合代入演算子です。 複合代入演算子は上で説明した +、-、*、/、等を =の前につけるだけでいいのです。x = x + y;を複合代入演算子で表現すると、 x += y;です。xにyを足しこむようなイメージでいいと思います。以下に例を示します。
#include<stdio.h> int main(void); int main(void){ int x = 0, y = 2, z = 3; printf("x = %d\n", x); x += y; printf("x = %d\n", x); x *= z; printf("x = %d\n", x); return(0); }
x = 0 x = 2 x = 6
次回は制御構造のif文、switch文を中心に説明します。標準入力についても触れます。
また、次回からは最後に問題を出題します。