情報科学演習
2013.11.11

Back to index page



  1. 本日の作業内容

  2. 前回の宿題の結果について

    まだコンパイルエラーの答案がありました.また,ソースコードの中に日本語が混じっているものでした.注意してください.

    b1373

    解答用紙を使用していないものもありました.

    b1274

    次の人は宿題とまったく無関係なプログラムを提出しています.

    b1235

    上記の3件はいずれも採点対象外ですので以後気を付けてください.

    ここからは例によって問題のある答案です.

            int num1, num2, num3, num4, num5, num6, num7;
    
            num1 = rand() % 100 + 1;
            num2 = rand() % 7 + 1;
            num3 = rand() % 9 + 8;
            num4 = rand() % 14 + 26;
            num5 = rand() % 32 + 33;
            num6 = rand() % 24 + 66;
            num7 = rand() % 9 + 91;
    
            if (num1 <= num2)
                    printf("大吉 ~\(^o^)/~");
            else if ( num2 < num1 <= num3)
                    printf("中吉 \(^o^)/");
            else if ( num3 < num1 <= num4)
                    printf("小吉 (^o^)");
            else if ( num4 < num1 <= num5)
                    printf("吉 (^_^)");
            else if ( num5 < num1 <= num6)
                    printf("末吉 (-_-)");
            else if ( num6 < num1 <= num7)
                    printf("凶 orz");
    

    間違いのオンパレードですが,まず,変数をたくさん置いて何かするということが変ですし,判断のしかたも理解できません.また,比較演算子は二項演算子なので3つの組合せはありません.これは授業でも言いました.最後の処理を else にしていないのもダメです.さらにさらにバックスラッシュの表示法についても忘れています.

            if(num >= 50){
            if(num <= 57)
            printf("大吉 ~\(^o^)/~");
            else if(num <= 67)
            printf("中吉 \(^o^)/");
            else
            printf("吉 (^_^)");
            }
            else if(num <= 50){
            if(num <= 10)
            printf("凶 orz");
            else if(num <= 25)
            printf("末吉 (-_-)");
            else
            printf("小吉 (^o^)");
            }
    

    インデントもおかしいのですが,処理がわかりません.

            if(num<40)
            {
                    if(num<=7)
                            printf("大吉 ~\(^o^)/~\n");
                    else
                            printf("吉 (^_^)\n");
            }
    
            else
            {
                    num2=num/5;
    
                    if(num2<=9)
                            printf("中吉 \(^o^)/\n");
                    else if(num2<=12)
                            printf("小吉 (^o^)\n");
                    else if(num2<=17)
                            printf("末吉 (-_-)\n");
                    else
                            printf("凶 orz\n");
            }
    

    すみません.これもわかりません.

            if(a<=7)
                    printf("大吉 ~\\(^o^)/~\n");
            else if(a-7<=10)
                    printf("中吉 \\(^o^)/\n");
            else if(a-17<=15)
                    printf("小吉 (^o^)\n");
            else if(a-32<=33)
                    printf("吉 (^_^)\n");
            else if(a-65<=25)
                    printf("末吉 (-_-)\n");
            else if(a-90<=10)
                    printf("凶 orz\n");
    

    最後が else になっていません.

        int num = rand() % 99 +1;
    

    乱数がおかしいです.他にも101で割っている人もいました.なぜ,いつまでたっても余りの個数や余りの最大値が分からないのでしょうか?

            int D;
            D= rand()%100;
    

    変数名は小文字で始めてください.

            if(7 < num)
                    if(num <= 17)
                            printf("中吉 \(^o^)/\n\n");
    

    こういうことをしなくてもいいように考えるのが宿題の意図でした.また,バックスラッシュが表示されません.

            else if(num <= 100)
                    printf("\n凶 orz\n");
    

    これも最後が else になっていません.

    以下はインデントのおかしいものです.

                            if(a <= 7)
                            printf("大吉 ~\\(^o^)/~\n\n");
                            else if(a <= 17)
                            printf("中吉 \\(^o^)/\n\n");
                            else if(a <= 32)
                            printf("小吉 (^o^)\n\n");
                            else if(a <= 65)
                            printf("吉 (^_^)\n\n");
                            else if(a <= 90)
                            printf("末吉 (-_-)\n\n");
                            else if(a <= 100)
                            printf("凶 orz\n\n");
                            printf("-----------------------------\n");
    
    
        return(0);
    

    本来は最後の return 文のところに揃うべきなのと,処理の文の部分が if に対して下がっていないことが問題です.

            printf("-----------------------------\n\n");
    
    
        return(0);
    }
    

    毎回言っているのですが,これは揃っていません.どこからかコピーしてきたものと自分の打ち込んだものの違いで見えないところで出てくる可能性があるので,自分できちんと入力してください.

            if(a <= 7)
            printf("大吉 ~\\(^o^)/~\n\n");
                    else if(a <= 17)
                    printf("中吉 \\(^o^)/\n\n");
    

    自分ルールを作らないで下さい.printf if に対して下がるべきであり,次の else が下がる理由はありません.

            printf("大吉 ~\\(^o^)/~");
        else if(num<=16)
            printf("中吉 \\(^o^)/");
                else if(num<=31)
                    printf("小吉 (^o^)");
    

    出たり入ったり好き勝手なことになっています.

            #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
    
    main()
    {
    

    毎回注意していますが,どうしてまだヘッダのインクルードする部分を下げるのでしょうか?

         if(n<8)
         printf("大吉 ~\(^o^)/~");
          else if(n<18)
           printf("中吉 \(^o^)/");
            else if(n<28)
             printf("凶 orz");
              else if(n<43)
               printf("小吉 (^o^)");
                else if(n<76)
                 printf("吉 (^_^)");
                  else if(n<101)
                   printf("末吉 (-_-)");
    

    こんなルールはありません.バックスラッシュもダメですね.

        if(num1 <= 6)
            printf("大吉 ~\(^o^)/~");
        else
        if(num1 <= 16)
            printf("中吉 \(^o^)/");
        else
        if(num1 <= 31)
            printf("小吉 (^o^)");
        else
        if(num1 <= 56)
           printf("末吉 (-_-)");
        else
        if(num1 <= 66)
            printf("凶 orz");
        else
            printf("吉 (^_^)");
    

    else if を別の行に別けて書くのなら if は下げてください.

            if(num<7)
                    printf("大吉~\\(^o^)/~\n");
            else if(num<17)
                            printf("中吉\\(^o^)/\n");
            else if(num<32)
                            printf("小吉(^o^)\n");
            else if(num<65)
                            printf("吉 (^_^)\n");
            else if(num<90)
                            printf("末吉 (-_-)\n");
            else
                    printf("凶 orz\n");
    

    if 文の中の位置がバラバラです.

    return(0);
    }
    

    これも毎回言っていますが,中括弧の閉じ括弧の上に何かが来ることはありません.

  3. 前回の復習

    • else

      else の処理について実習を行いました.if だけではやりづ らい2者択一の処理も else を使ってすっきりと実現できます. 今後も必要に応じて使ってください.

    • 論理演算式

      if 文の判別式の部分で論理演算の間違いをしている人が実習中に結構 見られました.以下のようなものは間違いですので,注意してください.

      	    if(a == 1, 2, 3)
      
      	    if(a == 1 || 2 || 3)
      

    • 除算と剰余算の上手な使い方

      トランプの課題を行いましたが,以下のように考えると if 文がすっきりしますので,適宜活用してください.トランプについては配列を学習したらまた扱います.

               0  1  2  3  4  5  6  7  8  9 10 11 12  <-- 13で割ったら商が0 Spades
              13 14 15 16 17 18 19 20 21 22 23 24 25  <-- 13で割ったら商が1 Hearts
              26 27 28 29 30 31 32 33 34 35 36 37 38  <-- 13で割ったら商が2  Diamonds
              39 40 41 42 43 44 45 46 47 48 49 50 51  <-- 13で割ったら商が3  Clubs
      13で割った剰余   0  1  2  3  4  5  6  7  8  9 10 11 12
                       A  2  3  4  5  6  7  8  9 10  J  Q  K
      				 
  4. switch

    switch 文は規則性の無い選択処理の際に使用すると便利です.が,み なさんの場合は if 文を使用してすっきりと書けるものまで switch を使ってしまう例がこれまで見られます.ですので,この授 業では本日の実習以外では switch 文を使用する処理は使わない と思ってください.すみません.

    正確には,if else 文と swith 文では分岐の動作が違います.if else 文では条件がたくさんあるとき,上から順番に if の式の真偽判定を順に行っていきます.下の方にある条件に合致するとしたら,それまで上でずっと続けられた判定は時間の無駄になってしまいます.一方,switch 文の場合は一発で該当する case 句に飛びますので,負荷の低減になります.ですので,分岐が多い場合には switch 文を使用するのが適切と言えます.
    注意

    教科書のp.35に switch 文の基本構成を示した図がありますが,ここで case の次にある「定数式」というのがわかりづらいかと思います.教科書にもあるようにこれは「整数型」か「文字型」で無いといけないのですが,教科書の例題3.7は「文字型」の例となっており,そのため演算記号の両側に文字を記述するための記号である引用符 ' ' がついています.「整数型」の場合には当然ですが引用符はあってはいけません.

    また,定数式ということで,変数や変数を含む式,また,文字列が来ることはできません. 1 + 1 のように変数を含まない式は可能ですが,使うことは無いでしょう.文字は教科書のp.143のASCIIコード表にあるように数値として計算機の内部で処理されます.そのように,単純な数値を値に持つものが定数式です.先ほどの 1 + 1 は2という数値になりますし,文字の '+' であればコード表にあるように10進法で43という数値で表されるので switch 文の中で使用できるのです.

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.41まで予習をしてきてください.教科書のp.38にある復号演算子は特 に重要です.必ず予習してきてください.

    また,次回は for 文に関する小テストを実施しますので,予習は特に念入りにお願いします.

  7. 宿題

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


目次ページに戻る