プログラミング入門 情報科学演習
2016.12.05

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    今回はコンパイルエラーが一人いました.エラーのある答案は出さないでください.

    コンパイルエラー: program4

    それからインデント(字下げ)については相変わらず改善が見られません.以下のように大勢の人がインデントに不備のあるプログラムを書いています.授業中に質問等を行って一日も早くおかしいところに気づいてください.

    インデントの不備: b1390 b1607 b1609 b1614 b1620 b1622 b1630 b1636 b1637 b1642 b1643 b1649 b1653 b1655 b1667 b1672 b1674 b1675 b1680 b1269 b1287 b1481 b1523 b1529 b1560 b1563

    反復処理が始まってから変数の初期化についてもくどいくらい言っています.が,以下のように初期化を行っていないプログラムも見られました.注意しましょう.

    初期化を行っていないもの: b1628 b1629 b1634 b1635 b1638 b1680 b1288

    解答用紙の不使用も出てしまいました.最初から解答用紙にプログラムを書く癖をつけてください.

    解答用紙不使用: b1541

    では,以下はいつものように不備のある解答の例です.参考にしてください.

            int i,b,c;
    

    今回一番不思議だったのは,変数名を i, num, max, min と指定していたのに実に多くの人が「無視した」ことです.なぜなんでしょうか?上のようなひどいものは減点しました.

        
             int dice,max,min,i;
    

    だから〜, dice はサイコロのことだって!

            for(i=1; i <= 10 ;i++){
                    int a = rand() %9000+1000;
    

    ごく一部に見られました.変数 a int 型であることをなぜ10回も宣言するのでしょうか?

            int i,nums[10];
    

    配列はまだ学習していませんので,使う必要はなかったのですけどね.

                    if(num > max){
                            max = num;
                            if(num < min){
                                    min = num;
                            }       
                            else{
                                    min = min;
                            }
                    }       
                    else if(num < min){
                            min = num;
                    }
                    else{
                            max = max;
                            min = min;
                    }
    

    大変な処理,お疲れ様です.解答例をよく見て勉強してください.

    何度も言っていますが,必ずどちらか,もしくは,どれかの処理をしなければならない時には else が出てきますが,してもしなくてもよいときには else は必ずしも必要ありません.使わなくても良い else を使うとこんなにややこしくなる,という,悪い例の代表ですね.

            int a,max,min;
    
            printf("My student number: s164028\n\n");
            max=a;
    

    結局,変数の値は初期化されていません.変数 a の値が不定であるのに,それを max に代入しても不定のままです.

                    if(a>=m)
                            m=a;
                    else if(a>=n);
                    else
                            n=a;
                    }
    

    else if の行の最後にセミコロンがあったり,なんかよくわからない処理です.当然,答えも間違ってきます.

                    if(a >= M){
                            M = a;
                            }else if(a <= m){
                                            m = a;
                    }
    

    変数名は小文字で始める癖をつけましょう.後は不要な else のためにややこしくなってます.

        int a = rand() % 9000 + 1000;
        int i;
        int max = a;
        int min = a;
    

    結構見られた間違いです.例えば,変数 a の値が1001とかになったとしたら,その後10回発生させる乱数でその値を下回るものはおそらく出てきませんので,最小値は間違ったものになる可能性があります. a の値が9998とかになっても同様の問題で正しい最大値を保存できない可能性があります.

                    num[i] = rand() % 9999 +1;
    

    いつになったら乱数がわかる?

    以下のようなインデントの不備が多いです.気をつけましょう.ブロックを意識してください.

            for(i=1;i<=10;i++){
                    n=rand()%9000 +1000;
            printf("%d ",n);
            if(i==1){
                    max=min;
                    max=n;
                    min=n;
            }
            if(n>max)
                    max=n;
            if(n<min)
                    min=n;
            }
    

  3. 前回の復習

    for 文が始まると,変数の値がループが回るたびにどのように変わっていくのか,十分に把握しておく必要があるのですが,そこをフォローするのが難しいのも事実です.そのため,変数の値の遷移をノートなどで確認していくことが重要です.例えば,以下のように考えてみましょう.

    #include <stdio.h>
    
    main()
    {
    	int i, j;
    	
    	for(i=0; i<=5; i++){             //  <- loop1
    		for(j=0; j<i; j++)        //  <- loop2
    			printf("   ");
    			
    		for(j=i; j<=i+5; j++){      //  <- loop3
    			printf("%2d ", j);
    		}
    		
    		printf("\n");
    	}
    	
    	return(0);
    }
    

    のようなプログラムで変数 i j がどのように変わっていくのか見てみましょう.

    loop1loop2loop3
    ijj
    0-0
    1
    2
    3
    4
    5
    10-
    -1
    2
    3
    4
    5
    6
    20-
    1
    -2
    3
    4
    5
    6
    7
    - - - -
    50-
    1
    2
    3
    4
    -5
    6
    7
    8
    9
    10

    この変数の変化と実際の実行結果との対応を考えてみてください.

  4. 多重の for

    前回に引き続き多重のループの練習を今日も行いますが,ループの処理の学習の 初期には変数の値がどのように変化しているのか,注意して行くと間違いに気づ いたり,処理の無駄に気づいたりということが多いので,分からなくなってきた ら,メモ用紙などに変数の値の遷移を書いて見直してみてください.

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.42からp.48の while 文を予習してきてください.

  7. 宿題

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

    10.184.10.130/report/

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


目次ページに戻る