プログラミング入門  情報科学演習
2017.10.23

Back to index page



  1. 本日の作業内容

  2. 小テスト

    最初に小テストを実施します.レポート提出システムを利用して行いますので,ログインして待っていて下さい.

    なお,小テストでは窓際の席で柱があるために飛び出している机の端末(合計6台)は使用しないで下さい.

  3. 宿題について

    今年度初めての宿題の提出でしたが,コンパイルエラーの答案がなかったことは大変うれしく思います.採点する方も助かりました.ただし,提出の不備については以下のようにかなりの数に達しましたので,今後は注意してください.それぞれ2点減点となっています.

    解答用紙への学生番号と名前の記入なし: b1756 b1768
    最後のハイフン無し:b1702 b1710 b1719 b1720 b1731 b1740 b1745 b1749 b1751 b1767 b1605 b1620 b1661 b1677 program1
    学生番号の出力なし: b1521 b1661

    ハイフンや学生番号が無いと採点の時に結構大変なので,きちんといれるようにしてください.

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

        int num = rand() % 89 + 10;
        int Num = rand() % 89 + 10;
    

    乱数を発生させるときに,最初は必ず上のような間違いをする人がいます.最後まで間違ったままの人もいますが,今回は少ないといえば少なかったかなと思いますが,早めに正しい方法に気づきましょう.

            int a = rand() % 91 + 9,b = rand() % 90 +10,c;
    

    なんで,ひとつ目と2つめが違うのか???

        printf("Obtained random number : %d%c%c%c%d\n",a, 'a' ,'n' ,'d',  b);
    

    なんかわざわざ難しい方法を選んでいるような.解答例を参考に次回からは普通にテキストを表示させましょう.

        printf("Random numbers: %dand%d\n", dice, a);  
    

    英語などの欧米の主要言語は「分かち書き」文化です.スペースが非常に重要な意味を持ちますので,気をつけてください.

    さて,ここからはインデント(字下げ)の不備の例です.今回もたくさんありました.直していきましょう.

    /*                                                    */
    /*                                                    */
      #include <stdio.h>                           
      #include <stdlib.h>                          
      #include <time.h> 
       
       main()
       {
          srand((unsigned) time(NULL));
          int num1 = rand() % 90 + 10;      
          int num2 = rand() % 90 + 10;
          int a = num1 * num2;
    

    行頭に不要なスペースがありますね.

    main()
    {
                    srand((unsigned)time(NULL));
    

    TABの数が多すぎます.

        int a = rand() % 90 + 10,
                     b = rand() % 90 + 10,
                     c = a * b;
    

    改行の意味がよくわかりません.

        printf("Product of them:  %d \n\n",a);
            printf("\n--------------------------------\n\n");
        return(0);
    }
    

    不揃いなのは気になりませんか?

            printf("Product of them: %d\n" , c);
    
        return(0);
    }
    

    よくあるパターンなんですが,Webテキストからコピペしたソースを使いまわすとこうなることがあります.TABかスペースかの見分けがつかないので,自分のところでは正常に見えることもあるので,必ずTABに直しておいてください.

            return(0);
            }
    

    自動インデントをつけているとこうなるのですが,最後は手動で閉じ中括弧の位置を修正してください.

    なお,今回インデントが良くないものは以下の方々でした.注意してください.インデントがよくわからない場合には質問してください.

    b1703 b1716 b1719 b1730 b1731 b1736 b1738 b1740 b1746 b1747 b1748 b1753 b1756 b1757 b1762 b1767 b1774 b1777 b1778 b1782 b1783 b1440 b1523 b1637

  4. 前回の復習

    四則演算と剰余を利用した乱数の発生について学習しました.四則演算では剰余が非常に大事であることを説明しましたが,今後も頻繁に登場するので早く使いこなせるようになってください.実習時に問題が見られた乱数と printf の使い方について以下にもう一度まとめておきます.

    • 乱数について

      C言語に標準で用意されている乱数を発生する関数 rand() ですが,これは整数型の数で扱える最大桁数のものが出ます.以下のような処理で確認してください.

      	int num;
      	num = rand();
      	
      	printf("%d\n", num);
      

      これでは扱いにくいので,例えばサイコロのように1から6までの整数というようなときには,その範囲の数に限定して発生させなければいけません.そのために,使用するのが剰余算です.6の剰余を利用することによって6種類の整数に限定して発生させることが可能です.

      	int num;
      	num = rand() % 6;
      	
      	printf("%d\n", num);
      

      ただし,それでは剰余は割り切れたときに0になってしまいますし,最大値は割る数よりも1だけ小さい数ですので,正の整数にするために加算をしておく必要があります.それが結局,例として紹介したものになっています.

      ですので,rand() を使用するときにはその後の剰余算と必ずセットになりますので,覚えておいてください.

      これから何度も出てくる2桁の正の整数,のような場合は,次のように考えてください.

      2桁の正の整数は10から99までです.剰余算では割り切れた場合の答えは0ですから,必ず10を最後に加えないといけません.一方,10を加えるということは,剰余算で出てくる答えは89までとなります.余りの最大値が89ということは,それよりも1だけ大きい数で割れば良いので,90で乱数を割ったあまりとなります.よって,以下のように記述することで2桁の正の整数全てが出てくる可能性のある変数が作れます.

      	int num = rand() % 90 + 10;
      
    • printf

      printf 文を使用すると表示したいテキスト(文字列)の中に変数の値を入れて表示することが可能です.もう一度,例をよく見て理解してください.

    • 変数の値の入れ替え

      2つの変数の値を入れ替えるためには,もう一つ変数が必要でした.以下のように一度どちらかの変数の値を第3の変数に代入しておいてから,書き換える処理をしないといけませんので,よく覚えておいてください.

      	int var1 = 1, var2 = 2, tmp;
      	
      	tmp = var1;
      	var1 = var2;
      	var2 = tmp;
      

  5. if

    今回からは「制御構造」というプログラミングの重要な要素を含む学習です.教 科書をよく読んでしっかり理解してください.以下に特に注意する点を挙げてお きます.

    • 処理の流れ

      前回までのプログラムでは,プログラムの1行目から順に処理を行って,最後に return(0); が来て,全ての処理を終わり,画面をプロンプトに 戻してくれていました.if のような制御構造が入ると,全ての 行を順番に実行するのではなく,場合によって実行するかしないか分かれ ることになります.必ず実行される行とそうでない行があることに注意し てください.それを分かりやすくするのが「フローチャート」です.

    • フローチャート

      教科書の図3.1からいわゆるフローチャートの紹介が始まっています.プログラ ムにおける処理の流れを表したもので,ややこしい処理もフローチャートで理解 するとわかりやすくなるので,今後は必要に応じて自分でも作るようにしてくだ さい.

    • 関係演算子

      大小関係を判断する演算子です.頻繁に使用しますので,覚えておいてください.

    • 等価演算子

      等しいか等しくないかを判断する演算子です.ここで,高い頻度で間違える可能 性があるのが「等しい」かを判断する == です.等号一つでは「代入」 なのですが,ときどき間違えますので,注意してください.例えば,以下のプロ グラムは動作がおかしくなります.

      #include <stdio.h>
      
      main()
      {
          int n = 1;
      
          if(n = 2)
              printf("n=2\n");
      
          return(0);
      }
      

    • ブロック

      教科書のp.24にブロックの紹介があります.if 文においては,if の中の処理が1行だけであるならばブロックを表す中括弧 { } は省略可能ですが,複数の処理が入ると中括弧が必須になります.ま た,ブロック内ではインデント(字下げ)を行ってください.

  6. else 処理

    if が出てくると,その条件式が真の場合に処理が行われることになります.式が偽の場合には何も起こりません.それだけでは簡潔な処理や必要な処理が作れないので,プログラミング言語には必ず else というものが用意されています.日本語で言うなら「そうでないならば」に相当します.

    else を使用するかどうかの基準は,必ず何かの処理を行なうかどうか,です.この後の実習で試してみましょう.

  7. 実習

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

  8. 次回の予習範囲

    教科書のp.33まで予習をしてきてください.特に,論理演算子のところは重要で すので,しっかり学習してください.

  9. 宿題

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

    レポート提出システムを利用します.

  10. メンター学習室

    内容も宿題も段々と難しくなっていきます.つまづく前にメンター学習室を活用して十分にプログラミング練習をしましょう.開設時間は水曜日の14:30-16:00です.


目次ページに戻る