Мне нужна помощь в создании цикла для решения этой проблемы

#c#

#c#

Вопрос:

У меня возникли трудности с созданием цикла для этой проблемы.

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

Это то, что у меня есть до сих пор

         int[] upper = { 9525, 38700, 82500, 157500, 200000, 500000, };
        int[] rate = { 10, 12, 22, 24, 32, 35, 37 };
        double tax;
        Write("Please enter your income >> ");
        double income = Convert.ToInt32(ReadLine());

        for (int i = 0; i < upper.Length; i  )
        {
            if (income <= upper[i])
            {
                tax = income * rate[i];

            }

        }
  

Логика цикла должна функционировать следующим образом, если доход составлял 100 000 долларов

 IncomeTax = 
  ($ 9,525[upper[0]]) * 10%[rate[0]] 
  ($38,700[upper[1]] - $9,525[upper[0]]) * 12%[rate[1]] 
  ($82,500[upper[2]] - $38,700[upper[1]]) * 22%[rate[2]] 
  ($100,000[income] - $82,500[upper[2]]) * 24%[rate[3]] = $18,289.50[total]
  

Любая помощь была бы очень признательна!

Комментарии:

1. Это похоже на школьный проект!!

2. в этом случае вам больше ничего не нужно

3. вставьте свой код сюда

4. Не включайте свой код в виде картинок. Добавьте свой код к вашему вопросу. Также будьте конкретны в своем вопросе и не задавайте несколько вопросов к одному сообщению.

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

Ответ №1:

Слишком много проблем с этим небольшим кодом.

  • Вы переписываете «Налог», в то время как вы хотите суммировать значение всех налогов, чтобы получить один результирующий налог
  • ваше условие income <= upper[i] для расчета налога не подходит в этом контексте
  • вы рассчитываете налог не на дельту, (upper[i] - upper[i -1]) а на upper[i] только
  • Ваша формула для расчета налога неверна.
  • вы должны разорвать цикл, как только обнаружите, что ваш доход меньше, чем slab (верхний [i])

Но, по крайней мере, я мог видеть ваши усилия, и поэтому я публикую один рабочий код для вашей ссылки (вы можете улучшить его дальше)

         //added , 9999999999 to make the last slab (37%) tends to infinite 
        long[] upper = { 9525, 38700, 82500, 157500, 200000, 500000, 9999999999 };
        int[] rate = { 10, 12, 22, 24, 32, 35, 37 };
        double tax = 0.0;
        Console.WriteLine("Please enter your income >> ");
        //if income is of double data type, we should convert console into double instead of int
        double income = Convert.ToDouble(Console.ReadLine());
        double taxCalculatedAmount = 0.0;

        for (int i = 0; i < upper.Length; i  )
        {
            //Note: here I am calculating the delta 
            //which I will use to calculate the tax for the slab.
            double incomeToCalculateTax  =
                upper[i] <= income ? (i == 0 ? upper[i] : upper[i] - upper[i - 1]) : 
                                     (i == 0 ? income : income - upper[i - 1]);

            //Condition which will check if amount on which we have calculated tax is exceeding total amount
            if (income > taxCalculatedAmount)
            {
                //proper formula of calculating tax
                tax  = (incomeToCalculateTax * rate[i]) / 100;
                taxCalculatedAmount  = incomeToCalculateTax;
            }
            else
                break;
        }
  

Комментарии:

1. Ваша помощь определенно подтолкнула меня в правильном направлении. Большое вам спасибо!

Ответ №2:

Ниже приведена автономная статическая функция, вычисляющая требуемый результат. Хотя это, вероятно, не имеет значения для выполнения упражнения, в целом рекомендуется не использовать числа с плавающей запятой для расчетов с валютой, потому что вы можете потерять точность при работе с большими суммами; либо конвертируйте в наименьшие единицы (центы или что-то еще) и используйте целые числа (или длинные), либо используйте десятичные дроби, как сделано ниже.

 public static decimal IncomeTax(decimal income)
{
    // Only positive income can be taxed
    if (income <= 0M) return 0M;

    // Initialize bracket limits and rate percentages
    int[] brackets = { 0, 9525, 38700, 82500, 157500,
                       200000, 500000, int.MaxValue };
    int[] rates = { 10, 12, 22, 24, 32, 35, 37 };

    // Start with zero tax
    decimal tax = 0M;

    // Loop over tax rates and corresponding brackets
    for (int i = 0; i < rates.Length; i  )
    {
        // Calculate amount of current bracket
        int currBracket = brackets[i   1] - brackets[i];

        // If income is below lower bound, exit loop
        if (income < brackets[i]) break;

        // If income is between lower and upper bound,
        if (income < brackets[i   1])
        {
            // adjust bracket length accordingly
            currBracket = income - brackets[i];
        }

        // Add tax for current bracket to accumulated tax
        tax  = (rates[i] / 100M) * currBracket;
    }

    // Return result
    return tax;
}