鱼C论坛

 找回密码
 立即注册
查看: 3444|回复: 48

[已解决]有人可以帮我分析一下小甲鱼的程序吗?

[复制链接]
发表于 2022-4-12 11:32:56 | 显示全部楼层 |阅读模式

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

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

x
下面就是小甲鱼计算 10000 以内的素数个数的程序
#include <stdio.h>

int main() {
        int count = 2; // 已知2和3是素数
        int i, j;
        _Bool flag = 1;

        for (i = 5; i < 10000; i++) {
                for (j = 2; j < i / 2; j++) {
                        if (i % j == 0) {
                                flag = 0;
                                break;
                        }
                }

                if (flag) {
                        count++;
                } else {
                        flag = 1;
                }
        }

        printf("10000以内共有%d个素数!\n", count);

        return 0;
}

小甲鱼这样写的话,素数不会被重复计算吗?就比如13是一个素数,它不能被2整除会让count+1,不能被3整除又会让count+,不能被4整数又会让count+1这样子
if (flag) {
                        count++;
                } else {
                        flag = 1;
                }
uTools_1649734155835.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-12 11:51:18 | 显示全部楼层
已解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 12:33:44 | 显示全部楼层    本楼为最佳答案   
同题讨论见https://fishc.com.cn/thread-211741-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 12:52:07 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问问为什么这样子,我putchar啥都打印不了啊
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                if (ch >= 0 && ch <= 10) {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 12:52:42 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html

我输的范围是0到10,也是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 12:58:19 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

putchar 函数要一个数字,然后putchar函数查ascii表,找到这个数字对应的字符,然后输出这个字符
例如
putchar(48);
putchar查ascii表,发现48对应的字符是 0
然后putchar输出 字符0
putchar(48); 和 putchar('0'); 是一回事,一样的,写法不一样,效果完全一样,一个意思

https://fishc.com.cn/thread-67427-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:05:54 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
我输的范围是0到10,也是不行

字符0可不是数字0
字符是用ascii码表示的
是用数字48来表示字符0的
$ cat main.c 
#include <stdio.h>

int main(void) {
    if('0' == 0) printf("'0' == 0\n");
    if('0' == 48) printf("'0' == 48\n");
    printf("%d\n", '0');
    return 0;
}
$ gcc-debug -o main main.c
$ ./main 
'0' == 48
48
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:08:48 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

你要明白,字符里面没有10
是字符1后面放一个字符0
不是字符10
没有字符10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:10:55 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                if (ch >= '0' && ch <= '9') {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                if (ch >= 48 && ch <= 57) {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:11:54 | 显示全部楼层
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                //if (ch >= 48 && ch <= 57) {
                if (ch >= '0' && ch <= 57) {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}
#include <stdio.h>

int main() {
        int ch;
        printf("请输入:");

        while ((ch = getchar()) != '\n') {
                //if (ch >= 0 && ch <= 10) {
                //if (ch >= 48 && ch <= 57) {
                //if (ch >= '0' && ch <= 57) {
                if (ch >= 48 && ch <= '9') {
                        putchar(ch);
                }

        }

        putchar('\n');

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:32:16 | 显示全部楼层

呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符打印出来,如果在循环里面就是结束了循环才会输出吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:34:57 | 显示全部楼层
1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...

没看懂你的问题
putchar函数会输出可打印字符,控制字符不输出
其中,ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:36:32 | 显示全部楼层
1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...

也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打印出来
和循环无关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:44:53 | 显示全部楼层
本帖最后由 1613551 于 2022-4-12 13:46 编辑
人造人 发表于 2022-4-12 13:36
也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打 ...


就比如小甲鱼的这个程序
#include <stdio.h>

int main()
{
        int ch;

        printf("请输入明文:");

        while ((ch = getchar()) != '\n')
        {
                if (ch >= 'a' && ch <= 'z')
                {
                        putchar('a' + (ch - 'a' + 3) % 26);
                        continue;
                }

                if (ch >= 'A' && ch <= 'Z')
                {
                        putchar('A' + (ch - 'A' + 3) % 26);
                        continue;
                }

                putchar(ch);
        }

        putchar('\n');

        return 0;
}
当执行到这一步的时候为什么没有把值给输出出来呢?
 putchar('a' + (ch - 'a' + 3) % 26);
是因为当时ch里面还没有值,是等于\n的时候,geichar()才把值给ch,然后putchar才输出的吗?
 while ((ch = getchar()) != '\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:46:22 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把ch的值给输出出来呢?

第几行的putchar ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:47:47 | 显示全部楼层
人造人 发表于 2022-4-12 13:46
第几行的putchar ?

第13和第19,就是当执行到这一步的时候为什么没有把putchar里面的值给输出出来,而是当while的值为0,结束循环的时候才输出putchar的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:49:50 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?

第13行的putchar要不要执行,这取决于第11行的if
第11行的if条件成立就执行13行和14行,不成立就不执行13行和14行
19行和20行由17行的if来决定要不要执行
23行的putchar只要是ch不是 '\n'就一定会执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:50:11 | 显示全部楼层
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...

一、
putchar()函数是输出一个字符
当给它的参数不是一个字符常量如“A”,也不是字符变量,如之前有定义
char a = 'A';
而是一个整型数,如65,那么putchar()函数输出的是以这个整型数为ASCII码所代表的字符,即“A”(字符A的ASCII码是65)

又因为0~31、127号ASCII码代表的都是控制字符,而非可见字符,所以你传入0~9当然什么都看不到(至于单拎10出去,这又是另一个问题了,见下)

二、
因为这里定义的ch是整型,如果你按照上面的思路进行修改可输入的范围,如
if(char >= 32 && char <= 126)
(该范围ASCII码代表可见字符)
再次运行程序,输入比如65(试图输出字符“A“)
你会发现还是什么都没有

这里是因为getchar()同样一次只接收一个字符,你输入65实际上是因为while循环两次的结果
等同于
getchar(6);
getchar(5);
结合第一段,所以什么都没有才是正确结果

三、
关于修改
最简单的是把ch定义为char类型,然后把if判断去掉(或者对着ASCII码表来选定你想要限制的输入范围)

如果执意要用int类型,那么就把输入函数换掉,getchar()一次只能接收一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 13:52:49 | 显示全部楼层
1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序

当执行到这一步的时候为什么没有把值给输出出来呢?

第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10行到24行之间,所以9行的while决定要不要执行11行的if
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 13:58:34 | 显示全部楼层
人造人 发表于 2022-4-12 13:52
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10 ...

不是的,这些我知道,我在想要怎么给你解释这个问题,这个问题困扰了我好久
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 22:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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