プログラミング入門 情報科学演習C7
2017.10.30

Back to index page



  1. 本日の作業内容

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

    初めての小テストであることからコンパイルエラーが続出しておりました.コンパイルエラーになる答案は提出しないでください.削除に大変時間がかかりますので.

    解答用紙に番号と名前を記入してないもの,実行結果の最初に学生番号が表示されていないもの,最後にハイフンラインが無いもの,など,形式の不備も目立ちます.テストは短時間ですが,形式的なものをまずきちんと整えてからプログラミングにとりかかるようにしてください.

    解答用紙に番号と氏名の無いもの: b1712 b1752 b1762
    実行結果に学生番号の無いもの: b1740 b1754 b1622
    実行結果の最後にハイフンラインが無いもの: b1701 b1740 b1741 b1749 b1754 b1758 b1765 b1770 b1777 b1442 b1622

    コンパイルエラー: b1711 b1712 b1713 b1717 b1718 b1728 b1730 b1733 b1735 b1736 b1737 b1742 b1752 b1762 b1769 b1771 b1776 b1780 program1

    インデント(字下げ)の不備も相変わらずでした.気をつけてください.

    インデントの不備: b1701 b1702 b1711 b1714 b1716 b1718 b1719 b1728 b1729 b1730 b1732 b1737 b1740 b1741 b1742 b1746 b1749 b1750 b1752 b1753 b1754 b1755 b1756 b1757 b1758 b1762 b1767 b1772 b1777 b1778 b1779 b1783 b1440 b1523 b1637 b1672 program1

    以下は問題のあるプログラムの例の一部です.次回以降の参考にしてください.

        if(a%2==0);
              printf("Even\n");
        if(a%2==1);    
              printf("Odd\n\n");
    

    上の例のような間違いが複数見られました. if の条件式の直後にセミコロンを入れてしまうと,その段階で if の作用が切れます.ですので,このような処理を描いてしまうと, printf の式は必ず実行されます.

            int a = rand() % 89 + 9;
    

    乱数の間違いもそこそこ見られました.早く理解してください.

            printf("Odd\n\n",a);
    

    最初のうちはよくやる間違いの一つですね. printf の2重引用符の中には %d などが無いにもかかわらず,後ろに変数を置いています.こういう場合警告が出ますので,注意してください.

            printf("-----------------------------------/n/n");
    

    上のものはバックスラッシュとスラッシュを間違えてました.

            if(n == 0)
                            printf("Even\n");
                            
            else
                            printf("Odd\n");
    

    こういうインデントの間違いも時々見られます.字下げの幅は統一してください.下げれば良いというものでも無いです.

  3. 宿題について

    提出してもらった宿題ですが,残念ながらまたもや形式的な不備が見られました.提出の際には慎重に確認してください.

    解答用紙に番号と名前無し: b1746 b1752 b1762
    解答用紙に間違った学生番号: b1723
    ハイフン行なし: b1711 b1712 b1714 b1461

    今年度の1年生ではこのハイフン無しが目立ちます.注意してください.

    インデント(字下げ)の不備は相変わらず大量に見られました.わからない場合には質問してください.

    b1703 b1706 b1709 b1711 b1713 b1714 b1715 b1716 b1718 b1719 b1722 b1730 b1731 b1733 b1736 b1740 b1741 b1743 b1744 b1745 b1746 b1748 b1752 b1757 b1762 b1763 b1769 b1771 b1772 b1776 b1778 b1781 b1440 b1461 b1468 b1622 b1661 b1663 program1

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

        int x = rand() % 12 - 6;
        int y = rand() % 12 - 6;
    

    乱数の扱いが間違っているものは減りましたが,まだ,ときどき見られます.注意してください.上の例では-6から5の範囲の整数です.

            if(c > 25)
                    printf("Out\n\n");
            if(c <= 25 && c >= 9)
                    printf("On\n\n");
            if(c < 9)
                    printf("In\n\n");
    

    このパターンの解答は多く見られました.動作が間違っているわけでは無いですが,今回の処理では必ず「In」,「On」もしくは「Out」のどれかになるわけですから,そのような場合には else を使うようにしてください.そうすれば条件式を減らせます.

                    if(x*x+y*y<9)
                                    printf("In\n");
                    else if(x*x+y*y>=9&&x*x+y*y<=25)
                                    printf("On\n");
                    else
                                    printf("Out\n");
    

    インデントの幅が大きすぎて,それ自身もおかしいのですが,この場合は else if のところで良くない状態です.最初の if で,すでに9未満の場合の処理としているので, else if の前半の9以上の条件式は不要ですね.

            if(a * a + b * b > 25)
                    printf("Out\n");
    
            else if(a * a + b * b < 9)
                    printf("In\n");
    
            else if(a * a + b * b >= 9 && a * a + b * b <= 25)
                    printf("On\n");
    

    最後の else には if はもう必要ないですね.

            int x = rand() % 13 - 6, y = rand() % 13 - 6, xy1 = (x * x) + (y * y) , xy2 = (x * x)  + (y * y) ;
    

    変数 xy2 の存在意義がわかりません.

            printf("Coordinate: (%d, %d)\n", a, b);
            
            if(a*a + b*b < 9)
                            printf("OUT\n");
    

    今回結構多く見られたインデントの不備が上のようなものです.インデントの幅が違っています.下げ幅は統一してください.

  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. 論理演算子

    複数の条件を if 文で処理したい時に,教科書p.30の表3.3にある論理演算子を使用します.実習の時に何人かの人が間違えたような,以下のような処理がありました.

        if( 1 < a < 5 )
        
        if( a == b == c )
    
    間違った記述.やっちゃだめ!

    上のようなやり方はプログラミング言語には用意されていません.そこで,論理積の記号 && を使用して以下のように書くと正しいものになります.

        if( a > 1 && a < 5 )
    

    論理演算子の結合の強さは四則演算や比較演算子よりも弱いので,式のように他の演算子を含む条件を記述する場合でも,特別にカッコを追加する必要はありません.

        if( a + b > 10 && a * b < 100 )
    

  7. 実習

    実習の演習問題はこちらです.

  8. 次回の予習範囲

    教科書のp.35まで予習をしてきてください.

  9. 宿題

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


目次ページに戻る