情報科学演習
2015.11.16

Back to index page



  1. 本日の作業内容

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

    残念ながらコンパイルエラーの答案が出てきました.以後は注意しましょう.

    b1532

    以下はいつものように問題のあるプログラムの例ですが,今回は特に1年生のプログラムで序数に関する英語表現の問題が多数見られました.一応減点していますので,以後は注意してください.

    1th 2th 3th というのは無いですよね.

    	int m = rand() % 5 + -2, 
    

    上のものは間違いでは無いので原点はしていませんが,わざわざ -2 を足す必要は無いですね.普通に2を引きましょう.

            int x,y = rand()% 2 - 2;
    

    乱数の発生自体も間違っていますが,このような表現はC言語にはありません.この場合変数 x には値が入らないので「不定」という状態になります.通常その場合にはコンピュターゴトに異なっている処理系に依存した値が入ります.前に使用した変数の値,ランダムな整数値などが入る場合が多いですが,困ったことにこの教室のCコンパイラはこのような場合に0を代入してしまいます.なので,間違いに気づきにくいのですが,今後反復処理以降は複合演算子による自己代入が始まりますので,初期化には特に注意が必要です.

            int a = rand() % 4 - 2;
            int b = rand() % 4 - 2;
    

    相変わらず乱数の範囲がわからない人が何人か見られました.上の例では,発生する整数は,-2 -1 0 1 の4種類です.

            if(x==0 && y==0)
                    {
                    printf("The point is on the y-axis.\n");
                    printf("The point is on the x-axis.\n\n");
                    }
    

    考え方が間違っています.この場合は原点です.

            if( 0 < a && 0 < b && a != 0 && b != 0){
    

    最初の二つの条件はすでに変数の値が0で無いことも含まれていますから,後ろ二つの条件式は不要です.

            if(a == 0 && b == 0)
                    printf("on the origin.\n");
            else if(a == 0 && b != 0)
                    printf("on the x-axis.\n");
            else if(a != 0 && b == 0)
                    printf("on the y-axis.\n");
            else if(a > 0 && b > 0)
                    printf("in the 1th quadrant.\n");
            else if(a > 0 && b < 0)
                    printf("in the 2th quadrant.\n");
            else if(a < 0 && b < 0)
                    printf("in the 3th quadrant.\n");
            else
                    printf("in the 4th quadrant.\n");
    

    条件に洩れがあるので,正しく判定しません.

            if(m==0&&n==0)
                            printf("on the origin.\n");
            if(m==0&&n!=0)
                            printf("on the y-axis.\n");
            if(m!=0&&n==0)
                            printf("on the x-axis.\n");
            if(m>0&&n>0)
                            printf("is the 1th quadrant.\n");
            if(m<0&&n>0)
                            printf("is the 2th quadrant.\n");
            if(m<0&&n<0)
                            printf("is the 3th quadrant.\n");
            if(m>0&&n<0)
                            printf("is the 4th quadrant.\n");
    

    結果として表示するものは1つだけなので else を使いましょう.

    インデント(字下げ)に問題のある答案 b1501 b1507 b1520 b1523 b1533 b1537 b1540 b1542 b1547 b1548 b1550 b1561 b1570 b1422 b1431 b1204

    ハイフンラインが無かったもの b1516 b1406

    学生番号がおかしかったもの b1575

  3. 前回の復習

    • else

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

    • 論理演算式

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

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

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

      トランプの課題を行いましたが,以下のように考えると 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 文の中で使用できるのです.

  5. 実習

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

  6. 次回の予習範囲

    次回は11/26(木)の実施です.間違えないように注意してください.宿題の提出期限もそれに合わせてあります.メンターは次回までに2回ありますが,次回の木曜日の授業の宿題提出は27日金曜日から30日の月曜日までと余裕がありませんので,注意してください.

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

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

  7. 宿題

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


目次ページに戻る