有人可以帮我分析一下小甲鱼的程序吗?
下面就是小甲鱼计算 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;
} 已解决 同题讨论见https://fishc.com.cn/thread-211741-1-1.html 风车呼呼呼 发表于 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;
} 风车呼呼呼 发表于 2022-4-12 12:33
同题讨论见https://fishc.com.cn/thread-211741-1-1.html
我输的范围是0到10,也是不行 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 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
$
1613551 发表于 2022-4-12 12:52
老哥我还有一点想不明白,我到现在还是没有搞懂,putchar函数怎么用的,小甲鱼的解释有点奇怪,我就想问 ...
你要明白,字符里面没有10
是字符1后面放一个字符0
不是字符10
没有字符10 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;
}
#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;
}
人造人 发表于 2022-4-12 13:11
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符打印出来,如果在循环里面就是结束了循环才会输出吗? 1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...
没看懂你的问题
putchar函数会输出可打印字符,控制字符不输出
其中,ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备 1613551 发表于 2022-4-12 13:32
呜呜呜,懂了懂了,但是我还有最后一个疑惑,putchar的输出条件是什么呢?也就是putchar什么时候会把字符 ...
也就是putchar什么时候会把字符打印出来
在你给putchar的数字是可打印字符的时候,putchar就会把字符打印出来
和循环无关 本帖最后由 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') 1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序
当执行到这一步的时候为什么没有把ch的值给输出出来呢?
第几行的putchar ?
人造人 发表于 2022-4-12 13:46
第几行的putchar ?
第13和第19,就是当执行到这一步的时候为什么没有把putchar里面的值给输出出来,而是当while的值为0,结束循环的时候才输出putchar的值 1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序
当执行到这一步的时候为什么没有把值给输出出来呢?
第13行的putchar要不要执行,这取决于第11行的if
第11行的if条件成立就执行13行和14行,不成立就不执行13行和14行
19行和20行由17行的if来决定要不要执行
23行的putchar只要是ch不是 '\n'就一定会执行
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()一次只能接收一个字符 1613551 发表于 2022-4-12 13:44
就比如小甲鱼的这个程序
当执行到这一步的时候为什么没有把值给输出出来呢?
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10行到24行之间,所以9行的while决定要不要执行11行的if
人造人 发表于 2022-4-12 13:52
第11行的if要不要执行,这取决于第9行的while
while条件成立就执行10行到24行的内容
11行的if自然在10 ...
不是的,这些我知道,我在想要怎么给你解释这个问题,这个问题困扰了我好久