【问题标题】:Calculation within if statement under switchswitch下if语句内的计算
【发布时间】:2021-11-24 02:50:54
【问题描述】:

我正在尝试编写允许用户输入申报状态和收入以计算所欠税款的代码。如果归档状态输入超出 1-4 ,程序将退出。我正在尝试使用开关和 if else if,但看起来我被困在生成欠税部分的代码上。每当我输入收入时,它都不会产生欠税金额。例如,案例1:在switch(最后一行)中输入1(单身),输入20000作为收入。结果应该显示 $3000 但它不会给出任何结果。下面是我到目前为止的代码。

#include<stdio.h>

int main()
{

//declaration  status = filing status , income = income input, taxOwed = tax owed calculation.
int status;
double income, taxOwed;

//data/input
printf("************Menu****************\n");
printf("1) Single\n");
printf("2) Married Filing Jointly\n");
printf("3) Married Filing Separately\n");
printf("4) Head of Household\n");
printf("5) Exit\n");
printf("\n");
printf("********************************\n");
printf("\n");
printf("Enter status : ");
scanf("%d", &status);

//processing switch with Calculation within each case
switch(status)
{
    case 5:
        printf("\n", status);
        printf("Exit Program...\n");
        break;
    case 6: case 7: case 8: case 9:
        printf("You entered a wrong status. Program Exit . . .");
        break;
    default:
        printf("You entered a wrong status. Program Exit . . .");
        break;
    case 1:
        printf("Enter your taxable TI: $");
        scanf("%.2lf\n", income);
        if (0 < income <= 24000)
        {
            taxOwed = (income * 0.15);
            printf("\n");
            printf("The taxes owed are: $%.2lf", taxOwed);
            break;
        }
        else if (24000 < income <= 58000)
        {
            taxOwed = 3600 + (0.28 * (income - 24000));
            printf("The taxes owed are: $%.2lf", taxOwed);
            break;
        }

}

return 0;
}

非常感谢任何评论和帮助。谢谢

【问题讨论】:

  • 关于您之前的编辑:对于printf,您可以对floatdouble 使用%f 格式说明符,但对于scanf,您必须使用%lf双倍的。这是因为在调用诸如printf 之类的可变参数函数时,float 被提升为doublescanf 不会进行任何形式的促销。
  • 请勿编辑帖子以更改所提出的问题,例如,通过在代码中进行一些修复并询问仍然存在的问题。 Stack Overflow 旨在成为其他人可以用作参考的问题和答案的持久存储库。当您更改问题时,未来的读者将不再看到匹配的问答,因此答案不会告诉他们如何解决特定问题。 Stack Overflow 不是个人调试服务,您不应该那样使用它。您应该主要自己调试程序并一次提出一个特定问题。
  • 这意味着您有责任将问题缩小到程序的特定部分,并仅针对该部分提出问题,最好将特定的代码部分提取到一个小程序中,以演示您遇到的问题。
  • 既然后续问题已经解决了,不妨把它删掉,以恢复原来的问题。
  • @AndreasWenzel 我已经删除了第二个问题,因为它已经解决了,但是第三个后续问题仍然有问题并且它没有打印带有 taxOwed 的字符串。

标签: c if-statement switch-statement calculation


【解决方案1】:

声明

scanf("%.2lf\n", income);

错了,原因有三:

  1. 函数scanf 期望它应该写入的变量的地址,而不是变量的先前值。

  2. 目前尚不清楚您打算.2 做什么。您可能将scanf 格式字符串与printf 格式字符串混淆了。这可能导致scanf 失败。你应该经常检查scanf的返回值,看看函数是否成功。

  3. 格式字符串中的\n 将导致scanf 继续读取空格,直到找到非空格字符。这意味着您必须至少按两次 ENTER 键并且必须提供额外的输入。这可能不是你想要的。

因此,您应该将该行更改为以下内容:

scanf("%lf", &amp;income);

还有,陈述

if (0 &lt; income &lt;= 24000)

else if (24000 &lt; income &lt;= 58000)

错了。

他们应该是

if (0 &lt; income &amp;&amp; income &lt;= 24000)

和:

else if ( 24000 &lt; income &amp;&amp; income &lt;= 58000 )

他们错的原因如下:

根据the rules on operator precedence,表达式

24000 &lt; income &lt;= 58000

相当于:

(24000 &lt; income) &lt;= 58000

这意味着这个表达式等价于任一

0 &lt;= 58000

1 &lt;= 58000

取决于 (24000 &lt; income) 的计算结果是真 (1) 还是假 (0)。

在这两种情况下,整个表达式的计算结果都为真,因为58000 大于01

这就是写作的原因

if (0 &lt; income &lt;= 24000)

else if (24000 &lt; income &lt;= 58000)

没有意义,因为这些语句相当于写

if ( 1 )

和:

else if ( 1 )

【讨论】:

  • 亲爱的 Andrea,非常感谢您的反馈。我正在查看代码,发现注意到您指出并修复它的代码,但它仍然不会计算所欠税款。在我输入备案状态和收入金额后,它只给我“进程返回-1073741819(0xC0000005)执行时间:4.239 s 按任意键继续。”您知道为什么它不打印所欠税款的金额吗?
  • @NewB123:在 Microsoft Windows 上,代码0xC0000005 通常代表“访问冲突”,这相当于 Windows 中的“分段错误”。这意味着您正在从您无权触摸的内存中读取或写入。请通过将其添加到问题底部来显示您的最新代码,不要覆盖您的原始问题。
  • @NewB123:您现在通过覆盖您的原始问题使我的答案无效。请恢复您的原始问题并将您的最新代码添加到问题底部。
  • 对不起,安德里亚,我在这个网站/论坛上还是新手,只是对编码很陌生,我不知道,我恢复了原来的问题。并添加了我的最新代码
  • @NewB123:在我的回答中,我建议您将scanf("%.2lf\n", income); 更改为scanf("%lf", &amp;income);,但您的最新代码中仍然缺少&amp;(地址)。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多