情報科学演習
2012.01.23

Back to index page



  1. 本日の作業内容

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

    全般に非常に悪い成績となった今回の小テストでした.コンパイルエラーの答 案が25件ありました.コンパイルしてエラーになる答案は採点しませんので, 今後は提出しないようにお願いします.期末試験のときなど特に注意してくだ さい.必ず,まず,コンパイルしてエラーがでないこと,次に,実行できるこ とを確認して添付してください.

    さて,中身ですが,いろんな間違いがありましたが,問題の大きいものと代表的 なものだけ以下に示します.

           for(i=0;i<3;i++){
            ary[i]=i+1;
            printf("%d ",i+1);
            }
            for(i=0;i<2;i++){
            ary[i]=i+2;
            printf("%d ",i+5);
            }
            printf("11\n");
    

    上のは例によって絶対にやっちゃだめ! という処理です.今回は数列で表すことができないようにわざと素数列を使用し ました.上のように,それを分割して力業で行なうのはダメです.残念ながらこ のような発想をするということだけで,この人の答案は0点になります.

            for(i=0;i<6;i++)
                    printf("%d ",ary);
    

    上の例が多く見られたもので,配列の「添字」を付けていないもの です.文字列配列が出てくるとこのような printf の使い方 も出てきますが,基本的には配列の要素を添字を使用して参照します.

            int ary[6] = {29, 23, 19, 17, 13, 11};
            int i, temp;
    
            for(i=0;i<=2;i++){
                    temp=ary[i];
                    ary[i]=ary[5-i];
                    ary[5-i]=temp;
            }
    
            for(i=0;i<=5;i++)
            printf("%d ",ary[i]);
    

    上の例は不要な処理を行っているので減点です.今回の課題は「逆順に表示」す るだけで,配列の要素を入れ換えることは指示していません.問題を良く読まな いと,無駄に減点を食らう可能性がありますので,注意してください.

  3. 宿題の結果について

    今回は当初提示していたコメントが不適切で御迷惑をお掛けしました.すみませ んでした.

    以下,いつものようにコメントですが,根本的に間違っているものについては以 下に挙げておりません.解答例を参考にしてください.

        for(i=1;i<=20;i++){
            ary[i] = rand() % 90 + 10;
            printf("%d ",ary[i]);
            if(ary[i]%2!=0)
                j++;
        }
    

    必要の無い変数 j があります.しかも,使わないのに,if 文の処理が用意してありますので,無駄があります.

            for (i = 1 ; i <= 20 ; i = i ++){
                    ary[i]=rand() % 90 +10;
    
            }
    

    上記の for 文の中の式3に御注意下さい.これは無限ループを引き起 こす可能性のあるものです.たまたま教室のPCでは動作するかも知れませんが, 他では無限ループになります.教科書やこれまでの実習でやってきたように単純 に i++ だけで大丈夫なので,変なことはしないようにしましょう.

    これで単位を落とした学生さんも過去にいます.

            for(i=0;i<20;i++){
            ary[i]=rand()%90+10;
    
            printf("%d ", ary[i]);
            }
            printf("\n");
    
            for(j=0;j<20;j++){
            b=ary[j]%2;
            if(b==1)
            printf("%d ",ary[j]);
            }
            for(j=0;j<20;j++){
            b=ary[j]%2;
            if(b==0)
            printf("%d ",ary[j]);
            }
            printf("\n\n");
    

    インデントのおかしい例です.見づらいということが理解してもらえるでしょう か.

                    if(a==0);
                    else
                            printf("%d ", ary[i]);
    

    if - else にする意味の無い処理です.

            for(i=0;i<20;i++){
                    ary[i] = rand() % 90 + 10;
                    printf("%d ", ary[i]);
            }
    
            printf("\n");
    
            for(j=0;j<20;j++){
                    if(ary[j]%2!=0)
                            printf("%d ", ary[j]);
            }
    
            for(k=0;k<20;k++){
                    if(ary[k]%2==0)
                            printf("%d ", ary[k]);
    

    ありがちな書き方なのですが,for 文が何回出てきても上のように変 数を変える必要はありません.全部 i で構いません.というよりも, i を変えない方が無難です.

    ただし,2重ループになると次の変数 j を用意しなければなりません. 期末試験では,1つの解答用紙に5問のプログラムを書くことになりますが,その 場合でも多重ループでなければ,for 文の変数は全部 i に しておきましょう.

            for(i = 0; i < 20; i++){
                    if(seisuu[i] % 2 != 0){
                            seisuu[i];
                            printf("%d ", seisuu[i]);
    

    3行目は不要です.

            for(i=0;i<=19;i++){
                    b= ary[i] % 2;
                    if(b!=0){
                            printf("%2d ",ary[i]);
                    }
            }
    

    変数 b は不要です.

                    rd = rand()% 89 + 10 ;
    

    前回の授業で説明したのに,まだ,乱数を間違っている人がいました.困ったこ とです.

  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[23][0]
    temp[24][14]
    23日午前0時の気温
    24日午後2時の気温
    3 temp[1][23][0]
    temp[2][1][15]
    1月23日午前0時の気温
    2月1日午後3時の気温
    4 temp[12][1][23][0]
    temp[13][2][1][16]
    2012年1月23日午前0時の気温
    2013年2月1日午後4時の気温

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

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

  6. 実習

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

  7. 次回の予習範囲

    教科書のp.66-70を予習してきてください.

  8. 宿題

    授業の終わりに宿題の案内をします.ただ し,問題を見ることができるのは24日以降です.


目次ページに戻る