情報科学演習
2014.11.17

Back to index page



  1. 本日の作業内容

  2. 小テスト

    授業の最初に小テストを実施します.例によって,窓際の柱のある部分の席は使用しないで下さい.

  3. 11/11の宿題の結果について

    今回もコンパイルエラーはありませんでした.例年に無くよい傾向で安心しています.しかし,解答用紙に名前と番号を書かない人はまだいました.注意してください.

    b1414 b1340

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

            num = rand() % 29+1;
    

    これでは30日が出てきません.

            switch(a){
                    case 1: printf("The %dst of November is Saturday.\n\n",a);
                                            break;
                    case 2: printf("The %dnd of November is Sunday.\n\n",a);
                                            break;
                    case 3: printf("The %drd of November is Monday.\n\n",a);
                                            break;
                    case 4:
                    case 11:
                    case 18:
                    case 25:        printf("The %dth of November is Tuesday.\n\n",a);
                                            break;
                    case 5:
                    case 12:
                    case 19:
                    case 26:        printf("The %dth of November is Wednesday.\n\n",a);
                                            break;
                    case 6:
                    case 13:
                    case 20:
                    case 27:        printf("The %dth of November is Thursday.\n\n",a);
                                            break;
                    case 7:
                    case 14:
                    case 21:
                    case 28:        printf("The %dth of November is Friday.\n\n",a);
                                            break;
                    case 8:
                    case 15:
                    case 22:
                    case 29:        printf("The %dth of November is Saturday.\n\n",a);
                                            break;
                    case 9:
                    case 16:
                    case 23:
                    case 30:        printf("The %dth of November is Sunday.\n\n",a);
                                            break;
    
                    case 10:
                    case 17:
                    case 24:        printf("The %dth of November is Monday.\n\n",a);
                                            break;
    

    いきなりやっちゃだめな解答が出てきましたね.このような処理を今後は絶対に書かないで下さい.

                   if ( a == 1 || a == 8 || a == 15 || a == 22 || a == 29 )
                            printf("Saturday.");
                    else if ( a == 2 || a == 9 || a == 16 || a == 23 || a == 30 )
                            printf("Sunday.");
                    else if ( a == 3 || a == 10 || a == 17 || a == 24 )
                            printf("Monday.");
                    else if ( a == 4 || a == 11 || a == 18 || a == 25 )
                            printf("Tuesday.");
                    else if ( a == 5 || a == 12 || a == 19 || a == 26 )
                            printf("Wednesday.");
                    else if ( a == 6 || a == 13 || a == 20 || a == 27 )
                            printf("Thursday.");
                    else
                            printf("Friday.");
    

    これも同様ですね.こんなに面倒なことをするのならプログラミングする必要は無くなります.プログラミングの良いところは自動化です.

            printf("The 11th of November is ");
    

    今回も出てきました.決め打ち.何故?

            if(num == 1)
                    printf("%dst of November is Saturday.", num);
            else if(num == 2)
                    printf("%dnd of November is Sunday.", num);
            else if(num == 3)
                    printf("%drd of November is Monday.", num);
            else if(num % 7 == 0)
                    printf("%dth of November is Friday.", num);
            else if(num % 7 == 1)
                    printf("%dth of November is Saturday.", num);
            else if(num % 7 == 2)
                    printf("%dth of November is Sunday.", num);
            else if(num % 7 == 3)
                    printf("%dth of November is Monday.", num);
            else if(num % 7 == 4)
                    printf("%dth of November is Tuesday.", num);
            else if(num % 7 == 5)
                    printf("%dth of November is Wednesday.", num);
            else if(num % 7 == 6)
                    printf("%dth of November is Thursday.", num);
            else
                    printf("%dth of November is Friday.", num);
    

    よくこんな面倒なことを思い付きますね.不思議です.

            if(num1==2||num1==9||num1==16||num1==23||num1==30)
            printf("Sunday.");
            else if(num1==3||num1==10||num1==17||num1==24)
            printf("Monday");
            else if(num1==4||num1==11||num1==18||num1==25)
            printf("Tuesday.");
            else if(num1==5||num1==12||num1==19||num1==26)
            printf("Wednesday.");
            else if(num1==6||num1==13||num1==20||num1==27)
            printf("Thursday.");
            else if(num1==7||num1==14||num1==21||num1==28)
            printf("Friday.");
            else
            printf("Saturday");
    

    インデントがおかしい上に面倒なことを自分でやっています.面倒なことは計算機にやらせましょう.

            if(n%10==1)
                    if(n==11)
                            printf("11th");
                    else
                            printf("%dst",n);
    

    2重の if 文は必要ないですね.

            num = rand() % 30 + 49;
            num2 = num % 7 + 49;
    
            printf("The %d",num-48);
    
            switch(num){
                    case '1': printf("st");
                            break;
                    case '2': printf("nd");
                            break;
                    case '3': printf("rd");
                            break;
    
                    default: printf("th");
            }
    

    なぜ49を足すのか?なぜ定数式が文字型なのか?さっぱりわかりませんし,接尾辞の方も間違っていますし.

            switch(b){
                    case 2: printf("Sunday.\n");
                            break;
                    case 3: printf("Monday.\n");
                            break;
                    case 4: printf("Tuesday.\n");
                            break;
                    case 5: printf("Wednesday.\n");
                            break;
                    case 6: printf("Thursday.\n");
                            break;
                    case 0: printf("Friday.\n");
                            break;
                    case 1: printf("Saturday\n");
                            break;
            }
    

    default を使いましょう.

            if(b == 0)
                    printf("Friday.");
            if(b == 1)
                    printf("Saturday.");
            if(b == 2)
                    printf("Sunday.");
            if(b == 3)
                    printf("Monday.");
            if(b == 4)
                    printf("Tuesday.");
            if(b == 5)
                    printf("Wednesday.");
            if(b == 6)
                    printf("Thursday.");
    

    どれか一つを必ず実行する場合には,if else 文で書いてください.

            b = a % 10;
            d = a / 10;
    

    変数 d って?

            switch(a){
                    case 1: printf("st");
                                            break;
                    case 2: printf("nd");
                                            break;
                    case 3: printf("rd");
                                            break;
                    default:        printf("th");
                                            break;
            }
    

    英語の勉強やり直し.

    以下はインデントのおかしいものです.注意してください.

            if(a%10==1 && a!=11)
                    printf("%dst ", a);
            else if(a%10==2 && a!=12)
            printf("%dnd ", a);
            else if(a%10==3 && a!=13)
            printf("%drd ", a);
            else
                    printf("%dth ", a);
    

    字下げが変ですね.下がったり,下がらなかったり.

            return(0);
            }
    

    今回も何人かに見られました.最後まで気を抜かずに.

            return(0);
      }
    

    これも最後の閉じ括弧の位置が変です.8番.

            default:
            printf(" of November is flyday\n");
            break;
    
    }
       printf("-----------------------------\n");
    
    
       return(0);
    }
    

    括弧の位置が変.

         else
             printf(" %dth", a);
    
    
          switch(b){
           case      1:
                     printf(" of November is Saturday");
                       break;
    
           case      2:
                     printf(" of November is Sunday");
                     break;
    
           case      3:
                     printf(" of November is Monday");
                     break;
    
           case      4:
                     printf(" of November is Tuesday");
                     break;
    
            case     5:
    

    スペースを入れるのでは無く,TABで字下げしてください.このように気ままな字下げは止めましょう.

        printf("-----------------------\n\n");
    
         return(0);
    }
    

    これも何で気づかないのでしょうか?

        srand((unsigned) time(NULL));
    
        int date, day;
    
        printf("My student number: s144043\n\n");
    
            date = rand() % 30 + 1;
            day = date%7;
    

    番号つきで出してます.注意してください.

  4. 前回の復習

    switch 文を学習しました.switch 文では if else 文の else と同様に default を必ず付けましょう.

  5. for

    1. for 文の基本

      for 文は教科書p.39の図4.2の下にあるような形式で使用します.式1から式3までは初期値,実行条件(この式の値が「真」であれば処理を実行),増分を表します.これらは必要に応じて処理のために使用するので,必ずしも書かなくてはいけないものではありません.ここが空欄であれば,教科書p.40にあるような無限ループになります.

      今後万一無限ループを作ってしまってプログラムが終わらない場合には,「コントロールキーとCのキー」を同時に押して処理を停止してください.Ctrl+Cと覚えておいてください.

      教科書に出ているCtrl+ZはWindowsにおける強制終了です.

    2. 仮変数

      for 文の式1から式3までの設定では変数 i がよく使用されます.これは整数(Integer)の頭文字を取ったものです.for 文ではこのように i を使用しますので,他の場所で i を使用する場合には注意が必要です.ただし,複数の for 文が一つのプログラム中にあってもこの変数(仮変数)は i のままで構いません.ですので,変数 i が重複して何度も出てくるようなプログラム,例えば,

      	for(i=0; i<=5; i++)
      		printf("hoge\n");
      	
      	for(i=10; i>=0; i--)
      		printf("hoge\n");
      	
      	for(i=0; i<=100; i++)
      		printf("hoge\n");
      

      でもエラーにはなりませんし,まずいプログラムでもありません.これで真っ当な書き方です.

      次回以降で扱う多重のループの場合には変数は使い分ける必要があります.その 際にはアルファベットの順番で i, j, k, l, m, ... などがよく使用 されます。

    3. 複合演算子

      教科書p.38で紹介されている複合演算子は非常に重要です.以後,頻繁に使用さ れる予定です.変数の値を変更する際に利用されますので,よく理解しておいて ください.本日の実習でも使用します.また,略号の方がよく使用されますので, そちらも注意してください.

      • 複合演算子の基本

        変数自身の値を変えることが出来るので,教科書の和の例のように積算を取るこ とが可能です.例えば,

        	a = 1;
        	
        	if(hoge)
        		a = 3;
        	
        	if(hoge)
        		a = 5;
        		
        		…
        

        のように条件が満たされる度に変数 a の値を2ずつ増やしたいときには,

        	a = 1;
        	
        	for(i=0; i<=10; i++)
        		if(hoge)
        			a += 2;
        

        のようにすれば良いということになります.

    4. インクリメント演算子

      教科書のp.39に出てくるインクリメント演算子(とデクリメント演算子)も非常に 重要です.変数の値を1増やす,もしくは,1減らすという処理ですので,こちら も頻繁に使用します.

      応用例としては「カウンタ」があります.例えば,さいころを複数回振る作業で, 1の目が何回出てきたかを数えるような処理のときに変数の値を1ずつ増やせるこ の演算子は効果的です.

      ときどき for 文の式3を以下のように書く人がいるのですが,これは環境によっては無限ループになるので,絶対に止めてください.

      	for(i=0; i<=5; i=i++)
      
    5. break

      教科書では無限ループから抜け出すのに,if 文と break の 組合せの例が出ていますが,この授業では基本的に break は使用しま せん.教科書p.39の for 文の説明にある「式2」を工夫することによっ て,面白い for 文の抜け出し方が実現できますので,それを練習する ことにします.

  6. 実習

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

  7. 次回の予習範囲

    教科書のp.48の例題4.8を予習してきてください.ただし,4行目でインクルード されている conio.h というヘッダファイルは教室の環境には無いので 使えません.これは10行目の clrscr() (クリアスクリーン)を使うた めのものなので,この行を削除すれば conio.h をインクルードしなく ても大丈夫です.

    また,例題4.8のやり方に固執すると今後のプログラミングに支障が出ますので,よりこの授業に合ったやり方を以下に紹介します.こちらについても理解をお願いします.

    #include <stdio.h>
    
    main()
    {
    	int i, j;
    	
    	for(i=-5; i<=5; i++){
    		for(j=0; j<=i*i-1; j++)
    			printf(" ");
    		
    		printf("*\n");
    	}
    
    	return(0);
    }
    

    また,次のような方法もあります.

    
    #include <stdio.h>
    
    main()
    {
    	int i, j;
    	
    	for(i=-5; i<=5; i++){
    		for(j=0; j<=25; j++)
    			if(j==i*i)
    				printf("*");
    			else
    				printf(" ");
    				
    		printf("\n");
    	}
    
    	return(0);
    }
    

    最後の方法がわかると期末試験等で楽にプログラミングできるはずです.

  8. 宿題

    授業の終わりに宿題の案内をします.ただ し,問題を見ることができるのは19日以降です.


目次ページに戻る