情報科学演習
2016.01.04

Back to index page



  1. 本日の作業内容

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

    小テストではどうしてもエラー等の採点対象外の答案が出やすいのですが,それでも自分で確認して提出はしないように気をつけてもらいたいです.

    コンパイルエラー: b1510 b1559 b1428 b1435

    セグメンテーション違反: b1501 b1516 b1539

    上記の2つは採点対象外です.セグメンテーション違反は配列のサイズ以上のものを扱おうとした場合に発生します.添字(変数)の使い方が間違っている場合によく起こります.以後は注意しましょう.

    インデントのミスも相変わらず発生しています.

    インデントのおかしいもの: b1501 b1507 b1508 b1530 b1548 b1558 b1569 b1570 b1579 b1450 b1288

    学生番号が無かったりおかしかったりするもの: b1516 b1561

    名前が無いもの: b1516

    ハイフンラインが無いもの: b1548

    さて,以下は問題のあるプログラムの例です.参考にしてください.

            a = rand() % 10 + 1;
    
            printf("Today's lucky prime number:%2d\n",m[a-1]);
    

    配列の要素は添字が0(ゼロ)から始まるので,わざわざ自然数にする必要は無いですね.

            a=rand()%9+1;
    

    10個の数のどれかを選ぶのだから10の剰余以外にはありえません.他にも11の剰余として計算している人がいました.いつになったら余りがわかるようになるのでしょうかねえ?

            for(i=0; i<=9; i++)
                    ary2[i] = ary1[i];
    

    いろいろなパターンがありましたが,いずれにしても今回のプログラムに for 文は必要ありません.

  3. 宿題の結果について

    今回はわりと不備が少なかったのですが,以下の2つは残念です.以後注意しましょう.

    解答用紙不使用: b1543

    セグメンテーション違反: b1435

    以下は例によって問題のあるプログラムの一例です.参考にしてください.

            for(i=0; i<=99; i++){
                    a = rand() % 11;
                    b[a]++;
            }
    

    何人かいたのですが,コインを10回投げるのでは無く,ただ単に0から10までの乱数の出現頻度の調査になり下がっているものがありました.

            printf("\nNumber of head:   0   1   2   3   4   5   6   7   8   9  10\n");
    

    この程度は for 文で表示させましょう.

                            if(num == 1)
                                    sum += 1;
                            else
                                    sum += 0;
    

    else の処理は要らんですね.

    以下は減点対象のものです.だいぶ減りましたが,もうちょっとですね.注意してください.

    インデントの不備: b1501 b1506 b1519 b1537 b1568 b1575

    学生番号表示の不備: b1519

    ハイフンライン無し: b1540 b1576

  4. 前回の復習

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

    	int ary[4];
    

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

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

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

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

    $ 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++;
    	}
    

  5. 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[4][0]
    temp[16][14]
    4日午前0時の気温
    16日午後2時の気温
    3 temp[1][4][0]
    temp[2][1][15]
    1月4日午前0時の気温
    2月1日午後3時の気温
    4 temp[15][2][1][16]
    temp[16][1][4][0]
    2015年2月1日午後4時の気温
    2016年1月4日午前0時の気温

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

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

  6. 実習

    実習の演習問題(予習用)はこちらです.

  7. 次回の予習範囲

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

  8. 宿題

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


目次ページに戻る