質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

解決済

コードが汚すぎるので、もう少しすっきりとさせたい

vnsa7221
vnsa7221

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

4回答

0評価

1クリップ

2278閲覧

投稿2017/06/27 09:46

###前提・実現したいこと
現在「一週間で身につく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#

// program\.cs using System; using System\.Collections\.Generic; using System\.Linq; using System\.Text; using System\.Threading\.Tasks; namespace Problem8_6 { class Program { static void Main\(string\[\] args\) { @public x = new @public\(\); Random rnd = new Random\(\); int denom1 = rnd\.Next\(2, 11\); // 分母\(1つ目の分数\) int numer1 = rnd\.Next\(1, 11\); // 分子\(1つ目の分数\) int denom2 = rnd\.Next\(2, 11\); // 分母\(2つ目の分数\) int numer2 = rnd\.Next\(1, 11\); // 分子\(2つ目の分数\) Console\.WriteLine\("1つ目の分数→" \+ numer1 \+ " / " \+ denom1\); Console\.WriteLine\("2つ目の分数→" \+ numer2 \+ " / " \+ denom2\); Console\.WriteLine\(\); int gcm = x\.Gcm\(denom1, denom2\); // 最大公約数 int lcm = x\.Lcm\(denom1, denom2, gcm\); // 最小公倍数 Console\.WriteLine\("最大公約数は " \+ gcm \+ " 最小公倍数は " \+ lcm\); Console\.WriteLine\(\); int rdNum1 = x\.Fraction\(denom1, numer1, lcm\); // 1つ目の分数通分時の分子の値 int rdNum2 = x\.Fraction\(denom2, numer2, lcm\); // 2つ目の分数通分時の分子の値 int rdSum = rdNum1 \+ rdNum2; Console\.WriteLine\("分母:" \+ lcm \+ " 分子1:" \+ rdNum1 \+ " 分子2:" \+ rdNum2 \+ " 分子1 \+ 分子2:" \+ rdSum\); Console\.WriteLine\(\); string ans = x\.Reduction\(lcm, rdSum\); Console\.WriteLine\("計算値は " \+ ans\); } } }

c#

// public\.cs using System; using System\.Collections\.Generic; using System\.Linq; using System\.Text; using System\.Threading\.Tasks; namespace Problem8_6 { class @public { // 最大公約数を表示 public int Gcm\(int d1, int d2\) { if\(d1 < d2\) { return Gcm\(d2, d1\); } while\(d2 != 0\) { var remain = d1 % d2; // 余り d1 = d2; // 次の計算時にbの値をaに設定 d2 = remain; // 次の計算時にremain\(余り\)の値をbに設定 } return d1; } // 最小公倍数を表示 public int Lcm\(int d1, int d2, int gcm\) { return d1 \* d2 / gcm; } // 通分 public int Fraction\(int den, int num, int lcm\) { return lcm / den \* num; // 分母にて、通分するために倍数計算し、分子に反映 } // 約分 public string Reduction\(int lcm, int rdsum\) { int tmp = rdsum / lcm; // 分子合計 / 分母通分値で帯分数の整数を算出 int ans = rdsum % lcm; // 分子合計 / 分母通分地で帯分数の分子を算出 if \(ans == 0\) { return tmp\.ToString\(\); // 整数値を文字列化して返却 } else if\(tmp >= 1\) { if\(Gcm\(ans, lcm\) != 1\) { int gcm = Gcm\(ans, lcm\); // 分子と分母の最大公約数を算出 ans /= gcm; // 分子を最大公約数で割る lcm /= gcm; // 分母を最大公約数で割る } return tmp\.ToString\(\) \+ " \. " \+ ans\.ToString\(\) \+ " / " \+ lcm\.ToString\(\); } else { if \(Gcm\(lcm, rdsum\) != 1\) { int gcm = Gcm\(lcm, rdsum\); // 分子と分母の最大公約数を算出 lcm /= gcm; // 分母を最大公約数で割る rdsum /= gcm; // 分子を最大公約数で割る } return rdsum\.ToString\(\) \+ " / " \+ lcm\.ToString\(\); } } } }

###補足情報(言語/FW/ツール等のバージョンなど)
C#を触り始めてちょうど1週間くらいになる初心者です。
この部分の処理はこうすればもっと少ない量で書けます。やこれを追加すればこんな面倒なことする必要ない等アドバイスを頂けると非常に幸いです。
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

mattn
mattn

2017/06/28 00:12

念のため言っておきたいですが、コードそんなに汚くないですよ\(public以外\)

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。