情報科学演習
2012.11.26

Back to index page



  1. 本日の作業内容


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

    時間制限のある小テストと言うプレッシャーの中でエラーなく解答を提出できるよう今後も訓練していきましょう.以下はいつものように問題のある答案の紹介です.

    やはりエラーが多く見られました.コンパイルエラーは以下の解答です.

    b1202 b1225 b1257 b1270 b1273 b1276 b1284 b1288

    b0969 b1106

    無限ループも見られました.

    b1223 b1281

    古い宿題を出してきた人もいました.

    b1163

    次のは必ず何人かはやってしまうのですが,絶対にやっちゃだめなやり方です.

            printf("-5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10\n\n");
    

    また,次のように無駄なものもあります.変数は i だけでいいのに,教科書の和を求めるプログラムの意味がわからないので,同じように和を求めてしまうという,分かっていない人にありがちな例です.

            a=-5 ;
    
            for(i=-5 ; i<11 ; i++){
                    printf("%d ",a);
                    a=a+1;
            }
    

    次のはまったく理解不能でした.これも絶対にやっちゃダメですね.

            for(i=0; i<=0; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=0; i<=1; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=1; i<=2; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=2; i<=3; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=3; i<=4; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=4; i<=5; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=5; i<=6; i++)
                    sum += i;
            printf("%d ",sum);
            for(i=6; i<=7; i++)
                    sum += i;
            printf("%d ",sum);
    

  3. 宿題の結果について

    今回の宿題では補足説明が正しく無くて御迷惑をお掛けしました.すみませんでした.場合によっては long でも数値がオーバーフローする可能性がありますので,定義どおりの for 文3つでは間違った答えとなることがありました.工夫が必要でした.

    まずはいつものようにコンパイルエラーの提出が以下の学生さんになります.採点しませんので,提出時にしっかりチェックしてください.

    b1261

    解答用紙を使用しない人もなかなか無くなりません.

    b1251 b1279

    提出してもらった解答で処理自体は間違っていなくても効率の悪鋳物もありました.以下のはもっと有効に変数 i を使用することで簡潔になります.

            for(i=1; i<=n; i++){
                    a *= m;
                    m -= 1;
            }
    

    インデント(字下げ)については何度も指摘していますが,理解してもらえていないようです.制御構造を記述する場合にはインデントは理解の大きな助けになりますので,気をつけてください.

    下のような表現が多くの解答に見られました.おかしいですね.

            for(k=1; k<=n; k++)
                    i*=k;
                    for(l=m-n+1;l<=m;l++)
                            j*=l;
                            printf("%d C %d = %d\n\n", m, n, j/i);
    

    下のものは以前にも指摘したのですが,for 文の処理の範囲を決める中括弧は for 文の位置が基準ですので,左端まで戻ることはありません.

            for(i=m; i>m-n; i--){
                    tmp1 *= i;
    
    }
    

  4. 前回の復習

    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, ... などは通常の変数名として使用しません.整数を扱う変数名としては,m, n, p, q などを使用するか,きちんとした名前をつけるかしてください.

    • 「式2」について

      「式2」は真偽値を判断するためのものです.教科書に書いてあるように,式2が 真であればループ内の処理(「文」)を実行します.偽になるとループを抜けるこ とになります.無限ループになる,もしくは,実行しない場合など,この式2も 原因となっていることがありますので,注意してください.

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

      上のような場合,ループは一回も回りません.また,

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

      では無限ループになります.

    • 「式3」について

      式3も無限ループを引き起こす可能性のある部分ですので注意してください.例 えば,次の例は教室のCの環境では動作しますが,別の環境では無限ループにな る場合がありますので,注意してください.

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

  5. 多重の for

    例題4.8では2重の for 文を使用して2次元の座標のような考え方を実 現しています.ただし,あまり良い例ではありません.もっと単純な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)
    

    例えば,そこで変数 i j の値を表示させてみるとよくわかるでしょう.

    	for(i=1; i<=5; i++)
    		for(j=1; j<=5; j++)
    			printf("(%d,%d)", i, j);
    

    ちなみに教科書の例題4.8を書き直すと以下のようになります.

    #include <stdio.h>
    
    main()
    {
    	int i, j;
    	
    	for(i=-5; i<=5; i++){
    		for(j=0; j<=i*i; j++)
    			printf(" ");
    			
    		printf("*\n");
    	}
    	
    	return(0);
    }
    

    #include <stdio.h>
    
    main()
    {
    	int i, j;
    	
    	for(i=-5; i<=5; i++){
    		for(j=0; j<=25; j++)
    			if(j==i*i)
    				printf("*");
    			else
    				printf(" ");
    				
    		printf("\n");
    	}
    
    	return(0);
    }
    

  6. 実習

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

  7. 次回の予習範囲

    教科書のp.49の例題4.9を予習してきてください.ただし,前回と同様5行目でインクルード されている conio.h というヘッダファイルは教室の環境には無いので 使えません.これは12行目の clrscr() (クリアスクリーン)を使うた めのものなので,この行を削除すれば conio.h をインクルードしなく ても大丈夫です.

  8. 宿題

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

    10.184.10.130/report/

    にアクセスして問題を見てください.


目次ページに戻る