情報科学演習
2011.11.21

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    相変わらず提出のミスが見られます.件名や添付ファイル名は日付と学生番号か ら構成されているので,間違いの無いようにもう少しチェックしてください.今 回はコンパイルエラーはありませんでしたが,解答用紙を使わないというのはま だ残っていました.

    例によって以下に問題のある答案の例をいくつか示しますが,今回は剰余の使用 を指定したのに使っていないというような解答も有り,全体的には点数はかなり 低くなってしまっています.質問を活用しましょう.

            if(num3 % 3 == 0 && num1 == 0){
                    printf("You:            Gu\n");
                    printf("Computer:       Gu\n");
                    printf("You Draw       (-_-)\n");}
    
            else if(num3 % 3 == 0 && num1 == 1){
                    printf("You:             Choki\n");
                    printf("Computer:        Choki\n");
                    printf("You Draw       (-_-)\n");}
            else if(num3 % 3 == 0 && num1 == 2){
                    printf("You:             Pa\n");
                    printf("Computer:        Pa\n");
                    printf("You Draw        (-_-)\n");}
    
            else if(num3 % 3 == 1 && num1 ==1 && num2 == 3){
                    printf("You:            Choki\n");
                    printf("Computer:       Gu\n");
                    printf("You win     \(^o^)/\n"); }
            else if(num3 % 3 == 1 && num1 ==2 && num2 == 4){
                    printf("You:            Pa\n");
                    printf("Computer:       Choki\n");
                    printf("You win     \(^o^)/\n");}
            else if(num3 % 3 == 1 && num1 == 0 && num2 == 5){
                   printf("You:            Gu\n");
                    printf("Computer:       Pa\n");
                    printf("You lose    (;_;)\n");  }
    
            else if(num3 % 3 == 2 && num1 ==2 && num2 == 3 ){
                    printf("You:            Pa\n");
                    printf("Computer:       Gu\n");
                    printf("You win       \(^o^)/\n");}
            else if(num3 % 3 == 2 && num1 == 0 && num2 == 5 ){
                    printf("You:            Gu\n");
                    printf("Computer:       Pa\n");
                    printf("You lose    (;_;)\n");}
            else {
                    printf("You:            Choki\n");
                    printf("Computer:       Choki\n");
                    printf("You Draw        (-_-)\n");}
    

    論理的に処理をすることが優先されて,処理自体をもっと考えるという発想が無 い答案ですが,このように場合分けをたくさん行えば良いという考えは早めに捨 てましょう.どうすれば短いプログラムがかけるのか考えてください.そのため には質問が一番かとは思います.

    それと上の答案の例もそうですが,バックスラッシュを表記する方法を忘れてし まっている人が多く見られました.気を付けてください.

            if(b % a == 3)
                    printf("Draw        (-_-) \n");
            if(b % a == 4)
                    printf("You win    \(^o^)/ \n");
            if(b % a == 5)
                    printf("You lose    (;_;) \n");
            if(b / a == 3)
                    printf("You lose    (;_;) \n");
            if(b / a == 4)
                    printf("Draw        (-_-) \n");
            if(b / a == 5)
                    printf("You win    \(^o^)/ \n");
            if(b % a == 1)
                    printf("You win    \(^o^)/ \n");
            else if(b / a == 2)
                    printf("Draw        (-_-) \n");
            if(b % a == 0)
                    printf("You lose    (;_;) \n");
    

    これは剰余の間違った使用例です.結局ぜんぜん簡単になっていません.バック スラッシュも問題です.

            if(b%(a+3) == 0)
                    printf("Draw        (-_-)\n\n");
            else if(b%(a+3) == 2)
                    printf("You lose    (;_;)\n\n");
            else if(b%(a+3) == 1)
                    printf("You win    \(^o^)/\n\n");
            else if(b%(a+3) == 4)
                    printf("You lose    (;_;)\n\n");
            else if(b%(a+3) == 3)
                    if(a == 1)
                            printf("You lose    (;_;)\n\n");
                    else
                            printf("You win    \(^o^)/\n\n");
    

    これも剰余の間違った使用例です.また最後には else をつける癖を つけましょう.必ずどれかの処理を行なう必要がある場合は,条件式ではなく else で止めておく方が間違いが減ります.また,バックスラッシュも同様です.

            if(a == 1 ,b == 3)
                    printf("You:     pa\n" "Computer:     pa\n");
            else if(a ==2 , b == 4)
                    printf("You:     gu\n" "Computer:     gu\n");
            else
                    printf("You:     choki\n" "Computer:     choki\n");
            if(b % a < 2 )
                    printf("Draw   (-_-)\n");
            else if(a % b > 3)
                    printf("You win         \(^o^)/\n");
            else
                    printf("You lose        (;_;)\n");
    

    if 文の中の式の間違っているものです.バックスラッシュもおなじで す.

            if(a == (b + 2) % 3)
                    printf("You win    \(^o^)/\n");
            else if(a == (b + 1) % 3)
                    printf("You lose    (;_;)\n");
            else if(a + 3 == b)
                    printf("Draw        (-_-)\n");
    

    これもここまで苦労しなくてもよい処理をしています.バックスラッシュもです. 今回の特徴として,処理がおかしい人は大体バックスラッシュの処理も忘れてい るようです.知識の積み重ねが単位に結びつくので,復習を忘れずに.

            int a = rand() % 3;
            int b = rand() % 3 + 3;
            int c = b - a + 3;
    

    これはちょっと面白い間違い例です.というのも,前期のこの授業ではじゃんけ んの勝ち負け判定に剰余を使用する際に負の剰余を避けるために3を足す操作を 紹介したのですが,今回はその必要が無いのに3を足しているもので,結局は処 理自体は理解されていないということがよくわかる例になっています.

    もう少し詳しく言うと,じゃんけんを扱う場合には通常,「ぐー」「ちょき」 「ぱー」を数字の0,1,2に対応させますが,その大小で勝ち負けを判定すると きに一人目が「ぐー」でもう一人が「ぱー」とかの場合,引き算をすると-2にな ります.-2を3で割ったあまりは教室のC言語では-2ですが,Rubyなどでは1です. なので,Rubyではお互いの手を引き算して3の剰余を求めるだけで勝ち負け判定 が簡単にできるのですが,C言語の場合,負の数の余りが返ってくるという困っ た仕様のため,あらかじめ3を足しておいて余りが必ず正になるようにしておく と楽に処理が書けます.

    今回はそのために一方の手を3から5の数にして引き算しても必ず差が正になるよ うにしておきました.よって,3を足す操作は不要だったということです.

  3. 前回の復習

    • else

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

    • 論理演算式

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

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

  4. switch

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

  5. 実習

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

  6. 次回の予習範囲

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

  7. 宿題

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


目次ページに戻る