1

有问题的方法调用在最后的这个 writeline 调用中

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));

这是该方法所在的费率类

public class Rates
{
    // Create a class named rates that has the following data members: 
    int     incLimit;
    double lowTaxRate;
    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 void assignRates()
    {
        incLimit = 30000;
        lowTaxRate = .15;
        highTaxRate = .28;
    }
    //A class constructor that takes three parameters to assign input values for limit, low rate and high rate.
    public void assignRates(int lim, double low, double high)
    {
        incLimit = lim;
        lowTaxRate = low;
        highTaxRate = high;
    }
    //  A CalculateTax method that takes an income parameter and computes the tax as follows:
    public int CalculateTax(int income)
    {

        int taxOwed;
        //  If income is less than the limit then return the tax as income times low rate.
        if (income < incLimit)
            taxOwed = Convert.ToInt32(income * lowTaxRate); 
        //  If income is greater than or equal to the limit then return the tax as income times high rate.
        else 
            taxOwed = Convert.ToInt32(income * highTaxRate);

        return taxOwed;
    }

现在,如果我在初始化以下变量时将一个值粘贴到它们中,我可以获得一个返回值,但如果我将它们保留为默认值,我总是从 writeline 中得到 0。

int     incLimit;
double lowTaxRate;
double highTaxRate;

以防万一您需要查看其他内容,剩下的就在这里。

我也有关于排序的问题,我认为它不能正常工作,因为我需要它按 taxOwed 金额排序,但目前是 0 和我的问题。

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

namespace Assignment5_2
{

public class Rates
{
    // Create a class named rates that has the following data members: 
    int     incLimit;
    double lowTaxRate;
    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 void assignRates()
    {
        incLimit = 30000;
        lowTaxRate = .15;
        highTaxRate = .28;
    }
    //A class constructor that takes three parameters to assign input values for limit, low rate and high rate.
    public void assignRates(int lim, double low, double high)
    {
        incLimit = lim;
        lowTaxRate = low;
        highTaxRate = high;
    }
    //  A CalculateTax method that takes an income parameter and computes the tax as follows:
    public int CalculateTax(int income)
    {

        int taxOwed;
        //  If income is less than the limit then return the tax as income times low rate.
        if (income < incLimit)
            taxOwed = Convert.ToInt32(income * lowTaxRate); 
        //  If income is greater than or equal to the limit then return the tax as income times high rate.
        else 
            taxOwed = Convert.ToInt32(income * highTaxRate);

        return taxOwed;
    }


}  //end class Rates

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

    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

    public static void GetRates()
    {
        //  Local method data members for income limit, low rate and high rate.

        int incLimit;
        double lowRate;
        double highRate;
        string userInput;
        Rates rates = new Rates();
        //  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 = (Console.ReadLine());
        if (userInput == "D" || userInput == "d")
        {

            rates.assignRates();
        } // 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. */
        else 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();
            rates.assignRates(incLimit, lowRate, highRate);
        }
        else Console.WriteLine("You made an incorrect choice");
    }

    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());
            taxArray[x].taxOwed = taxRates.CalculateTax(taxArray[x].grossIncome);

        }


        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, taxArray[i]);//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 
4

1 回答 1

0

问题是您没有调用设置默认费率的代码。这段代码:

//A class constructor that assigns default values 
public void assignRates()
{
    incLimit = 30000;
    lowTaxRate = .15;
    highTaxRate = .28;
}

虽然评论为“构造函数”不是一个。它永远不会被调用或运行。由于您的类称为 Rates,因此您需要一个名为 Rates 的默认构造函数:

public Rates()
{
    // assign the default rates in your constructor
    assignRates();
}
于 2012-04-12T07:25:46.680 回答