user-0 提问: C primer Plus 第七章编程练习第十一题

回复:
user: user-1
content: 引用 4 楼 m0_44999580 的回复:非常感谢指出我的错误所在！并且让你费时间给了更完美的答案。因为是自学，由于内容的限制，有些问题只能用我所能用到的知识去解决。譬如您提到的getBuff，我还没有接触到。感谢前辈的指导！！最后想问下该如何结帖给分  不用客气！俗话说，活到老、学到老，俺也是C语言的学习者一枚而已。大家一起共同学习提高吧！ 另外上面代码中的 getBuff 不是什么新鲜知识，只是一个普通的 变量名 而已，只是起了一个叫 getBuff 的容易识别的变量名而已，重点是 清空输入缓冲区 的那两行代码 的逻辑。  嗯，结帖的话，用「 浏览器 」 打开自己的帖子 ，就有 结帖、给分 的按钮了。可以根据页面提示操作。 手机app好像不能结帖。

user: user-0
content: 引用 1 楼 user-3 的回复：一般好的题目都会明确说明保证输入的合法性，如果每道题都要考虑输入的异常，代码量会多不知道多少。的确如此，我也是闲的，就想着它会出点问题

user: user-0
content: 引用 2 楼 自信男孩 的回复：while ((ch =getchar()) == 1, ch != ' ') 这条语句是想做什么呢？getchar()怎么能与1划等号呢？getchar()怎么也无法输入1呢。你是不是把getchar()和scanf的返回值闹混了。  建议查一下getchar();的返回值非常感谢指出我的毛病！！我还是太年轻了，由于程序执行没问题，根本没去看代码是否有问题，很感谢前辈的指导！

user: user-0
content: 非常感谢指出我的错误所在！并且让你费时间给了更完美的答案。因为是自学，由于内容的限制，有些问题只能用我所能用到的知识去解决。譬如您提到的getBuff，我还没有接触到。感谢前辈的指导！！最后想问下该如何结帖给分

user: user-1
content: （1）确实可以考虑「输入的数据是否有效」，最好还要同时考虑「过滤掉无效输入」。 （2）另外，诚如2楼所言，getcha()的返回值不是得到了字符的个数，因为这没有意义——要么不输入，就是什么都没有，程序停在getchar()不往下走；要么无论输入什么，getchar()只获得一个字符。getchar()的返回值就是它得到的那个字符。 （3）俺把你上面的代码简单修改了一下，对 ch 的输入进行了判别和过滤，把程序的逻辑也修正了一下，你原来的代码在直接输入字符 q 的情况下，输出结果还需要 付包装费、运费，岂不是滑稽？ （4）如果，要针对 重量的输入数据 进行判别和过滤的话，也可以依葫芦画瓢。 （5）说明：俺没有读过你提到的这本书，也没有去翻看题目是什么，下面的代码全是基于你的帖子进行的调整。具体的数值计算的逻辑是否正确什么的，俺不负责哈。  代码如下：  #include <stdio.h>  #define Y 2.05 //洋蓟单价 #define T 1.15 //甜菜单价 #define H 1.09 //胡萝卜单价 #define Z 0.05 //折扣 #define F1 6.5 //第一阶段运费和包装费 #define F2 14 //第二阶段运费和包装费 #define B1 5 #define B2 20  int main(void) { 	char ch; 	float a, b, c; 	float z1 = 0, z2 = 0, z3 = 0; //各蔬菜的重量 	float zz = 0, sj = 0, yf = 0, zj = 0; //总重、蔬菜价、运费和总价 	z1 = z2 = z3 = 0;  	printf("请输入对应字母选择您要订购的蔬菜：\n"); 	printf(" a.洋蓟    b.甜菜    c.胡萝卜   q.退出\n");  	int flag = 1;  	while (flag == 1) { 		while ((ch = getchar()) != 'a' && ch != 'b' && ch != 'c' && ch != 'q') { 		}  		//清空输入缓冲区 		int getBuff; 		while ((getBuff = getchar() != '\n') && (getBuff != EOF)) 			;  		switch (ch) { 		case 'a': 			printf("请输入洋蓟的磅数：\n"); 			scanf("%f", &a); 			z1 += a; 			printf("您一共输入了%.2f磅洋蓟。\n", z1); 			break; 		case 'b': 			printf("请输入甜菜的磅数：\n"); 			scanf("%f", &b); 			z2 += b; 			printf("您一共输入了%.2f磅甜菜。\n", z2); 			break; 		case 'c': 			printf("请输入胡萝卜的磅数：\n"); 			scanf("%f", &c); 			z3 += c; 			printf("您一共输入了%.2f磅胡萝卜。\n", z3); 			break; 		case 'q': 			printf("您将退出订购！\n"); 			flag = 0; 			break; 		} 		if (flag == 1) { 			printf("请继续选择，选择完毕请摁空格键，退出请摁q：\n"); 			printf(" a.洋蓟    b.甜菜    c.胡萝卜   q.退出\n"); 		} 	}  	zz = z1 + z2 + z3;  	if (zz == 0) { 		yf = 0; 		sj = 0; 		zj = 0; 	} else if (zz <= B1) { 		yf = F1; 		sj = z1 * Y + z2 * T + z3 * H; 		zj = sj + yf; 	} else if (zz <= B2) { 		yf = F2; 		sj = z1 * Y + z2 * T + z3 * H; 		zj = sj + yf; 	} else { 		yf = F2 + 0.5 * (zz - B2); 		sj = z1 * Y + z2 * T + z3 * H; 		if (sj >= 100) 			zj = sj * (1 - Z) + yf; 		else 			zj = sj + yf; 	}  	printf("洋蓟单价：￥%.2f   甜菜单价：￥%.2f   胡萝卜单价：￥%.2f\n", Y, T, H); 	printf("您订购的总重是：%.2f磅.\n", zz); 	printf("蔬菜总费用为：$%.2f.\n", sj); 	printf("可享受折扣：%s.\n", sj >= 100 ? "95折" : "无折扣"); 	printf("运费及包装费为：%.2f.\n", yf); 	printf("您一共需要支付：%.2f.\n", zj);  	return 0; }   如有帮助，烦请及时结帖、给分。：）

user: user-2
content: while ((ch =getchar()) == 1, ch != ' ') 这条语句是想做什么呢？getchar()怎么能与1划等号呢？getchar()怎么也无法输入1呢。你是不是把getchar()和scanf的返回值闹混了。  建议查一下getchar();的返回值

user: user-3
content: 一般好的题目都会明确说明保证输入的合法性，如果每道题都要考虑输入的异常，代码量会多不知道多少。