ほとんどのプログラミング言語では, 「実数データ」といっても有限桁数で計算を行う.
実数を有限の桁数で表現することはできないため,
double 型のデータには誤差が生じる可能性がある.
例題 3.1 実数データ x を入力し, x をそのまま小数点以下 30 桁するプログラム ex31.c を作成せよ.
ex31.c |
---|
#include <stdio.h> int main(void) { double x; printf("x を入力して下さい: "); scanf("%lf", &x); printf("x = %.30f¥n", x); return 0; } |
コンパイルし, 実行してみる
abc12345@KSKS04DT00 ~/ $ cd c3 abc12345@KSKS04DT00 ~/c3 $ gcc ex31.c abc12345@KSKS04DT00 ~/c3 $ ./a x を入力して下さい: 0.5 x = 0.500000000000000000000000000000 abc12345@KSKS04DT00 ~/c3 $ ./a x を入力して下さい: 0.1 x = 0.100000000000000005551115123126 |
課題 3.1 実数データ x, y をこの順に入力し, z = x / y を計算して z を小数点以下 30 桁するプログラム err.c を作成せよ.
例題 3.2 品物の税抜き価格 (整数値) x を入力し,
消費税が 8% のときの税込み価格 (小数点以下を切り捨てた整数値) y
を計算して出力するプログラムを作成せよ.
ex32.c |
---|
#include <stdio.h> int main(void) { int x; /* 税抜き価格 */ int y; /* 税込み価格 */ printf("税抜き価格 x を入力して下さい: "); scanf("%d", &x); /* x (整数値) の読み込み */ y = x * 1.08; /* 税込み価格の計算 */ printf("税込み価格 y = %d¥n", y); return 0; } |
コンパイルと実行の例
(ディレクトリ c3 で) abc12345@KSKS04DT00 ~/c3 $ gcc ex32.c abc12345@KSKS04DT00 ~/c3 $ ./a 税抜き価格 x を入力して下さい: 98 税込み価格 y = 105 ← 105.84 が整数化されて 105 になる |
課題 3.2
銀行に預金する金額 x 円 (整数値) と年利 r (実数値) を入力すると,
x 円を複利 r で 3 年間預けたときの預金額 y 円 (整数値; 小数点以下は切り捨てる)
を出力するプログラム deposit.c を作成せよ.
整数データの除算には注意が必要
例題 3.3 大学の志願者数 n (整数) と定員 c (整数) をこの順に入力し,次は間違ったプログラムである (倍率の小数点以下が切り捨てられる)
ex33.c (間違い) |
---|
#include <stdio.h> int main(void) { int n, c; double r; printf("志願者数と定員を入力して下さい: "); scanf("%d %d", &n, &c); r = n / c; /* 間違い (小数以下が切り捨てられる) */ printf("倍率は %.2f¥n", r); return 0; } |
実行例
abc12345@KSKS04DT00 ~/ $ ./a 志願者数と定員を入力して下さい: 423 100 倍率は 4 ←おかしい |
ex33.c (正解) |
---|
#include <stdio.h> int main(void) { int n, c; double r_wrong, r; printf("志願者数と定員を入力して下さい: "); scanf("%d %d", &n, &c); r = (double) n / (double) c; /* 正しい書き方 (丸覚えする) */ printf("倍率は %.2f¥n", r); return 0; } |
実行例
abc12345@KSKS04DT00 ~/ $ ./a 志願者数と定員を入力して下さい: 423 100 倍率は 4.23 |
課題 3.3
n 個のクッキーを m 人の子供に配分するとする. n と m (いずれも整数) を入力し,
子供 1 人あたりに配れるクッキー数の平均値 (小数点以下3桁) と,
同じ数だけ配分した場合に一人あたり何個配れて何個余るか,
を計算して出力するプログラム cookie.c を作成せよ.
abc12345@KSKS04DT00 ~/ $ ./a 志願者数と定員を入力して下さい: 423 0 Floating point exception (コアダンプ) |
ex33.c (ゼロ除算防止) |
---|
#include <stdio.h> int main(void) { int n, c; double r_wrong, r; printf("志願者数と定員を入力して下さい: "); scanf("%d %d", &n, &c); if ( c!=0 ) { /* もし c≠0 であれば */ r = (double) n / (double) c; printf("倍率は %.2f¥n", r); } return 0; } |
課題 3.4 課題3.3 の cookie.c を書き換え, m=0 の場合には計算を行わないようにするプログラム cookie2.c を作成せよ.
科目名: コンピュータ演習A 課題: C3 番号: 9999 氏名: 関学 太郎 作成: 20oo年oo月oo日 ------------------------------------------------------------- [課題 3.1] 〜を作成した. 実行結果は下記の通りである. (Cygwinの実行結果を貼り付ける) 〜で苦労した, 〜を工夫した, 等 ------------------------------------------------------------- ([課題 3.2] 以降も同様) ------------------------------------------------------------- [感想] (今回の課題に関する感想を書く) ------------------------------------------------------------- |