C语言求助!!!!!显示问题!!
#include<stdio.h>#include<ctype.h>
#include<stdbool.h>
int main(void)
{
char ch;
inti,j,k,a,b,flag;
float m,n,p,q,suma,sumb,sumc,sumd;
m=0;n=0;p=0; //洋蓟磅数//甜菜磅数//胡萝卜磅数
printf("*****************************************************************\n");
printf("a 洋蓟 b 甜菜\n");
printf("c 胡萝卜 q 退出\n");
printf("*****************************************************************\n");
printf("请输入要购买的菜类品种\n");
ch=getchar();
while (ch!='q'&&ch!='Q')
{
switch (ch)
{
case 'A':
case 'a':
printf("请输入要购买的洋蓟磅数\n");
scanf("%f",&q);
m+=q;
break;
case 'B':
case 'b':
printf("请输入要购买的甜菜磅数\n");
scanf("%f",&q);
n+=q;
break;
case 'C':
case 'c':
printf("请输入要购买的胡萝卜磅数\n");
scanf("%f",&q);
p+=q;
break;
} //SWITCH结束
// 此菜单应该只显示一次,可不知道为什么总是显示二次
// 此菜单应该只显示一次,可不知道为什么总是显示二次
// 此菜单应该只显示一次,可不知道为什么总是显示二次
// 此菜单应该只显示一次,可不知道为什么总是显示二次
printf("*****************************************************************\n");
printf("a) 洋蓟 b) 甜菜\n");
printf("c) 胡萝卜 q) 退出\n");
printf("*****************************************************************\n");
printf("请输入要购买的菜类品种1\n");//此处出现两次
ch=getchar();
} //WHILE 结束
suma=m*2.05+n*1.15+p*1.09;
if (suma>=100)
sumd*=0.95;
sumb=m+n+p;
if (sumb<=5)
sumc=6.5;
else if(sumb<20)
sumc=14;
else
sumc=14+(sumb-20)*0.5;
printf("洋蓟售价为2.05美元/磅\n");
printf("矩菜售价为1.15美元/磅\n");
printf("胡萝卜售价为1.09美元/磅\n");
printf("您一共购买洋蓟%.2f磅\n",m);
printf("您一共购买甜菜%.2f磅\n",n);
printf("您一共购买胡萝卜%.2f磅\n",p);
printf("订购的蔬菜费用为%.2f\n",suma);
printf("您的订单总费用为%.2f\n",suma+sumc);
printf("您的订单折扣为%.2f\n",(suma+sumc)>=100?suma*0.05:0);
printf("您的运费和包装费为%.2f\n",sumc);
getchar();
getchar();
return 0;
} 因为你的getchar放在末尾了,末尾读了就重新开始下一个循环了,所以建议使用do while而不是while 本帖最后由 zohoChou 于 2022-6-28 16:05 编辑
写的啥烂代码啊……
给你改了,错误一堆,初学也不能这个样子,我也是初学者,但是我干啥都规规矩矩的。
一定按规矩办事,该加的{},该写的都得规规矩矩地写
double suma, sumb, sumc = 0.0;
问题:
1、逻辑不清,clang编译的时候直接炸了,a,b,c都是干啥的?一看一堆unused,sumd你写了个if,然而还是没有任何作用,连printf输出都没有,就是很单纯的运算了一步,没了……没仔细看具体用途,但确实删除以后没有任何影响
2、代码未格式化,各种缩进大括号没点对的
3、while、break没学好就乱用。break只能退出当前的循环。你退出了switch的循环以后程序仍然在while的循环内部,然后程序再次判断ch的值,重复case-break-while形成死循环。
4、谁教你的case空置还不打大括号???我都没反应过来你写的啥……我明白你的意思
case 'a':
case 'A':
XXX;
上面这玩意应该说的是“如果检测为小写,就跳转到大写的情况”对吧?错了!没有这种用法!!!编译器没有这么聪明!
你完全可以用ctypes.h里面的tolower函数,别管用户输入的是大写小写,一律转换为小写不就行了?
5、代码变量规范化。你隔上10天再来看看,你看得懂这一堆suma、sumb什么的?变量要规范!哪怕你英文不好,hu_luo_bo(胡萝卜)也比abc强!
6、在论坛发帖不要题目写的不明不白的,帖子一上来就要让大家看到重点、疑惑、自己推测的原因,不要隐藏到代码里面!
最后,不要把编程想得太简单,编程一定要规范化。还有,虽然我说的语气可能比较激烈,但是内容没问题,毕竟,前人踩过的坑后人还是不碰比较好。
如果我说的地方有哪里不对欢迎其他真~大神指出!
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
int main(void)
{
char ch;
float m, n, p, q;
double suma, sumb, sumc = 0.0;
m = 0;
n = 0;
p = 0; //洋蓟磅数//甜菜磅数//胡萝卜磅数
printf(
"*****************************************************************\n");
printf("a 洋蓟 b 甜菜\n");
printf("c 胡萝卜 q 退出\n");
printf(
"*****************************************************************\n");
printf("请输入要购买的菜类品种\n");
ch = (char)tolower(getchar());
if (ch != 'q')
{
switch (ch)
{
case 'a': {
printf("请输入要购买的洋蓟磅数\n");
scanf("%f", &q);
m += q;
break;
}
case 'b': {
printf("请输入要购买的甜菜磅数\n");
scanf("%f", &q);
n += q;
break;
}
case 'c': {
printf("请输入要购买的胡萝卜磅数\n");
scanf("%f", &q);
p += q;
break;
}
}
} // WHILE 结束
suma = m * 2.05 + n * 1.15 + p * 1.09;
sumb = m + n + p;
if (sumb <= 5)
{
sumc = 6.5;
}
else if (sumb < 20)
{
sumc = 14;
}
else
{
sumc = 14 + (sumb - 20) * 0.5;
}
printf("洋蓟售价为2.05美元/磅\n");
printf("矩菜售价为1.15美元/磅\n");
printf("胡萝卜售价为1.09美元/磅\n");
printf("您一共购买洋蓟%.2f磅\n", m);
printf("您一共购买甜菜%.2f磅\n", n);
printf("您一共购买胡萝卜%.2f磅\n", p);
printf("订购的蔬菜费用为%.2f\n", suma);
printf("您的订单总费用为%.2f\n", suma + sumc);
printf("您的订单折扣为%.2f\n", (suma + sumc) >= 100 ? suma * 0.05 : 0);
printf("您的运费和包装费为%.2f\n", sumc);
getchar();
return 0;
} 本帖最后由 zohoChou 于 2022-6-28 15:54 编辑
对了,还有一个小问题,但是大家都经常犯(我也是……),并且初学问题不大我就没有指出来,类型转换一定要注意。
你的float的suma那一堆应当使用double类型进行储存,因为下面运算时C自动识别的变量类型是double,从double到float是缩小了范围,当输入数字太大时可能会溢出(极小概率,但应当注意),所以给改成了double。
当然,你也可以在运算的那一步进行强制类型转换,将转换为float。初学者而言区别不大 本帖最后由 zohoChou 于 2022-6-28 16:07 编辑
又看到了逻辑问题:
一共只买一种菜对吧?
为什么下面printf出来了所有东西?
写到case里面不好?放在外面属实多此一举
1楼说的对,代码为什么要重复?
要是这样建议直接写个函数。
是多选菜单,要求输入买菜的种类,然后输入数量。可多次选择同一种菜。最后的一堆PRINTF是题目要求这样打印的。
对于float和double,现在的题目用不到这么大的数,后面如果用到了,会注意。 forestlxg 发表于 2022-6-28 16:06
是多选菜单,要求输入买菜的种类,然后输入数量。可多次选择同一种菜。最后的一堆PRINTF是题目要求这样打印 ...
那我改改,有没有原题目?我试着写个看看 zohoChou 发表于 2022-6-28 15:44
写的啥烂代码啊……
给你改了,错误一堆,初学也不能这个样子,我也是初学者,但是我干啥都规规矩矩的。
...
1、逻辑不清,clang编译的时候直接炸了,a,b,c都是干啥的?一看一堆unused,sumd你写了个if,然而还是没有任何作用,连printf输出都没有,就是很单纯的运算了一步,没了……没仔细看具体用途,但确实删除以后没有任何影响
2、代码未格式化,各种缩进大括号没点对的
3、while、break没学好就乱用。break只能退出当前的循环。你退出了switch的循环以后程序仍然在while的循环内部,然后程序再次判断ch的值,重复case-break-while形成死循环。
4、谁教你的case空置还不打大括号???我都没反应过来你写的啥……我明白你的意思
1 我发的这是一大段程序里我只截取了有问题的问题,简化了,其他没问题的,就没写。
2 截取的,所以有可能没格式化
3 break 就是为了退出switch,因为是要循环。
4 case 执行顺序就是后面的顺序执行,直到遇到BREAK;
5 case 'A':
case'a':
组合,是人为的,消除输入大小写的问题,可以增加判断大小写的函数,但这里没必要增加代码。至于能不能这样用,你还是先看看switch语句的说明吧。
6 sumd,这个变更是没用,我看题时,没看清,所以后面没用。
7 这题是C primer Plus里的第7级的练习题。 zohoChou 发表于 2022-6-28 16:07
那我改改,有没有原题目?我试着写个看看
原题如图 forestlxg 发表于 2022-6-28 16:23
1、逻辑不清,clang编译的时候直接炸了,a,b,c都是干啥的?一看一堆unused,sumd你写了个if,然而还是没 ...
很抱歉之前语气比较冲。
1.之前确实不知道你只截取了一部分,这个表示抱歉
2. 了解
3.这个问题你应该描述一下的(笑哭,因为认为是单次循环,故认为为笔误
4.5.对,但是部分老版本编译器可能会出现问题,所以个人建议提前转换以避免相关问题
6.ok
7.正在写的,过会发出来讨论讨论