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

Back to index page



  1. 本日の作業内容

  2. 小テストについて

    授業の最初に配列に関する小テストを実施します.いつものように柱のところの席は使用しないで下さい.

  3. 宿題の結果について

    今回は久しぶりに大馬鹿野郎が出てきました.困ったものです.

    b1675 b1678

    さて,コンパイルエラーと無限ループも出てきてしまいました.こちらも提出前にわかることなので,出さないようにしてください.

    コンパイルエラー: b1705
    無限ループ: b1663

    変数の初期化を行っていないことによる誤動作も見られました.何度も言いますが,教室のありがた迷惑な仕様として「初期化していない変数に勝手に0を代入する」というのがあります.見た目にはわかりにくいので,要注意です.変数の初期化には十分注意してください.

    初期化が無いために誤動作するもの: b1701 b1740 b1521 b1523 b1638 b1678

    学生番号の間違いや解答用紙に氏名などを記入しないもの,さらにはインデント(字下げ)のおかしいものなども相変わらず出てきています.

    学生番号の出力間違い: b1737
    解答用紙に番号と名前無し: b1512
    インデントに問題: b1710 b1736 b1738 b1746 b1749 b1461 b1512 b1601

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

                    j = rand()%1000+100;
    

    所望の乱数を得るための剰余算の間違いがなかなかなくなりません.

            i = rand()% 11 + 10;
    

    上のものは間違ってはいないものの,以前にも言ったように変数 i とか j はこういうためには使わないのが慣例です.意味のある変数名を使用しましょう.

            printf("2-digit number: %d\n\n",a);
            while(b%a!=0){
    

    ここだけ見てもわかりにくいですが,このような変数の初期化を行わないものが多く見られました.

            while(b%a>0){
                    b=rand()%900+100;
                    printf("%d ", b);
                    b%a;
            }
    

    最後の b%a; は何でしょう?

            int stop = 0;
            while(stop!=0){
    

    初期化の間違いですね.変数 stop に0を代入したので,次の while ループの条件式は必ず偽になりますから,実行されません.

            for(i=0;i<1;){
    

    while 文の宿題のはずが...

            while(n!=1){
                    b = rand()%900 + 100;
                    printf("%d ",b);
                    
                    if(b%a==0){
                            c = b;
                            n++;
                    }
            }
    

    c = b; の意味は?

    Stopped: 24 is multiple of 168.
    

    きちんと英語の部分を読めばこんなことにはならないはずなのに...

  4. 前回の復習

    while 文を学習しました.実習では式の部分の理解がまだ不十分な人が見られました.式が真の時には処理を実行しますが,偽になるとループから抜けるという動作をよく理解しておいて下さい.

    	i = 1;
    	while(i>10){
    		printf("%d ", i);
    		
    		i++;
    	}
    

    上の例は変数 i の値が10になったら処理を止めるというつもりで,間違えたものです.初心者によく見られるミスの一つです.この場合,変数 i に初期値の1を代入しているので,while の後の式は偽になりますので,処理は実行されません.

  5. 1次元配列

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

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

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

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

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

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

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

    例えば,配列の要素の初期値を全部0にしたい場合などはよくあるのですが,以下のように簡単に出来ます.

    	int i, ary[100];
    	
    	for(i=0; i<=99; i++)
    		ary[i] = 0;
    

    配列では先頭の要素の添字は0です.これは便利な取り決めなのですが,いつまで経ってもわからない人がいますので,困ります.よく理解しておいてください.すなわち,要素が10個ある配列の各要素の添字は0から9までの10個です.

    また,教科書ではp.59ようやく出てくるのですが,int 型の配列を定義するには以下のようにすれば簡単にできます.重要なので,これだけはまず理解しておいてください.

    	int ary[5] = {1, 2, 3, 4, 5};
    

  6. 実習

    実習の演習問題はこちらです.

  7. 次回の予習範囲

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

  8. 宿題

    授業の最後に宿題の案内をします.

    今年のメンター学習室は12/20(水)で終わりです.来年最初の授業は1/15(月)ですので注意してください.また,メンター学習室は1/10(水)からの予定です.


目次ページに戻る