情報科学演習
2013.11.18

Back to index page



  1. 本日の作業内容

  2. 小テスト

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

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

    今回の宿題はなかなか難しい問題でした.ほとんどの人が期待した処理をしていませんでしたが,それもしかたないかもしれません.ポイントは,65, 66, 67, 68, 69, 97, 98, 99, 100, 101の10個の整数のどれか一つを乱数で発生させる処理です.考え方はまとめると以下のようになります.

    65 + 0 〜 4 のいずれかの整数 + 32 * 0 もしくは 1

    ということで,乱数を2つ使用することに気づくとできるものでした.

    提出の不備ですが,以下の3件です.

    コンパイルエラー b1341

    解答用紙不使用 b1174

    まったく関係の無いプログラム提出 b1317

    以下は例によって問題のある答案です.

            switch(num){
            case    'A':    printf("a\n");
                                            break;
            case    'B':    printf("b\n");
                                            break;
            case    'C':    printf("c\n");
                                            break;
            case    'D':    printf("d\n");
                                            break;
            case    'E':    printf("e\n");
                                            break;
    
            case    'a':    printf("A\n");
                                            break;
            case    'b':    printf("B\n");
                                            break;
            case    'c':    printf("C\n");
                                            break;
            case    'd':    printf("D\n");
                                            break;
            case    'e':    printf("E\n");
                                            break;
                            }
    

    これはいろんな問題がてんこもりのものですね.まず,インデントがおかしいです.次に,必ず何かの結果を出力しないといけないのに default を使っていません.そして,処理は簡潔にまとめられるのに全部書いています.なるべく簡潔にわかりやすいコードを書きましょう.

        int a = rand() % 5 +65,b = rand() % 2 * 32;
        int c = a + b;
    

    上のものは無駄に変数を使用していますね.変数は一つで十分です.

            n = rand() % 5 + 65, rand() % 5 + 97;
    

    カンマ以降は何の意味もありません.

                    switch(num){
                            case 65:
                            case 66:
                            case 67:
                            case 68:
                            case 69:printf("%c -> %c\n\n",num,num+32);
                                            break;
                            case 70:
                            case 71:
                            case 72:
                            case 73:
                            case 74:printf("%c -> %c\n\n",num+27,num-5);
                                            break;
    

    インデントもおかしいですが,これは,題意の「アルファベットのABCDEabcdeの10文字のどれか一つを文字コード表を利用して乱数により発生させます」を満足していません.

    以下はインデントのおかしな例です.

    main()
    {
        srand((unsigned) time(NULL));
    
            char asc;
            asc = rand()%5 + 65 + rand()%2*32;
    
            printf("%c -> ",asc);
            switch(asc){
            case 'A':
    

    srand の行とchar の行がずれているのは変ですし,switch 文の case も下がっていません.

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

    毎回これも指摘していますが,まだ気づいていない人が結構います.実際に自分のプログラムでprintf の前と return の前のカーソルの移動の様子を見てください.それで違いがあれば間違っています.見ただけでは分からない間違いです.

  4. 前回の復習

    実習課題のiii.では,やたらとたくさん条件を設定する人が散見されました.このような場合ではまず規則性を見つけることから始めてください.安打表のように2次元に表示されている場合には1次関数(直線の式)で整理できることを活用してください.その場合,左上が座標原点で,下方向にx軸,右方向にy軸と考えると今後の作業にも役立ちます.

  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ずつ増やせるこ の演算子は効果的です.

    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日以降です.


目次ページに戻る