プログラミング入門I
2018.10.29

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    初めての宿題でしたが,幸いにもコンパイルエラーになるものはありませんでした.採点する上で大変助かりました.今後もこの調子でお願いします.

    ただし,問題のあるプログラムも結構見られましたので,それらについて,以下に簡単に述べておきます.今後の参考にしてください.

    解答用紙に学生番号と名前が無い: b1842 b1854
    コンパイル時に警告が出る: b1805 b1847
    結果表示の際に学生番号の表示がない: b1566
    結果表示の際に最後のハイフンラインが無い: b1817 b1824 program4 b1202 b1566 b1734
    インデントがおかしい: b1806 b1807 b1809 b1810 b1814 b1816 b1839 b1844 b1852 b1854 b1860 b1864 program4 b1608 b1734

    中身については以下のようなものもありました.こちらも次回からこのようなことが無いように注意しましょう.

            a=99;
            b=65;
            c=34;
            d=3366;
    

    上のような例(番号は変えてありますが)は結局自分で計算を行っていますね.これではプログラミングではありません.計算機に計算させるのがプログラミングです.

      printf("--------------------------\n\n", a, b);
    

    二重引用符 " " の中に表示させるものが無いのに,後ろに変数を入れています.このようなプログラムではコンパイル時に警告が出ます.

         printf("My student number: s186047\n\n", a);
    

    先ほどと同じで,警告が出ます.

            printf("My student number: s1860%d\n\n"
            "Last 2 digits: %d\n"
            "(%d - %d) * %d = %d * %d = %d\n\n"
            "--------------------------\n",a,a,a,b,a,c,a,d);
    

    こういう printf の使い方は推奨しませんが,それでも使うのなら2行目以降は行頭ではなく,2重引用符の頭を揃えるようにしてください.

       printf("(%d - 65) * %d = %d * %d = %d\n\n", a, a, b, a, c);
    

    今回は変数の個数を2個と書いておりましたが,このように2つ以上使う人が多く見られました.実は, printf の中に数式を書いても良かったのですが,それを教科書が説明していませんでした.私の方も,教室で見た時には教えましたが,全員には伝わらなかったようで,すみません.次回からは数式も入る前提で printf を使いましょう.

    以下はインデント(字下げ)のまずいものの一部です.注意してください.

       printf("(%d - 65) * %d = %d * %d = %d\n\n", a, a, b, a, c);
       printf("--------------------------\n");
    
            return 0;
    }
    

  3. 前回の復習

    1. 予習と復習について

      前回の授業では,予習をきちんと行っていない人が多数に渡ることが判明しました.最初の授業で説明したように,この授業はアクティブラーニング手法に基づいた「反転授業」と「グループ学習」の要素が入っています.すなわち,教科書とWebテキストにより各自で予習を行い,授業中には演習問題をグループ間で相談しながら理解していく,という形式です.基本的には自分たちで解決することが必要ですが,教員とTAが疑問等に答えてサポートします.

      ということで,何より大事なのは授業前に予習をしておくこと.授業で扱った内容を宿題に限らずおさらいして復習することです.演習問題は意図的に多く作ってあり,授業中には終わらないのが前提ですので,復習時にぜひ続きを行ってください.それができないままでは,今後大変苦労します.

    2. printf

      画面に文字列を表示させる printf について,文字幅や右揃え,小数部の桁数指定などさまざまな表示について実習しました. printf はこれからも使い続けますので,だんだん慣れてくると思います.細かい指定の部分など忘れないようにしてください.

      表示させたい値が,整数なのか,実数なのか,文字なのか,幅はどれだけで表示するのか,などを意識しておいてください.

  4. 演算子

    • 算術演算子

      C言語には教科書p.34の表2_8に示す算術演算子が用意されています.これに加えて,前回説明した単項演算子(負号)があります.特に注意が必要なのが剰余算です.これから乱数も含めて剰余の計算をたくさん行いますので,まずは剰余の基本を理解しましょう.

    • 剰余算

      ある数を3で割ったあまりは,0,1,2の3つです.当たり前ですね.でも,この基本がわからない人が毎年います.舐めてかからないでしっかり理解しましょう.ある整数 m を別の整数 n で割ったあまりは全部で n 種類であり,あまりの中の最大値は n - 1 です.これが剰余の基本中の基本です.

    • 代入演算子

      ほとんど全てのプログラミング言語においては等号の記号 = は「代入」を表します.「等しい」ことを説明しているのではなく,右辺の値を左辺の変数(もしくは定数)に「代入」しています.

    • 複合演算子

      教科書の表2_9にある代入以外の演算子記号は全て等号と算術演算子の組み合わせになっています.このような演算子を複合演算子とも言います.非常に重要な演算子で,今後たくさんの機会で使用します.以下のような動作をしますので,働きを理解しましょう.

      演算例意味 a 初期値演算後の a の値
      a += 1 a の値を1増やす12
      a -= 1 a の値を1減らす21
      a *= 2 a を2倍する36
      a /= 2 a を半分にする42
      52
      a %= 3 a を3で割ったあまりにする52

      いずれの場合でも行われた操作により変数 a の値が変わっています.

    • 演算子の優先度

      数学における四則演算と同様に掛け算と割り算は足し算引き算よりも優先されます.剰余算は割り算と同じです.また,計算は左から代入は右側から行われます.

    • インクリメント演算子・デクリメント演算子

      複合演算子を用いた代入の

      	i = i + 1;
      	i += 1;
      

      のような演算は非常に頻繁に使用されるので,専用の演算子が用意されています.値を1増やす演算子をインクリメント演算子,値を1減らす演算子をデクリメント演算子と言います.

      	i++;
      	++i;
      	i--;
      	--i;
      

      のように使用します.演算子が変数の前にあるか,後にあるかで動作が異なります.教科書p.35のリスト2_9を参照してください.

  5. 乱数

    サイコロを使ってランダムに数を作りたい時など,「乱数」というものが役に立ちます.以下は,サイコロをシミュレートするプログラムです.

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

    • ヘッダファイル

      標準のヘッダファイルに加えて,以下の2つをインクルードする必要があります ので,必ず記入しておいてください.

      #include <stdlib.h>
      #include <time.h>
      
      

    • 乱数配列の初期化

      乱数は一度作られるとその順番が決まってしまいます.そこで,実行する度にそ の順番をシャッフルしないといけません.そのための命令を最初に書いておきま す.これは一つのプログラムの中に1回あればそれで構いません.

          srand((unsigned) time(NULL));
      

      unsigned とは符号無し の数(正の数)で,コンピュータ内の時計を利用して毎回違う数字を発生させるた めに,時間の関数である time() を使っています.

    • 乱数を発生させる関数

      乱数は以下の関数で発生させられます.

          rand();
      

      「関数」というのは,C言語では名前に括弧 () をつけて表現されるもので,それを命令で呼び出すと「値」を返してくれるものです.括弧の中はこの rand() のように空欄のままのものや printf のように括弧の中に式や文字がある場合とがあります.rand() は呼び出される度に発生させた乱数の値が返されます.
      ただし,rand() だけだと発生する乱数は扱える最大の桁の整数になってしまいます.次の例で試してみましょう.

          printf("%d\n", rand());
      

      そこで以下に示すように剰余を使用して範囲を限定します.

    • 乱数の範囲

      例えば,サイコロの目ですと全部で6種類なので6で割った余りを活用します.注 意するのは6で割った余りは0から5までなので,サイコロにするには1を加えて1 から6にする必要があることです.そこで,例のようになるわけです.

          rand() % 6 + 1;
      

    • 画面への乱数の出力

      単に乱数を画面に表示するだけなら, printf の中で発生させることで可能です.

          printf("%d\n", rand());
      

      しかし,発生させた乱数をなんらかの処理で利用する場合には一度変数に入れる必要がありますので,注意してください. 

      	int num = rand();
      	
      	printf("Obtained random number: %d\n", num);
      

  6. 実習

    実習の演習問題は予習用の部分はすでに見えますのでしっかり予習してください.

  7. 次回の予習範囲

    引き続き教科書のp.38まで予習をしてきてください.

    また,次週はテスト環境の予行演習を後半で行います.具体的な指示は授業中に行います.

  8. 宿題

    宿題についても当日ご案内します.ただし, 宿題の問題を見ることができるのは30日以降になりますので,注意してく ださい.


目次ページに戻る