問 1(提出プログラム名:ex1401.c)
まず,このプログラム(ex1401.c)とヘッダ(ex1401.h)をダウンロードしなさい.
ヘッダ ex1401.h では(講義で説明した)有理数を表す構造体 RATIONAL について,
その入力を行う関数 scan_r,出力を行う関数 print_r,かけ算を行う関数 mul がそれぞれ用意されている.
そして,プログラム ex1401.c は n 個の有理数を読み込み,それらをすべてかけ合わせた結果を有理数のかたちで出力させようとしている(つまり,練習 2 (p1402.c)のプログラムの「かけ算」版である).
ex1401.c を完成させて提出しなさい.
なお,この問題では入力される有理数はすべて正の数であると仮定してよい.
【注意】
この問題ではヘッダの方は一切書き換えないこと.提出するのは ex1401.c の方である.
例年,有理数を出力するのにわざわざ自分で printf で書こうとするミスが見られる(有理数を出力するための関数 print_r がヘッダ ex1401.h の中で既に用意されているのでそれを呼び出すだけで話は済む).
【ヒント】
n 個の整数をすべてかけ合わせるのであれば次のようなプログラムになりますので,
これを有理数向けに少し書き換えることになります:
int i, n, prod, x; ← prod と x は型を RATIONAL にする必要あり.
scanf("%d", &n); ← 有理数向けの scanf は scran_r として用意してある.
prod = 1; ← 同じことを有理数でやる場合は,分子と分母の両方を 1 にする.
for ( i = 0; i < n; i++ ){
scanf("%d", &x); ← 有理数向けの scanf は scran_r として用意してある.
prod = prod * x; ← 有理数向けの掛け算には mul を使う.
}
printf("積 = %dn", prod); ← 有理数向けの printf は print_r として用意してある.
※有理数向けの scanf は scan_r として用意してあり,有理数向けの printf は print_r として用意してあります.さらに有理数のかけ算は mulとして用意してあります.
例えば,prod = prod * x; は prod = mul(prod, x); といった感じです.
- 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
かけ合わせたい有理数の個数を入力してください:4 1 個目の有理数の分子と分母を入力してください:1 2 [入力された有理数 = 1/2]⏎ 2 個目の有理数の分子と分母を入力してください:3 4 [入力された有理数 = 3/4]⏎ 3 個目の有理数の分子と分母を入力してください:5 6 [入力された有理数 = 5/6]⏎ 4 個目の有理数の分子と分母を入力してください:7 8 [入力された有理数 = 7/8]⏎ ⏎ 入力された有理数の積 = 35/128⏎
- 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
かけ合わせたい有理数の個数を入力してください:3 1 個目の有理数の分子と分母を入力してください:4 6 [入力された有理数 = 2/3]⏎ 2 個目の有理数の分子と分母を入力してください:3 4 [入力された有理数 = 3/4]⏎ 3 個目の有理数の分子と分母を入力してください:8 5 [入力された有理数 = 8/5]⏎ ⏎ 入力された有理数の積 = 4/5⏎
【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 出力結果が上の実行例と違う(きちんと確認していない).
■ prod の初期値を 0 (=0/1) にしてしまっている.(そうすると答えは 0 になってしまいます)
■ 上のヒントを見落としていて,かけ算を行うのにうまく関数 mul を使えていない.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
ミスが無いことを確認したら次の問題へ → [ 問2 (ex1402.c) ]