Lecture 5 関数

Assingment 5(第5回の宿題)

以下の問それぞれに対応するプログラムを作成し,課題提出の手順に則ってOh-o! Meijiの対応するレポート提出場所に提出しなさい.


    1. 以下のサンプルコードのように,しきい値60以上であれば合格, それ未満であれば不合格となるように判定する関数 eval() を作って下さい. プログラム名を,学籍番号10桁-05-1.cppとする.

      【ヒント】

      // 年組番号 明治太郎
      // eval.cpp
      const int THRESHOLD = 60; 
      
      int eval(int point)
      {
          ...
      }
      
      #if defined(TEST)
      #include ...
      int main(void)
      {
          int test_result = 0;
      
          printf("テストの点数:"); 
          scanf("%d", &test_result);
          
          if(eval(test_result)){
              printf("テストの結果は「合格」です.\n");
          }else{
              printf("テストの結果は「不合格」です.\n");
          }   
      }
      #endif
      

      コード例 A5-1 eval.cpp

      コード例 A5-1 eval.h




    2. 直角三角形の短辺2つの長さ(a,b)を入力すると,長辺の長さ(c)を返す関数を作りましょう. a,bの値はそれぞれキーボードから入力します, プログラム名を,学籍番号10桁-05-2.cppとする.
      【ヒント】関数の中では計算処理だけを行います.
      【ヒント】main関数では,関数を呼び出す前処理や結果の表示だけ行います.
      【ヒント】2乗根の計算は,sqrt() を用います.使うには math.h が必要です.
      【ヒント】コンパイル,実行まで出来たら既知の値を入れてみてプログラムが正しいかどうか確認します(評価テスト).下の例ではテストコードを挿入しています.

      【ヒント】

      // 年組番号 明治太郎
      // the Pythagorean theorem
      #include <math.h>
      
      float pythagorean(...)
      {
          ...
      }
      
      #if defined(TEST)  // テストコード(プログラムの品質検査用コード)
      #include <stdio.h>
      int main(void)
      {
          for(float a=3; a<10; a+=2){
              for(float b=4; b<10; b+=3){
                  float c = pythagorean(a, b);
                  printf("a=%5g, b=%5g, c=%10g¥n", a,b,c);
              }
          }
      }
      #endif
      

      コード例 A5-2 pythagorean.cpp

      コード例 A5-2 pythagorean.h




    3. QUIZの5番目の問題は,1から3までの3個の2乗和を求めました. このプログラムを改良して,1からNまでの2乗和を求めるプログラムにしてください. このとき,Nの値は,scanf()関数でキーボードから与えられるようにしてください.
      プログラム名を,学籍番号10桁-05-3.cppとする.

      【ヒント】例えば以下の様にしてfor文を使います

      // 年組番号 明治太郎
      // 自乗和
      int jijo(int x)
      {
          ...
      }
      
      int jijo_wa(int n)
      {
          ...
      }
      
      #if defined(TEST)
      #include <stdio.h>
      int main(void)
      {
          int n = 0;
      	while(n<=0){
              printf("n:");
              scanf("%d",&n);
          }
          int sum = jijo_wa(n);
          printf("sum(n^2) = %d¥n", sum);
      }
      #endif
      


      コード例 A5-3 jijo_wa_n.cpp

      コード例 A5-3 jijo_wa_n.h




    4. 速度0で静止しているロケットに点火してロケットを打ち上げます.ロケットの質量をm,推力が F で一定だとしたとき, 打ち上げから時間t秒後の速度v(t)を求める関数を作って下さい.引数はm,F,tで,戻り値がv(t)です.
      プログラム名を,学籍番号10桁-05-4.cppとする.
      【ヒント】m, F はキーボードから入力して下さい.
      【ヒント】打ち上げる場所は地球ではなくて,空気の無い軌道上です.空気抵抗は考えなくて結構です. 皆さんが知っている公式(あるいは積分した式)v=at+v0を使って構いません.

      【ヒント】2つのテストコードで動作チェックをしてください

      // 年組番号 明治太郎
      // Rocket launch
      #include <math.h>
      
      float estimate_v(...
      {
          ...
      }
      
      #if defined(TEST)  // テストコード(プログラムの品質検査用コード)
      #include <stdio.h>
      int main(void)
      {
          const float m = 10.0;   // [kg]
          const float F = 100.0;  // [N]
          float t = 60;
      
          float v = estimate_v(m,F,t);
          printf("v(%g) = %g [m/s]\n", t, v);
      }
      
      #elif defined(TEST2) // テストコード2(プログラムの品質検査用コード)
      #include <stdio.h>
      int main(void)
      {
          const float m = 10.0;   // [kg]
          const float F = 100.0;  // [N]
          float t_end = 60;
          float dt = 0.1;
      
          float t = 0;
          float v = 0;
          while(1){
              printf("v(%.1f) = %7.1f [m/s]\n", t, v);
              v += estimate_v(m,F,dt);
              t += dt;
              if(t>=t_end)    break;
          }
      }
      #endif
      

      コード例 A5-4 rocket.cpp

      コード例 A5-4 rocket.h




    5. 関数f(x)=sin(x^2)の数値積分を実行するプログラムを作成してください. なお,積分は最も単純な長方形近似で計算して良いです. プログラム名を,学籍番号10桁-05-5.cppとする.
      // 年組番号 明治太郎
      #include ...
      double function(double x)
      {
          return sin(x*x);
      }
      
      double integrate(...)
      {
          ...
      }
      
      #if defined(TEST)  // テストコード(プログラムの品質検査用コード)
      #include <stdio.h>
      int main(void){ 
      int main(void){ 
          const double dx = 0.00001;
          const double x1=1.0, x2=2.0, x3=3.0, x4=4.0, x5=5.0, x6=6.0; 
          
          printf("%.1lfから%.1lfまでの積分値は%8.4lfです.\n",x1,x2,integrate(x1,x2,dx)); 
          printf("%.1lfから%.1lfまでの積分値は%8.4lfです.\n",x3,x4,integrate(x3,x4,dx)); 
          printf("%.1lfから%.1lfまでの積分値は%8.4lfです.\n",x5,x6,integrate(x5,x6,dx)); 
          
          return 0;  
      } 
      #endif
      

      //実行結果 
      1.0から2.0までの積分値は  0.4945です. 
      3.0から4.0までの積分値は -0.0264です. 
      5.0から6.0までの積分値は  0.1105です.
      

      コード例 A5-5 integrate.cpp

      コード例 A5-5 integrate.h


課題提出

作成したプログラム(ソースコード(*.cpp)の部分だけです)をOh-o! Meijiシステムのレポート提出場所に提出する. 提出するすべてのファイルには,年組番号 氏名を記入すること.

【注意】すべてのファイル名は半角のみで構成すること.
【注意】提出時のファイル名命名規則を守らないと採点されないことがあるので注意すること.