2013-10-11 7 views
2

Я сделал эту программу, которая рассчитывает налог для ряда окладов на основе ввода пользователем. Все работает нормально, за исключением того, что я не могу найти способ заставить приложение игнорировать последние 3 printf и просто распечатать сообщение об ошибке, если пользователь вводит отрицательное значение. Я не хочу отображать последние 3 printf, если пользователь вводит отрицательное число, вместо этого я хочу, чтобы приложение просто отображало «Ошибка: вы ввели отрицательное число» или что-то в этом роде. Я использую визуальную студию в качестве моего компилятора, и это приложение C. Помогите плз. А также, пожалуйста, пройдите со мной на мой класс программирования, в котором мы все еще делаем очень простые вещи.Выдача налогового калькулятора

Вот код:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 

    float salary, tax = 0; 
    printf("\n\n\tEnter the salary ammount per year: \t\t$"); 
    scanf("%f", &salary); 

    if (salary <= 10000){ 
     tax=0; 
    } 
    else if (salary > 10000 && salary <= 40000){ 
     tax = (salary - 10000)*0.2; 
    } else if (salary > 40000 && salary <= 50000){ 
     tax = 6000 + (salary - 40000)*0.3 ; 
    } else if (salary > 50000 && salary <= 75000){ 
     tax = 9000 + (salary - 50000)*0.4; 
    } else if (salary > 75000.01 && salary <= 100000){ 
     tax = 19000 + (salary - 75000)*0.5; 
    } else if (salary > 100000 && salary >=100000.01){ 
     tax = 31500 + (salary - 100000)*0.6; 
    } 



    printf("\nSalary per year:\t\t $ %.2f\n\n", salary); 
    printf("Tax ammount per year:\t\t $ %.2f\n\n", tax); 
    printf("Salary after tax:\t\t $ %.2f\n", salary-tax); 


    getchar();getchar(); 
} 
+4

всего в 2, что вещи в жизни: налоги, а CS профессоров раздавая налог калькулятор заданий –

+0

В общем, если вы делаете с учета денежных ценностей, не используйте 'float' или даже' double'. Лучше всего использовать 'long' или' long long' и подсчитывать центы или сантимы или любую наименьшую единицу валюты. Например, «float» не может точно хранить 0,01 доллара. –

ответ

5

Вы уже продемонстрировали, вы знаете, как использовать if заявления, чтобы проверить, относятся ли int в заданном диапазоне. Просто примените эту же логику к выходу. Отрицательные числа: < 0.

Например:

if(salary < 0) { 
    //print error 
} else { 

    if (salary <= 10000) { 
     tax=0; 
    } else if (salary > 10000 && salary <= 40000) { 
     tax = (salary - 10000)*0.2; 
    } else if (salary > 40000 && salary <= 50000) { 
     tax = 6000 + (salary - 40000)*0.3 ; 
    } else if (salary > 50000 && salary <= 75000) { 
     tax = 9000 + (salary - 50000)*0.4; 
    } else if (salary > 75000/*.01*/ && salary <= 100000) { 
     tax = 19000 + (salary - 75000)*0.5; 
    } else /*if (salary > 100000 && salary >=100000.01)*/ { 
     tax = 31500 + (salary - 100000)*0.6; 
    } 

    printf("\nSalary per year:\t\t $ %.2f\n\n", salary); 
    printf("Tax ammount per year:\t\t $ %.2f\n\n", tax); 
    printf("Salary after tax:\t\t $ %.2f\n", salary-tax); 
} 

На последнем else if, вы действительно не нужно if заявление, только else. Хотя быть уверенным (и для ясности), это хорошо, чтобы включить его. ОДНАКО, вам определенно не нужно ** salary >=100000.01)>= будет оценивать только true, если salary > 100000 уже оценен до true. И && будет оцениваться до true, только если обе стороны оценят значение true. Единственный способ быть правдой, а другой неверный - если кто-то вводит нечетную зарплату (100000.005), но даже если эта зарплата будет введена, они все равно должны быть в этой налоговой скобке.

Во всяком случае, ваши printf заявления теперь содержит в else блоке if(salary<0) {}else{} блока, так что они будут печатать только если зарплата была> = 0.

+0

спасибо за ответ. Я работаю над этим какое-то время, и вы, когда вы работаете над чем-то, что вы просто так сосредоточены, вы забываете о других вещах. В любом случае, спасибо за быстрый ответ – user2869498

+0

+1 за то, что отрицательные числа <0! – mjs

+1

Эта же ошибка закралась в 'зарплата == 75.005'. В общем, вы слишком часто проверяете зарплату. В каждой ветке 'else' вы знаете, что предыдущее условие ложно. Например. если вы находитесь в ветке 'else'' if (зарплата <= 10000) ', вы знаете, что' зарплата <= 10000' должна быть ложной, и поэтому 'зарплата> 10000' должна быть правдой. – MSalters

0

Я думаю, что ваш код подвержены ошибкам, и могу упрощен много:

if (salary <= 10000){ 
    tax=0; 
} else if (salary <= 40000){ 
    tax = (salary - 10000)*0.2; 
} else if (salary <= 50000){ 
    tax = 6000 + (salary - 40000)*0.3 ; 
} else if (salary <= 75000){ 
    tax = 9000 + (salary - 50000)*0.4; 
} else if (salary <= 100000){ 
    tax = 19000 + (salary - 75000)*0.5; 
} else { 
    tax = 31500 + (salary - 100000)*0.6; 
} 
1

Это не ответ на ваш вопрос, но это всегда лучше, чтобы компьютер делать все работы в расчетах. У вашего кода есть несколько промежуточных результатов, которые вы должны были вычислить вручную. Почему бы не позволить компьютеру это сделать? Он также позволяет вам легко изменять структуру ставок, редактируя ключевые функции, скобки и ставки, и не нужно беспокоиться о промежуточных результатах.

float tax = 0; 
struct { 
    float basis; 
    float rate; 
} *ptr, rateStructure[] = 
// list these from high to low brackets 
{ 
{100000,0.6}, 
{ 75000,0.5}, 
{ 50000,0.4}, 
{ 40000,0.3}, 
{ 10000,0.2}, 
{  0,0.1} 
}; 

ptr = rateStructure; 
do { 
    float bracket = salary - ptr->basis; 
    if (bracket > 0) { 
     tax += bracket * ptr->rate; 
     salary -= bracket; 
    } 
    ptr++; 
} while (salary); 
+0

Не очень.Я бы предложил «плавающие скобки» [2] [] = {{100000, 0.6}, {75000, 0.5} ....}; и для цикла. Макросы противны, а не лучший способ создать таблицу. – MSalters

+0

@MSalters - рефакторинг. –

+0

Выглядит намного лучше. C++ будет немного короче, с 'for (auto ptr: rateStructure)'. Преимущество таких циклов заключается в том, что компилятор имеет гораздо лучшую идею о том, как долго они будут работать, и может оптимизировать на основе этого. – MSalters

Смежные вопросы