C言語講座-1日目「ごく基本」


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

まずごく簡単な、基本的なプログラムを書いてみます。その中でまずはC言語に、あるいは変数や関数といった基本的な処理の流れについて理解しましょう。

説明pdf
firstday.pdf
advance説明pdf
firstday-a.pdf

プログラム1・2はごく基本的な処理になっています。とくに1に関しては「hello,world!」といってプログラムを始めるときのお決まりのプログラムになっています。
さて、暇があるならプログラムの「どこが変えられるか」、「どこを変えてはいけないか」を書き換えながらじっくり検討してみてください。


では、説明をしていきます。

変数

プリントでは、変数について
コンピュータ(のメモリ上)に確保される作業エリアです。
という説明がなされています。また、よくなされる説明としては
数字を入れる箱のようなもの
というものがあります。コンピュータが処理するに当たって、当然処理途中の数字を記憶したりしておく必要がでてきます。人間では、例えば2+3*5という計算をするならば、3*5の結果15を記憶してから2+15という処理をするわけです。この処理途中の数字を記録するために変数は確保されます。

数字をいれる箱のようなもの
という説明からすればわかりやすいですが、当然箱は用意してやらなければなりません。ない箱に数字など入れることはできませんから。そのためにプログラムではその用意にあたる「 宣言 」が必要になります。この形は「 データ型 変数名; 」というものになります。データ型とはその変数が何を保存するものか、というものです。例えば「int」であれば整数ですし、「double」であれば実数になります。他のデータ方についてはデータ型のページを参照してください。

関数

xが変数ならf(x)がまさに関数にあたるわけですが、まずは関数、という言葉についてみていきましょう。かつて東西の数学の差はこの「関数の概念の有無」にあるともいわれていますが(和算は微積の直前といえるところまで発展していたが、関数の概念がなかった)、この関数という言葉はもともと英語でfunctionといいます。これが中国に入ったときに「函数:ハンシュー」という言葉に訳され、この言葉をそのまま日本でも使いました。しかし、戦後教科書に採用するに当たり、函という漢字がなかったために関という漢字が当てられ、現代に至ります。

このfunctionという言葉ですが、辞書を引くと
1 (人間・物・制度などに固有の)機能, 作用, 働き, 効用;職務, 役割, 役目
という訳が最初に出てきます。つまり、functionは「機能」という意味を持つわけです。
この概念はCにおける関数には特に顕著であります。つまり、Cの関数とは「 機能のひとまとまり 」を示すことになります。同じような機能が複数出てくるときに、そのまとまりを一つにわけて外部においてしまえばプログラムは簡潔になります。特によく出てくるものであれば、C言語が固有にもったり、あるいは自分で作ったものなら関数だけ外部ファイルに分けてしまうこともできるわけです。

以降プログラム2を見ながら読んでください。

関数には、特に二つの概念の理解が必要です。それは「 引数 (ひきすう)」と「 返り値 (戻り値)」です。
引数とは、関数に渡す値のことです。たとえば、a+bをさせる関数をつくれば、aとbの値を与えてやらなければなりません。プログラム2のwaruという関数でいけば、これはaを割る関数ですから、引数にaをとります。
返り値とは、関数が呼び出し元に返す値です。たとえば、上の関数であれば、a+bの計算結果になりますし、プログラム2の関数waruではaをMで割った結果になります。これが返されなければ関数を呼び出した意味が有りません。
なお、これらは必要がない場合もあります。例えば引数がいらないものとして「現在時刻を知る関数」のようなもの、あるいは返り値がいらない例として「画面に表示する命令」があげられます(Cに標準でついているこれらの機能を持つ関数は引数・返り値を持つものも多いですが)。

関数を定義するときは、「 返り値の型 関数名(引数,引数…){ }」という形で行います。例えばプログラム2の
double waru(int a)
なります。その後、{}で囲って関数の機能を記述します。その際、返り値が必要な関数であれば「 return 返り値;
を最後に書くことで実装できます。
なお、int main(){}という部分もやはり関数です。これをmain関数と言って、プログラムはここから始まります。ところで、このmain関数の後に関数を定義するとき、一見main関数が実行された時点では関数がないように見えるため、エラーが返されることがあります。そのため、main関数の前に プロトタイプ宣言 を行う必要があります。これはmain関数の前に「 返り値の型 関数名(引数の型,引数の型…); 」だけを記述するものです。例えば、a+bを足す関数は以下のようになります。
int plus(int a,int b){
       return a+b;
}

標準入出力関数

文字を表示したり、あるいは入力させるための関数を入出力関数と言います。Cについている標準的な入出力関数は「printf関数」と「scanf関数」です。printfのほうが表示、scanfが入力です。

printf関数は「 printf("表示文字列",引数,引数・・・) 」という形になります。例えばプログラム1ではHello,world!と表示するのに
printf("Hello,world\n")
としていますね。
ここで引数とは、表示する変数のことです。例えば「a=(aの値)」とするときは、aを引数の中にいれることになります。そして表示文字列の中には何を入力するかというものを表す、 変換指定文字 というものをいれます。「%s」とすれば変数に入っているものを文字列として表示しますし、「%d」とすれば整数として、「%f」とすれば実数としてffff.ffffと小数の形で、「%e」とすれば実数としてaaaaEaaという指数表示の形で表記してくれます。プログラム2の例では割られる数aと、計算結果waru(a)を表示するのに
printf("%d÷M は%f です。\n",n, waru(n));
としていますね。当然、引数にとる変数名は書いてる順番にします。ごちゃごちゃにしたらコンパイラは迷ってしまいますから。
なお、「\n」は改行文字です。これを入れることで改行できます。その他「\t」でタブ入力をしてくれます。

scanf関数は「 {scanf("指定変換文字列",入力先変数のアドレス,変数のアドレス…)」という形をとります。指定変換文字列はprintfと同じですが実数だけは「 %lf 」になりますので注意してください。
問題は変数のアドレスですが、これはとりあえずの間気にせず 変数名の前に「&」をつけなければならない とだけ考えてください。この問題については3日目に考察しましょう。
例をいくつか見ましょう。まずはプログラム2では割られる数nを入力するのに
scanf("%d", &n );
としています。また、n/mをさせるn,m両方入力させたいというのであれば、
scanf("%d%d",&n,&m);
とすることで可能です。ちなみに入力時はスペースで区切ります。

また、区切らせる記号もして可能で、""の中に入れてやることで指定できます。例えば,で区切らせたければ
scanf("%d,%d".&n,&m);
とすることで可能です。

プリプロセッサ命令

プリプロセッサとは、コンパイルする前にコンパイラにさせる仕事です。これは、命令の前に「#」がつきます。代表的なものに「#include」と「#define」があります。一つずつ見ていきましょう。

「#include」は、指定したヘッダファイルと呼ばれる関数(正確には関数のプロトタイプ宣言)が書かれたファイルをコンパイル前に読み込み、プログラムに引っ付けます。これで、外部ファイルに書かれたソースコードも使えるようになります。実は「printf関数」や「scanf関数」もこの外部ファイルに書かれていたもので、「stdio.h」というファイルに書かれています。このように標準でついているものをインクルードする(#includeを使うことをこういいます)時は<>をつけて
#include <stdio.h>
という風にします。自作のものは""をつけるのですが、これはadvanceで扱うことにしましょう。

「#define」は、指定した単語を別の文字に自動的に置き換えてくれます。たとえばプログラム2のように
#define M 5
とすることで、プログラム中のMという単語を5に変えてくれます。プログラムを分りやすくするのには結構使います。