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:无法比较数组中的两个元素。---> System.ArgumentException: 至少一个对象必须实现 IComparable。
在 System.Collections.Comparer.Compare(Object a, Object b)
在 System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
在 System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[]键,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 比较器)
--- 内部异常堆栈跟踪结束 ---
在 System.Collections.Generic.ArraySortHelper`1.Sort(T[] 键,Int32 索引,Int32 长度,IComparer`1 比较器)
在 System.Array.Sort[T](T[] 数组,Int32 索引,Int32 长度, IComparer`1 comparer) at System.Array.Sort[T](T[] array)
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
  • 你的第二个Rates构造函数什么都不做。

  • Taxpayer.taxOwed是无限递归的。

  • 我认为没有必要调用Convert.ToString字符串:

    userInput = Convert.ToString(Console.ReadLine());
    
  • 你永远不会使用调用的结果Rates.CalculateTax

  • GetRatesRates对它实例化的对象做任何事情;调用它似乎无济于事。

  • 嵌套类taxpayer似乎没有用于任何事情。你在努力Taxpayer IComparable吗?您将IComparableTaxpayer课堂上实施。你不应该定义一个单独的类。您可能还想实施IComparable<Taxpayer>

  • You are using your program class for your data. You should probably split Taxpayer away from your program class. It should be a separate class like Rates is.

于 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 回答