情報科学演習
2014.01.06

Back to index page



  1. 本日の作業内容

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

    小テストの結果は悲惨でした.きちんと学習している人とそうでない人の二極分化が著しいです.また,大量の不合格者が出そうな悪い予感が漂ってきました.しっかり予習と復習をしましょう.

    まずは,採点対象外のものです.以下のようになっています.

    コンパイルエラー b1324 b1353 b1381 b1184 b1204 b1281
    セグメンテーション違反 b1315 b1333 b1348 b1364 b1115 b1244 b1269
    解答用紙の不使用 b1346 b1351 b1375
    以前の課題の提出 b1351

    「セグメンテーション違反」は配列の要素が無いような添字を使用したり,表示させる型が違ったりすると出ます.注意してください.

    問題のある答案は多すぎてきちんとは紹介出来ないのですが,以下の二つのパターンがやたら多く見られました.しっかり問題文を読むようにしましょう.

            char str[11] = {10,11,12,13,14,15,16,17,18,19,20};
    

    問題文には for 文を使用して,とあるので,上のはダメです.

            for(i=10; i<=20; i++){
                    a[i] = rand()% 11 + 10;
            }
    

    普通に10から20までの数を入れればいいので,乱数は要りません.

  3. 宿題の結果について

    宿題の方ではコンパイルエラーは無かったのですが,セグメンテーション違反がやはりいくつか見られました.注意しましょう.

    解答用紙不使用 b1327 b1329

    セグメンテーション違反 b1344 b1352 b1369 b1370 b1273

    無限ループ b1064

    以下は良くないプログラムの例のいくつかです.

            int i,j,k,l,m,sum,num,a[11]={0,0,0,0,0,0,0,0,0,0,0};
    

    やたらたくさん変数を定義していますが,これは for 文のためのもののようでした.ですが,前にも説明しているように for 文は仮変数として使用する i などは別に文ごとに変える必要はありません.無駄な変数を使用するのは止めましょう.また,配列の初期化も今回の例のような規則的なものは for 文で行うようにしましょう.

            int a[10000],b[10],c[11],i,j,k,num;
    
            printf("   0     1     2     3     4     5     6     7     8     9     10\n");
    

    意味の無い配列が定義されています.また,コインの枚数を表示する部分ですが,こういうのも for 文を使用しましょう.

            for(i=1,num=rand()%1024+1;i<=10000;i++,num=rand()%1024+1){
                    if(num==1)
                            coin[0]++;
                    else if(num==2)
                            coin[10]++;
                    else if(num<=12)
                            coin[1]++;
                    else if(num<=22)
                            coin[9]++;
                    else if(num<=67)
                            coin[2]++;
                    else if(num<=112)
                            coin[8]++;
                    else if(num<=232)
                            coin[3]++;
                    else if(num<=352)
                            coin[7]++;
                    else if(num<=562)
                            coin[4]++;
                    else if(num<=772)
                            coin[6]++;
                    else
                            coin[5]++;
            }
    

    ごくわずかですが,このような処理がありました.こういう力業は好ましく無いですね.

                            printf("\n");
                    }
                    printf("\n----------------------------------\n\n");
    
    
                    return(0);
    }
    

    インデントについてはかなり良くなってきています.しかし,このようなものがまだ残っているので注意してください.上の例はTABの個数が違っています.

  4. 前回の復習

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

  5. 2次元配列

    教科書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[6][0]
    temp[16][14]
    6日午前0時の気温
    16日午後2時の気温
    3 temp[1][6][0]
    temp[2][1][15]
    1月6日午前0時の気温
    2月1日午後3時の気温
    4 temp[13][2][1][16]
    temp[14][1][6][0]
    2013年2月1日午後4時の気温
    2014年1月6日午前0時の気温

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

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

  6. 実習

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

  7. 次回の予習範囲

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

  8. 宿題

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


目次ページに戻る