情報科学演習
2011.11.14

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    今回はコンパイルエラーの答案がありませんでした.また,提出の不備も少し減っ てきました.ただ,解答用紙の不使用は相変わらず若干ありますので,注意して ください.例によって,以下に問題のある答案の例を示しておきます.今後の参 考にしてください.

            a = rand() % 91 + 10;
            b = rand() % 8 + 2;
    

    乱数の記述がおかしいですね.これでは変数 a は10から100までの整 数になってしまいます.

            if(m%n==0)
            printf("%d is a multiple of %d.\n\n",m,n);
    

    典型的なインデント(字下げ)の不備の例です.if はブロックを取るの で,if 文の中の処理は字下げしてください.

            int m = rand() % 89 + 10;
            int n = rand() % 9 + 1;
    
            if(m%n == 0)
                    printf("%d is a multiple of %d\n" ,m ,n);
            if(m%n == 1)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 2)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 3)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 4)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 5)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 6)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 7)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 8)
                    printf("%d is not a multiple of %d\n" ,m ,n);
            if(m%n == 9)
                    printf("%d is not a multiple of %d\n" ,m ,n);
    

    上の例はまず乱数が間違っています.この設定では a は10から98まで, b は1から9までになります.また,if 文の方はまった く意味の無いことを記述しています.!= さえ使用すればいいの ですから.

            int a = rand() % 99 + 10, b = rand() % 9 + 1, c = a%b ;
    
            printf("My student number: s114099 \n");
    
            if(c == 0)
                    printf("%d is a multiple of %d \n" , a, b);
    
            if(c <= 1)
                    printf("%d is not a multiple of %d \n" , a, b);
    

    乱数の記述が a b の両方とも間違っています.さらに, if の式がおかしいために,間違った動作となります.

            if(c == 0)
                    printf("%d is multiple of %d\n",a, b);
    
            if(c != 0)
                    printf("%d is not a multiple of %d\n",a, b);
    
            return(0);
    

    これもよくあるミスで終わりのハイフンによるラインを出力していません.他に も学生番号の出力をしていないもの,自分のでは無い学生番号を出力しているも のなど,必要な情報をきちんと出力していない例が結構見られますので,注意し てください.

          srand((unsigned) time(NULL));
           int a, b;
           a = rand() % 90 + 10;
           b = rand() % 8 + 2;
          printf("My student number: s114099\n\n");
          if(a % b == 0)
          printf("%d is a multiple of %d.\n\n", a, b);
          if(a % b != 0)
          printf("%d is not a multiple of %d.\n\n", a, b);
    

    まずはインデントがおかしいですね.TABで揃える習慣をつけていれば上記のよ うなミスは無くなります.また,if 文のインデントも無いです.

            float futa, hito, Tes;
    
            futa = rand () % 90 + 10;
            hito = rand () % 8 + 2;
    
            Tes = futa / hito;
    
            int Jud;
    
            Jud = futa / hito;
    
            printf("My student number: s114019\n\n");
    
            if(Tes == Jud)
                    printf(" %2.0f is a multiple of %1.0f.\n", futa, hito);
    

    これは何をしたいのかよくわからない例ですが,処理を単純にするために剰余が あるということをしっかり覚えてください.今後も剰余は頻繁に使用します.ま た,変数名は小文字で始めましょう.

    {
            if(c == 0)
                    printf("%d is a multiple of %d.",a,b);
            if(c != 0)
                    printf("%d is not a multiple of %d.",a,b);
    }
            printf("\n\n-----------------------------------\n");
    

    動作に影響は無いですが,不要な中括弧 { } があります.また,つけ るのであれば正しい位置につけなければなりません.インデントの規則に習って 位置を適正にしましょう.

            printf("\n");
                    if(a == 0)
                            printf("%d is a multiple of %d.\n",m,n);
                    if(a != 0)
                            printf("%d is not a multiple of %d.\n",m,n);
            printf("\n");
    

    これもインデントがおかしい例です.if 文自体を下げる必要はありま せん.下げるのは,if の中の処理の部分だけです.

            if(a / b == 2 || a / b == 3 || a / b == 4 || a / b == 5 || a / b == 6 || a / b == 7 || a / b == 8 || a / b == 9 || a / b == 10 || a / b == 11 || a / b == 12 || a / b == 13 || a / b == 14 || a / b == 15 || a / b == 16 || a / b == 17
    || a / b == 18 || a / b == 19 || a / b == 20 || a / b == 21 || a / b == 22 || a
    / b == 23 || a / b == 24 || a / b == 25 || a / b == 26 || a / b == 27 || a / b == 28 || a / b == 29 || a / b == 30 || a / b == 31 || a / b == 32 || a / b == 33
    || a / b == 34 || a / b == 35 || a / b == 36 || a / b == 37 || a / b == 38 || a
    / b == 39 || a / b == 40 || a / b == 41 || a / b == 42 || a / b == 43 || a / b == 44 || a / b == 45 || a / b == 46 || a / b == 47 || a / b == 48 || a / b == 49)                printf("%.0f is a multiple of" " " "%.0f.\n", a, b);
            else
                    printf("%.0f is not a multiple of" " " "%.0f.\n\n", a, b);
    

    さっそくとんでも無い例が出てきました.こんなに長い処理を書くような課題は この授業では出てきません.これも剰余を知らないために生じた問題です.とに かく,剰余は必須の演算ですので,早く理解してください.

            if(a != 0)
                    printf("%d is not a multiple of %d.\n\n-----------------------------------\n",m,n);
    

    これは珍しい例で,if による処理の中にハイフンラインの出力が入っ てしまっています.これではif の処理が実行されないとラインも出力 されません.

  3. 前回の復習

    if 文の基本について学習しました.条 件式に関する重要な概念に真偽の判定がありますので,以下に説明しておきます.

    教科書のp.24にあるように if 文の基本は図1のようになります.

        if(式){    
            文 ;    
        }
    

    図1 if 文の構成

    ここで,式の値が「真」か「偽」かによって処理の流れが変わるのが if 文の基本動作ですが,式の値が真もしくは偽とはどういう意味なのか について考えましょう.

    教科書では関係演算子や等価演算子のような「比較演算子」の使用が最初から行 われていますので,括弧の中には比較する式が入るものと思いがちですが,そこ には値さえあれば,何でも動作します.ですので,等価演算子 == の 代わりに間違って代入記号の = を使用してもエラーなく動作します. (処理は間違ってしまいますが.)

    以下のプログラムで,値の真と偽について考えてみましょう.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    main()
    {
        srand((unsigned) time(NULL));
    
        int num = rand() % 3 - 1;
        printf("%d\n", num);
    
        if(num)
            printf("True\n");
    
        return(0);
    }
    

  4. if ~ else

    今回は,もし〜ならば,という条件式にさらに「そうでないならば」という else の処理を追加したプログラムを学習します.実習課題に沿って学習し ていきましょう.

    注意

    インデント(字下げ)について毎回注意していますが,if 文においても インデントは論理構造を把握するのに重要です.ところが,教科書のインデント の例はあまり良くないので,以下のどちらかのように揃えるようにしましょう.きっと,こ の方が分かりやすいと思います.

        if( hoge ){
            hogehoge ;
            hogehogehoge ;
        }
    
        if( hege )
            hegehege ;
        else
            hegehegehege ;
    
        if( huge )
            hugehuge ;
        else if( hugehugehuge)
            hugehugehugehuge ;
        else if( hage ){
            hagehage ;
            hagehagehage ;
        }
        else
            hige ;
    

        if( hoge ){
            hogehoge ;
            hogehogehoge ;
        }
    
        if( hege )
            hegehege ;
        else
            hegehegehege ;
    
        if( huge )
            hugehuge ;
        else if( hugehugehuge)
                 hugehugehugehuge ;
             else if( hage ){
                      hagehage ;
                      hagehagehage ;
                  }
                  else
                      hige ;
    

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.35まで予習をしてきてください.

  7. 宿題

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


目次ページに戻る