情報科学演習
2012.11.05

Back to index page



  1. 本日の作業内容

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

    時間制限のあるテストを初めて試しましたが,あせっていたためか,採点対象外の答案が実に多く提出されました.次回以降のテストでは十分に注意してください.なお,採点対象外のものには以下のようなケースがあります.

    • scanf を使用したもの

      以前にお伝えしたように,この授業では,宿題とテストに scanf は一切使用しません.scanf があると採点の自動化ができないためです.なので,残念ながら以下の方々の答案は採点できません.

      b1202 b1204 b1231 b1244 b1257 b1264 b1269 b1273 b1281

    • コンパイルエラー

      1年生は以下の通り

      b1206 b1208 b1209 b1210 b1213 b1214 b1216 b1219 b1223 b1230 b1235 b1236 b1239 b1240 b1249 b1250 b1265 b1267 b1270 b1272 b1276 b1278 b1284 b1285

      再履修生でもエラーがありました.

      b0973 b1141

    • 解答用紙不使用

      1年生

      b1209 b1224 b1237 b1269 b1284

      再履修生

      b1141

    • 前回の宿題提出

      b1217

    • 昔のテスト提出

      b1136

    以下は問題のある解答の一例です.

    
    	int a = rand() %899 + 100
    

    問題に3桁の整数の乱数の作り方を書いておいたのにまだ間違っている人がいます.なぜなんでしょうか?

            if(a == b)  printf("%d=%d\n", a, b);
    

    このように1行で書くやりかたは推奨しません.

             if(a > b);
    
    

    if 文の行の終わりにセミコロン ; をつけてしまうと,それで if 文自体が終わってしまいます.

  3. 宿題について

    今回は宿題に関して,C7クラスには御迷惑をお掛けしました.すみませんでした.

    さて,宿題は提出自体の不備は少なくなっていますが,まだ以下のようにコンパイルするとエラーが出る答案や解答用紙を使用しないものがありますので,注意してください.

    エラー b1240

    解答用紙不使用 b1273

    以下は if の使い方のあまりよくない例で,一つ目は上述のように1行で書いてしまっていること,2つ目は if 文とその処理の間に空行があることです.あまり推奨しませんので,直すようにしてください.

            if(a == b) printf("%d and %d :Double match\n", a, b);
    

            if(a == b)
    
                    printf("Double match");
    

    以下に示すのはインデント(字下げ)の不適切なものです.授業中に解説しますので,よく聞くようにしてください.

            if(a == b)
            printf("Double match\n");
    
    
    
            if(a == b)
                    printf("Double match\n\n", a, b);
            else if(a/10 == b/10)
                            printf("Single match\n\n", a, b);
    
    
    
            else
                    printf("%d and %d :No match\n",a,b);
                    printf("-------------------------\n");
    return(0);
    }
    
    
    
            #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
    
            main()
    {
    
    
    
                            printf("%d and %d: No match\n\n", num1, num2);
                    printf("---------------------------------------------\n");
                    return(0);
    }
    
    
                    if(a==b)
                            printf("%d and %d:Double match\n",a,b);
                    else
                    if(a%10==b%10)
                    printf("%d and %d:Single match\n",a,b);
                    else
                    if(a/10==b/10)
                    printf("%d and %d:Single match\n",a,b);
                    else
                    printf("%d and %d:No match\n",a,b);
            return(0);
    }
    
    
    
            if(a == b)
                    printf("%d and %d: Double match\n\n",a ,b);
            else if(a / 10 == b / 10 || a % 10 == b % 10)
                            printf("%d and %d: Single match\n\n",a ,b);
    
    
    
            if(a == b)
            printf("%d and %d: Double match\n\n",a ,b);
                    else
                    if(a/10 == b/10)
                    printf("%d and %d: Single match\n",a ,b);
    
    
    
    {
        srand((unsigned) time(NULL));
    
            int a, b;
            a = rand() % 21 + 10;
        b = rand() % 21 + 10;
    
       printf("My student number: s124083\n\n");
    
    
    
    
        else
            printf("%d and %d : No match \n\n",a, b);
    
            printf("----------------------\n\n");
            return(0);
    }
    
    

    一方,C7クラスの方ですが,以下のように根本的に英語の理解に欠けている解答がいくつか見られました.残念です.

            if(num1 % 3 == 0)
                    printf("Sum of each digit %d is a multiple of 3\n", num1);
    
            if(num1 % 3 != 0)
                    printf("not\n");
    

    また,変数は2つまでと指定しているのに,下記のようなものが出てきました.0点です.

            int a = rand() % 900 + 100, b, c, d, e, f;
    

    それから3桁の整数と言っているのに,下のようなものもありました.こちらも0点です.

            int a = rand() % 90 + 10, b = rand() % 10 + 0;
    

  4. 前回の復習

    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);
    }
    

  5. 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 ;
    

  6. 実習

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

  7. 次回の予習範囲

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

  8. 宿題

    授業の終わりに