プログラミング入門I
2019.01.07

Back to index page



  1. 本日の作業内容

  2. 確認テスト

    授業の後半で確認テストを実施しますので,アナウンスに従って作業してください.

  3. 前回の宿題について

    今回は久しぶりに解答用紙を使用しない人が出てきました.残念です.

    解答用紙不使用: b1772

    学生番号を出力してない人と,相変わらずインデント(字下げ)の不備もありました.

    番号出力無し: b1827
    インデントの不備: b1801 b1848 b1859 b1864 program4

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

            int i = rand() % 900 + 100;
    

    だ〜か〜ら〜,こういう変数名に i を使うなって言ってるだろうに!

            int num = rand() % 990 + 100;
    

    乱数の範囲には注意してください.

                    if(a%2==0)
                    {
                            b = a / 2;
                    }
                    else
                    {
                            b = a * 3;
                            b ++;
                    }       
                    a = b;
                    printf("%d ", a);
    

    間違いでは無いけれど,変数 b は不要ですね.

                    if(num%2==0)
                    {
                            num /= 2;       
                            printf("%d ",num);
                    }
                    else 
                    {
                            num = num*3 + 1 ;
                            printf("%d ",num);
                    }
    

    こちらも間違いでは無いけれど, printf は最後にまとめれば1個ですみますけど...

            while(i==1)
            {
                    
                    
                    if(num % 2==0)
                    {
                            num = num / 2;  
                            printf("%d ",num);
                    }
                    else
                    {       
                            num = num * 3 + 1;
                            printf("%d ",num);
                    }
                    
                    if(num==1)
                    {
                            i++;
                    }
                    num=num;
            }
    

    せっかく while 文を使っているのに,余分なことをするのなら意味が無くなります.

            while(num>0)
            {
                    printf("%d ",num);
                    if(num%2==0&&num>1)
                    {
                            num/=2;
                    }
                    else if(num==1)
                    {
                            num -= 1;
                    }
                    else if(num%2!=0)
                    {
                            num *= 3;
                            num += 1;
                     }              
            }
    

    場合分けが変ですし, if - else 文を使用するという基本がわかっていません.

            while(a > 1)
            {
                    printf("%d ",a);
                    
                    if(a%2==0)
                    {
                            a = a/2 ;
                    }
                    else
                    {
                            a= a*3+1;
                    }
            
            }
    

    微妙な間違いです.先に printf で変数 a の値を出力してしまうと,最後の1が出力されません.

  4. 前回の復習

    前回は while 文でした.何回繰り返すかわからない処理の場合などには for 文よりも while 文の方が適している場合がありますので,今後も必要に応じて使い分けていきましょう.

    	while(式)
    	{
    		文;
    	}
    

    	for(式1; 式2; 式3)
    	{
    		文;
    	}
    

  5. 多重の for

    for 文の中にまた for 文を入れることで様々なことが可能になります.例えば,2次元的な画面表示があります.今回は,画面に座標的な出力を行うことを学習します.

    12月10日の演習課題の iii. のような表示は,今回扱う2重の for 文を使用すればものすごく簡単になります.また,剰余なども必要ありません.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
    	srand((unsigned) time(NULL));
    	
    	int i, j;
    	
    	for(i=1; i<=5; i++)
    	{
    		for(j=0; j<25; j++)
    		{
    			printf("%d ", j);
    		}
    		
    		printf("\n");
    	}
    	
    	return 0;
    }
    

    基本的には,外側のループで行を縦にすすめる制御を,内側のループで行内を右へ表示していく作業を行っています.

    乱数を使って行ごとに異なる数の●を表示させる以下のようなプログラムを考えましょう.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        srand((unsigned) time(NULL));
    
        int i, j, dots;
    
        for(i=1; i<=3; i++)
        {
            dots = rand() % 4 + 1;
    
            for(j=1; j<=dots; j++)
            {
                printf("● ");
            }
    
            printf("\n");
        }
    
        return 0;
    }
    

    このプログラムの動作を理解してもらうための,紙芝居的なページも別に用意しましたので,必要に応じてご覧ください.じっくり見て動作を確認してもらえれば幸いです.

    ただし,発生する乱数は4,3,1と固定されていますので,ご注意ください.
  6. 実習

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

  7. 次回の予習範囲

    引き続き多重の for 文を扱います.予習用の課題を見ておいてください.

  8. 宿題

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


目次ページに戻る