情報科学演習
2011.05.30

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    • ぜったいやってはいけない処理

      やはり以下のような処理を考えた人が出てきました.これが,絶対やっちゃダメな処理です.

      	if(a == 10)
      		printf(" 2 5 10\n\n");
      	else if(a == 12)
      		printf(" 2 3 4 6 12\n\n");
      	else if(a == 14)
      		printf(" 2 7 14\n\n");
      	else if(a == 15)
      		printf(" 3 5 15\n\n");
      	else if(a == 16)
      		printf(" 2 4 8 16\n\n");
      	else if(a == 18)
      		printf(" 2 3 6 9 18\n\n");
      	else if(a == 20)
      		printf(" 2 4 5 10 20\n\n");
      	else
      		printf(" %d\n\n", a);
      

      何が悪いかと言うと,「約数を自分で探している」ことです.そんな面倒臭いこ とは「計算機にやらせる」のがプログラミングです.もし,問題が以下のような ものであったらどうするでしょうか?

      10桁の整数を乱数で発生させて,その約数を全て表示せよ

      上の処理でできますか?

      似たようなものに以下のものもありました.

          switch(a){
                      case 10:
                              printf("Number %d has following measures : 1 2 5 10\n",a);
                              break;
                      case 12:
                              printf("Number %d has following measures : 1 2 3 4 6 12\n",a);
                              break;
                      case 14:
                              printf("Number %d has following measures : 1 2 7 14\n",a);
                              break;
                      case 15:
                              printf("Number %d has following measures : 1 3 5 15\n",a);
                              break;
                      case 16:
                              printf("Number %d has following measures : 1 2 4 8 16\n",a);
                              break;
                      case 18:
                              printf("Number %d has following measures : 1 2 3 6 9 18\n",a);
                              break;
                      case 20:
                              printf("Number %d has following measures : 1 2 4 5 10 20\n",a);
                              break;
                      default:
                              printf("Number %d has following measures : 1 %d\n",a ,a);
                      }
      

      上記のような発想自体を忘れ去らない限り,この授業の単位の取得は難しくなり ますので,注意してください.

    • やめた方が望ましい処理

      以下のように工夫しているものもありました.が,これもこの問題限定の処理で すので,一般化できません.10桁の整数の約数には使用できませんので,歓迎で きません.

      		if(a % 2 == 0)
      				printf(" 2");
      		if(a % 3 == 0)
      				printf(" 3 %d", a / 3);
      		if(a % 4 == 0){
      				if(a / 4 == 4)
      						printf(" 4");
      				else if(a / 3 != 4)
      						printf(" 4 %d", a / 4);
      		}
      		if(a % 2 == 0)
      				printf(" %d", a / 2);
      
      		printf(" %d\n",a);
      

  3. 前回の復習

    switch 文を学習しましたが,前回も言ったようにこれ以後は使う必要 はありません.基本の if 文および else を使って条 件分岐をしっかり考えてください.

  4. for

    1. for 文の基本

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

    2. 仮変数

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

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

    3. 複合演算子

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

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

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

  5. 実習