2

私はまだC#プログラミングに不慣れで、次のプロジェクトで立ち往生しています。私はそれが簡単でなければならないことを知っていますが、メソッドを配置する場所Reduce()と、整数を削除してこれをReduce()メソッドに呼び出すことによって分数を変換する方法について頭がロックされています。プロジェクトは次のとおりです。

+()2 つの分数を加算する演算子メソッドを追加します。2 つの分数を足すには、まず値の整数部分をすべて削除します。たとえば、2 1/4 は 9/4 になり、1 3/5 は 8/5 になります。共通の分母を見つけて、分数をそれに変換します。たとえば、9/4 と 8/5 を足すと、45/20 と 32/20 に変換できます。次に、77/20 を与える分子を追加できます。最後に、Reduce()メソッドを呼び出して結果を減らし、数値の小数部分が 1 未満になるように整数値を復元します。たとえば、77/20 は 3 17/20 になります。

ここに私がこれまでに持っているコードがあります。また、これらの分数を乗算して後で配列を作成する際にも問題が発生しますが、今のところ、一度に 1 つのステップを実行しようとしています。ありとあらゆる回答をいただければ幸いです。

public class Fraction
{
    public int WholeNumber { get; private set; }
    public int Numerator { get; private set; }
    public int Denominator { get; private set; } 

    private void Reduce()
    {
        if (Numerator < Denominator)
        {
            WholeNumber = 0;
            return;
        }
        if (Numerator == Denominator)
        {
            WholeNumber = 1;
            Numerator = 0;
            return;
        }
        if (Numerator > Denominator)
        {
            WholeNumber = (int)Math.Floor((decimal)Numerator / Denominator);
            Numerator = Numerator - WholeNumber * Denominator;
        }
    } 

    //constructor with three parameters 
    public Fraction(int wholenumber, int numerator, int denominator)
    {
        WholeNumber = wholenumber;
        Numerator = WholeNumber * Denominator + Numerator;
        Reduce();
    }

    //constructor with two parameters 
    public Fraction(int numerator, int denominator)
    {
        WholeNumber = 0;
        Numerator = numerator;
        Denominator = denominator;
        Reduce();
    } 

    //parameter less with set values
    public Fraction()
    {
        WholeNumber = 0;
        Numerator = 0;
        Denominator = 1;
    }

    public static Fraction operator +(Fraction firstfraction, Fraction secondfraction)
    {
        if (firstfraction.Denominator == secondfraction.Denominator)
        {
            int firstProduct = (firstfraction.WholeNumber * firstfraction.Denominator) + firstfraction.Numerator;
            int secondProduct = (secondfraction.WholeNumber * secondfraction.Denominator) + secondfraction.Numerator;
            return (new Fraction(firstProduct + secondProduct, firstfraction.Denominator));
        }
        else
        {
            int commondenominator = firstfraction.Denominator * secondfraction.Denominator;
            int firstProduct = ((firstfraction.WholeNumber * firstfraction.Denominator) + firstfraction.Numerator) * secondfraction.Denominator;
            int secondProduct = ((secondfraction.WholeNumber * secondfraction.Denominator) + secondfraction.Numerator) * firstfraction.Denominator;
            return (new Fraction(firstProduct + secondProduct, commondenominator));
        }
    } 


    public Fraction Reduce(int WholeNumber, int Numerator, int Denominator)
    {
        int reduceWhole = (int)WholeNumber;
        while (Numerator > Denominator)
        {
            Numerator -= Denominator;
            reduceWhole += 1;
        }
        while (Denominator % Numerator == 0)
        {
            int factor = (int)Denominator / Numerator;
            Numerator = 1;
            Denominator = factor;
        }

        return new Fraction(reduceWhole, Numerator, Denominator);
    } 

}//end class

class Program
{
    static void Main(string[] args)
    {
        Fraction firstfraction = new Fraction();
        Fraction secondfraction = new Fraction();
        Fraction total = firstfraction + secondfraction;
        Console.WriteLine(total);
        Console.Write("Enter whole number portion of fraction: ");
        firstfraction.WholeNumber = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter numerator: ");
        firstfraction.Numerator = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter denominator: ");
        firstfraction.Denominator = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter whole number portion of fraction: ");
        secondfraction.WholeNumber = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter numerator: ");
        secondfraction.Numerator = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter denominator: ");
        secondfraction.Denominator = Convert.ToInt32(Console.ReadLine());
        Console.Write("{0} {1}/{2}", firstfraction.WholeNumber, firstfraction.Numerator,
        firstfraction.Denominator);
        Console.WriteLine(" + {0} {1}/{2}", secondfraction.WholeNumber,
        secondfraction.Numerator, secondfraction.Denominator);
        Fraction add = new Fraction();
        add = firstfraction + secondfraction;
        Console.Write("Result of adding two fractions is:{0} {1}/{2}", add.WholeNumber,
        add.Numerator, add.Denominator);
        Console.ReadLine();
    }//end main
}//end class

