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

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    提出に関する不備がまだ出ますね.注意してください.以下のものは採点の対象外です.

    コンパイルエラー b1341

    無限ループ b1339

    前回の宿題提出 b1204

    以下は例によって問題のあるプログラムです.まずは,内容から.

            for(i;j>=i;i=i++){
    

    これはWeb版のテキストでも紹介しましたが,for 文の式3がこれでは無限ループになると警告していたものです.C言語を使用する環境はさまざまなので,環境によって動作に違いが出ることがあります.この授業では式3は必ず i++ のように単純に記述してください.

            num = rand() % 70 + 10;
    
            if(num % 10 == 0)
                    printf("Prime numbers between %d and %d\n",num, num + 20)
    

    乱数の発生もおかしければ,その後の処理もむちゃくちゃです.

            for(j=10; j<=i+20; j++){
                    if(j%2 == 0||j%3 == 0||j%5 == 0||j%7 == 0)
                    printf("");
                    else
                    printf("%d ", j);
            }
    

    これも同じく,素数を探すことと約数を探すことは裏表の関係であることに気づけなかった例です.

            int i, j, a, b, c, d, e;
            a = rand() % 8 + 1;
            b = a*10;
            c = b + 20;
    

    豪勢に変数を使いまくっていますが,このような不要な変数は止めましょう.処理が重くなる原因です.

    ここからはインデント(字下げ)関連のものです.あいかわらず多数の答案に適切でないインデントが見られます.

                    for(j=1;j<=i;j++){
                            if(i%j==0)
                                    m=m+1;
                                    }
    

    for 文の閉じ括弧の位置はこのような中途半端なところにしないで,揃えてください.

                    for(i=num;i<=num+20;i++){
                                    div=0;
    
                                    for(j=1;j<=i;j++){
                                                    if(i%j==0)
                                                                    div++;
                                    }
    
                                    if(div==2)
                                            printf("%d ",i);
    

    ときどき見られるのですが,インデントをTAB2個分で書かれていたり,一個分だったりとぐちゃぐちゃです.

            for(i=n;i<=m;i++){
                    for(j=1;j<=m;j++){
                            if(i % j == 0)
                                    c++ ;
                    }
                            if(c == 2)
                            printf("%d ",i);
                            c = 0;
            }
    

    二つ目の if 文は内側の for 文の反復処理ではありませんので,for と同じレベルに上げてください.

            for(j = 1; j<=i; j++){
                    if(i % j == 0)
                            c++;
                    }
                    if(c == 2)
                            printf("%d ",i);
                    c =0;
    

    これも同じで for 文の中では無いので,2つ目の if の部分は下げないで下さい.

                    for(i=num;i<=num+20;i++){
                                    j=0;
    
                                    for(k=1;k<=i;k++){
    
                                            if(i%k==0)
                                                    j++;
                                    }
    
                            if(j==2)
                                    printf("%d ",i);
    
                    }
    
                    printf("\n\n----------------------\n");
    
    
                    return(0);
    }
    

    TAB幅がいい加減です.TAB一つできちんと揃えてください.

            for(i = num; i <= num + 20; i++){
                    for(j = 2; j < i; j++){
                            if(i % j == 0 )
                                    k++;
                            }
            if(k == 0)
                    printf("%d ", i);
            k = 0;
            }
    

    今度は if 文が出過ぎです.外側の for 文の繰り返しの一部ですので,下げてください.

            for(i=b;i<=b+20;i++){
                    for(j=1;j<=i;j++)
                            if(i%j==0)
                                    sum++;
                                    if(sum==2)
                                            printf("%d ", i);
                    sum=0;
            }
    

    なんか段々下がっていっていますが,まったく意味が分かりません.適切なところから始めてください.

    main()
    {
        srand((unsigned) time(NULL));
    
            int i , j, num1 = (rand() % 8+1)*10;
    
    
    
    
    
    
            printf("\n\n------------------\n");
    
        return(0);
    }
    

    また出ました.何度言っても出てきます.この状態は自分ではおそらく分かりません.なので,使いまわしをせずに一度一から入力しなおしてください.

  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. 宿題

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

    10.184.10.130/report/

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


目次ページに戻る