forestlxg 发表于 2022-6-28 13:10

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;
}

康娜喵 发表于 2022-6-28 15:28

因为你的getchar放在末尾了,末尾读了就重新开始下一个循环了,所以建议使用do while而不是while

zohoChou 发表于 2022-6-28 15:44

本帖最后由 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:48

本帖最后由 zohoChou 于 2022-6-28 15:54 编辑

对了,还有一个小问题,但是大家都经常犯(我也是……),并且初学问题不大我就没有指出来,类型转换一定要注意。


你的float的suma那一堆应当使用double类型进行储存,因为下面运算时C自动识别的变量类型是double,从double到float是缩小了范围,当输入数字太大时可能会溢出(极小概率,但应当注意),所以给改成了double。

当然,你也可以在运算的那一步进行强制类型转换,将转换为float。初学者而言区别不大

zohoChou 发表于 2022-6-28 15:59

本帖最后由 zohoChou 于 2022-6-28 16:07 编辑

又看到了逻辑问题:
一共只买一种菜对吧?
为什么下面printf出来了所有东西?
写到case里面不好?放在外面属实多此一举

1楼说的对,代码为什么要重复?
要是这样建议直接写个函数。

forestlxg 发表于 2022-6-28 16:06

是多选菜单,要求输入买菜的种类,然后输入数量。可多次选择同一种菜。最后的一堆PRINTF是题目要求这样打印的。
对于float和double,现在的题目用不到这么大的数,后面如果用到了,会注意。

zohoChou 发表于 2022-6-28 16:07

forestlxg 发表于 2022-6-28 16:06
是多选菜单,要求输入买菜的种类,然后输入数量。可多次选择同一种菜。最后的一堆PRINTF是题目要求这样打印 ...

那我改改,有没有原题目?我试着写个看看

forestlxg 发表于 2022-6-28 16:23

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级的练习题。

forestlxg 发表于 2022-6-28 16:29

zohoChou 发表于 2022-6-28 16:07
那我改改,有没有原题目?我试着写个看看

原题如图

zohoChou 发表于 2022-6-28 16:33

forestlxg 发表于 2022-6-28 16:23
1、逻辑不清,clang编译的时候直接炸了,a,b,c都是干啥的?一看一堆unused,sumd你写了个if,然而还是没 ...

很抱歉之前语气比较冲。
1.之前确实不知道你只截取了一部分,这个表示抱歉
2. 了解
3.这个问题你应该描述一下的(笑哭,因为认为是单次循环,故认为为笔误
4.5.对,但是部分老版本编译器可能会出现问题,所以个人建议提前转换以避免相关问题
6.ok
7.正在写的,过会发出来讨论讨论
页: [1] 2 3
查看完整版本: C语言求助!!!!!显示问题!!