程序的结果不正确

时间:2022-07-23 16:44:46
#include <stdio.h>
#define SINGLE 17850
#define HOST 23900
#define MARRIED 29750
#define MARRIED_DIVORCE 14875
#define RATE1 0.15
#define RATE2 0.28
int main(void)
{
char choice;
int  threshold;
double salary,tax;
while(1)
{
printf("Please input your choice\n");
printf("1)SINGLE\t\t2)HOST\n");
printf("3)MARRIED\t\t4)MARRIED_DIVORCE\n");
printf("5)quit\n");
scanf("%c",&choice);
switch(choice)
{
case '1':threshold=SINGLE;break;
case '2':threshold= HOST;break;
case '3':threshold=MARRIED;break;
case '4':threshold=MARRIED_DIVORCE;break;
case '5':printf("quit\n");return 0;
default:continue;
}

printf("You have chose %c\n",choice);
printf("Please input your salary\n");
scanf("%lf",&salary);
if(salary<= threshold) tax=salary* RATE1;
else tax= threshold* RATE1+(salary-threshold)* RATE2;
printf("Tax is %lf\n",tax);
printf("hello world\n");
}
}

这个程序运行结果 程序的结果不正确
为什么最后有两次那个输出?

7 个解决方案

#1


scanf("%c",&choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

#2


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

楼上正解, 因为回车符被scanf接收了,所以第二次循环时就直接赋值给choice, 在switch语句中直接进入default分支,然后continue了

#3


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

你的意思是不是执行下一次循环的时候  我的本身的循环 和空格作为while参数的循环 是两次循环 

#4


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

懂了 谢谢指教

#5


抱歉,输入有误是在该语句后加上getchar();
scanf("%lf",&salary);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &choice);时回车符就成了输入字符。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

#6


引用 5 楼 cfjtaishan 的回复:
抱歉,输入有误是在该语句后加上getchar();
scanf("%lf",&amp;salary);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &amp;choice);时回车符就成了输入字符。
这也是%c特有的特性,在%d形式输入时……

然后下次执行scanf("%c", &choice);时回车符就成了输入字符 什么意思?说反了?
还有getchar有什么用啊 为什么他可以把回车变垃圾

#7


一种改法
#include <stdio.h>
#include <stdlib.h>

#define SINGLE 17850
#define HOST 23900
#define MARRIED 29750
#define MARRIED_DIVORCE 14875
#define RATE1 0.15
#define RATE2 0.28

int main()
{
static char choice[1024];
int threshold;
double salary,tax;
while(1)

puts("Please input your choice\n"
"1)SINGLE\t\t2)HOST\n"
"3)MARRIED\t\t4)MARRIED_DIVORCE\n"
"5)quit\n");
scanf("%1023s",choice);
switch(atoi(choice))
{
case 1:
threshold=SINGLE;
break;
case 2:threshold= HOST;
break;
case 3:
threshold=MARRIED;
break;
case 4:
threshold=MARRIED_DIVORCE;
break;
case 5:
printf("quit\n");
return 0;
default:
printf("Invalid choice: %s\n",choice);
continue;
}

printf("Please input your salary\n");
scanf("%lf",&salary);
if(salary<= threshold) 
{
tax=salary* RATE1;
}
else
{
tax= threshold* RATE1+(salary-threshold)* RATE2;
}
printf("Tax is %lf\n",tax);
}
    return 0;
}

#1


scanf("%c",&choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

#2


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

楼上正解, 因为回车符被scanf接收了,所以第二次循环时就直接赋值给choice, 在switch语句中直接进入default分支,然后continue了

#3


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

你的意思是不是执行下一次循环的时候  我的本身的循环 和空格作为while参数的循环 是两次循环 

#4


引用 1 楼 cfjtaishan 的回复:
scanf("%c",&amp;choice);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

懂了 谢谢指教

#5


抱歉,输入有误是在该语句后加上getchar();
scanf("%lf",&salary);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &choice);时回车符就成了输入字符。
这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

#6


引用 5 楼 cfjtaishan 的回复:
抱歉,输入有误是在该语句后加上getchar();
scanf("%lf",&amp;salary);
问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &amp;choice);时回车符就成了输入字符。
这也是%c特有的特性,在%d形式输入时……

然后下次执行scanf("%c", &choice);时回车符就成了输入字符 什么意思?说反了?
还有getchar有什么用啊 为什么他可以把回车变垃圾

#7


一种改法
#include <stdio.h>
#include <stdlib.h>

#define SINGLE 17850
#define HOST 23900
#define MARRIED 29750
#define MARRIED_DIVORCE 14875
#define RATE1 0.15
#define RATE2 0.28

int main()
{
static char choice[1024];
int threshold;
double salary,tax;
while(1)

puts("Please input your choice\n"
"1)SINGLE\t\t2)HOST\n"
"3)MARRIED\t\t4)MARRIED_DIVORCE\n"
"5)quit\n");
scanf("%1023s",choice);
switch(atoi(choice))
{
case 1:
threshold=SINGLE;
break;
case 2:threshold= HOST;
break;
case 3:
threshold=MARRIED;
break;
case 4:
threshold=MARRIED_DIVORCE;
break;
case 5:
printf("quit\n");
return 0;
default:
printf("Invalid choice: %s\n",choice);
continue;
}

printf("Please input your salary\n");
scanf("%lf",&salary);
if(salary<= threshold) 
{
tax=salary* RATE1;
}
else
{
tax= threshold* RATE1+(salary-threshold)* RATE2;
}
printf("Tax is %lf\n",tax);
}
    return 0;
}