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

Back to index page



  1. 本日の作業内容

  2. 小テストについて

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

  3. 宿題の結果について

    今回の提出では残念ながら無限ループのプログラムが出てきました.他にも解答用紙を使用していないものも久しぶりに出てきました.残念ですが,採点の対象外ですので,以後は注意してください.

    無限ループ: b1605 b1669 b1671

    解答用紙不使用: b1606

    また,例によって,インデント(字下げ)の不備が多く見られました.こちらも,どこが間違っているのかわからない場合は質問してください.もったいない減点を防止しましょう.

    インデントの不備: b1603 b1612 b1622 b1644 b1659 b1287 b1416 b1449 b1556 b1563 program4

    以下は例によって気になるプログラムや間違っているものの例です.参考にしてください.

            n = rand()%27-1;
    

    乱数の範囲が間違っています.これでは27種類出てきてしまうので,変なものを出す可能性があります.

            while(i<=2){
                    int num=rand()%25+97;
                    
                    printf("%c",num);
                    
                    if (num==97)
                    
                            printf(" %c \\\\ ");
                            
                    if(num==97)
                            
                            i++;
                            
                    }
    

    こちらは変な部分が盛りだくさんの例です.まず,乱数の範囲が間違っています.次に2つに if 文を分けていますが,意味がありません.一つにまとめましょう.また,バックスラッシュを表示させる printf 文の二重引用符の中に %c が入ってしまっているので,変なものが出てきます.他にもあったのですが,文字を表示させるときには確認のために less に処理を渡すことが大事です.これは文字列配列が出てきた時に改めて説明しますが,以下のようにすると,変なものが入っているかどうかがわかります.

    $ ./a.out | less

    ページャである less を抜けるためにはキーボードのQのキーを押します.

                           printf(" \\\\ ", al);
    

    こちらも printf 文の中に不要な変数が指定されています.

            while(i<=2){
                    num = rand() % 26 + 97;
    
                    if(num == 97){
                            i++;
                            printf("%c \\\\ ", num);
                    }
    
                    else{
                            printf("%c", num);
                    }
            }
    

    if else で処理する必要は無いはずですが,結構いました.

            i = 1;
            while(count<2){
                    num = rand() % 26 + 97;
                    printf("%c", num);
                    if(num == 97){
                            printf(" \\\\ ");
                            count++;
                    }
                    i++;
            }
    

    変数 i は何のため?

            while(j<3){
                    while(i>97){
                            num =rand()%26+97;
                            printf("%c",num);
                            i=num;
                    }
                    printf(" \\\\ ");
                    i=122;
                    j++;
            }
    

    なぜ二重の while 文?

            int i, a;
            
            printf("My student number: s164075\n\n");
            
            while(i>=97){
                    a = (rand () % 26 + 97);
                    printf("%c", a);
                    
                    if(a==97){
                            printf(" \\\\");
                            break;
                    }       
            }
            while(i>=97){
                    a = (rand () % 26 + 97);
                    printf("%c", a);
                    
                    if(a==97){
                            printf(" \\\\\n");
                            break;
                            }
            }
    

    a が100回出てきたら終了するプログラムだったらどうします?

            i = 0;
            while(i < 2){
                    num = rand() % 25;
                    switch(num){
                            case 0:
                                    printf("a \\\\ ");
                                    i++;
                                    break;
                            case 1:
                                    printf("b");
                                    break;
                            case 2:
                                    printf("c");
                                    break;
                            case 3:
                                    printf("d");
                                    break;
                            case 4:
                                    printf("e");
                                    break;
                            case 5:
                                    printf("f");
                                    break;
                            case 6:
                                    printf("g");
                                    break;
                            case 7:
                                    printf("h");
                                    break;
                            case 8:
                                    printf("i");
                                    break;
                            case 9:
                                    printf("j");
                                    break;
                            case 10:
                                    printf("k");
                                    break;
                            case 11:
                                    printf("l");
                                    break;
                            case 12:
                                    printf("m");
                                    break;
                            case 13:
                                    printf("n");
                                    break;
                            case 14:
                                    printf("o");
                                    break;
                            case 15:
                                    printf("p");
                                    break;
                            case 16:
                                    printf("q");
                                    break;
                            case 17:
                                    printf("r");
                                    break;
                            case 18:
                                    printf("s");
                                    break;
                            case 19:
                                    printf("t");
    		                        break;
                            case 20:
                                    printf("u");
                                    break;
                            case 21:
                                    printf("v");
                                    break;
                            case 22:
                                    printf("w");
                                    break;
                            case 23:
                                    printf("x");
                                    break;
                            case 24:
                                    printf("y");
                                    break;
                            case 25:
                                    printf("z");
                                    break;
                    }
            }
    

    ぜったいにやっちゃダメ!なプログラムです.

            for(i=1;i<=2;i++){
            while(a != 98){
            a=rand()%26 +97;
            printf("%c ",a);
            a++;
            }
            if(a=97)
                    printf("\\\\");
            }
    

    なぜ for 文?インデントもぼろぼろで,しかも break 使ってるし...

    
                    if(count=2){
                            break;
    

    if 文の式がおかしいので,必ず break するけど,何か?

            while(i<100){
                    a = rand() % 26 + 97;
                    printf("%c",a);
                    if(a==97){
                            printf(" %c%c ",92,92); 
                            count++;
                    }
                    if(count==2){
                            break;
                    }
            }
    

    変数 i は何のため?あと,バックスラッシュは簡単に出せますが?

  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/21(水)で終わりです.来年最初の授業は1/11(水)ですので注意してください.また,メンター学習室はその週には無いかもしれませんので,そちらもご注意ください.


目次ページに戻る