情報科学演習
2011.07.11

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    縦の列の平均を求める際に,次のようなプログラミングをしている人が多くいま した.

            for(j=0;j<=k-1;j++){
                    total=0;
                    for(i=0;i<=k-1;i++){
                            total+=a[i][j];
                    }
                    avg=total/k;
                    printf("%4.1f", avg);
            }
    

    2重のループを回す場合に通常外側のループの変数を i として内側を j とするのが慣例です.その場合,列の和を取るときには第2引 数 j を揃えて和を取ることになります.すなわち,和を取ると きの式に出てくる配列要素は a[j][i] となります.この方が理 解がしやすいので,そのようにするように今後は注意してください.

  3. 前回の復習

    前回の実習課題iの理解が難しい人が多く見られました.配列の要素の 参照と値の入れ換えの組合せがややこしいので,処理に関して混乱している様子 でした.そこで,何人かの人には授業中に説明したのですが,以下のように手作 業で for ループを動かしてみることをお薦めします.メモなどに実際 の変数や配列の要素の値の変遷を書いていくと,プログラミングの参考になりま すので,今後もこのような手法も一つだと思って活用してください.

    問題

    例題5.3を参考に,配列の要素の値を大きい順に並べ替える操作を行なうプログ ラムを考える.100以下の正の整数を乱数で5つ発生させ,それらを大きい順に並 べ変えよ.

     85  48  72  41  51
     85  72  51  48  41
    

    例えば,上の例のように現在配列 ary に順に85,48,72,41,51が入っ ているとします.このとき,配列の要素は以下の表のようになっています.

    添字01234
    要素8548724151

    まず,先頭の要素(0番目)と次(1番目)の要素,2番目の要素と順に比較し,もし 後の方が大きい場合には値を入れ換える操作を行うものとします.そのとき,比 較の操作は

        if(ary[i] < ary[j])
    

    のように2重ループの変数 i j を使用して行うものとし ます.そのとき, i j の値と配列の要素がどのように変 化していくのかを順に示すと,以下のようになります.

    変数ij添字 01234操作
    01要素8548724151そのまま
    02要素8548724151そのまま
    03要素 8548724151そのまま
    04要素 8548724151そのまま
    一巡目終了
    12要素8572484151入れ換え
    13要素8572484151そのまま
    14要素8572484151そのまま
    二巡目終了
    23要素8572484151そのまま
    24要素8572514148入れ換え
    三巡目終了
    34要素8572514841入れ換え
    四巡目終了

    このように i j が変化していくようなループを作れば完 了です.内側のループの繰り返しの回数が段々と減っているのは,次のように表 示するプログラムと同じです.

    ****
    ***
    **
    *
    

  4. 文字列配列

    C言語では文字列(abc shimane のような文字の組)は配列 となります.それぞれの文字は配列の要素として利用可能です.文字列に関して は以下のような注意が必要です.

    • ヌル文字

      文字列の最後には文字列の終わりを意味するヌル文字 \0 があります. これは目には見えませんが,必ず付いているものです.ですので,配列の要素の 個数は文字数+1にしておく必要があります.

      実際にNULL文字が存在するのかは以下のようなプログラムで確認することが出来 ます.

          char str[2] = "1";
      
          printf("%d %d\n", str[0], str[1]);
      

    • 文字としての数字

      見た目には区別しにくいですが,char 型で定義すると数字も文字にな り,四則演算はできなくなります.注意してください.次の配列は数値です.

          int ary[2] = {1, 2};
      
          printf("%d\n", ary[0]+ary[1]);
      

      しかし,次のものは文字なので,計算には使用できません.

          char str[3] = {'1', '2', '\0'};
      
          printf("%d\n", str[0]+str[1]);
      

    • static 宣言

      教科書のp.59からは初期化のところで,auto (省略可)と static の宣言の話が出てきます.この授業の範囲では auto で構 いませんので,特別に宣言することは不要です.

  5. 実習