情報科学演習
2016.11.21

Back to index page



  1. 本日の作業内容

  2. 小テスト

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

    なお,授業でも少しお話ししましたが,教科書の for 文の例題があまり良くないので,以下に基本的な例を2つ示しておきます.参考にしてください.

    main()
    {
    	int i;
    
    	for(i=1; i<=10; i++)
    		printf("%d\n", i);
    	
    	return(0);
    }
    

    上の例は1から10までの整数を1行に1つずつ表示するもの.次の例は,1行に全部表示するものです.

    main()
    {
    	int i;
    
    	for(i=1; i<=10; i++)
    		printf("%d ", i);
    	
    	printf("\n");
    	
    	return(0);
    }
    

  3. 前回の宿題の結果について

    1年生の方ではコンパイルエラーもなくていい感じなのですが,学生番号や氏名を記入しない,表示させない,という答案が多くなってきました.提出前によく確認するようにおねがいします.

    コンパイルエラー: b1545
    解答用紙不使用: b1552 b1560

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

        switch(num){
            case 0:
            printf(" Gu\n");
            break;
            
            case 1:
            printf(" Choki\n");
            break;
            
            case 2: 
            printf(" Pa\n");
            break;
        }
    

    上の例は結構見られたのですが,何度も言うように必ずどれか一つを実行するときには default を入れてください.if 文の場合なら else ですね.

            if(a==3)
                    printf("Gu\n");
            if(a==4)
                    printf("Choki\n");
            if(a==5)
                    printf("Pa\n");
    

    switch 文で書けと言ったのに,なぜ if ? しかも else 使ってないし.

            switch((b - a) % 3){
                    case 1:
                            if(a == 0){
                                    printf("You: Gu\n");
                                    printf("Computer: Choki\n");
                                    printf("Winner is You!\n");
                                    }
    

    switch 文と言いながら if

            c = (a - b  % 3);
    

    カッコをつける位置が間違っているので,正しい答えにならない例.他にもパターンがありましたが,何度かやってみればおかしいことに気づくはずなので,提出前にはきちんと確認しましょう.

            switch(you) {
                                            case 3:
                                                    printf("Gu\n");
                                                    break;
                                            case 4:
                                                    printf("Pa\n");
                                                    break;
                                            default:
                                                    printf("Choki\n");
                                                    break;
            }
    

    こんなにTABの幅を取らなくても.見づらいし,わかりにくいです.

    以下はインデントに関するものです.

    main()
    {
        srand((unsigned) time(NULL));
        
            
            int a= rand() % 3+3;
    

    相変わらず見られるもの.いい加減にコピペした後にTABを確認する癖をつけてほしいものです.あと,最後の return の位置がおかしいものもいくつか見られました.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
            main()
            {
            srand((unsigned) time(NULL));
    

    main は下げない,と,何度言ったらわかるのでしょうか,b1612!

  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. 複合演算子と初期化

      教科書のp.38にある複合演算子はこれから非常に重要なものになります.

      	a += 1;
      

      このような複合演算子は変数自身の値を変えて行くことができるので,繰り返しの中で順に値が変わっていく場合に重宝します.ただし,注意しないと行けないのは,初期化を行わないと正しく動作しない場合があることです.

      上の変数 a は値を1増やす処理となっていますが,元の値がそもそもなければ変なことになります.ですので,インクリメント演算子(複合演算子の特殊型)や複合演算子を使用する場合には,必ず変数の初期化を行ってください.

      ところが,困ったことに教室のCコンパイラは初期化されていない変数の値を勝手に0にする仕様となっています.便利なのは便利ですが,これに慣れてしまうと他のコンパイラを使用した場合に不定の値が入ってしまい,予想外の結果となりかねません.C言語は使用するコンピュータやOSによって動作が微妙に違っていますので,必ず初期化するようにしてください.

      初期化できているかどうか,不安な場合には以下のオプションをつけてコンパイルするとわかります.

      $ cc -Wuninitialized hoge.c

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

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


目次ページに戻る