現在、プロパティまたはインデクサーを示す 3 つのエラー メッセージが表示されます。

'FractionProgram.Fraction.Denominator'set アクセサーにアクセスできないため、このコンテキストでは使用できません。

さらに、firstProduct と secondProduct の正しい計算はありますか?

4

2 に答える 2

3

私はあなたのために問題を解決するつもりはありませんが、あなたが自分で問題を解決して学ぶのに役立ついくつかのヒントをあなたに与えます。

まず、Reduceメソッドの配置については、いくつかの方法があります。

  • myFraction.Reduce()Fraction( )の値を変更するインスタンスメソッドにすることができます
  • 分数を変更しないが、新しい既約分数(stringまたは演算子など)を返すインスタンスメソッドにすることができます(myFraction = myFraction.Reduce()
  • 上記のオプションを静的メソッドに変えることができます(myFraction = Fraction.Reduce(myFraction)

課題を読んだところ、最初の課題を使用することになっているようです。ただし、通常、将来のプロジェクトでこのような機能を実装する方法は複数あることに注意してください。

メソッドの実際の内容については、ここに答えの方向に導くためのいくつかのヒントがあります。

  • 整数除算とその仕組みについて考えてください。いくつかの例を書き留めて(またはコードでテストして)、答えが何であるかを確認してください。
  • 剰余演算子について考えてみてください。まだ学習していない場合は、整数除算を行う演算子ですが、商の代わりに余りを返します。まだ使用が許可されていない場合は、その機能を非常に簡単に複製できます。

残りの部分は数学的に理解できるはずですが、それでも助けが必要な場合はコメントを残してください。

于 2012-07-03T00:38:03.380 に答える
0

あなたは非常に近いので、賛成票を投じるに値します。Reduce()メソッドは分数クラスの一部であり、コンストラクターで呼び出される必要があります。分数の一貫性を確保するために、プロパティ WholeNumberNumerator、およびDenominatorreadonly を作成する必要があります。

public int WholeNumber { get; private set; }
public int Numerator { get; private set; }
public int Denominator { get; private set; }

このメソッドは、整数が常に分数に含まれているかのように、 andにWholeNumber基づいてを計算します。分子が分母よりも大きい場合や、分子が等しい場合などの状況に対処する必要があります。メソッドは次のとおりです。NumeratorDenominatorReduce()

private void Reduce()
{
    if (Numerator < Denominator)
    {
        WholeNumber = 0;
        return;
    }
    if (Numerator == Denominator)
    {
        WholeNumber = 1;
        Numerator = 0;
        return;
    }
    if (Numerator > Denominator)
    {
        WholeNumber = (int)Math.Floor((decimal)Numerator / Denominator);
        Numerator = Numerator - WholeNumber * Denominator;
    }
}

コンストラクターは次のようになります。

//constructor with three parameters
public Fraction(int wholenumber, int numerator, int denominator)
{
    WholeNumber = wholenumber;
    Numerator = WholeNumber * denominator + numerator;
    Denominator = denominator;

    Reduce();
}

//constructor with two parameters
public Fraction(int numerator, int denominator)
{
    WholeNumber = 0;
    Numerator = numerator;
    Denominator = denominator;
    Reduce();
}

次に、演算子は次のように+()なります。

public static Fraction operator+(Fraction firstfraction, Fraction secondfraction)
{
    if (firstfraction.Denominator == secondfraction.Denominator)
    {
        int firstProduct = (firstfraction.WholeNumber * firstfraction.Denominator) + firstfraction.Numerator;
        int secondProduct = (secondfraction.WholeNumber * secondfraction.Denominator) + secondfraction.Numerator;
        return (new Fraction(firstProduct + secondProduct, firstfraction.Denominator));
    }
    else
    {
        int commondenominator = firstfraction.Denominator * secondfraction.Denominator;
        int firstProduct = ((firstfraction.WholeNumber * firstfraction.Denominator) + firstfraction.Numerator) * secondfraction.Denominator;
        int secondProduct = ((secondfraction.WholeNumber * secondfraction.Denominator) + secondfraction.Numerator) * firstfraction.Denominator;
        return (new Fraction(firstProduct + secondProduct, commondenominator));
    }
}
于 2012-07-03T01:55:59.210 に答える