Вопрос был связан с темой if-else. Я попытался создать программу, в которой человек вводит свой доход, а программа показывает, сколько налога ему нужно заплатить.
#include<stdio.h>
int main ()
{
float tax, income;
printf("Kindly note down your income here\n");
scanf("%f", income);
if (income < 5.0 && income > 2.5)
{
printf("You have to pay 5 tax because your income is %f\n", income);
}
else if (income < 10.0 && income > 5.0)
{
printf("You have to pay 20 tax because your income is %f\n", income);
}
else if (income > 10.0)
{
printf("You have to pay 30 tax because your income is %f\n", income);
}
else if (income < 2.5)
{
printf("You have to pay no tax because your income is %f\n", income);
}
return 0;
}
Это то, что я попробовал. где я ошибаюсь?
(1) Проверьте значение, возвращаемое scanf() и семьей, чтобы убедиться, что вы получили ожидаемые данные. (2) Один из самых простых методов отладки — вывести на печать значение, которое программа прочитала (или должна была прочитать), чтобы вы могли сравнить его с тем, что вы ожидали получить. (3) Убедитесь, что вы компилируете с включенными предупреждениями. Если вы используете GCC, то хорошей отправной точкой будет gcc -Werror -Wall -Wextra …, но при желании можно и посложнее.
Ваше первоначальное название вопроса было не очень удачным. Это была лишь косвенная информация, а не описание реальной проблемы. В тексте вопроса должно быть указано, что пошло не так — вы должны были сообщить нам, какой результат вы получите для примера входных данных. Пожалуйста, прочитайте страницы О и Как задать вопрос (снова).
Что, если income равно, например, 5,0?
Ребята... нам не нужно отвечать на бесконечные часто задаваемые вопросы о неуместном & в scanf. Если вам нужен канонический дубликат, то вот он: Что произойдет, если в операторе scanf не поставить '&'? Но на самом деле это следует назвать «просто опечаткой». Каждый новичок в C допускает эти ошибки, и их лучше всего устранять, уделяя больше внимания учебным материалам для начинающих, глава 1.





float *, соответствующую строке формата %f. Вот что говорит gcc -Wall:1.c: In function ‘main’:
1.c:8:17: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
8 | scanf("%f", income);
| ~^ ~~~~~~
| | |
| | double
| float *
и исправление состоит в том, чтобы изменить его на:
scanf("%f", &income);
Всегда проверяйте возвращаемое значение scanf(), иначе вы можете работать с неинициализированными переменными.
Вы хотите присвоить значение переменной tax.
При тестировании income вы пропускаете значения, равные (нижней или верхней) границе. Вы хотите использовать половину открытого интервала, скажем, [2.5, 5), который вы бы написали как income >= 2.5 && income < 5. Также рассмотрите возможность логического упорядочения условий. Как только вы это сделаете, вы сможете исключить нижнюю границу, поскольку каждое условие выполняется последовательно, как показал вам @Chris:
double tax;
if (income < 2.5)
tax = 0;
else if (income < 5.0)
tax = 5;
else if (income < 10.0)
tax = 20;
else
tax = 30;
#include <values.h>
// ...
float tax_rates[][2] = {
{2.5, 0},
{5, 20},
{FLT_MAX, 30}
};
size_t n = sizeof tax_rates / sizeof *tax_rates;
float tax = tax_rates[n - 1][1];
for(size_t i = 0; i < n - 1; i++) {
if (income < tax_rates[i][0]) {
tax = tax_rates[i][1];
break;
}
}
Основное преимущество этого подхода заключается в том, что таблица тарифов теперь представляет собой данные, которые могут изменяться независимо от вашего кода. Вы можете прочитать налоговые ставки из текстового файла или загрузить авторитетный источник (IRS, если вы находитесь в США).
printf() утверждения, и вы, вероятно, захотите указать printf(), сколько значащих цифр вы хотите напечатать. Я использовал 2 ниже:#include <stdio.h>
int main () {
printf("Kindly note down your income here: ");
float income;
int rv = scanf("%f", &income);
if (rv != 1) {
printf("scanf failed\n");
return 1;
}
float tax = 0;
if (income >= 2.5 && income < 5)
tax = 5;
else if (income >= 5 && income < 10)
tax = 20;
else if (income >= 10)
tax = 30;
if (tax)
printf("You have to pay %.2f tax because your income is %.2f\n", tax, income);
else
printf("You have to pay no tax because your income is %.2f\n", income);
}
Хотя Аллан Винд определил источник вашей ошибки, я бы также предложил вам реорганизовать ваше условие, изменив порядок, чтобы уменьшить количество элементов, которые вам нужно проверить, поскольку вы можете предположить, что все предыдущие проверенные условия являются ложными.
if (income < 2.5) {
printf("You have to pay no tax because your income is %f\n", income);
}
// We now *know* that income >= 2.5
else if (income < 5.0) {
printf("You have to pay 5 tax because your income is %f\n", income);
}
else if (income < 10.0) {
printf("You have to pay 20 tax because your income is %f\n", income);
}
else {
printf("You have to pay 30 tax because your income is %f\n", income);
}
Хотя это не имеет отношения к этому очень простому примеру, использование чисел с плавающей запятой для работы с деньгами сомнительно, но использование чисел с плавающей запятой одинарной точности (по сравнению с double) особенно сомнительно, поскольку деньги могут включать в себя большие числа, которые делают операции с одинарной точностью. числа быстро становятся неточными, что приводит к ошибкам в расчетах. Лишь немногие виды арифметических ошибок расстраивают людей больше, чем те, которые связаны с деньгами.
Поскольку условия являются исчерпывающими (ветвь всегда выполняется), нет необходимости инициализировать tax при ее объявлении.
Изменение предложенного Алланом Виндом кода для этого:
#include <stdio.h>
int main () {
printf("Kindly note down your income here: ");
double income;
int rv = scanf("%lf", &income);
if (rv != 1) {
printf("scanf failed\n");
return 1;
}
double tax;
if (income < 2.5)
tax = 0;
else if (income < 5.0)
tax = 5;
else if (income < 10.0)
tax = 20;
else
tax = 30;
// Or even just:
// double tax = (income < 2.5) ? 0 :
// (income < 5.0) ? 5 :
// (income < 10.0) ? 20 : 30;
if (tax)
printf("You have to pay %.2f tax because your income is %.2f\n", tax, income);
else
printf("You have to pay no tax because your income is %.2f\n", income);
}
scanf("%f",income);потребности в тмscanf("%f",&income);