情報科学演習
2013.01.07

Back to index page



  1. 本日の作業内容

  2. 小テストについて

    授業の最初に配列に関する小テストを実施します.レポート提出システムを使用します.

  3. 宿題の結果について

    今回は久しぶりに解答用紙を使用しない人が出てきました.注意してください.

    b1213

    後,名無しの権兵衛さんや,学生番号が99番とかもありましたので,提出前には今一度チェックをお願いします.

    では,例によって問題のある解答の例をいくつか挙げさせていただきます.

                    b=rand()%2+1;
                    if(b==1){
                            i+=a;
                            printf("+ %d ",a);
                    }
                    if(b==2){
                            i-=a;
                            printf("- %d ",a);
    

    上の例が今回最も多く見られた問題です.ここはプログラミングの大事なポイントなので以後はよく注意してください.

    まずは,演算子のための乱数発生ですが,+かーのどちらかを発生させるということで,必要な数は2種類です.乱数で使用する rand() 関数と剰余の組合せでいうと,

    	rand() % 2;
    

    ということになり,0と1をそれぞれ+かーに対応させれば良いのですが,上の例ではなぜ1か2を発生させる必要があったのでしょうか.1を加えるということはまったく無駄な作業をしているわけです.「一桁の正の整数」とか「サイコロの目」のような条件付きの場合にはなんらかの数を足して条件を満たすようにしますが,今回は必要ないですね.無駄なことは止めましょう.

    それから,次に書かれているのはもっと重要な問題です.今回は演算子として+かーかのどちらなのかに関する条件分岐ですので,if 文の書き方としては,必ずどちらかが実行されるように else を使うのがポイントです.特定の条件のみを取り出す場合には if else if の組合せですが,必ずどれかの条件を実行する場合には最後の条件を明記するのでは無く,else で終わらせるようにしましょう.条件の指定洩れが無くなり,より安全なプログラムとなります.

                    n = rand() % 19 + -9;
    

    上の例は,問題の条件である「1桁の正の整数を乱数を用いて順次発生させていく」ことに反していますので,減点です.

            printf("\n      My      student number  :       s1240**\n\n");
    

    なぜ,このようにたくさんのスペースが必要なのでしょうか?

                    a = rand() % 10 + 1, b = rand() % 2 + 1;
    

    以前にも言いましたが,どうしても rand() 関数が適切に使用できない人が最後まで残ります.これも「1桁の正の整数」の条件を満足していません.

            printf("10");
            i = 1;
            while(i < 10){
                    num = rand()% 18 - 9;
                    sum += num;
                    i++;
                    if(num > 0){
                            printf("+" );
                    }
    
                    if(sum < 10)
                    printf("%d", num);
            }
            printf(" = %d",sum - 10);
    

    上の例は,何がしたいのか理解できませんでした.

            while(i){
                    a = rand()% 9 + 1;
                    b = rand()% 2 + 1;
                    if(b == 1){
                            sum -= a;
                            printf(" - %d",a);
                    }
                    if(b == 2){
                            sum += a;
                            printf(" + %d",a);
                    }
                    i++;
                    if(sum < 0)
                            break;
            }
    

    break を使うのなら while 文の練習になりませんね.

                    int i, a, b = 10;
                    
                    printf("10 ");
                    while(i >= 0){
    

    これはありがちなミスなのですが,通常は実行してみて気づくはずのものなので,チェック不足です.変数 i に値が入っていないのに while 文で条件式を使用しているので,正しく実行されません.

  4. 1次元配列

    この授業の最後の難関である配列です.これが使えないと実際のプログラミング では困ります.複数の並んだ値を一つの名前で保存できる便利な機能ですので, 必ず使えるようになってください.

    例えば,1日の気温を1時間ごとに自動で測定するシステムがあるとします.午前0 時から午後11時まで24個の温度を,

    temp0, temp1, temp2, .... , temp23

    のようにたくさんの変数を使用して記憶しておくことは無駄ですし,後から使う ときにやりにくい面が多いことになります.そこで,配列 temp として 1時間ごとの温度を

    temp[0], temp[1], temp[2], ... , temp[23]

    のようにしておくと,変数名としては1つの temp だけで済みますし, 時間を添字として利用することで読み出しが簡単になります.

    今日からのポイントは値が何番目に入っているかを示す「添字」の使い方です.この添字を for 文などと組み合わせて自動的に処理する方法を理解しましょ う.

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.59-65を予習してきてください.

  7. 宿題

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


目次ページに戻る