###前提・実現したいこと
現在「一週間で身につくC#言語の基本」サイトを参照しながらC#の勉強中
練習問題を一通り解き終え、Prob8のチャレンジ問題を解いており、一応希望に沿った動きを実現することができた。
ただコードが汚すぎてもう少しきれいに実装したいと考えている
対象問題
2つの分数同士の足し算をし、その結果を分数で表示するプログラムを作りなさい。このとき、分子、分母共に最大値が10で、最小値は分母が2、分子が1とする。それらの数値をランダムに発生させ、以下のように結果を表示させなさい。ただし、計算結果は、分子と分母がきちんと約分されていることとする。また、分子が分母の数で割り切れる場合は、整数として表示するものとする。
例
1/5 + 2/3 = 13/15 ← 通常のケース
2/3 + 3/8= 1.1/24 ← 帯分数になるケース
1/6 + 1/3= 1/2 ← 約分されるケース
1/2 + 1/2 = 1 ← 整数になるケース
###発生している問題・エラーメッセージ
コードをもう少しすっきりとさせたい。主な悩みとして
- intの連発
- 変数大量使用
- classも無駄な計算をしているように感じる
###該当のソースコード
c#
1// program.cs 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace Problem8_6 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 @public x = new @public(); 15 Random rnd = new Random(); 16 17 int denom1 = rnd.Next(2, 11); // 分母(1つ目の分数) 18 int numer1 = rnd.Next(1, 11); // 分子(1つ目の分数) 19 int denom2 = rnd.Next(2, 11); // 分母(2つ目の分数) 20 int numer2 = rnd.Next(1, 11); // 分子(2つ目の分数) 21 22 Console.WriteLine("1つ目の分数→" + numer1 + " / " + denom1); 23 Console.WriteLine("2つ目の分数→" + numer2 + " / " + denom2); 24 Console.WriteLine(); 25 26 int gcm = x.Gcm(denom1, denom2); // 最大公約数 27 int lcm = x.Lcm(denom1, denom2, gcm); // 最小公倍数 28 29 Console.WriteLine("最大公約数は " + gcm + " 最小公倍数は " + lcm); 30 Console.WriteLine(); 31 32 int rdNum1 = x.Fraction(denom1, numer1, lcm); // 1つ目の分数通分時の分子の値 33 int rdNum2 = x.Fraction(denom2, numer2, lcm); // 2つ目の分数通分時の分子の値 34 int rdSum = rdNum1 + rdNum2; 35 36 Console.WriteLine("分母:" + lcm + " 分子1:" + rdNum1 + " 分子2:" + rdNum2 + " 分子1 + 分子2:" + rdSum); 37 Console.WriteLine(); 38 39 string ans = x.Reduction(lcm, rdSum); 40 41 Console.WriteLine("計算値は " + ans); 42 } 43 } 44}
c#
1// public.cs 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace Problem8_6 9{ 10 class @public 11 { 12 // 最大公約数を表示 13 public int Gcm(int d1, int d2) 14 { 15 if(d1 < d2) 16 { 17 return Gcm(d2, d1); 18 } 19 20 while(d2 != 0) 21 { 22 var remain = d1 % d2; // 余り 23 d1 = d2; // 次の計算時にbの値をaに設定 24 d2 = remain; // 次の計算時にremain(余り)の値をbに設定 25 } 26 27 return d1; 28 } 29 30 // 最小公倍数を表示 31 public int Lcm(int d1, int d2, int gcm) 32 { 33 return d1 * d2 / gcm; 34 } 35 36 // 通分 37 public int Fraction(int den, int num, int lcm) 38 { 39 return lcm / den * num; // 分母にて、通分するために倍数計算し、分子に反映 40 } 41 42 // 約分 43 public string Reduction(int lcm, int rdsum) 44 { 45 int tmp = rdsum / lcm; // 分子合計 / 分母通分値で帯分数の整数を算出 46 int ans = rdsum % lcm; // 分子合計 / 分母通分地で帯分数の分子を算出 47 48 if (ans == 0) 49 { 50 return tmp.ToString(); // 整数値を文字列化して返却 51 } 52 else if(tmp >= 1) 53 { 54 if(Gcm(ans, lcm) != 1) 55 { 56 int gcm = Gcm(ans, lcm); // 分子と分母の最大公約数を算出 57 ans /= gcm; // 分子を最大公約数で割る 58 lcm /= gcm; // 分母を最大公約数で割る 59 } 60 return tmp.ToString() + " . " + ans.ToString() + " / " + lcm.ToString(); 61 } 62 else 63 { 64 if (Gcm(lcm, rdsum) != 1) 65 { 66 int gcm = Gcm(lcm, rdsum); // 分子と分母の最大公約数を算出 67 lcm /= gcm; // 分母を最大公約数で割る 68 rdsum /= gcm; // 分子を最大公約数で割る 69 } 70 return rdsum.ToString() + " / " + lcm.ToString(); 71 } 72 } 73 } 74}
###補足情報(言語/FW/ツール等のバージョンなど)
C#を触り始めてちょうど1週間くらいになる初心者です。
この部分の処理はこうすればもっと少ない量で書けます。やこれを追加すればこんな面倒なことする必要ない等アドバイスを頂けると非常に幸いです。
よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー