情報科学演習
2011.06.06

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    提出された答案の中で一番目に付くのはインデント(字下げ)の不備です.インデ ントがおかしいためにブロックの範囲の認識が難しく,採点が困難なものが多く なっています.注意してください.以下に典型的な問題のある答案を示しますの で,以後,このような処理を行わないように注意してください.

    • 無駄な手作業

              for(i=1; i<=4; i++){
              a = rand() % 25 + 65;
              b = rand() % 25 + 65;
              c = rand() % 25 + 65;
              d = rand() % 25 + 65;
              e = rand() % 25 + 65;
              printf("%c%c%c%c%c ",a,b,c,d,e);
      

      まったく無駄な手作業が入っています.こういうことを簡単にするのが for 文のような反復処理ですので,気を付けましょう.

    • 変な位置での宣言

              for(i = 1;i <= 20;i++){
                      char a = rand() % 26 + 65;
                      printf("%c", a);
                      if(i % 5 == 0)
                              printf(" ");
              }
      

      なぜ,for 文の中で char などの宣言をするのでしょうか? 変数の定義は先頭でまとめてやっておきましょう.特に,ループの中では絶対に 避けましょう.

    • 不必要な2重ループ

                      for(i = 1; i <= 4; i++){
                                      for(j = 1; j <= 5; j++)
                                                      printf("%c",a= rand() % 26 + 65);
                                      printf(" ");
                      }
      

      今回の処理は2重のループは不要です.

    • 無駄な変数

              for(b = 1; b <= 20; b ++){
                      a = rand() % 26 + 65;
                      printf("%c", a);
                      c ++;
      
                      if(c % 5 == 0)
                              printf(" ");
              }
      

      変数 c を使用してスペースを入れるための位置を判断していますが, これはまったく無駄な変数です.上記の例でいけば,変数 b を使えば 良いことです.なんでもかんでもカウンタやフラグが要るわけではありません.

    • インデントの不備

              for(i=1; i <=20; i++){
              num = rand() % 26 + 65;           この行は1TAB下がるべき
                      printf("%c",num);
                              if(i % 5 == 0)    この行は1TAB左に出るべき
                              printf(" ");
              }
      

      上記のようにインデントが不適切なものが大変多いです.

  3. 前回の復習

    for 文を学習しました.for 文はこの後で登場する while 文に比べると分かりやすく,初心者にも使い易いと言われてい るものですが,授業の実習では明らかに予 習不足のため理解が悪い人が多く見られました.しっかり予習はや りましょう.以下に,教科書の内容に関する補足を少し行っておきます.

    • 「式1」の意味

      教科書のp.39にある for 文の基本形式ですが,その内のまず「式1」 についてもう少し説明しておきます.良くあるのが,i=1 のようなも のですが,これは見てのとおり「代入」です.変数 i にこの場合数値 の1を代入しています.for ループの中で使用する変数 i の 値を初期化しているわけですが,ここで注意が必要なのは,前回多くの人が間違 えていた以下のような処理です.

          i = rand()
      
          for(i=1; i<=10; i++)
      

      上では,1行目で変数 i に乱数の値を代入していますが,その直後に for 文で i に1を代入しています.for 文で使 用する変数はこのように初期化されるので,それ以前にたとえ値を持っていた としても,変更されます.気を付けて下さい.

      そのため,for 文の仮変数として使用される i, j, k, ... などは通常の変数名として使用しません.

    • 「式2」について

      「式2」は真偽値を判断するためのものです.教科書に書いてあるように,式2が 真であればループ内の処理(「文」)を実行します.偽になるとループを抜けるこ とになります.自分のプログラムにおいて処理が実行されていないようだと,こ の条件を見直してみてください.

  4. 多重の for

    例題4.8では2重の for 文を使用して2次元の座標のような考え方を実 現しています.すなわち,変数 i j を用意して以下のよ うな処理を考えると,

        for(i=1; i<=5; i++)
            for(j=1; j<=5; j++)
    

    以下のような座標的な処理が実現できますので,その位置で何をするか決めれば いろんな処理が出来ます.

    (1,1) (1,2) (1,3) (1,4) (1,5)
    (2,1) (2,2) (2,3) (2,4) (2,5)
    (3,1) (3,2) (3,3) (3,4) (3,5)
    (4,1) (4,2) (4,3) (4,4) (4,5)
    (5,1) (5,2) (5,3) (5,4) (5,5)
    

  5. 実習