程序的结果不正确

tingfengx 2012-11-27 10:49:32
#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");
}
}

这个程序运行结果
为什么最后有两次那个输出?
...全文
106 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2012-11-27
  • 打赏
  • 举报
回复
一种改法
#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;
}

tingfengx 2012-11-27
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
抱歉,输入有误是在该语句后加上getchar(); scanf("%lf",&salary); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &choice);时回车符就成了输入字符。 这也是%c特有的特性,在%d形式输入时……
然后下次执行scanf("%c", &choice);时回车符就成了输入字符 什么意思?说反了? 还有getchar有什么用啊 为什么他可以把回车变垃圾
自信男孩 2012-11-27
  • 打赏
  • 举报
回复
抱歉,输入有误是在该语句后加上getchar(); scanf("%lf",&salary); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。然后下次执行scanf("%c", &choice);时回车符就成了输入字符。 这也是%c特有的特性,在%d形式输入时就不存在这样的问题。
tingfengx 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
scanf("%c",&choice); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。 这也是%c特有的特性,在%d形式输入时就不存在这样的问题。
懂了 谢谢指教
tingfengx 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
scanf("%c",&choice); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。 这也是%c特有的特性,在%d形式输入时就不存在这样的问题。
你的意思是不是执行下一次循环的时候 我的本身的循环 和空格作为while参数的循环 是两次循环
breakfisher 2012-11-27
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
scanf("%c",&choice); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。 这也是%c特有的特性,在%d形式输入时就不存在这样的问题。
楼上正解, 因为回车符被scanf接收了,所以第二次循环时就直接赋值给choice, 在switch语句中直接进入default分支,然后continue了
自信男孩 2012-11-27
  • 打赏
  • 举报
回复
scanf("%c",&choice); 问题在这句输入的问题,你在这句后面添加一句:getchar();用于接收输入字符后的回车符。此时的回车符就成了“垃圾”数据存放在行缓冲里。 这也是%c特有的特性,在%d形式输入时就不存在这样的问题。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