academic.002 C言語入門「配列を使おう!」

この記事は2002年に書かれたものです。

                                                          2002年06月10日発行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■Webプログラミング - academic.002
                                              http://www.ichikoro.com/webp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                 【 Subject: C言語入門「配列を使おう!」】

                     01. プログラミング入門:C言語入門編
                     02. Web基礎知識:「WWW」       ← お休みです。
                     03. インタネット業界の一週間          ← お休みです。


こんにちは、編集者の勝部です。

今回はC言語入門だけです。
すみませんです、はい( ^.^)( -.-)( _ _)
来週のenterpriseはなるべく全部載せるようにしますです。

というのも、すでに書き溜め分の原稿を全部使っちゃてるからなんですよね。
それもかなり昔に。ああ、時間の出来た時に書けるといいなぁ(とほひ目)。

では今週も行って見ましょう!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 01. プログラミング入門:「C言語入門」
──────────────────────────────────────

■今回は配列についてです。
    まずは下のプログラムを動かしてみてください。

        ・ソース
            #include<stdio.h>

            int main(void)
            {
                int array[5];     /*配列を宣言*/

                /*配列に値を代入*/
                array[0] = 100;
                array[1] = 200;
                array[2] = 300;
                array[3] = 400;
                array[4] = 500;

                /*配列の値を表示*/
                printf("%d \n", array[0]);
                printf("%d \n", array[1]);
                printf("%d \n", array[2]);
                printf("%d \n", array[3]);
                printf("%d \n", array[4]);

                return(0);
            }

        ・実行例
            C:\>bcc32 array.c
            Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
            array.c:
            Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

            C:\>array
            100
            200
            300
            400
            500

    どんな言語でも大抵「配列」と呼ばれる物が用意されています。
    もちろんC言語にもです。

    では配列って何なのでしょうか?簡単に言うと連続した変数.....っていって
    もいきなり分かりませんよね(^^; それでは、順番を追って説明しましょう
    まず、

>        int array[5];

    とした段階で、メモリ上にはint型の変数が一度に5個分確保されます。
    arrayというのが配列の名前です。その横にある[]の間にある数字が
    「容易する個数」を示します。

      ┌────┬────┬────┬────┬────┐
      |     |     |     |     |     |
      └────┴────┴────┴────┴────┘
      array[0] array[1] array[2]  array[3]  array[4]

    その後、変数へ代入が行われております。

>        /*配列に値を代入*/
>        array[0] = 100;
>        array[1] = 200;
>        array[2] = 300;
>        array[3] = 400;
>        array[4] = 500;

    普通の変数へ代入するのと変わりませんね。

      ┌────┬────┬────┬────┬────┐
      | 100  |  200 |  300  |  400  |  500 |
      └────┴────┴────┴────┴────┘
      array[0] array[1] array[2]  array[3]  array[4]

    それぞれの要素にアクセスするには、プログラムにあるように、配列名の
    横の [] の中に順番を記述します。ここで注意しなければならないことは、
    要素は、0からはじまるという点です。

    それ以外の扱い方は普通の変数と変わりません。
    違うのは一度に、たくさん扱えるという所です。


■配列の宣言

    配列というのは変数の一種ですから、宣言をしないといけません。

>        int array[5];

    これで、int型のarrayという名前の変数を5個用意できました。もちろん配列の名前
    は自由に決められます。複数同時に宣言することもメモリが許す限りいくらでも可
    能です。

    実際の書式は、

        データ型 配列名[必要な個数], 配列名[必要な個数], ...配列名[必要な個数];

    という具合にになります。

    当たり前ですが必要な個数の部分に-50などと負数を指定するとエラーになります。
    3.5などの少数付きの物もご法度です。本当かどうか早速試してみましょう。

        ・ソース
            #include<stdio.h>

            int main(void)
            {
                int array1[-5];
                int array2[3.5];

                array1[0] = 10;
                array2[0] = 20;
                printf("%d %d\n", array1[0], array2[0]);

                return(0);
            }

        ・実行例
            C:\>bcc32 array.c
            Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
            array.c:
            エラー E2021 array.c 5: 配列には最低 1 個の要素が必要(関数 main )
            エラー E2313 array.c 6: 定数式が必要(関数 main )
            *** 2 errors in Compile ***


    ただ、用意することは不可能でも

      array[-50]

    と言う記述をすることはあります。
    後ほど出てきますので、しばらくお待ちください(^-^)/


    待ちきれない、そんなあなたは以下のプログラムをを実行してみてください。

        #include<stdio.h>

        int main(void)
        {
            char *str = "News Paper";

            /* Paperを表示 */
            str += 5;
            printf("%s", str);

            /* Newsを表示 */
            str[-1] = '\0';
            printf("%s", &str[-5]);

            return(0);
        }

    う〜ん、何の意味もないプログラムなので、細かいところを突っ込まないで
    くださいね(^^;


■配列の使い方

    では、今度は初期化をしてみましょう。
    上でも書いたプログラムを改めて見てみましょう

        ・ソース
            #include<stdio.h>

            int main(void)
            {
                int array[5];     /*配列を宣言*/

                /*       ↓ここが初期化しているところです   */
                array[0] = 100;
                array[1] = 200;
                array[2] = 300;
                array[3] = 400;
                array[4] = 500;

                /*配列の値を表示*/
                printf("%d \n", array[0]);
                printf("%d \n", array[1]);
                printf("%d \n", array[2]);
                printf("%d \n", array[3]);
                printf("%d \n", array[4]);

                return(0);
            }

    ここまでに書いてきたとおり、配列は0からはじまり、要素数-1で終わります。
    それ以外は普通の変数と同じように初期化できる事がわかりますよね。

    変数と同じということは、配列も宣言すると同時に初期化できるのでしょうか?
    この答えはYesです。

        ・ソース
            #include<stdio.h>

            int main(void)
            {
                int array[5] = {100, 200, 300, 400, 500};

                /*配列の値を表示*/
                printf("%d \n", array[0]);
                printf("%d \n", array[1]);
                printf("%d \n", array[2]);
                printf("%d \n", array[3]);
                printf("%d \n", array[4]);

                return(0);
            }

    宣言時に初期化する時は {} を付け、中の値はカンマで区切ります。
    また、

        ・ソース
            #include<stdio.h>

            int main(void)
            {
                int array[] = {100, 200, 300, 400, 500};

                /*配列の値を表示*/
                printf("%d \n", array[0]);
                printf("%d \n", array[1]);
                printf("%d \n", array[2]);
                printf("%d \n", array[3]);
                printf("%d \n", array[4]);

                return(0);
            }

    このように、宣言時に用意する個数を省略すると、自働的に代入した個数と同じだけ
    用意してくれます。特別な事情がない限りは、こちらの書き方をおすすめします。

    ここで注意しなければならないのは、要素数を越えたところを操作しようとすると、
    フリーズやクラッシュの原因となることです。上で言えばarray[1000]などです。

    動く場合もありますが、非常に危険です。遊びや実験以外では絶対にしないで下さ
    いね。と、言いますかこれが原因のバグはしょっちゅうあります(^^; Windowsだと
    「不正な処理を.....」系のエラーがこれだったりする場合が多いです。


■もっと効率の良い配列の使い方

    ここまでご紹介したプログラムは、あまりスマートな書き方ではありませんでした。
    もっとスマートなやり方をご紹介しましょう。

        #include<stdio.h>

        int main(void)
        {
            int array[5];
            int val;
            int i;

            /*--------------------------------------*/
            /*           配列の値を初期化           */
            /*--------------------------------------*/
            val = 100;            /* 最小値を代入 */
            i   = 0;              /* 添え字を初期化 */
            while( i < 5 ){                /* 配列の個数分ループする */
                array[i] = val;

                val = val + 100;           /* 値を増やす */
                i   = i   + 1;             /* 代入する場所を進める */
            }


            /*--------------------------------------*/
            /*           配列の値を表示する         */
            /*--------------------------------------*/
            i = 0;
            while( i < 5 ){
                printf("%d \n", array[i]);

                i = i + 1;
            }

            return(0);
        }

    それぞれ反復構造を用いることで、例えば配列の数が1000個になっても
    大丈夫になりました。そして、気がつかれたでしょうか?そうなんです。
    要素数の部分には変数が使えるのです。

    そうでないと、大変なことになってしまいますからね(^^;


■マジックナンバーを使わない!

    しかし、上のプログラムには問題があります。
    それを解決したのが下のプログラムです。

        #include<stdio.h>

        #define MIN_VAL     (100)
        #define STEP        (100)
        #define ARRAY_SIZE  (5)
        #define ARRAY_MIN   (0)
        
        int main(void)
        {
            int array[ARRAY_SIZE];
            int val;
            int i;

            /*--------------------------------------*/
            /*           配列の値を初期化           */
            /*--------------------------------------*/
            val = MIN_VAL;                              /* 最小値を代入 */
            for( i=ARRAY_MIN ; i<ARRAY_SIZE ; i++ ){        /* 配列の個数分ループする */
                array[i]  = val;                            /* 配列に代入 */
                val      += STEP;                           /* 値をSTEP分増やす */
            }

            /*--------------------------------------*/
            /*           配列の値を表示する         */
            /*--------------------------------------*/
            for( i=ARRAY_MIN ; i<ARRAY_SIZE ; i++ ){        /* 配列の個数分ループする */
                printf("%d \n", array[i]);
            }

            return(0);
        }


    次回は何が問題だったのか、そしてこのプログラムについて解説したいと思います。
    お楽しみに(^-^)/


    【 確 認 】
        ・あなたは配列の宣言が分かりますか?
                Yes / No

        ・あなたは配列の初期化が2種類とも分かりますか?
                Yes / No

        ・あなたは配列が何物かを、知らない人に説明できますか?
                Yes / No


        Noがあったら、しっかりと見直しましょう〜。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 02. Web基礎知識
──────────────────────────────────────

    ※すみません、今週はお休みです。
     来週にご期待ください。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 03. インタネット業界の一週間
──────────────────────────────────────

    ※すみません、今週はお休みです。
     来週にご期待ください。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                           編    集    後    記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

いつも行っているスポーツクラブにサウナがあり、毎回使用しているんですが、
ホントに気持ちいいんですよね〜。その後広いお風呂で足を伸ばしていると幸せです。
ホンワカした気分で夜の新宿の街を歩いていると、風が何とも気持ちいいのです。

ただ、サウナに入るたびに思うのですが、「息するのつらくありません?」
どこのサウナもそうなんですが、熱い空気が器官に入って来て、みなさんつらくあり
ませんか?? 我慢してるんですよね(^^;

もし「サウナで使える新鮮な空気」が100円くらいで売ってたら間違いなく買うのになぁ
とか考えていたのですが、人間は「地面」に価値を見つけ、お金を出すようになりまし
た。最近は「水」にも価値を見つけ、お金を払うようになりました。最初は「信じられ
ない」と言っていた人も今では普通に買って飲んでいるんじゃないでしょうか。

とすると、次は「空気」か?
まぁサウナで使うかどうかは別にして、「クリーンエアー」を買う日がいつかやってく
るのかなぁと、口の周りを手で覆いながらサウナの中で色々と考えていました。それも
何だかなぁという感じですね。

#そういえばドラえもんでそんな道具があったような、なかったような。


ではでは、また来週お会いしましょう (^-^)/~~
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

                   【 Webプログラミング Code Sample 】

                    発  行 : ichikoro.com
                発行責任者 : 勝部 麻季人
                              < mailto:katsube@ichikoro.com >
                  発行部数 : 2075部(前回)
                 Webサイト : < http://www.ichikoro.com/webp/ >
            お問い合わせ先 : < mailto:mm-webp@ichikoro.com >

                            Powerd by まぐまぐ
    All Right Reserved, CopyRight(C) 2001 Webプログラミング Code Sample
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

コメント

コメントを入力. Wiki文法が有効です:
D᠎ N E᠎ Q Y