情報科学演習
2015.11.26

Back to index page



  1. 本日の作業内容

  2. 小テスト

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

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

    今回もコンパイルエラーの答案がありました.なぜ,提出前に確認しないのでしょう?

    コンパイルエラーの答案 b1546 b1440

    以下はいつものように問題のあるプログラムの例です.参考にしてください.

                    int a = rand() % 30 + 1;
                    int b = rand() % 30 + 1;
                    int c = rand() % 30 + 1;
                    int d = rand() % 30 + 1;
                    int e = rand() % 30 + 1;
    

    題意を考えていない乱数の発生法ですね.

                    if(b<28){
                            b=rand()%(30-b)+(b+1);
                            printf("%d",c);
                                    if(c<29){
                                            b=rand()%(30-c)+(c+1);
                                            printf("%d",d);
                                                    if(d<30){
                                                            b=rand()%(30-d)+(d+1);
                                                            printf("%d",e);
                                                    }
    

    コピペするときに変数名を変えるのを忘れていますが,なぜ実行時に気づかないのでしょう?

                                    printf("Random numbers:      -- Sorry! Impossible to  print all.");
    

    printf の中に余計な文字列まで出力するように書いてあります.

    さて,相変わらずインデントの不適切なものが多く見られます.早めに確認の質問等を行って下さい.

    b1502 b1520 b1523 b1529 b1542 b1543 b1565 b1567 b1569 b1573 b1575 b1376 b1406 b1468 b1204 b1274

    また,今回もハイフンのラインの出力が無いものがありました.こちらも注意してください.

    b1415 b1418

  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. 宿題

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


目次ページに戻る