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

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    今回は採点対象外の提出は2件ありました.今後は注意してください.

    解答用紙を使用していない b1401

    学生番号と氏名が無い b1333

    以下はいつものようにまず処理に問題のある解答の例です.

            for(i=1;i<=1000;i++)
                    if(a%b==0){
                            a--;
                            b=2;
                    }
                    else
                            b++;
    

    いろいろ考えて工夫したのだと思いますが,汎用性が無いように思えます.1000回限定とかの for 文に違和感があります.

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

    これと同じようなものがかなりの数ありました.最大の素数を表示するのは1回だけなので,for 文の中に printf を入れるのは感心しません.

            for(i=num;i>=2;i--){
                    for(j=i-1;j>=2;j--){
                            if(i % j==0)
                                    j = -1;
                    }
                    if(j==1){
                            printf(" %d.\n\n",i);
                            i = j;
                    }
            }
    

    if 文の中で変数 i の値をいじっているのですが,このような処理はあまり歓迎できません.

            int i,num=rand()%9000+1000,num2,count=0;
            printf("My student number: s134015\n\n");
            for(i=(num/2)-1;i<=2;i--){
                    if(num%i!=0){
                            num2+=i;
                            break;
                    }
    
            }
    

    num2 の値が初期化されていません.オプションで初期化を確認するようにWebテキストで何度も指示していますので,確認する癖をつけてください.

            for(i=1; i<=a-1; i++){
                    count=0;
    
                    for(j=2; j<=i-1; j++)
                            if(i%j==0)
                                    count++;
    
                    if(count==0)
                            if(max<i)
                                    max=i;
            }
    

    変数 max の値が不定です.

            a = rand() % 8999 + 1000;
    

    いつまで経っても乱数と剰余のわからない人がいます.

            for(i=1; i<=(a-1); i++){
                    if((a - 1) % i == 0)
                            b++;
                            if(b == 2)
                                    c = i;
            }
    

    何をしているのでしょう?

            for(i=1;i<=a;i++){
                    for(j=2;j<=i;j++){
                            if(i%j==0)
                                    num=1;
    
                    }
                    if(num==0){
                            num2=i;
                    }
                    printf("%d\n",num2);
            }
    

    発生した乱数の行数分,1を表示しつづけます.えらい迷惑でした.

    以下はインデントの問題です.いくつかについては番号も出しましたので,自分でよく確認してください.

                    printf(" %d\n\n",max);
                    printf("----------------------------------------\n");
    
            return(0);
    }
    

    上のようにどのレベルに合わせるのか,いまだにわからない人が多いようです.制御構造(if 文や for 文)の処理部分が下がるだけです.

            for (i=0; i<a ; i++)
            {
                    yakusuu=0;
                    for (j=2; j<=i-1; j++)
                    {
                            if(i%j == 0)
                                    yakusuu++;
                    }
                                    if(yakusuu == 0)
                                            max = i;
            }
    

    最後の if 文の構造は全部位置がおかしいですね.

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

    上は21番ですが,字下げする幅が4文字分だったり3文字分だったりといい加減です.スペースでは無く,TABで下げればこのようなことにはなりませんが.

        for(i=1;i<a;i+=1)
        {
            for(j=2;j<i;j++)
                    if(i%j==0)
                            j=j+i;
            if(i==j)
                            max = i;
            }
                    printf("The greatest prime number under %d is %d.\n\n",a,max);
    
        printf("----------------------------------------\n\n");
    

    32番.2つ目のif 文の代入の式の位置がおかしいし,その後の printf もおかしい.

            for(i=2; i<num; i++){
                            count = 0;
    
                    for(j=2; j<=i-1; j++)
                            if(i%j==0)
                            count++;
    
                    if(count==0)
                     max=i;
    
            }
    

    35番.最初のfor 文の処理の位置と if 文の代入の式の位置.

        printf("The greatest prime number under %d", a);
    
            for(i=2;i<a;i++){
                      c=0;
             for(j=2;j<=i-1;j++){
                  if(i%j==0)
                       c++;
         }
    
         if(c==0)
             b=i;
    
      }
    

    41番.for 文がぐちゃぐちゃ.

        printf("The greatest prime number under %d is ", a);
    
            for(i=1; i<a; i++){
                    count = 0;
    
                    for(j=2; j<=i-1; j++)
                            if(i%j==0)
                                    count++;
    
                    if(count==0)
                            b=i;
                    }
            printf("%d", b);
    
            printf("\n\n----------------------\n\n");
    
                    return(0);
    }
    

    43番.なぜ for 文が下がる?しかも,インデントの幅がまちまち.

        for(i=1; i<a; i++){
                    count = 0;
    
                    for(j=2; j<=i-1; j++)
                                    if(i%j==0)
                                                    count++;
                    if(count==0)
                            b=i;
        }
    

    46番.インデントの幅がTAB1個分だったり,2個分だったり,3個分だったり...

                    printf(" %d\n\n",max);
                    printf("-----------------------------\n");
    
            return(0);
    }
    

    57番.最初の例といっしょ.

            for(i=1; i<n; i++){
                    y = 0;
                    for(j=1; j<=i; j++){
                            if(i%j==0)
                                    y += 1;
                    }
                    if(y==2)
                    s = i;
            }
    

    63番.if 文の中.

            for(i=2; i<num; i++){
                    count = 0;
    
                    for(j=2; j<=i-1; j++)
                            if(i%j==0)
                                            count++;
    
                    if(count==0)
                            max=i;
            }
    

    65番.count++ の位置.

        for(i=1; i<num; i++){
            count = 0;
    
            for(j=2; j<=i-1; j++)
                    if(i%j==0)
                            count++;
    
            if(count==0){
                    max = i;
            }
        }
    

    70番.内側の for 文と,if 文の中の処理.

        printf("The greatest prime number under %d is  ",num);
    
            for(i=1; i<num; i++){
                    count = 0;
    
                    for(j=2; j<=i-1; j++)
                            if(i%j==0)
                                    count++;
    
                    if(count==0){
                            max = i;
                    }
            }
    
            printf("%d.\n ",max);
    
            printf("\n----------------------\n\n");
    
        return(0);
    

    77番.for 文以降.

        printf("The greatest prime number under %d is ",a);
    
         for(i=1;i<a;i++){
            count=0;
            for(j=1;j<=i;j++){
    
                    if(i%j==0){
                            count+=1;
                    }
            }
            if(count==2){
                    if(i>b)
                            b=i;
            }
         }
        printf("%d.\n",b);
    

    1304番.好き勝手な位置に並んでいる.きちんとTABで下げて.

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

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

    10.184.10.130/report/

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


目次ページに戻る