プログラミング入門  情報科学演習
2015.12.14

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    今回は幸いにもコンパイルエラーなどは無く良かったのですが,解答用紙を使用していないケースがまた発生しました.残念です.

    解答用紙不使用: b1510

    以下は問題のある解答の一例です.参考にしてください.

            int i, j, a, d=100, e=0;
            printf("My student number: s154019\n\n");
    
            for(i=1;i<=3;i++) {
                    int b, c;
                            for(j=1;j<=10;j++){
                                    a=rand()%100+1;
                                    printf("%d ", a);
                                    if(b>a)
                                            b=a;
                                    if(c<a)
                                            c=a;
                                    a=0;
                                    }
    

    まず問題なのは for 文の中に int のような定義が入っていることです.for 文の中の処理は一定回数繰り返されるわけですが,なぜ何度も何度も定義する必要があるのか,ですね.そのような繰り返しの定義は不要です.もう一つの問題点は if 文で変数 b a の大小比較を行っていますが,そこよりも前のどこにも変数 b の値が代入されていません.初期化がなされていない状態です.このような場合,通常は変数 b の値は不定ですのでおかしい動作をします.ただ,残念ながら,この教室では,勝手に0が代入されてしまうので,このようなミスに気づきにくくなっています.これを避けるために,以前から紹介していますが,

    $ cc -Wuninitialized hoge.c

    のように初期化に関するオプションをつけてコンパイルすると,警告が出ますのでうっかりミスを防ぐことが出来ます.

            int i, j, k, amax1, bmax1, cmax1, max2, amin1, bmin1, cmin1, min2;
            int a,b,c;
            amax1=0,bmax1=0,cmax1=0,max2=0,amin1=101,bmin1=101,cmin1=101,min2=101;
    

    こんなにたくさんの変数なんかは不要です.で,これらを使って,

            if(amax1>max2 && amax1>bmax1 && amax1>cmax1)max2=amax1;
            if(cmax1>max2 && cmax1>bmax1 && cmax1>amax1)max2=cmax1;
            if(bmax1>max2 && bmax1>cmax1 && bmax1>cmax1)max2=bmax1;
            if(amin1<min2 && amin1<bmin1 && amin1<cmin1)min2=amin1;
            if(bmin1<min2 && bmin1<cmin1 && bmin1<amin1)min2=bmin1;
            if(cmin1<min2 && cmin1<bmin1 && cmin1<amin1)min2=cmin1;
    

    こんなことになっているのですが,これは絶対にやっちゃダメ!な方法です.プログラミングは自分が楽をするためにあるので,こんな面倒なことは考えては意味がありません.

                    max=0;
                    min=0;
    

    最小値 min の初期値がまずいためにその後きちんと最小値を格納できなくなります.

                    for(j=1; j<=10; j++){
                            int a = rand() %  100 + 1;
    

    こちらも for 文の中で変数の定義をしていますが,別に10回も定義する必要は無いですね.

                    if(tmin=min)
                            tmin=min;
    

    条件間違っちゃいましたね.

                            printf("%3d",num1);
    

    すき間が無いので,100が出たら数字がつながってしまいます.

                            printf("%d ",a);
    

    桁数指定を覚えてください.

                                    p =rand() % 90 + 10;
    

    今回は2桁の整数では無く,1から100までのはずでしたが...

            for(i=0; i<=2; i++){
                    min = j;
                    max = j;
    
                    for(j=0; j<=9; j++){
    

    こちらも変数 j の値は代入した後の内側の for 文で初めて決まるので動作がおかしくなります.

                            if(a<num1 || a==num1)
    

    いいことを教えてあげましょう.なんと比較演算子には <= というのがあるんです!

    今回の原点答案一覧です.初期化していないパターンが新たに登場しました.

    初期化なし: b1519 b1020 b1217 b1288

    相変わらずのインデント不良: b1502 b1504 b1506 b1519 b1526 b1527 b1528 b1529 b1533 b1536 b1539 b1543 b1544 b1548 b1552 b1557 b1567 b1570 b1577 b1406 b1417 b1428 b1470

    未だにこれだけ大量の人がインデントの不備のあるプログラムを書いているのは困ります.今日の授業中に質問してください.

    最後のハイフンラインが無いもの: b1505 b1547 b1414

    学生番号が無かったりおかしかったりしたもの: b1547 b1570 b1414 b1422 b1431

  3. 前回の復習

    for 文の式2の終了条件が定数でなく,変数になる場合を練習しました. これにより2次元の多様な表現が可能となります.今後も使用しますので, 覚えておいてください.

        for(i=1; i<=5; i++)
            for(j=1; j<=i; j++)
    
    

    上のように j に関する終了条件を i に依存させることで, 以下のような変数の変化が実現できます.

    (1,1)
    (2,1) (2,2) 
    (3,1) (3,2) (3,3) 
    (4,1) (4,2) (4,3) (4,4) 
    (5,1) (5,2) (5,3) (5,4) (5,5)
    

  4. while

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

    for 文で式2だけを使用する場合や式3が無い場合などは while 文を使用する方がすっきり書けることがあります.
  5. 実習

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

  6. 次回の予習範囲

    教科書のp.52-59を予習してきてください.また,配列に関する小テストを実施 しますので,予習をしっかりしてきてください.

  7. 宿題

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


目次ページに戻る