プログラミング入門I
2018.11.19

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回も重大な問題が発生するようなプログラムはなかったのですが,依然として軽微な不注意によるものなどありましたので,以後は注意してください.なお,インデントについては,下記に指摘されている人は必ず自分のプログラムを確認し,おかしいことがわからない場合には質問してください.

    出力した学生番号の間違い: b1813 b1834 b1854 b1858
    ハイフンライン出力無し: b1566 b1781
    警告: b1806 b1832 b1849 b1855

    警告の内容は,基本的には以下のように不必要な変数が printf に入っているものです.コピペの使い回しには注意してください.

       printf("Greater than 5\n", num);
    

    インデントの不備: b1821 b1825 b1828 b1842 b1860 b1861 b1864 program1 b1718

    if 文のように中括弧 { } を伴うようなもの(ブロック)は字下げをしてください.以下のような不備がちょくちょく見られました.

           if(a>5)
           {
           printf("Greater than 5\n");
           }
    

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

            if(a % 3 == 0)
            {
                    printf("Multiple of %d\n",a);
            }
    

    %d にしているので,何の倍数かわからなくなってます.

            if("a%3 == 0")
    

    文字列が入っていますので, if 文の条件式が常に真になります.

            if(a > 5)       
            {
                    printf("Greatr than 5\n");
            
            if(a % 2 == 0)
            {
                    printf("Even\n");                       
            }       
            
            if(a % 3 == 0)
            {
                    printf("Multipl of 3 \n\n");
            }       
            
            printf("----------------------------\n");}
    

    最初の if のとじ中カッコが最後の printf の後になっていますので,変数 a が5以下の場合には以下の if などは実行されません.

            if(num > 5)
            {
                    printf("Greater than 5\n");
                    
                    if(num % 2 == 0)
                    {
                            printf("Even\n");
                            
                            if(num % 3 == 0)
                            {
                                    printf("Multiple of 3\n\n");
                            }
                            
                    }
                    
            }
    

    変数 num が5より大きくないと,以降が実行されませんし,3の倍数を表示するのは,さらに偶数でないとダメ,という構成になってしまっています.多重の if はこの問題では不要でした.

            int a = rand() %9 + 1 ;
    

    プログラム的な間違いではないので減点はしていませんが,上のような「気持ち悪い」書き方はやめましょう.演算子と変数や数値の間には1文字分のスペースを空けるようにしてください.以下のような書き方ですね.

            int a = rand() % 9 + 1 ;
    

  3. 前回の復習

    条件分岐の基本である if 文について学習しました.条件式と文によって構成されるものでした.

    	if(条件式)
    	{
    		文;
    	}
    

    中括弧でくくられる「ブロック」という領域に文が入ります.文はインデント(字下げ)してください.

    また,教科書では書かれていませんでしたが,条件式の部分に四則演算を用いた式を入れることも可能です.

    	if(a+b>c)
    	{
    		文;
    	}
    

  4. if-else

    今回学習するのは教科書p.51にある if-else 文です.使い方はリスト3_3などの例題を見てもらいたいのですが,前回出てきた if 文の拡張にあたります.しかし,実は使う上で意味が大きく異なりますので,注意してください.まずは,基本的に理解しておかなければならない目的の部分です.

    if 文は,何かの条件に合致した時に特定の処理を行うけれども,合致しなかった場合には何もしない,というのが使用の条件です.一方, if-else 文は必ず何かの処理を行うのだけれども,行うにあたって場合分けが必要なときに使用します.以下に単純な例を示します.

    • 発生させた乱数が偶数だったらEvenと表示する.

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(void)
      {
      	srand((unsigned) time(NULL));
      	
      	int num = rand() % 90 + 10;
      	
      	printf("Random number: %d\n", num);
      	
      	if(num%2==0)
      	{
      		printf("Even\n");
      	}
      	
      	return 0;
      }
      

    • 発生させた乱数が偶数か奇数かを表示する.

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(void)
      {
      	srand((unsigned) time(NULL));
      	
      	int num = rand() % 90 + 10;
      	
      	printf("Random number: %d\n", num);
      	
      	if(num%2==0)
      	{
      		printf("Even\n");
      	}
      	else
      	{
      		printf("Odd\n");
      	}
      	
      	return 0;
      }
      

      上のプログラムは,下のように書くことも可能ではあります.

      
      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(void)
      {
      	srand((unsigned) time(NULL));
      	
      	int num = rand() % 90 + 10;
      	
      	printf("Random number: %d\n", num);
      	
      	if(num%2==0)
      	{
      		printf("Even\n");
      	}
      
      	if
      	{
      		printf("Odd\n");
      	}
      	
      	return 0;
      }
      


      上のような if 文を2回書くプログラムは動作間違っていませんが,推奨しません.今は場合が2つだけで単純ですが,いくつもの場合があったり,条件分けが複雑だったりした時に,何らかの「抜け落ち」が発生する可能性があります.とにかく,何かの処理をするのであれば,保険として else をつけてください.
    • 入れ子の if-else

      教科書p.54のリスト3_5のように, if 文同様, if-else 文も入れ子にできます.

    • else if

      条件が3つ以上になると,教科書p.55のリスト3_6のように else if を使う場合があります.これも演習で確認しましょう.

  5. 論理演算子

    論理演算子は教科書p.52の表3_3にある以下の3つです.戻り値は1もしくは0のブール値ですので, if 文の条件式のところや,後に出てくる for 文の式の中で通常は使用します.

    演算子名称
    && 論理積(AND)
    || 論理和(OR)
    ! 論理否定(NOT)

    あらかじめ説明しておきますが,初心者がよくする間違いに以下のようなものがあります.

    	if(a > b, b > c)	意味不明な動作になる可能性
    	
    	if(a == b || c)	cに値があれば必ず真
    	
    	if(a < b < c)	右の不等号以降は無視される
    

    上記はいずれも間違ったプログラムです.正しくは,以下のように書く必要がありますので気をつけてください.

    	if(a > b && b > c) もしくは if(a > b || b > c)
    	
    	if(a == b || a == c)	
    	
    	if(a < b && b < c)	
    

  6. 実習

    実習の演習問題は予習用の部分はすでに見えますのでしっかり予習してください.

  7. 次回の予習範囲

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

  8. 宿題

    宿題についても当日ご案内します.ただし, 宿題の問題を見ることができるのは20日以降になりますので,注意してく ださい.


目次ページに戻る