情報科学演習
2017.11.06

Back to index page



  1. 本日の作業内容

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

    今回は残念ながらコンパイルエラーが出てしまいました.採点の対象外となりますので,注意してください.インデント(字下げ)の変なものがだいぶ減ってきているので,少し安心していますが,以下で指摘された人はもう一度インデントについてよく考えてください.また,わからない場合には質問してください.

    コンパイルエラー: b1712 b1770
    解答用紙に番号と名前無し: b1725
    実行結果に間違った番号を出力: b1730 b1637
    実行結果に番号の出力無し: b1734
    ハイフンライン無し: b1622
    インデントの不備: b1703 b1713 b1718 b1720 b1722 b1733 b1736 b1741 b1749 b1752 b1773 b1656

    以下は問題のある解答の例の一部です.参考にしてください.

            int a = rand() % 11 + 1 ;
            int b = rand() % 11 + 1 ;
    

    乱数の発生範囲について,まだ変な人がいました.余りの種類がどれだけあるか,よく考えましょう.

                    int a = rand()%10+1;
                    int b = rand()%10+1;
                    int c = rand()%6+1;
                    int d = rand()%6+1;
                    int e = rand()%2+1;
                    int f = rand()%2+1;
    

    こんなにたくさん乱数を作る必要は無いですね.

            if(dice<=2)
                    printf("1");
            else if(dice<=5)
                    printf("2");
            else if(dice<=6)
                    printf("3");
            else if(dice<=7)
                    printf("4");
            else if(dice<=8)
                    printf("5");
            else
                    printf("6");
    

    まちがっているわけでは無いのですが,もっとコンパクトになります.解答例を参考にしてください.

        if((a==7||a==8) && (b==7||b==8))
            printf("Doctored dice: 1 1\n\n");
        else if((a==9||a==10) && (b==9||b==10))
            printf("Doctored dice: 2 2\n\n");
        else if((a==7||a==8) && (b==9||b==10))
            printf("Doctored dice: 1 2\n\n");
        else if((a==9||a==10) && (b==7||b==8))           
            printf("Doctored dice: 2 1\n\n");
        else if(a==7||a==8)    
            printf("Doctored dice: 1 %d\n\n" ,b);
        else if(a==9||a==10)
            printf("Doctored dice: 2 %d\n\n" ,b);
        else if(b==7||b==8)        
            printf("Doctored dice: %d 1\n\n" ,a);
        else if(b==9||b==10)
            printf("Doctored dice: %d 2\n\n" ,a);
        else
            printf("Doctored dice: %d %d\n\n" ,a ,b);
    

    2つのサイコロの目を一緒に考えると,上のようなややこしいことをしないといけなくなります.一個一個分けて考えましょう.今後もこのような扱いはよく出てくることになっていますし.

        if(a<=30)
            if(b<=130)
                    printf("Doctored dice : 1 1\n\n");
            else
                    if(b>=131 && b<=160)
                            printf("Doctored dice : 1 2\n\n");
                    else
                            if(b>=161 && b<=170)
                                    printf("Doctored dice : 1 3\n\n");
                            else
                                    if(b>=171 && b<=180)
                                            printf("Doctored dice : 1 4\n\n");
                                    else
                                            if(b>=181 && b<=190)
                                                    printf("Doctored dice : 1 5\n\n");
                                            else
                                                    printf("Doctored dice : 1 6\n\n");      
    
        else
            if(a>=31 && a<=60)
                            if(b<=130)
                                    printf("Doctored dice : 2 1\n\n");
                            else
                                    if(b>=131 && b<=160)
                                            printf("Doctored dice : 2 2\n\n");
                                    else
                                            if(b>=161 && b<=170)
                                                    printf("Doctored dice : 2 3\n\n");
                                            else
                                                    if(b>=171 && b<=180)
                                                            printf("Doctored dice : 2 4\n\n");
                                                    else
                                                            if(b>=181 && b<=190)
                                                                    printf("Doctored dice : 2 5\n\n");
                                                            else
                                                                    printf("Doctored dice : 2 6\n\n");
                    else
                            if(a>=61 && a<=70)
                                    if(b<=130)
                                            printf("Doctored dice : 3 1\n\n");
                                    else
                                            if(b>=131 && b<=160)
                                                    printf("Doctored dice : 3 2\n\n");
                                            else
                                                    if(b>=161 && b<=170)
                                                            printf("Doctored dice : 3 3\n\n");
                                                    else
                                                            if(b>=171 && b<=180)
                                                                    printf("Doctored dice : 3 4\n\n");
                                                            else
                                                                    if(b>=181 && b<=190)
                                                                            printf("Doctored dice : 3 5\n\n");
                                                                    else
                                                                            printf("Doctored dice : 3 6\n\n");
                            else
                                    if(a>=71 && a<=80)
                                            if(b<=130)
                                                    printf("Doctored dice : 4 1\n\n");
                                            else
                                                    if(b>=131 && b<=160)
                                                            printf("Doctored dice : 4 2\n\n");
                                                    else
                                                            if(b>=161 && b<=170)
                                                                    printf("Doctored dice : 4 3\n\n");
                                                            else
                                                                    if(b>=171 && b<=180)
                                                                            printf("Doctored dice : 4 4\n\n");
                                                                    else
                                                                            if(b>=181 && b<=190)
                                                                                    printf("Doctored dice : 4 5\n\n");
                                                                            else
                                                                                    printf("Doctored dice : 4 6\n\n");
                                    else
                                            if(a>=81 && a<=90)
                                                    if(b<=130)
                                                            printf("Doctored dice : 5 1\n\n");
                                                    else
                                                            if(b>=131 && b<=160)
                                                                    printf("Doctored dice : 5 2\n\n");
                                                            else
                                                                    if(b>=161 && b<=170)
                                                                            printf("Doctored dice : 5 3\n\n");
                                                                    else
                                                                            if(b>=171 && b<=180)
                                                                                    printf("Doctored dice : 5 4\n\n");
                                                                            else
                                                                                    if(b>=181 && b<=190)
                                                                                            printf("Doctored dice : 5 5\n\n");
    else
                                                                                            printf("Doctored dice : 5 6\n\n");
                                            else
                                                    if(a>=91 && a<=100)
                                                            if(b<=130)
                                                                    printf("Doctored dice : 6 1\n\n");
                                                            else
                                                                    if(b>=131 && b<=160)
                                                                            printf("Doctored dice : 6 2\n\n");
                                                                    else
                                                                            if(b>=161 && b<=170)
                                                                                    printf("Doctored dice : 6 3\n\n");
                                                                            else
                                                                                    if(b>=171 && b<=180)
                                                                                            printf("Doctored dice : 6 4\n\n");
                                                                                    else
                                                                                            if(b>=181 && b<=190)
                                                                                                    printf("Doctored dice : 6 5\n\n");
                                                                                            else
                                                                                                    printf("Doctored dice : 6 6\n\n");
    

    大変な力作ですが,このような行数を必要とする課題を出すことはこの授業ではありません.どれだけ短くできるかを意識してください.

            if(a <= 2)
                    printf("1");
            else if(a <=5)
                    printf("2");
            if(a == 6)
                    printf("3");
            if(a == 7)
                    printf("4");
            if(a == 8)
                    printf("5");
            if(a == 9)
                    printf("6");
    

    何度も言いますが, if の羅列はこの場合にはふさわしく無いですね. else を使ってください.

  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
      				 
      上のように処理をするために,発生させる乱数を0〜51としています.1〜52でも同様のことが出来ますが,右の商による分別を行うためには1引かなければなりません.

      また,いずれ配列が出てきたときには,配列の要素の循環のために0から始まる数にしておく方が楽になることがわかります.
  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 文の中で使用できるのです.

    最後に,定数式ですが,比較演算子,等価演算子,論理演算子などは使用できません.数値の範囲や大小などを入れることはできないということです.あくまで,ある「値」になっているかどうかだけを判断します.

    出て来た乱数の値によって処理が変わるような例は以下のようになります.

    	int num = rand() % 3;
    
    	switch(num){
    		case 0: 
    			printf("%d\n", num);
    			break;
    
    		default:
    			printf("1 or 2\n");
    			break;
    	}
    

  5. 実習

    実習の演習問題予習分はこれです.

  6. 次回の予習範囲

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

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

  7. 宿題

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


目次ページに戻る