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

Back to index page



  1. 本日の作業内容

  2. 小テスト

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

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

  3. 宿題について

    今のところコンパイルエラーなどは無いので少し安心していますが,よくない答案は結構出てきております.以下に例をいくつか示しておきますので,参考にしてください.

            A = rand() % 90 + 10;
    

    変数名は小文字で始めるのが慣例です.他の言語では大文字で始めると変数では無く定数になる場合もありますので,C言語でもわかりやすくするために小文字で始めるようにしておきましょう.途中から大文字が入るのは構いません.

            float m = rand() % 89 + 10;
    
            int a = rand() % 99 + 1;
    
            float num = rand() % 100 + 10;
    

    上の3つはどれも乱数の発生が正しくありません.1つ目のやりかたでは99が出てきませんし,2番目は1〜9の一桁の数が出てきます.最後のは100〜109までの3桁の数が出てきます.

            int a = rand() %90 + 10;
            int b = rand() %90 + 10;
            double c;
            c = a / b;
    

    c という変数を double で定義しても,演算が整数型なので a / b の値は整数型になってしまいます.

            float m,n;
            printf("My student number: s154059\n\n");
            m=rand() % 90+10;
            n=rand() % 90+10;
    
            printf("Random numbers: m=%d, n=%d\n",m,n);
    

    float で変数を定義しても,printf の中で %d としているために正しい値が出力されません.

            printf("Quotient: m/n=%d\n");
    

    上のものは %d と出力文字に命令を書いていても,その部分に入れるべき変数などの値がありません.

    以下は書式や形式の不備です.減点になりますので,今後は注意してください.

    字下げ(インデント)のおかしいもの b1501 b1520 b1541 b1548 b1561 b1567 b1402 b1470 b1259 b1288
    最後にハイフンラインが無いもの b1505 b1523 b1543 bb1545 b1580 b1359 b1415 b1437 b1447
    解答用紙に学生番号と氏名が無いもの b1522 b1525 b1580 b1416 b1430
    出力結果に学生番号が無いもの b1580 b1437
    解答用紙の書式を使用していないもの b1390 (これは残念ながら0点)

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

    • printf

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

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

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

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

  10. メンター学習室

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


目次ページに戻る