情報科学演習
2015.01.05

Back to index page



  1. 本日の作業内容

  2. 小テストの結果について

    採点対象外の答案が以下のようにありました.以後は注意してください.

    コンパイルエラー b1435 b1466(日本語フォント混入) b1274(先頭の / 抜け)

    名前と番号無し b1428 b1465

    セグメンテーション違反 b1477

    以下は問題のある答案の例です.参考にしてください.

            printf("\n23 1 54 69 37 71 47 93 13 87\n");
    

    絶対にやっちゃだめ!なやつです.0点です.

            printf("Sum of above numbers:495");
    

    同じく絶対にやっちゃだめ!なやつです.0点です.

            i=0;
    

    初期化する変数が違います.

            sum==0;
    

    代入と等価演算子の入れ替わり.

            for(i=0; i<=9; i++){
                    printf("%d ",ary[i]);
                    a=0;
                    a += ary[i];
            }
    

    この場所で0を代入すると,ループが回る度に0に戻されます.

            for(i=1; i<=10; i++){
    

    繰り返す範囲の間違い.配列の添字の初期値は0です.

            for(i=0; i<=0; i++){
    

    一回しか回りませんが?

    以下はインデント(字下げ)のおかしい例です.注意してください.

            for(i=0;i<=9;i++){
                            printf("%d ", ary[i]);
                            sum= sum + ary[i];
            }
    

    for 文の中がTAB2個分下がっています.

        for(i=0; i<=9; i++){
            printf("%d ", ary[i]);
    
            sum+=ary[i];
            }
    
            printf("\nSum of above numbers: %d", sum);
            printf("\n\n------------------------\n\n");
    
            return(0);
    }
    

    for 文が終わったのに下がったまま.

  3. 前回の復習

    配列を扱いました.配列は添字(インデックス)を使って中の値を参照するもので すが,その添字は記号を利用した数式でも構いません.そのため,for 文などと組み合わせて,たくさんの値を一度に代入したり,計算した りすることが可能です.これが配列の便利なところなので,今後も反復処 理と組み合わせて利用する実習課題を行っています.

    	int ary[4];
    

    のように定義すると,次の図のように整数値を入れるための入れ物(配列)が用意されます.

    また,以下のように定義すると,下図のように値が入った配列が用意されます.

    	int ary[4] = {5, 11, 2, 3};
    

    もう一つ,前回多く見られた問題についても挙げておきます.以下のような処理を書いていた人が少なからずいました.

    	ary[i] = num;
    	num = rand() % 90 + 10;
    

    プログラムは基本的には上から順に処理が進むので,これでは1行目の ary[i] には不定の値が最初入ってしまいます.注意してください.

    それから初期化について改めて注意しておきます.初期化がきちんと出来ているかどうかは以下のようにオプションをつけてコンパイルすることでわかります.

    $ cc -Wuninitialized hoge.c

    なお,初期化が必要なものは以下のように最初に値を利用するもので,代入であれば問題ありません.

    初期化が必要な例

    	int i;
    	
    	while(i>0)
    		hoge;
    

    	int i, a;
    	
    	for(i=0; i<=4; i++)
    		a += i;
    

    初期化が不要な例

    	int i, j, count;
    	
    	for(i=0; i<=4; i++);{
    		count = 0;
    		
    		for(j=0; j<=4: j++)
    			count++;
    	}
    

  4. 2次元配列

    2次元の配列は上の図で示したような入れ物が2重になっているもので,例えば以下のように表すことも出来ます.

    	int ary[3][4] = {{5, 11, 2, 3}, {4, 15, 6, 9}, {12, 13, 1, 7}};
    

    教科書p.54の図5.3にあるように2次元の配列を用意すると,マトリックス状にデー タを格納できます.これを利用して,表計算のようなことも出来ます.例えば, 次のような配列があるとします.

        ary[3][3] = {{11, 12, 13}, {21, 22, 23}, {31, 32, 33}}
    

    要素は例えば,ary[0][1] は12ですし,ary[2][0] は31です.

    このとき,ふたつ目のインデックス(添字)が1に関する和を取ると,12+22+32の 足し算となります.これがデータを行と列に並べた場合の列に関する和となりま す.

    111213
    212223一つ目の添字が1のものはこの行ary[1][j]
    313233
    2つ目の添字が1のものはこの列
    ary[i][1]

    また,マトリックス的なものでは無い多次元配列の使い方としては,前回説明し た温度測定の場合でもあります.1次元の配列だと,1日の温度のデータが格納で きるだけですが,次元を上げていくと次のようにも使えます.

    次元補足
    2 temp[5][0]
    temp[16][14]
    5日午前0時の気温
    16日午後2時の気温
    3 temp[1][5][0]
    temp[2][1][15]
    1月5日午前0時の気温
    2月1日午後3時の気温
    4 temp[14][2][1][16]
    temp[15][1][5][0]
    2014年2月1日午後4時の気温
    2015年1月5日午前0時の気温

    このように添字を使用すれば,後から値を読み出すときに変数を使用して簡単に 出来ます.

    	    year = 15;
    	    month = 1;
    	    date = 5;
    	    hour = 0;
    
    	    printf("%d\n", temp[year][month][date][hour]);
    

  5. 実習

    実習の演習問題は当日ご案内します.

  6. 次回の予習範囲

    教科書のp.66-70を予習してきてください.また,次回の授業では最初に文字列配列に関する小テストを実施しますので,文字列について予習をしっかりしてきてください.

  7. 宿題

    授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは6日以降です.レポート提出システムから閲覧してください.


目次ページに戻る