プログラミング入門I
2018.12.26

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回は残念ながら無限ループが出てきてしまいました.以後注意してください.原因は式2の書き間違いです.

    無限ループ: program4

    	for(;i=10;)
    

    警告もありました.

    警告: b1742

    内容は,以下のようなものです.

    warning: zero-length gnu_printf format string [-Wformat-zero-length]
        printf("");
               ^
    

    間違いでは無いのですが,不要な printf に対して出ているもののようです.

    他には,初期値がないまま変数を使用してしまったために,正しい結果が表示されないものもありました.

    初期値なし: b1830

    これは教室の環境では初期化しない変数に勝手に0を代入してしまう仕様が使われているため,気づきにくいものとなっています.他の環境に行くとそのような余計なおせっかいをしてくれることはありませんので,今のうちに初期化に意識を向けるよう努めてください.

    ハイフンライン無し: b1823
    インデント不備: b1812 b1841 b1847 b1848 b1859 b1864 b1775

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

                    i = rand() % j + 10;
    

    上のものは間違いではないのですが,変数 i j をこのように普通の変数の代わりに使用するのはやめましょう.普段から意味のない変数名の a b などを使用していると, i でも j でも同じだと思うかもしれませんが, for 文で1つずつ値を増やしていくための変数などに i j を使用し,通常の変数は意味のある名前をつけるように習慣づけてください.

                    b -= 10;
                    a = b;  
    

    これも間違いではないですが,一つの式にできますし,そのほうが簡単です.

            for(i==0; i<1;)
    

    式1の書き間違いで,正しい動作をしないものになっていました.

                    if((float)num/10 == 1)
    

    意味不明のキャスト演算子.どうして?

            for( ;i > 10; )
            {
                    num=rand()%i+10;
                    if(num<i)
                    {
                            printf("%d ",num);
                            i=num;
                    }
            }
    

    解答例を見てもらうとわかるように,今回 if 文は不要です.ところが,一度 if 文を学習すると,この例のようについつい if に頼ってしまう, if 文症候群に陥ってしまう人が多く見られます.無くても良い物は入れないようにしましょう.

  3. 前回の復習

    for 文について学習してきました.演習問題の解答例も載せていますので,それらを参考に反復処理を理解できるようになってください.

  4. while

    while 文は,for 文と異なり,実行条件(式2)しか指定しま せん.その分,自由度が高いので,熟練した人はよく使用します.最初は for 文の方が簡単なので,この授業では基本的に for 文を使用しますが,知っておいて損はありません.

    for 文で式2だけを使用する場合や式3が無い場合などは while 文を使用する方がすっきり書けることがあります.
    前回の演習問題の i. は, while 文を使用すると以下のように書けます.

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

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.62-64を一応一通り読んでおいてください.実際にはより複雑な for 文にチャレンジしますので, for 文の基礎をしっかり押さえておくようにおねがいします.

    また,次回は反復処理に関する確認テストを実施します.

  7. 宿題

    授業の終わりに宿題の案内をします.

    明日から冬休みということで,今回はメンター学習室はありませんので,ご注意ください.


目次ページに戻る