プログラミング入門II
2019.06.24

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    まずは形式的な不備がいくつか出てきましたので,ご紹介します.気をつけましょう.

    解答用紙に番号と名前無し: b1848
    出力結果に番号なし: b1806 b1843
    ハイフンライン無し: b1806
    間違った番号出力: b1838

    以下は気になるプログラムの例です.参考にしてください.

            int num[27],tmp,i,j;
    

    配列を int 型で作るのであれば,要素は26個で十分です.

    kenhuimixc
    ekhnimiucx
    

    大文字という条件だったのに…

            for(i = 0; i <= 9; i++)
            {
                    str[i] = rand() % 26 + 65;
                    
                    printf("%c", str[i]);
            }
    

    これでは同じ文字が重複して出ます.

            //入れ替え
            for(i=0;i<10;i++)
            {
                    for(j=i+1;j<=10;j++)
                    {
                            if(b[i] > b[j])
                            {
                                    tmp = b[i];
                                    b[i] = b[j];
                                    b[j] = tmp;
                            }
                    }
            }
    

    配列の要素の個数が10個なので,上の添字で回すと余分なnull文字まで入れ替えます.なので,

    EGSADRTCBH
    ^@ABCDEGHRS
    

    こんなことになります

            for(i = 0; i <= 9; i++)
            {
                    for(j = 0; j <= 9; j++)
                    {
                            if(a[i] == a[j] && i != j)
                            {
                                    while(a[i] == a[j])
                                    {
                                            num = rand() % 26 + 65;
                                            
                                            a[j] = num;
                                    }
                                    if(i > j)
                                    {
                                            i =  j - 1;
                                    }
                            }
                    }
            }
    

    重複させないために工夫していますが,これがデータ数が多くなった場合に処理が重くなる原因になります.最初に重複しないようにすれば良いだけです.

            for(i = 0; i <= 9; i ++)
            {
                    alpha[i] = rand() % 26 + 65;
                    
                    for(j = 0; j <= i - 1; j ++)
                    {
                            if(alpha[j] == alpha[i])
                            {
                                    i --;
                            }
                    }
            }
    

    こちらも同じです.工夫はしているのですが,毎回それよりも前の要素全部を当たらないといけないのは無駄な処理になります.

  3. 前回の復習

    文字配列を体験しました.ただ,1次元の文字配列は文字コードによる処理でも同じようなことができるので,そこまで威力を発揮しません.2次元の文字列配列に期待しておいてください.

  4. 2次元配列

    1. 基本表現

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

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

    2. データの2次元表現

      教科書p.124のリスト6_8にあるように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]

    3. データの関連付け

      サイコロの目の出た頻度のデータは配列を用いると簡単に保存できることを以前に体験しました.ただ,出た目が多い順に並べ替えるような操作をすると,頻度の情報だけではどの目がどれだけ出たのかわからなくなります.そこで,サイコロの目と頻度とを2次元の配列でセットで格納しておけば,並べ替えが可能になります.例えば,

      1, 17
      2, 15
      3, 10
      4, 20
      5, 21
      6, 17
      
      や,
      1, 2, 3, 4, 5, 6
      17, 15,10, 20, 21, 17
      
      のように,セットで目と出た頻度を記録しておくと,並べ替えても目の情報を保持できます.

      1, 17, 2, 15, 3, 10, 4, 20, 5, 21, 6, 17

      のように1次元配列でも可能ですが,一つおきに意味が違う数値が並ぶので,少し面倒です.

    2次元配列のキモ

    • 宣言するときの [ ] の1つ目が外側の { } に対応し,2つ目が内側の { } に対応する

    • ary[4][3]ならば4行3列のマトリックスのように考える

    • int ary[4][3] = {{11, 12, 13},{21, 22, 23},{31, 32, 33},{42, 42, 43}};の2次元表現
      11 12 13
      21 22 23
      31 32 33
      41 42 43
      

    • for 文と組み合わせるときには,外側のループの添字と内側のループの添字を組み合わせて配列の全要素に順番にアクセスできる

    • for(i・・・ ){for(j・・・ ){ ・・・ }} のとき
      ary[i][j] ならば1行ずつ順にアクセス
      ary[j][i] ならば1列ずつ順にアクセス

  5. 実習

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

  6. 次回の予習範囲

    引き続き教科書のp.121-124とそれに加えてp.127-128を予習してきてください.

    また,次回は授業の後半に確認テストを実施しますので,準備をよろしくおねがいします.

  7. 宿題

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


目次ページに戻る