【演習の注意事項】を良く読んで解答してください
【主な内容】・プロトタイプ宣言 |
以下の3つのレベル(初級レベル, 中級レベル, 上級レベル)の全ての 課題に解答しなさい。各々の課題毎にファイルを作成しなさい。
課題はテキスト(文書)ファイルで提出するものと C言語のプログラムファイルで提出するものがあります。 前者は".txt"、後者は".c" という拡張子をつけて下さい。 各課題にはファイル名が指定してあるので、その指示にしたがって下さい。
なお、実行例やコマンドなどで赤色の字は キーボードから入力したもの、 深緑の字はコンピュータからの表示を示しています。 また、%はプロンプト(皆さんの環境では std1ss1{s1160000}1:等に相当する) を示しており、皆さんが入力するのはその次の文字からになります。
講義資料(ハンドアウト)の例題 lec10-1.c, lec10-1b.c, lec10-2.c, lec10-3.c, lec10-4a.c, lec10-4b.c, lec10-4c.c, lec10-5.c のソースプログラムをコピーし、そのプログラムの動作を予測した上で、コンパイル・実行を試してみなさい。
コピーの方法: % cd ~/Prog0/Ex10 % cp /home/course/prog0/public_html/2008/lec/source/lec10-*.c .
#include <stdio.h> ____ triple( ____ ); main() { float x = 2.0; printf("x:%f, x*x*x: %f\n", x, triple( x ) ); } float triple( float x ) { return x*x*x; }
#include <stdio.h> double triple( ____ ); main() { double t, x = 2.0; t = triple( x ); printf("x:%f, x*x*x: %f\n", x, t ); } double triple( ____ x ) { return x*x*x; }
3 5 2 4.6 3.2 6.7 5.2 8 3 x x 5
#include <stdio.h> main() { int a, b, value; printf(" a, b を入力して下さい> "); value = scanf("%d%d", &a, &b ); printf("scanf の値は: %d (a:%d, b:%d)\n", value, a, b ); }
補足:scanf()の戻り値は
・正常に読み込まれた数を返す。例えば
scanf("%d%d",&i, &j)
の場合、通常
0(全く読めなかった)
1(1個だけ正常に読めた)
2(2個とも正常に読めた)
のどれかが返ります。
・コントロール + d が押された場合やファイルの終端の場合
は特別に -1 (マクロ定義された EOFの値)が返ります
(ハンドアウトlec10-16ページ参照)
#include <stdio.h> #define PI 3.141592 int cirarea_r4(float); main() { float x; float menseki; printf("円の半径を入力して下さい "); scanf("%f",&x); menseki=cirarea_r4(x); printf("半径%fの円の面積は%fです\n",x, menseki); } int cirarea_r4(float r) { r=PI*r*r; r=(int)(r*1000+0.5)/1000; }
華氏温度から摂氏温度への変換式:
c = 5 * (f - 32) / 9
ただし、華氏温度 f, 摂氏温度 c とします。
また、浮動小数点型で計算すること。
[実行例] % ./a.out 華氏(°F) 摂氏(°C) 0 -17.777779 5 -15.000000 10 -12.222222 15 -9.444445 ..... 90 32.222221 95 35.000000 100 37.777779
[実行例] % ./a.out 3 の 0 乗は 1 です 3 の 1 乗は 3 です 3 の 2 乗は 9 です 3 の 3 乗は 27 です 3 の 4 乗は 81 です 3 の 5 乗は 243 です 3 の 6 乗は 729 です 3 の 7 乗は 2187 です 3 の 8 乗は 6561 です 3 の 9 乗は 19683 です 3 の 10 乗は 59049 です
注意)p(べき乗) が大きすぎるとオーバーフローが 発生して計算できなくなります。
[実行例] % ./a.out 正の実数 a の n 乗根を求めます。 a, n を入力して下さい: 2.0 2 x fx dfx 1.500000 2.000000 4.000000 1.416667 0.250000 3.000000 1.414216 0.006944 2.833333 1.414214 0.000006 2.828431 2.000000 の 2 乗根は 1.414214 % ./a.out 正の実数 a の n 乗根を求めます。 a, n を入力して下さい: 16.0 4 x fx dfx 12.000977 65520.000000 16384.000000 9.003047 20726.750000 6913.687500 6.757767 6553.889648 2918.962646 5.081286 2069.512451 1234.438843 3.841454 650.645142 524.784546 2.951653 201.762115 226.749710 2.369287 59.903343 102.862167 2.077716 15.511642 53.200199 2.004253 2.635670 35.877216 2.000014 0.136520 32.204563 2.000000 0.000435 32.000652 16.000000 の 4 乗根は 2.000000
[動作確認用計算例] 0!=1, 1!=1, 2!=2, 3!=6, 4!=24, 5!=120, 6!=720, 7!=5040, …
注意)n が大きすぎるとオーバーフローが 発生して計算できなくなります。
なお、eの級数は以下のように求められ、
e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ... +1/n! + ...
答えは 2.7182…になります。
#include <stdio.h> #include <math.h> float func(float); float simpson(float, float); float integrate(float, float, int); main() { int i; float result; for(i = 100; i <= 3000; i += 100) { result = integrate(0.0, 1.0, i); printf("%4i分割 答え %10.8f (%10.8f)\n", i, result, 4.0*result); } } float func(float x) { return sqrt(1.0-x*x); } float simpson(float a, float b) { /* Simpsonの式の計算 */ } float integrate(float p, float q, int n) { /* 区間[p, q]をn分割して積分をする */ }このプログラムでは関数を三つ定義しています。
[実行例] % gcc ex10c4.c -lm % ./a.out 100分割 答え 0.78535742 (3.14142966) 200分割 答え 0.78538370 (3.14153481) 300分割 答え 0.78539044 (3.14156175) 400分割 答え 0.78539336 (3.14157343) 500分割 答え 0.78539455 (3.14157820) 600分割 答え 0.78539550 (3.14158201) 700分割 答え 0.78539592 (3.14158368) 800分割 答え 0.78539634 (3.14158535) 900分割 答え 0.78539681 (3.14158726) 1000分割 答え 0.78539586 (3.14158344) 1100分割 答え 0.78539699 (3.14158797) 1200分割 答え 0.78539765 (3.14159060) 1300分割 答え 0.78539795 (3.14159179) 1400分割 答え 0.78539759 (3.14159036) 1500分割 答え 0.78539693 (3.14158773) 1600分割 答え 0.78539824 (3.14159298) 1700分割 答え 0.78539813 (3.14159250) 1800分割 答え 0.78539705 (3.14158821) 1900分割 答え 0.78539741 (3.14158964) 2000分割 答え 0.78539658 (3.14158630) 2100分割 答え 0.78539687 (3.14158750) 2200分割 答え 0.78539765 (3.14159060) 2300分割 答え 0.78539819 (3.14159274) 2400分割 答え 0.78539675 (3.14158702) 2500分割 答え 0.78539902 (3.14159608) 2600分割 答え 0.78539765 (3.14159060) 2700分割 答え 0.78539556 (3.14158225) 2800分割 答え 0.78539735 (3.14158940) 2900分割 答え 0.78539777 (3.14159107) 3000分割 答え 0.78539860 (3.14159441)