プログラミング入門I
2021.12.06

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回はついに無限ループが出てきました.これは面倒なので,無限ループにならないことを確認してからの提出をお願いします.また,コンパイルエラーも残念ながら出ています.こちらも自分で確認するとわかるので,そこんとこよろしく.

    無限ループ: C008
    コンパイルエラー: b2126 b2153

    そして,相変わらずの解答用紙の不使用です.もう採点しないことは前回このWebテキストにも書いておいたので,分かってもらえるはずなのですが.

    解答用紙不使用: b1923

    朗報は,インデントの不備が減ったことでしょうか.この調子で,皆さんも適切なインデントで見やすいコードを書くことに努めましょう.

    不適切なインデント: b2118 b2134

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

        double i;
    

    for() 文などの反復処理でよく使用する変数 i ですが,これは整数の英語 integer から来ているもので,a とかでなく i を使うことには意味があります.double 型の変数名としては適切ではないので,そのときそのときで適切な変数名をつけるよう注意してください.

        int i, num, count, A = 0; 
    

    変数 count が初期化されていないので値が不定となり,後々変な値が出ます.また,変数名は小文字で始めましょう,となんども言っているのですがね.

        float num = rand() %9999 + 1;
    

    発生する乱数が4桁の正の整数になっていないですね.出るのは,1から9999です.

        number = rand() %9990 + 9;
    

    さらに不可解な乱数です.9から9998の範囲ですよね.

        for(;num>1 ;)
        {
            if(num>1)
            {
                num /= 2;
                count++;
                printf("%.2f ", num);
            }
        }
    

    このようなプログラムがいくつか見られました.でも,for() 文の中の if() は不要ですよね?

        int num, a=0; 
    
        num = rand() % 9000 + 1000;
    
        printf("Original radiation dose: %d Bq\n\n", num);
    
        for( ; num>1; )
        {
            num /= 2;
            a += 30;
            printf("%d ", num);
        }
    

    変数を int 型で定義してしまったので,小数部が切り捨てられて,答えが変わってしまいます.

        printf("original radiation dose: %.f Bq\n\n", num);
        for(; num>0.5; num/=2)
        {
            printf("%.2f",num);
            if(num>1)
            {
                year +=30;
            }
        }
    

    ただの %f だと,標準的な仕様では小数部が6桁表示されますので,問題文で指定している出力形式と違ってしまいます.教科書p.27の書式指定子のところをしっかり復習してください.

                    for ( i = 0; 1<connecter; )
                    {
                        double shousuu=(connecter*100) /2;
                         double round(double shousuu);
                         printf("%.2f ",shousuu/100);
                            connecter=shousuu/100;
                            i=i+1;
                    }
    

    インデントもダメなのですが,それ以上に for() 文の中で double 型などを定義しています.反復処理を行っているので,毎回宣言することになりますよね.なぜ,for() 文の中で定義するのでしょうか?

    さて,今回は絶対にやっちゃダメなのが出てきてしまいました.プログラミングは,これまでにも説明しましたが,自分が楽をするために行うものです.自動化や自動処理といった放っておけばあとは勝手にコンピュータがやってくれるという状態にするのがプログラムの目的です.手作業で頑張るのはダメです.

        if(num>=8193 && num<=9999)
        {
            for(i=2; i<=16384; i *= 2)
            {
                printf("%.2f ", num / i);
            }
    
            printf("\n");
    
            printf("420 years to become less than 1 Bq\n");
        }
        else if(num>=4096 && num<=8191)
        {
            for(i=2; i<=8192; i *= 2)
            {
                printf("%.2f ", num / i);
            }
    
            printf("\n");
    
            printf("390 years to become less than 1 Bq\n");
        }
        else if(num>=2048 && num<=4095)
        {
            for(i=2; i<=4096; i *= 2)
            {
                printf("%.2f ", num / i);
            }
    
            printf("\n");
    
            printf("360 years to become less than 1 Bq\n");
        }
        else if(num>=1024 && num<=2047)
        {
            for(i=2; i<=2048; i *= 2)
            {
                printf("%.2f ", num / i);
            }
    
            printf("\n");
    
            printf("330 years to become less than 1 Bq\n");
        }
        else if(1000<=num && num<=1023)
        {
            for(i=2; i<=1024; i *= 2)
            {
                printf("%.2f ", num / i);
            }
    
            printf("\n");
    
            printf("300 years to become less than 1 Bq\n");
        }
    

  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. 宿題

    宿題はレポート提出システムを利用して行いますので,当日の18:00に公開予定の課題を確認して下さい.


目次ページに戻る