いままで,いろいろな名前の変数を使用してきました。例えば,nl や c などです。例えば,変数 x を int と宣言すれば,JAIST では,4バイトの メモリ領域が確保されます。こんな感じ(一つの括弧が4バイト)。
nc と nl と nw のときには,このように確保されます。
変数の名前は何でも良いのですが,数字の数を数えるなどの場合のように, 連続した性質の量(同属性の変数)を扱う場合や,行列の成分のように 本来番号がついている変数を扱う場合には,『配列』を使いましょう。 『配列』宣言は,ほとんど変数と同じです。10この成分を持つ整数配列 n[ ] を宣言するためには,
それぞれの領域は,
n[0] | n[1] | n[2] | n[3] | n[4] | n[5] | n[6] | n[7] | n[8] | n[9] |
に対応しています。int n[10] と書いた時,0 から 9 に対応することに 注意! n[3]の値を1プラスしたければ,++n[3]とすればよいのです。 (ここで[ ]の中は数字です,文字ではありません)。同様のことは,
入力したテキストの中の 0から9までの数字を数える プログラムを書け |
27ページのプログラムの本質は,上のとおりです。これを解決するのに, 問題点が3つあります。
{ 配列を宣言する int ndigit[10] カウンターndigit[i]を0にリセット; ←for文を使う while(とってきた文字cがEOFでないなら)ループにはいる もし(cが0(48)以上 かつ 9(57)以下)ならば カウンターndigit['c'-48]をプラス1 ; 結果(カウンタの値)をプリントアウト ←for文を使う for(i=0 から; i<10 まで;i を一つづつプラス) printf("%d ",n[i]); } |
配列のリセットや表示には,for文を使うのが普通です。if文については すでに説明済みですね。
始めにも述べたように,Cのプログラムとは関数の集まりです。Cの関数の
イメージは例えば,『いくつかの入力に対して,最高で一つの値を出力する』
というものです。
大抵の関数は,一つか二つの入力に対して一つの値を返しますが,ときには,
何も入力がなくても値を返すもの(getchar()もそうです)や,入力があっても
何も値を返さないもの,いや「なにもない」という値を返すものと言うべきか?
もあります。(後に出てくるcopy())
このようないろいろな関数を組み合わせて,ひとつのmainという関数が
出来上がります(こんなイメージ↓)。
関数は出来合いのものだけではなくて,自分で作ることも出来ます。ここでは それをやりましょう。
教科書では,いきなりベキ関数を作っています。いきなりこれでは 分かるものも分からなくなります。そこで,まず
整数 x と 整数 y の和を求める関数を書け。 |
をやりましょう。x と yを入力すると出力 z(= x+y)がかえってくる関数です。
int wa(int x, int y) { int z; z=x + y; return z; } |
戻り値の型 関数の名前(パラメータの型 パラメータ, ...) { 変数 z の宣言; 関数の本体; 戻り値 z を返す; } |
これをmainのなかで呼び出してやると,printf ("%d \n",wa(3,2)) で 5 と いう答がでてきます。当然 wa(32,21)→53 です。
このような関数を一度定義してしまえば,main関数の中だけでなく, 任意の関数の中で使うことが出来ます。私達は,この関数の機能 (何を入れれば何が出てくるか)だけ知っていれば,これらを ブラックボックスとして使うことが出来ます。関数どうしが独立に ブラックボックスとして扱える,これがC言語の良い所です。
教科書に戻ります。教科書にはただ単に「関数 power とそれをテストする 主プログラムを示す。」とだけあります。これでわかれば苦労はしないので, 少し説明を加えます。
著者は次のように考えました。
int power(int base, int n) { int i, p; p = 1; for(i = 1; i < n; ++i) p = p * base; return p ; } |
パラメータは,base と n { 変数の宣言 初期値設定 次の行を n 回繰り返す base を掛け合わせる。 結果を返す(戻り値は p ) } |
次にチェックのための,main関数です。printfのところは,書式設定はしてません。
main( ) { int i; for(i = 0; i < 10; ++i) printf( i, power(2,i), power(-3,i) ); return 0; } |
mainはパラメータなし { 変数の宣言 iを0から9まで変えて,次の行を繰り返す i と power(2,i) と power(-3,i) を表示 正常終了 } |
今までなかったものに,return 0;があります。これは,「mainも 関数である以上,何らかの値を返すべきである」というポリシーに従った ものだと考えてもらって良いです。では,返す値として適当なものは, ということで,正常終了に対応する0を返すわけです。今までは, 省略していただけです。
これらの関数は別々のファイルにすることも出来ますが,私達の レベルでは,一つのファイルにするのが良いでしょう。その場合は, 一般には次のように書きます。
#まずヘッダファイルの読み込み #記号定数の定義 プロトタイプ1 プロトタイプ2 : : main( ) { } 関数1( ) { } 関数2( ) { } : : |
ここで「プロトタイプ」とは,Cコンパイラに対して,あらかじめこのような 関数を使用すると言うことを教える役割をします。パラメータや戻り値の型が, 実際の関数のそれと一致するように書きましょう。
33ページからの「歴史のはなし」は,知っている人には意味がありますが, 初心者には百害あって一利もありません。理解する必要はありません。
対数関数や三角関数をCで使うためには,数学ライブラリを読み込む必要が
あります。その方法は,つぎのとおり。
|
ここでは,いろいろややこしいことが書いてありますが,要約すると,
|
関数の内部から実引数を変えることは出来ません。逆に言えば,実引数は 変化しないので,安心して任意の関数の中で計算が出来ます。
上のプログラムを見ると,mainにもpowerにも変数 i がつかわれていますが, 両者は,全く独立です。何の関係もありません。