吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 616|回复: 21
收起左侧

[求助] C语言求助!!!!!显示问题!!

[复制链接]
forestlxg 发表于 2022-6-28 13:10
[Asm] 纯文本查看 复制代码
#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
int main(void)
{
    char ch;
    int  i,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;
}
问题显示.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

康娜喵 发表于 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空置还不打大括号???我都没反应过来你写的啥……我明白你的意思

[C] 纯文本查看 复制代码
case 'a':
case 'A':
    XXX;

上面这玩意应该说的是“如果检测为小写,就跳转到大写的情况”对吧?错了!没有这种用法!!!编译器没有这么聪明!
你完全可以用ctypes.h里面tolower函数,别管用户输入的是大写小写,一律转换为小写不就行了?
5、代码变量规范化。你隔上10天再来看看,你看得懂这一堆suma、sumb什么的?变量要规范!哪怕你英文不好,hu_luo_bo(胡萝卜)也比abc强!
6、在论坛发帖不要题目写的不明不白的,帖子一上来就要让大家看到重点、疑惑、自己推测的原因,不要隐藏到代码里面!

最后,不要把编程想得太简单,编程一定要规范化。还有,虽然我说的语气可能比较激烈,但是内容没问题,毕竟,前人踩过的坑后人还是不碰比较好。
如果我说的地方有哪里不对欢迎其他真~大神指出!



[C] 纯文本查看 复制代码
#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,现在的题目用不到这么大的数,后面如果用到了,会注意。
问题显示.jpg
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
那我改改,有没有原题目?我试着写个看看

原题如图
3.jpg
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.正在写的,过会发出来讨论讨论
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表