0

このプログラムを実行すると、次の出力が得られます。

Please enter the Social Security Number for taxpayer 0:  111111111
Please enter the gross income for taxpayer 0:  20000
Please enter the Social Security Number for taxpayer 1:  555555555
Please enter the gross income for taxpayer 1:  50000
Please enter the Social Security Number for taxpayer 2:  333333333
Please enter the gross income for taxpayer 2:  5464166
Please enter the Social Security Number for taxpayer 3:  222222222
Please enter the gross income for taxpayer 3:  645641
Please enter the Social Security Number for taxpayer 4:  444444444
Please enter the gross income for taxpayer 4:  29000
Taxpayer # 1 SSN: 111111111, Income is $20,000.00, Tax is $0.00
Taxpayer # 2 SSN: 555555555, Income is $50,000.00, Tax is $0.00
Taxpayer # 3 SSN: 333333333, Income is $5,464,166.00, Tax is $0.00
Taxpayer # 4 SSN: 222222222, Income is $645,641.00, Tax is $0.00
Taxpayer # 5 SSN: 444444444, Income is $29,000.00, Tax is $0.00

未処理の例外: System.InvalidOperationException: 配列内の 2 つの要素を比較できませんでした。---> System.ArgumentException: 少なくとも 1 つのオブジェクトが IComparable を実装する必要があります。
System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems (T[]
で System.Collections.Generic.ObjectComparer`1.Compare(T x、T y)で
キー、IComparer`1 比較子、Int32 a、Int32 b)
System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] キー、Int32 左、Int32 右、IComparer`1 比較子)
System.Collections.Generic.ArraySortHelper で`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
--- 内部例外スタック トレースの終了 ---
System.Collections.Generic.ArraySortHelper`1.Sort(T[] キー、Int32 インデックス、Int32 長さ、IComparer`1 比較子)
で System.Array.Sort[T](T[] 配列、Int32 インデックス、Int32 長さ、 System.Array.Sort[T](T[] array)の IComparer`1 comparer)
at Assignment5.Taxpayer.Main(String[] args) in Program.cs:line 150

行末の 0 が税額であることに注意してください。

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace taxes
{
    class Rates
    {
        // Create a class named rates that has the following data members: 
        private int incLimit;
        private double lowTaxRate;
        private double highTaxRate;

        // use read-only accessor
        public int IncomeLimit  
        { get { return incLimit; } }
        public double LowTaxRate 
        { get { return lowTaxRate; } }
        public double HighTaxRate 
        { get { return highTaxRate; } }

        //A class constructor that assigns default values 
        public Rates()
        {
            int limit = 30000;
            double lowRate = .15;
            double highRate = .28;
            incLimit = limit;
            lowTaxRate = lowRate;
            highTaxRate = highRate;
        }
        //A class constructor that takes three parameters to assign input values for limit, low rate and high rate.
        public Rates(int limit, double lowRate, double highRate)
        {
        }
        //  A CalculateTax method that takes an income parameter and computes the tax as follows:
        public int CalculateTax(int income)
        {
            int limit = 0;
            double lowRate = 0;
            double highRate = 0;
            int taxOwed = 0;
            //  If income is less than the limit then return the tax as income times low rate.
            if (income < limit)
                taxOwed = Convert.ToInt32(income * lowRate);
            //  If income is greater than or equal to the limit then return the tax as income times high rate.
            if (income >= limit)
                taxOwed = Convert.ToInt32(income * highRate);
            return taxOwed;
        }


    }  //end class Rates

        //  Create a class named Taxpayer that has the following data members:
        public class Taxpayer
        {
            //Use get and set accessors.
            string SSN
            { get; set; }
            int grossIncome 
            { get; set; }

            //  Use read-only accessor.
            public int taxOwed  
            {
                get { return taxOwed; }
            }

            //   The Taxpayer class should be set up so that its objects are comparable to each other based on tax owed.
            class taxpayer : IComparable
            {
                public int taxOwed { get; set; }
                public int income { get; set; }
                int IComparable.CompareTo(Object o)
                {
                    int returnVal;
                    taxpayer temp = (taxpayer)o;
                    if (this.taxOwed > temp.taxOwed)
                        returnVal = 1;
                    else
                        if (this.taxOwed < temp.taxOwed)
                            returnVal = -1;
                        else
                            returnVal = 0;
                    return returnVal;

                }  // End IComparable.CompareTo
            } //end taxpayer  IComparable class
                //  **The tax should be calculated whenever the income is set.
                //  The Taxpayer class should have a getRates class method that has the following.
                public static void GetRates()
                {
                    //  Local method data members for income limit, low rate and high rate.
                    int incLimit = 0;
                    double lowRate;
                    double highRate;
                    string userInput;
                    //  Prompt the user to enter a selection for either default settings or user input of settings.
                    Console.Write("Would you like the default values (D) or would you like to enter the values (E)?:  ");
                    /*   If the user selects default the default values you will instantiate a rates object using the default constructor
                    * and set the Taxpayer class data member for tax equal to the value returned from calling the rates object CalculateTax method.*/
                    userInput = Convert.ToString(Console.ReadLine());
                    if (userInput == "D" || userInput == "d")
                    {
                        Rates rates = new Rates();
                        rates.CalculateTax(incLimit);
                    } // end if
                    /*  If the user selects to enter the rates data then prompt the user to enter values for income limit, low rate and high rate, 
                     * instantiate a rates object using the three-argument constructor passing those three entries as the constructor arguments and 
                     * set the Taxpayer class data member for tax equal to the valuereturned from calling the rates object CalculateTax method. */
                    if (userInput == "E" || userInput == "e")
                    {
                        Console.Write("Please enter the income limit: ");
                        incLimit = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Please enter the low rate: ");
                        lowRate = Convert.ToDouble(Console.ReadLine());
                        Console.Write("Please enter the high rate: ");
                        highRate = Convert.ToDouble(Console.ReadLine());
                        Rates rates = new Rates(incLimit, lowRate, highRate);
                        rates.CalculateTax(incLimit);
                    }  
                }  

            static void Main(string[] args)
            {

                Taxpayer[] taxArray = new Taxpayer[5];
                Rates taxRates = new Rates();
                //  Implement a for-loop that will prompt the user to enter the Social Security Number and gross income.
                for (int x = 0; x < taxArray.Length; ++x)
                {
                    taxArray[x] = new Taxpayer();
                    Console.Write("Please enter the Social Security Number for taxpayer {0}:  ", x + 1);
                    taxArray[x].SSN = Console.ReadLine();

                    Console.Write("Please enter the gross income for taxpayer {0}:  ", x + 1);
                    taxArray[x].grossIncome = Convert.ToInt32(Console.ReadLine());

                }

                Taxpayer.GetRates();

                //  Implement a for-loop that will display each object as formatted taxpayer SSN, income and calculated tax.
                for (int i = 0; i < taxArray.Length; ++i)
                {
                    Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(taxArray[i].grossIncome));

                } // end for
                //  Implement a for-loop that will sort the five objects in order by the amount of tax owed 
                Array.Sort(taxArray);
                Console.WriteLine("Sorted by tax owed");
                for (int i = 0; i < taxArray.Length; ++i)
                {
                    Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i + 1, taxArray[i].SSN, taxArray[i].grossIncome, taxRates.CalculateTax(taxArray[i].grossIncome));

                }
            }  //end main
        } //  end Taxpayer class

}  //end 

金額が 0 になる理由と、並べ替えが機能しない理由についての手がかりはありますか?

4

2 に答える 2

2
  • 2 番目のRatesコンストラクターは何もしません。

  • Taxpayer.taxOwed無限再帰です。

  • 文字列を呼び出す必要はないと思いConvert.ToStringます:

    userInput = Convert.ToString(Console.ReadLine());
    
  • を呼び出した結果を使用することはありませんRates.CalculateTax

  • GetRatesRatesインスタンス化するオブジェクトには何もしません。それを呼び出すと、何もしないように見えます。

  • ネストされたクラスtaxpayerは何にも使用されていないようです。作ろうとしていTaxpayer IComparableますか?クラスに直接実装IComparableしますTaxpayer。別のクラスを定義するべきではありません。おそらく、IComparable<Taxpayer>代わりに実装することもできます。

  • データにプログラム クラスを使用しています。おそらくTaxpayer、プログラム クラスから離れるべきです。のように別のクラスにする必要がありRatesます。

于 2012-04-11T05:24:45.273 に答える
1
Rates rates = new Rates(incLimit, lowRate, highRate);
                        rates.CalculateTax(incLimit);

実装がないコンストラクターに値を渡します

//A class constructor that takes three parameters to assign input values for limit, low rate and high rate.
        public Rates(int limit, double lowRate, double highRate)
        {
        }

このコンストラクター内のメソッドに値を割り当てて、プログラムを実行してみてください。デバッグして、問題が発生している場所を教えてください。

于 2012-04-11T05:35:03.590 に答える