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

Back to index page



  1. 本日の作業内容

  2. 小テスト

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

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

  3. 宿題について

    残念ながら今回も採点対象外の解答が出てしまいました.該当者もそれ以外の人も今後とも注意してください.

    コンパイルエラー: program3 (全角スペースが紛れ込んでいます)
    解答用紙不使用: b1604

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

             unsigned int a = 1 + ( 2 * rand() % 5 );
    

    unsigned がついていると,変な結果になることがあります.

            printf("Odd number: %d\n",(rand() % 5 + 1 ) * 2 - 1);
    

    なぜ,わざわざ面倒くさい方法を取るのでしょうかねえ?乱数の発生がきちんとわかっていれば, + 1 が不要なことがわかるはずですが.

            a = rand() % 5 + 0;
    

    こちらもなぜわざわざ + 0 をするのでしょうか?

            m = (rand()%6)*2-1;
    

    必要な乱数は5種類なので,間違っています.

            if(a % 2 == 1)
                    printf("%d",a);
            if(a % 2 == 0)
                    printf("%d",a + 1);
    

    奇数が一般的に 2n+1 (nは整数)と表されることは基本的な知識ですね.

            int num1 =
    

    エラーにはならないのですが,このような残骸が残っているプログラムはダメです.

    以下はプログラムの処理というよりも見た目の問題です.まずは,スペースの代わりにTABが入っている人がいました.非常に見づらいですし,結果も見づらくなりますので,注意してください.

    #include        <stdio.h>
    #include        <stdlib.h>
    #include        <time.h>
    
    main()
    {
                    srand((unsigned)        time(NULL));
    
                    int     num     =       rand()  %       5*2+1;
    
                    printf("\n");
    

    以下は,インデント(字下げ)の不備の答案の例です.

    main()
    
    {
    
        srand((unsigned) time(NULL));
    
            int num = rand() % 5 + 1;
    

    前回も説明しましたが,スペースとTABが混在していると,このようになっていること自体に気づかない恐れがあります.必ず,TABであることを確認しましょう.Webテキストから貼り付けるとこのようになることがあります.

    /* ************************************************** */
    /*                                                    */
    /*      この行以降に解答のプログラムを書くこと        */
            
            #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
    
    main()
    {
    
            srand((unsigned) time(NULL));
      
        int a;
    

    上の例も前回説明しました.中括弧 { } で囲まれた範囲がブロックとなり,ブロック単位で字下げを行います.main() よりも前は字下げの範囲に入りません.教科書をよく見てください.

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

    main() は下がりません!

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

    最後の return まで気を抜かないこと.

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

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

    レポート提出システムを利用します.なお,今週の3日(木)の祝日は大学が終日停電となります.宿題はできないと思いますので,当てにしないで平日に行うようにしましょう.

  10. メンター学習室

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


目次ページに戻る