迫江・内田研スーパーサイエンスハイスクール用資料
C言語入門 (第2回)

平成17年8月22日


繰り返し処理 (for)
#include <stdio.h>
main()
{
    int i;

    for(i=0; i<20; i++){    /* 20回繰り返す。(iは0から19まで) */
        printf("Repeat !\n");
    }
}


[A]================================
まず、for(i=0; i<20; i++)を見てみましょう.
この文は「iを0から1つずつ増やしな がら,以下を繰り返す.ただし,i<20の間に限る」と読みます.
見慣れぬ表現 i++ がありますが,これは i = i + 1, すなわち i の値を一 つ増やすことを意味します。
ですので,この文は「iを0から19まで順に1つずつ 増やしながら繰り返す」ことを表現しています.

[B]================================
for文で繰り返したい部分は,直後の"{}"で括られた中に書かれます.
この例では,printf("Repeat !\n");がその繰り返したい内容で す.

[で,結局どう動くの?]================================
[A]と[B]をまとめると,このプログラムは 「iを0から19まで順に1つずつ増やしながら,計20回分printf("Repeat !\n");を繰り返す」という意味になります.
実際にこのプログラムを実行すると、"Repeat !"と書いた行が20行分画面 に出力されるわけです。

[なんでfor文なんて要るの?]================================
これを聞いた太郎君が文句を言いました.
「なんだそれなら printf("Repeat !\n");を 20回プログラムに書いておけばいいじゃん.forなんて要らないよ」

この太郎君の意見,あなたはどう思いますか?

ぼくならこう言います.「じゃぁ,10000行表示してみてよ」
太郎君式だと,一生懸命,間違えないように10000行分printfを書か ないといけません.
でもfor文を使うと上の20のところを10000にするだけでよいのです!
楽だし,ずっと正確ですよね.



以下はもう少し複雑な例です。出力はどうなるでしょう?

#include <stdio.h>
main()
{
    int i;

    for(i=0; i<20; i++){    /* 20回繰り返す。(iは0から19まで) */
        printf("i = %d\n", i);
        /* ここには、繰り返したい文をいくつも書くことができる */
    }
}

どうです? むずかしいですかね? 繰り返しの部分はさっきと同じですから、 やっぱり何かを20回繰り返すわけです。
で,今回繰り返すのは、printf("i = %d\n", i); です。
さぁ、これは何だ、というわけですが、みなさん printfの使い方 はもう知ってますよね?
そう、なんのことはない、このprintf("i = %d\n", i);だと、変 数iが5だったら、"i = 5"と画面出力して改行するだけです。
じゃぁ、残るは変数iの正体ですが、 これは繰り返しのカウンタ ですね。
そう、0から19まで、一つづつ増えていくというアレです。

さぁ、このプログラムがどう動くかわかりましたでしょうか?
最初はi=0の状態でループに突入します。で,printf("i = %d\n", i);によって,"i = 0"が画面出力されます.
これで第0ループ終了.
次にi=1になって再びループに突入します。で,printf("i = %d\n", i);によって,今度は"i = 1"が画面出力されます.
これで第1ループ終了.
次にi=2になって....


結局"i = 0"から "i = 19" までが順に表示されることになります.



このfor文を応用すると,数列も簡単に(?)計算できます。

#include <stdio.h>
main()
{
    int i;
    int shoko, kosa, atai ;
    shoko = 10;
    kosa = 3 ;
    atai = shoko ;
    for(i=0; i<20; i++){
        printf("%d-th value= %d\n", i, atai);
        atai = atai + kosa;
    }
}

わかりますか? 今度は繰り返している部分"{}"の中に,printfだけじゃな くて,式"atai = atai + kosa;"も入っていますね.
このプログラムを理解するには,ループを1回繰り返すたびに,変数 atai の中身がどう変化するのかを実際にチェックしてみるとよいでしょう.


問題4

数列  An = 10*n + 1 を n=0から10まで画面出力するプログラムを書け。


配列変数

[集合住宅登場] ================================
配列とは幾つかの変数のかたまり(集合)です。
これまでの変数が一戸建ての家なら、配列は集合住宅です。
以下の例でててくる配列h[5]は,家5軒があつまって1つの集合 住宅(長屋?)を構成しています。
集合住宅の各家が0号室、1号室と呼ばれるように、配列の各変数(要素)はh[0], h[1]として参照されます。

C言語での配列は、ほかの言語でよく使われる小カッコ(())による表現ではなく、大カッコ([])によって表現されます。

[ちょっとした注意] ================================
ちょっとややこしいのですが、A[5]と定義した場合,使っていいのはh[0]か らh[4]までです.
すなわち,5号室はありません。

#include <stdio.h>

main()
{
    int i;
    int h[5];

    for(i=0; i<5; i++){
     h[i] = i * 2;
    }
}


問題5

数列  An = 2*n + 5  を n=0から10まで配列 A[n] に格納するプログラムを書いてみよう。



なお、配列には次のようにあらかじめ値を入れておくこともできます。
#include <stdio.h>

main()
{
    int i;
    int day[12] =     /* 配列の初期化は中カッコでくくる */
            {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    for(i = 0 ; i < 12 ; i ++) {
        printf("%d gatsu ha %d nichi aru.\n", i+1, day[i]);
    }
}
 


多次元配列

[高層アパート登場] ================================
さっきは変数(一戸建て)から配列(集合住宅=長屋)を作りました.
その延長線上で、高層アパートにすることもできます。
次の例(九九を配列に入れる)に出てくる配列kukuは、 各階に9部屋ある9階建てのアパートと考えればよいでしょう。

#include <stdio.h>

main()
{
    int i, j;
    int kuku[9][9];   /* 2次元配列 */

    for(i=0; i<9; i++)  {
        for(j=0; j<9; j++){
            kuku[i][j] = (i + 1) * (j + 1);
        }
    }
}

このように2次元配列はkuku[i][j]のように扱い、kuku[i,j]ではありません。
 



2 次元配列にも次のようにあらかじめ値を入れておくこともできます。
#include <stdio.h>

main()
{
    int i;
    int   a[3][3] =   {{0,1,2},{-1,2,10},{1,5,1}};
    printf("a[2][1]=%d\n",a[2][1]); /* 5と表示されるはず */
}
 
 


おわりに

以上で,C言語の基本は終りです.ごくろうさまでした.
基本とはいえ,これだけあれば相当のプログラムが組めます.
例えばゲームで言うと,クイズプログラム,マインスイーパー,各種トラ ンプゲーム,ロールプレイング,スロットマシン,競馬,などなど.もちろん, グラフィックスは除きますけど.とにかく,これだけ知っていれば,基本部分は ほぼできちゃいます.
そしてもちろん,人工知能も!!
それではみなさん,9月10日にお会い致しましょう!