鱼C论坛

 找回密码
 立即注册
查看: 158|回复: 3

[已解决]求助:课后作业复制小甲鱼的代码运行结果不一样

[复制链接]
发表于 2024-10-20 18:04:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
S1E21:指针 | 课后测试题及答案
https://fishc.com.cn/thread-71653-1-1.html
(出处: 鱼C论坛)

动动手第0题,我复制了小甲鱼给的答案:
#include <stdio.h>

int main(void)
{
        int a, b, c, t;
        int *pa, *pb, *pc;
        
        printf("请输入三个数:");
        scanf("%d%d%d", &a, &b, &c);
        
        pa = &a;
        pb = &b;
        pc = &c;
        
        if (a > b)
        {
                t = *pa;
                *pa = *pb;
                *pb = t;
        }
        
        if (a > c)
        {
                t = *pa;
                *pa = *pc;
                *pc = t;
        }
        
        if (b > c)
        {
                t = *pb;
                *pb = *pc;
                *pc = t;
        }
        
        printf("%d <= %d <= %d\n", *pa, *pb, *pc);
        printf("%d <= %d <= %d\n", a, b, c);
        
        return 0;
}


(见图片)

为什么会这么奇怪??
最佳答案
2024-10-20 18:25:24
本帖最后由 jackz007 于 2024-10-20 18:49 编辑

        如果键盘输入语句这样写:
       scanf("%d%d%d", &a, &b, &c) ;
        那么,键盘输入必须是这样:
1 5 3
        就是说,1 5 3 之间的分隔字符是空格,不可以使用逗号

        如果键盘输入语句是这样写的:
       scanf("%d,%d,%d", &a, &b, &c) ;
        那么,键盘输入才可以这样:
1,5,3
        通常情况下,为了避免不必要的麻烦,应该尽量选择前者,也就是以空格作为输入分隔符。
   
        此外,利用三目运算符可以大幅度简化代码:
#include <stdio.h>

int main(void)
{
        int a, b, c, t                                                         ;
        int *pa, *pb, *pc                                                      ;
        
        printf("请输入三个数:")                                               ;
        scanf("%d%d%d", &a, &b, &c)                                            ;
        
        pa = (a < b && a < c) ? & a : (b < a && b < c) ? & b : & c             ;
        pc = (a > b && a > c) ? & a : (b > a && b > c) ? & b : & c             ;
        pb = (b + c == * pa + * pc) ? & a : (a + c == * pa + * pc) ? & b : & c ;
        
        printf("%d <= %d <= %d\n", *pa, *pb, *pc)                              ;

        return 0;
}
        编译、运行实况:
D:\[exercise]\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.31.31107 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.31.31107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

D:\[exercise]\C>x
请输入三个数:1 5 3
1 <= 3 <= 5

D:\[exercise]\C>

运行结果

运行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-20 18:04:12 | 显示全部楼层
你好,看起来你在复制代码时不小心遗漏了一些部分。以下是小甲鱼给的完整代码模板,你可以试着再复制一次,并确认是否有遗漏:
#include <stdio.h>

int main(void)
{
    int a, b, c, t;
    int *pa, *pb, *pc;

    printf("请输入三个数:");
    scanf("%d%d%d", &a, &b, &c);

    pa = &a;
    pb = &b;
    pc = &c;

    if (a > b)
    {
        t = *pa;
        *pa = *pb;
        *pb = t;
    }

    if (a > c)
    {
        t = *pa;
        *pa = *pc;
        *pc = t;
    }

    if (b > c)
    {
        t = *pb;
        *pb = *pc;
        *pc = t;
    }

    printf("从小到大排序为:%d %d %d\n", a, b, c);

    return 0;
}

确保:
1. 头文件`#include <stdio.h>`正确包含。
2. 完整的`printf`和`scanf`部分。
3. 比较和交换的逻辑部分没有遗漏。

如果仍然遇到运行结果不一致的问题,请检查是否有语法错误或编译时产生警告。希望这个回答能帮助到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 18:25:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-10-20 18:49 编辑

        如果键盘输入语句这样写:
       scanf("%d%d%d", &a, &b, &c) ;
        那么,键盘输入必须是这样:
1 5 3
        就是说,1 5 3 之间的分隔字符是空格,不可以使用逗号

        如果键盘输入语句是这样写的:
       scanf("%d,%d,%d", &a, &b, &c) ;
        那么,键盘输入才可以这样:
1,5,3
        通常情况下,为了避免不必要的麻烦,应该尽量选择前者,也就是以空格作为输入分隔符。
   
        此外,利用三目运算符可以大幅度简化代码:
#include <stdio.h>

int main(void)
{
        int a, b, c, t                                                         ;
        int *pa, *pb, *pc                                                      ;
        
        printf("请输入三个数:")                                               ;
        scanf("%d%d%d", &a, &b, &c)                                            ;
        
        pa = (a < b && a < c) ? & a : (b < a && b < c) ? & b : & c             ;
        pc = (a > b && a > c) ? & a : (b > a && b > c) ? & b : & c             ;
        pb = (b + c == * pa + * pc) ? & a : (a + c == * pa + * pc) ? & b : & c ;
        
        printf("%d <= %d <= %d\n", *pa, *pb, *pc)                              ;

        return 0;
}
        编译、运行实况:
D:\[exercise]\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.31.31107 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.31.31107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

D:\[exercise]\C>x
请输入三个数:1 5 3
1 <= 3 <= 5

D:\[exercise]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-21 12:38:45 | 显示全部楼层
jackz007 发表于 2024-10-20 18:25
如果键盘输入语句这样写:

        那么,键盘输入必须是这样:

已解决,感谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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