鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 10

[已解决]这串代码的运行思路是什么?

[复制链接]
发表于 2023-2-11 12:42:10 | 显示全部楼层 |阅读模式

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

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

x
我没搞懂这串代码的运行,有大佬可以解释一下吗?
最佳答案
2023-2-11 15:45:48
时十陵 发表于 2023-2-11 15:31
如果可以的话,麻烦模拟一下,我用VS调试没有弄明白

代码大概是这样的吧:
#include <stdio.h>
int fun(int *a, int n) {
        int i, j;
        for (i = 0, j = 0; i < n; ++i)
                if (a[i] % 2 == 1)
                        a[j++] = a[i];
        return j;
}
int main() {
        int a[] = {1, 2, 3, 4, 5, 6}, i, k;
        k = fun(a, 6);
        for (i = 0; i < k; ++i)
                printf("%3d", a[i]);
        getchar();
}
调用 fun
  • 循环开始前,i = 0, j = 0, a : 1, 2, 3, 4, 5, 6
  • 第一次循环,i = 0, j = 0, a0 % 2 == 1,也就是奇数,所以就先把 a0 设为 a0,再将 j++,此时 a : 1, 2, 3, 4, 5, 6
  • 第二次循环,i = 1, j = 1, a1 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 2, 3, 4, 5, 6
  • 第三次循环,i = 2, j = 1, a2 % 2 == 1,也就是奇数,所以就先把 a1 设为 a2,再将 j++,此时 a : 1, 3, 3, 4, 5, 6
  • 第四次循环,i = 3, j = 2, a3 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 3, 3, 4, 5, 6
  • 第五次循环,i = 4, j = 2, a4 % 2 == 1,也就是奇数,所以就先把 a2 设为 a4,再将 j++,此时 a : 1, 3, 5, 4, 5, 6
  • 第六次循环,i = 6, j = 3, a5 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 3, 5, 4, 5, 6
  • 第七次循环,i < n 不成立,所以退出

fun 返回 j,也就是 3
回到 main,k 被设为了 3,k 在这里表示长度,原本是 6,现在是 3
输出前 3 项,也就是 1 3 5,这个也就间接性的筛掉了 a 中的偶数
8d46d59b7c4254f658f1aeaa3a7f166.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-11 13:03:19 | 显示全部楼层
请解释一下什么是 void int 类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 13:05:47 | 显示全部楼层
fun 就是把 a 里面的偶数删掉,当然这里不是真正意义上的删掉,而是仅仅将奇数移到前面,在将长度减少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 13:06:17 | 显示全部楼层
zhangjinxuan 发表于 2023-2-11 13:03
请解释一下什么是 void int 类型

同意
《空整数》,你开玩笑吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 13:06:33 From FishC Mobile | 显示全部楼层
int main(void)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 13:07:33 | 显示全部楼层

他这都能写反,有点佩服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 13:08:52 | 显示全部楼层
有些东西我们眼睛看也许就能看出来,这个也不是什么特别难的算法,你可以在纸上模拟,如果真的要让我来帮你模拟的话……随便吧,也许你只是不知道模拟的方法

评分

参与人数 1荣誉 +2 鱼币 +5 贡献 +2 收起 理由
时十陵 + 2 + 5 + 2 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2023-2-11 15:29:27 From FishC Mobile | 显示全部楼层
是void main  我用的是别人的图,在编译器上运行之后忘记改了,但是这段代码我没有弄明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-11 15:31:22 From FishC Mobile | 显示全部楼层
zhangjinxuan 发表于 2023-2-11 13:08
有些东西我们眼睛看也许就能看出来,这个也不是什么特别难的算法,你可以在纸上模拟,如果真的要让我来帮你 ...

如果可以的话,麻烦模拟一下,我用VS调试没有弄明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 15:45:48 | 显示全部楼层    本楼为最佳答案   
时十陵 发表于 2023-2-11 15:31
如果可以的话,麻烦模拟一下,我用VS调试没有弄明白

代码大概是这样的吧:
#include <stdio.h>
int fun(int *a, int n) {
        int i, j;
        for (i = 0, j = 0; i < n; ++i)
                if (a[i] % 2 == 1)
                        a[j++] = a[i];
        return j;
}
int main() {
        int a[] = {1, 2, 3, 4, 5, 6}, i, k;
        k = fun(a, 6);
        for (i = 0; i < k; ++i)
                printf("%3d", a[i]);
        getchar();
}
调用 fun
  • 循环开始前,i = 0, j = 0, a : 1, 2, 3, 4, 5, 6
  • 第一次循环,i = 0, j = 0, a0 % 2 == 1,也就是奇数,所以就先把 a0 设为 a0,再将 j++,此时 a : 1, 2, 3, 4, 5, 6
  • 第二次循环,i = 1, j = 1, a1 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 2, 3, 4, 5, 6
  • 第三次循环,i = 2, j = 1, a2 % 2 == 1,也就是奇数,所以就先把 a1 设为 a2,再将 j++,此时 a : 1, 3, 3, 4, 5, 6
  • 第四次循环,i = 3, j = 2, a3 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 3, 3, 4, 5, 6
  • 第五次循环,i = 4, j = 2, a4 % 2 == 1,也就是奇数,所以就先把 a2 设为 a4,再将 j++,此时 a : 1, 3, 5, 4, 5, 6
  • 第六次循环,i = 6, j = 3, a5 % 2 == 0,也就是偶数,也就什么都不做,此时 a : 1, 3, 5, 4, 5, 6
  • 第七次循环,i < n 不成立,所以退出

fun 返回 j,也就是 3
回到 main,k 被设为了 3,k 在这里表示长度,原本是 6,现在是 3
输出前 3 项,也就是 1 3 5,这个也就间接性的筛掉了 a 中的偶数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-11 16:10:14 From FishC Mobile | 显示全部楼层
zhangjinxuan 发表于 2023-2-11 15:45
代码大概是这样的吧:

调用 fun

明白了,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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