練習 [13] 構造体(2/5)

練習 2(提出プログラム名:p1302a.c)

まず,このプログラム(p1302a.c)ヘッダ(p1302a.h)をダウンロードしなさい.
p1302a.c では n 個の有理数を読み込み,それらの合計値を有理数のかたちで出力させようとしている.つまり,次のような計算をさせようというものである:

このプログラムを完成させなさい.ここで扱う有理数はすべて正の数であると仮定してよい.
なお,有理数を表現するための構造体やそれを使った関数はすべてヘッダ p1302a.h で用意してあるので,main 関数の中でそれらを使うだけでよい

【目的の処理】
 以下,このプログラムでやりたいことを順に説明する.
 仮に n 個の整数を合計するという話ならば,次のようなプログラムを書けばよいことになる:

  int i, n, sum, x;
  scanf("%d", &n);
  sum = 0;
  for ( i = 0; i < n; i++ )
  {
    scanf("%d", &x);
    sum = sum + x;
  }
  printf("合計 = %dn", sum);

 これに対し,この問題ではここでの整数(int 型)
 有理数(RATIONAL 型)に置き換えて同じことをやろうとしている.
 以下の手順(2)及び(4)–(6)を main 関数で実現しなさい.

 (1)まず,変数 sumxint 型から RATIONAL 型に変更する(実装済).
 (2)sum = 0; の代わりとして,
   有理数の分子(sum.a)を 0,分母(sum.b)を 1 にする.
 (3)scanf("%d", &x); の代わりとして scan_r(&x); を実行する(実装済).
 (4)上で読み込んだ有理数 xprint_r で出力する.
 (5)sum = sum + x; の代わりとして,関数 add で有理数の足し算を行う.
 (6)最後に合計値 sumprint_r で出力する.

【注意】
手順(3)で使用している scan_r という関数は講義資料では登場していないが,有理数向けの scanf として阿萬が用意したものである(p1302a.h 内で定義してある).
なお,ヘッダ p1302a.h は使うだけで何も書き換えないので,p1302a.c だけを提出せよ.

【ヒント】
有理数 sum と有理数 x を足して,その答えを再び sum へ代入するという処理は
 sum = add(sum, x);
だけで実現できます.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
合計したい有理数の個数を入力してください:4
1 個目の有理数の分子と分母を入力してください:1 2
  [入力された有理数 = 1/2]
2 個目の有理数の分子と分母を入力してください:3 4
  [入力された有理数 = 3/4]
3 個目の有理数の分子と分母を入力してください:5 6
  [入力された有理数 = 5/6]
4 個目の有理数の分子と分母を入力してください:7 8
  [入力された有理数 = 7/8]

入力された有理数の合計 = 71/24
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
合計したい有理数の個数を入力してください:3
1 個目の有理数の分子と分母を入力してください:1 3
  [入力された有理数 = 1/3]
2 個目の有理数の分子と分母を入力してください:1 3
  [入力された有理数 = 1/3]
3 個目の有理数の分子と分母を入力してください:1 3
  [入力された有理数 = 1/3]

入力された有理数の合計 = 1/1

【過去にあったミス(減点となり,やり直しを命じられる)】
2 種類の実行例を確認せずに提出してしまっている.
sum = 0; に相当する作業(2)において,分母(sum.b)を間違って 0してしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 練習 3 (p1303a.c) ]