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

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    久しぶりの宿題だったためか,不備が多く見られました.注意しましょう.

    学生番号間違い: b1710 b1728 b1440
    ハイフンライン無し: b1736 b1758 b1737

    2重の for 文に if 文も加わり,インデントのおかしい物が激増しましたね.わからない人は必ず質問して確認してください

    インデントの不備: b1701 b1702 b1703 b1711 b1716 b1718 b1722 b1736 b1737 b1738 b1743 b1746 b1749 b1755 b1757 b1760 b1761 b1762 b1767 b1768 b1769 b1771 b1772 b1773 b1775 b1777 b1781 b1782 b1783 b1440 b1461 b1512 b1523 b1601 b1605 b1620 b1622 b1664 b1672 b1675 b1678

    今回も変数の初期化を行っていないために実行結果が適切でないものがありました.こちらも注意してください.

    初期化しない変数の使用: b1736

    何度も書きますが,以下のようにオプションをつけてコンパイルを実行すれば簡単に確認できますので,忘れないようにチェックしましょう.

    $ cc -Wuninitialized hoge.c

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

                    r = rand()%(9999-1000+1)+1000;
    

    なんでこんなややこしいことを.カッコの中を計算したら9000ですが?

            for(i=1; i<=5; i++){
                    b = 0;
                    c = 10000;
                    
                    for(j=1; j<=5; j++){
                            printf("%d ", a = rand() % 9000 + 1000);
                            if(a>b)
                                    b=a;
                            if(a<c)
                                    c=a;
                    }
                    printf(" | %d %d\n", b, c);
            }
    

    上の例は間違いではないのですが,いい加減変数名を a とか b とかやめませんか?見るときに,これらの変数がどんな役割をしているのかがわからいので,判断がしづらくなります.

            for(i=1; i <=5; i++){
                    for(j=1; j<=5; j++){
                            a = rand() % 9000 + 1000;
                    
                            printf("%d ",a);
                            
                            if(a >= max)
                                    max = a;
                            
                            else if(a <= min)
                                    min = a;
                    }
                            
                    printf(" | %d %d\n",max,min);
            
            }
    

    else if もおかしいでですが,それよりも最大値や最小値の変数が各行ごとに初期化されていないので,累積での最大値と最小値が残ってしまいます.前回からカウンタなどもどこで初期化するのかが重要な練習問題を扱っていますので,もう一度よく確認してください.

            for(i=0 ;i<=4 ;i++){
                    max = 0;
                    min = 10000;
                    
                    for(j=0 ;j<=4 ;j++){
                            a = rand() % 9000 + 1000;
                            printf("%5d",a);
                            
                            if(a >= max)
                                    max = a;
                            
                            if(a <= min)
                                    min = a;
                    }
                    
                    if(max >= tmax)
                            tmax = max;
                            
                    if(min <= tmin)
                            tmin = min;
                            
                    printf(" |%5d%5d\n",max,min);
            }
    

    外側の for 文での最大値や最小値の更新処理は不要ですよね.

                    int Max = 0;
                    int Min = 9999;
    

    for 文の中での int などの宣言はやめて欲しいのですが,それに加えて変数名は小文字で始めるという約束も理解してください.

                    printf("| Max: %d, min: %d \n", max, min);
    

    指示と大きく異なる表示形式もやめてください.

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

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


目次ページに戻る