Вопрос по c#, arrays, methods – Не могу получить ничего кроме $ 0 от вызова метода для расчета taxAmount

2

У меня проблемы с этим следующим вызовом, особенно последний компонент:

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

Я делаю вызов метода CalculateTax в классе Rates, инициированном как taxRates в основном.

Вот метод CalculateTax

<code>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 if(income >= incLimit) {
            taxOwed = Convert.ToInt32(income * highTaxRate);}
        else taxOwed = 0;
        return taxOwed;
    }
</code>

incLimit, lowTaxRate и highTaxRate установлены ранее

Любые идеи, почему это всегда выходит на 0. Я даже отправил методу число, например, 50000 и все равно получил 0.

Я могу получить значение, просто используя метод, так что это что-то еще, вот код

<code>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()
    {
        //int limit = 30000;
        //double lowRate = .15;
        //double highRate = .28;
        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);
        Console.WriteLine(taxOwed);
        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());

        }

        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(50000));//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 
</code>
@Jason:stackoverflow.com/questions/693372/… - Проще говоря, деньги всегда должны быть десятичными. m-y
@ Jason Это, вероятно, учебное упражнение, основанное на простоте этого. Yuck
@ Джейсон: естьbig Разница между тем, что вы могли бы сделать (почти все) и что вы должны делать. Черт, ФП мог бы хранить доллары в одномint и изменение в другоеint и создал свой собственный класс, чтобы справляться со всей математикой ... но всегда хорошо, когда люди знают, что приемлемый тип денегdecimal. m-y
Хотя это довольно несправедливый способ сделать это, я бы хотел, чтобы Налоговый кодекс США был таким простым! jason
имеющийincLimit, lowTaxRate, а такжеhighTaxRate выходит за рамки вашего метода очень плохой дизайн. Ваш метод должен получать все, что ему нужно, не полагаясь на глобальные переменные. Yuck

Ваш Ответ

5   ответов
1

else taxOwed = 0; никогда не будет выполнен, так что он не нужен. Я запустил ваш код, как показано ниже, и все работает.The problem must be with either the parameter being passed into the method being zero, or you are not setting the values like you think you are.

void Main()
{
    var result = CalculateTax(40000);
    Console.WriteLine(result);
}

public int CalculateTax(int income)
{
    var incLimit = 50000;
    var lowTaxRate = 0.10;
    var highTaxRate = 0.25;
    int taxOwed;

    if (income < incLimit){
        taxOwed = Convert.ToInt32(income * lowTaxRate); }
    else if(income >= incLimit) {
        taxOwed = Convert.ToInt32(income * highTaxRate);}
    return taxOwed;
}
Update

Теперь, когда вы опубликовали свой полный код, ваша проблема в том, что вам нужно изменить статическийGetRates() способ вернуть ставки, какКларк упоминает. Этот статический метод является единственным местом вызоваrates.assignRates() и эти назначенные ставки хороши только для этого конкретного случаяrates содержится в этом методе и больше нигде. Так что меняйGetRates() чтобы вернутьrates пример следующим образом:

 public static Rates GetRates()
 {
    ...
    Rates rates = new Rates();
    ...
    return rates;
 } 

Затем измените основной метод следующим образом:

static void Main(string[] args)
{
    Taxpayer[] taxArray = new Taxpayer[5];
    // Implement a for-loop that will prompt the user to enter
    // the Social Security Number and gross income.

    ...

    Rates taxRates = 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(50000));

    } 
    ...
}
@ Кен Уайт: Точка Принимается и исправляется. Спасибо
Я хотел бы убедиться, что они не равны нулю с некоторыми отладочными операторами.
Пожалуйста, используйте настоящие слова. & APOS; U & APOS; и 'coz'; нет, и вы не общаетесь с друзьями. Эти ответы используются взрослыми, которые пишут программное обеспечение для жизни, и другими, кто действительно хочет иметь возможность понять, что они читают. Вы, безусловно, можете позволить себе набрать «Вы». вместо "U" и реального слова "потому что" вместо 'coz' когда разговариваю со взрослыми. Благодарю. :)
0

чтобы подтвердить, что lowTaxRate и hightTaxRate не равны нулю / нулю.

1

е его только из статического метода Taxpayer.GetRates (). Этот метод воздействует на локальный объект Rates, а затем выбрасывает заполненный объект. Возможно, вы захотите изменить Taxpayer.GetRates (), чтобы он возвращал объект Rates, возвращая внутренне созданную (и заполненную) переменную ставок:

public static Rates GetRates() { ... return rates; }

А затем в Main () удалите существующий вызов Taxpayer.GetRates () и измените строку, в которой вы объявляете переменную taxRates, следующим образом:

Rates taxRates = Taxpayer.GetRates();

Также обратите внимание, что вы также должны как-то обрабатывать ошибки из-за неправильного / отсутствующего ввода, но вы, похоже, не делаете это прямо сейчас, поэтому я не включил никаких функциональных изменений, кроме как вернуть вас назад к заполненному объекту Rates. ,

Кроме того, вы можете подумать о том, чтобы сделать класс Rates статическим, поскольку вы, похоже, используете только один его экземпляр.

+1 с его обновлением, чтобы показать весь его код, да, это проблема.
1

я получаю правильный ненулевой результат (900 используя мои ценности):

internal class Program {
    private static int incLimit = 30000;
    private static float lowTaxRate = 0.18F;
    private static float highTaxRate = 0.30F;

    private static void Main(string[] args) {
        var result = CalculateTax(5000);
    }

    public static 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 if (income >= incLimit) {
            taxOwed = Convert.ToInt32(income * highTaxRate);
        }
        else taxOwed = 0;

        return taxOwed;
    }
}
Я получаю результат, отличный от нуля, с вашим собственным примером программы.
0

что lowTaxRate и highTaxRate не установлены в 0, потому что все, умноженное на 0, равно 0. Установите некоторые отладчики / MessageBoxes, чтобы проверить это.

@ Кен Уайт: Точка Принимается и исправляется. Спасибо
Я хотел бы убедиться, что они не равны нулю с некоторыми отладочными операторами.
Пожалуйста, используйте настоящие слова. & APOS; U & APOS; и 'coz'; нет, и вы не общаетесь с друзьями. Эти ответы используются взрослыми, которые пишут программное обеспечение для жизни, и другими, кто действительно хочет иметь возможность понять, что они читают. Вы, безусловно, можете позволить себе набрать «Вы». вместо "U" и реального слова "потому что" вместо 'coz' когда разговариваю со взрослыми. Благодарю. :)

Похожие вопросы