情報科学演習
2015.11.09

Back to index page



  1. 本日の作業内容

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

    時間的なプレッシャーのかかる小テストではミスが出やすいものですが,今回の1年生のコンパイルエラーは多すぎます.特に,作りかけのプログラムを提出する人が多かったのは問題です.途中までしか書いていないのだからコンパイルエラーになるのは当り前ですが,エラーになるプログラムは提出しないように再三注意していたはずですから,確信犯ですね.もうマイナス1万点位つけたい気分です.

    この前も言いましたが,宿題とテストの両方ともコンパイルエラーになるものは採点しませんので,提出しないでください.

    コンパイルエラーの答案提出者: b1406 b1416 b1449 b1507 b1508 b1509 b1510 b1538 b1541 b1544 b1553 b1556 b1563 b1567 b1569 b1570 b1573 b1577

    以下は,問題のあったプログラムの一例です.確認しておいてください.

            int m = rand() % 91 + 10, n = rand() % 7 + 2;
    
            m = rand() % 99 + 10;
            n = rand() %  8 +  2;
    
            m = rand () % 89 + 10;
            n = rand () % 8 + 2;
    
            int m =  rand() % 90 + 10;
            int n =  rand() % 10 + 2;
    
            int m = rand() % 90 + 10, n = rand() % 9 + 1, z = m - n;
    

    上のものはいずれも乱数の間違いです.正しいものが出ませんので,よく理解しておいてください.

            if(m-n%n==0)
    

    四則演算の優先順位をよく確認しましょう.

            if((a%num2)==0)
                    printf("%d is a multiple of %d\n",a,num2);
    
            else if(a%num2!=0)
                    printf("%d is not a multiple of %d\n",a,num2);
    

    いずれか一つの処理を必ず実行するパターンでは最後は else で終わりにするのがよいのですが,上の例ではさらに if がありますので,これは余分です.

            if(c % b == 0)
                    printf("%d is a multiple of %d\n", c, b);
            if(c % b != 0)
                    printf("%d is not a multiple of %d\n", c, b);
    

    これも後の方は else でいいですね.

            if(q % n == 0){
                    printf("m - n = q\n");
                    printf("%d is a multiple of %d\n\n", q, n);
    }
            else{
                    printf("m - n = q\n");
                    printf("%d is  not a multiple of %d\n\n", q, n);
    }
    

    上の方の printf は選択処理とは無関係なので,この位置にある必要は無いです.閉じ中括弧のインデントが無くなっています.

            if(d==0)
            {printf("My student number:s154033\n");
            printf("Double figure number:m=%d\n",a);
            printf("Single figure number:n=%d\n",b);
            printf("m-n=%d\n",c);
            printf("%d is a multiple of %d\n",c,b);
            }
            else
            {printf("My student number:s154033\n");
            printf("Double figure number:m=%d\n",a);
            printf("Single figure number:n=%d\n",b);
            printf("m-n=%d\n",c);
            printf("%d is not a multiple of %d\n",c,b);
            }
    

    これも同じで,こんなにたくさん書く必要は無いです.また,インデントもおかしいです.

            printf("Double figure numbers: %d --> ", m);
            printf("Single figure numbers: %d --> ", n);
    

    表示形式を勝手に変えないでください.

            else
                            printf("%d is not a multiple of %d\n", l, n);
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            return(0);
    }
    

    いやがらせですかねえ.b1422番.

            int A = m-n;
    

    大文字で始めることは止めましょう.

            printf("S154005\n");
    

    指定通りの書式で学生番号を出力してください.

    /*      学生番号:b1524                           */
    

    たぶん学生番号はb1524では無いと思いますが?

    以下にその他の間違いのあったものをまとめておきますので,注意してください.

    インデント(字下げ)のまずいもの b1269 b1417 b1470 b1506 b1529 b1531 b1535 b1536 b1543 b1548 b1561 b1564 b1578 b1580

    最後のハイフンラインが無いもの: b1020 b1274 b1414 b1422 b1450 b1525 b1532 b1533 b1535 b1536 b1543 b1552 b1572 b1575 b1576 b1578 b1579 b1580 program1

  3. 宿題について

    残念ながら今回はコンパイルエラーの解答が出てきてしまいました.以後は注意してください.

    コンパイルエラー b1390

    また,まれに見られるのですが,前回の宿題を間違えて出すパターンというのもありました.

    前回の宿題提出者 b1457

    いずれも過年度生なので,慣れて注意力が散漫にならないよう気を付けましょう.

    また,今回も解答用紙を使用しない人が出ました.

    解答用紙不使用 b1480

    上記はいずれも採点対象外です.残念です.

    以下にいくつか問題のある解答の例を示します.

                                           else if(d > 0)
                                                            printf("Unfair dice: 5\n\n");
    
            printf("----------------------------\n");
    

    授業でも説明しましたが,最後の条件は可能であれば else としましょう.もうそれ以上場合が無いような条件であれば if は不要です.

            if(a == 1 )
                    printf("1\n");
            if(a == 2 )
                    printf("1\n");
            if(a == 3 )
                    printf("1\n");
            if(a == 4 )
                    printf("2\n");
            if(a == 5 )
                    printf("3\n");
            if(a == 6)
                    printf("4\n");
            if(a == 7 )
                    printf("5\n");
            if(a == 8 )
                    printf("6\n");
            if(a == 9 )
                    printf("6\n");
            if(a == 10 )
                    printf("6\n");
    

    こういうのはやっちゃだめです.どうやって楽をするのかがプログラミングのポイントです.

            if(a==1 || a==2 || a==3){
                    printf("%c\n",b[0]);
            }
            if(a==4 || a==5 || a==6){
                    printf("%c",b[5]);
            }
    

    こういうのは排他的な条件分岐なので,if を続けるのでは無く,else if にしましょう.

            if(a <= 30)
                    printf("1\n\n");
            else if(a > 30 && a <= 60)
                    printf("6\n\n");
            else if(a > 60 && a <= 70)
                    printf("2\n\n");
            else if(a > 70 && a <= 80)
                    printf("3\n\n");
            else if(a > 80 && a <= 90)
                    printf("4\n\n");
            else
                    printf("5\n\n");
    

    解答例を見てもらえばいいのですが,論理演算子 && は不要です.そのための else です.

        if(a<=5)
            printf("Unfair dice: %d\n",a);
        else if(a>=6 && a<=8)
                    printf("Unfair dice: 1\n");
    

    これも論理演算子は不要です.

            num1 =rand() % 6 + 1;
            i = rand() % 100;
    
            printf("\nMy student number: s144031\n\n");
            printf("Unfair dice: ");
    
            if(num1 % 6 == 0){
                    if(0 <= i || i < 30){
                            printf("%d",num1);
                    }
            }
    

    確率の意味がわかっていません.

            m = rand() % 6 + 1;
    
            printf("My student number: s144040\n\n");
            printf("Unfair dice: ");
            if(m==1)
                    printf("%d\n\n",m);
    
            else if(m>=2)
                    if(m<=5)
                            printf("1\n\n");
    
            else if(m!=1)
                    printf("6\n\n");
    

    これは1と6しか出ませんけど.

            int a = rand() % 10 + 1 ;
            int b = rand() % 4 + 2 ;
    

    こういうのが多かったのが不思議なんですが,なんで乱数が二つ必要なんでしょうか????

            a = rand() % 9 + 1;
    

    場合の数が違っているので,指定通りの確率になりません.

            if( m <=10 )
                    {printf("\nMy student number: s154050\n\n");
                    printf("Unfair dice: ");
                    printf("%d\n",2);
                    printf("\n\n-----------------------------\n");}
    
                    else if ((10< m )&&(m<=20) )
                            {printf("\nMy student number: s154050\n\n");
                            printf("Unfair dice: ");
                            printf("%d\n",3);
                            printf("\n\n-----------------------------\n");}
    

    同じ内容が何度も出てきますが,それは無駄です.

    以下はインデント(字下げのまずい例ですが,たくさんありました.ぼちぼちきちんと書く癖を付けましょう.

            if(a<=3)
            printf("Unfair dice: 1\n");
    

            if( num2 < 3 )
        {
            printf("OUnfair dice:1\n");
        }
        else
        {
            if( num2 < 6 )
    

    教科書やWebの解答例などを参考に直してください.

            printf(" s154054\n\n");
    

    学生番号の出力も指定通りでお願いします.

    インデントのよくない解答 b1501 b1523 b1526 b1580 b1402 b1470 b1269 b1274 b1288

    ハイフンラインの無い解答 b1503 b1545 b1406 b1415

    解答用紙に名前を書いていない解答 b1550 b1569 b1416

    学生番号の出力がおかしいもの b1570 b1416 b1430

    上記はいずれも減点されていますので,以後は注意してください.

  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 の処理を追加したプログラムを前回から学習しました.本日も,実習課題に沿って学習していきましょう.

    else を使用するのは重要です.発生した状態に対して,必ず何かの処理を行なう必要がある場合には必ず最後に else を入れるようにしましょう.処理の洩れを防止するのに役立ちます.一方,必ず何かの処理をする訳では無いときには,else を入れないようにしましょう.

    	if(hoge)
    		hogehoge;
    	else
    		hogehogehoge;
    		


    上のようであれば,hogehoge hogehogehoge のどちらかが必ず実行されます.一方,

    	if(hoge)
    		hogehoge;
    	else if(hege)
    		hogehogehoge;
    		


    であれば,hogehoge hogehogehoge も実行されないこともあります.
    注意

    インデント(字下げ)について毎回注意していますが,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. 宿題

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


目次ページに戻る