学术诚信声明:

    本人郑重承诺,本篇报告选题与内容不存在剽窃、抄袭他人的学术观点、思想和成果,不存在篡改、伪造实验数据,如有违规行为发生,本人愿承担由此产生的一切法律责任。

1.选题与准备

1.1选题

希望更进一步了解角谷程序运行的过程

1.2环境准备

        操作系统:Windows11

        编译器:Dev-C++,VScode和gcc版本

        辅助工具:搜索引擎,AI工具等

2.编译调试过程

2.1初始编译与错误分析

        main函数返回值错误,C语言中void main是非标准写法;

        缺少<conio.h>头文件;

        包含错误特殊字符;

2.2错误修正

        void main()改为int main(),在代码最后添加"return 0;";

        加上#include <conio.h>;

        删除37行的错误特殊字符;

2.3反复调试

3.代码理解与重命名

3.1运行测试

角谷猜想

3.2代码解析

(一)任取一个正整数,如果是偶数,就除以2

(二)如果是奇数,就乘3加1

(三)重复上述操作,最终结果一定会收敛到1

3.3重命名

082Jiaogu_conjecture.c

4.使用VSCode管理项目

4.1VSCode环境配置

        安装C/C++,C/C++ Extension Pack,C/C++ Themes,Chinese(Simplified)(简体中文)Language Pack for Visual Studio Code,Code Runner等插件,安装git,配置环境变量

4.2在VSCode中编译运行

5.代码版本管理

5.1Gitee仓库创建

5.2VSCode中集成Git

6.总结

角谷猜想(考拉兹猜想)的核心逻辑是对任意自然数,偶数除以2、奇数乘3加1,最终都会收敛到1。本次针对代码的修复过程,既暴露了基础编码的典型问题,也反映出C语言在算法实现中的特性与发展方向,以下从技术挑战、优化建议、语言发展思考三方面展开分析。

一、技术挑战反思:编码与逻辑的核心问题

1. 语法与标准合规性问题

(1) 主函数定义不规范:代码中void main()并非C语言标准定义(标准为int main()并返回0),部分编译器会报警告或编译失败,违背了C语言的标准化编程原则。

(2)非标准函数的移植性风险:clrscr()(清屏)、getch()(无回显输入)属于DOS下的conio.h库函数,在Linux、macOS等现代系统中无法运行,导致代码跨平台性极差;puts()与printf()混用虽无语法错误,但输出格式一致性不足,增加了阅读成本。

(3)格式控制符与表达式错误:printf中(n-1)/3的写法逻辑混乱(奇数处理应为n*3+1,无需反向推导),且2*n在偶数输出中属于冗余计算,同时存在格式字符串与参数匹配的潜在风险(如步长计数count的自增时机)。

2. 逻辑与边界处理缺陷

(1)输入验证缺失:未对输入的非正整数(如负数、0以外的非自然数)做判断,若输入负数,会陷入无限循环(如n=-1时,-1*3+1=-2,再除以2得-1,循环往复)。

(2)变量初始化与重置问题:count(步数计数)在每次验证后未重置为0,导致多次输入数字时,步数会持续累加,输出结果失真。

(3)循环终止条件的隐性风险:do-while(n!=1)在n=1时虽能终止,但初始输入1时仍会执行一次循环体,逻辑上存在冗余。

3. 代码可读性与可维护性问题

      缺少注释说明关键逻辑(如步数计数的意义、循环的终止条件),变量命名(n、count虽简单但无歧义,可优化)与代码缩进虽清晰,但关键步骤的拆分不足,降低了调试效率。

二、代码优化建议:从合规性到性能的全面提升

1. 基础语法与移植性优化

     统一主函数标准:将void main()改为int main(),并在末尾添加return 0;,符合C89/C99标准。

     替换非标准函数:用标准库函数实现跨平台兼容,如用system("clear")(Linux)/system("cls")(Windows)替代clrscr(),用getchar()替代getch();移除冗余的puts(),统一使用printf()格式化输出,提升代码一致性。

     修正表达式错误:删除(n-1)/3与2*n的冗余计算,直接输出n的原始值与计算后结果,如奇数处理改为printf(">> Step No.%d: %d*3+1=%d\n", ++count, n, n*3+1);。

2. 逻辑与边界条件优化

(1) 增加输入验证:在scanf后添加判断,若n<1且n!=0,提示“请输入正整数”并重新输入,避免负数导致的死循环。 

(2)重置计数变量:在每次进入验证逻辑前,将count重置为0,确保多次输入的步数独立统计。

 (3)优化循环结构:对初始输入n=1的情况,直接输出“已为1,无需计算”,跳过do-while循环,减少冗余执行。

3. 性能与可读性优化

(1)减少变量冗余:若无需保留原始输入值,可直接复用n;若需保留,新增temp变量存储计算过程值,提升代码可读性。

(2)增加注释与模块化:将角谷猜想的核心计算逻辑封装为独立函数(如int collatz(int num, int *count)),主函数仅负责输入输出与调用,降低代码耦合度。

(3)优化循环效率:对大数计算,可通过位运算替代除法(如n/2改为n>>1),但需注意C语言中整数除法的特性,确保逻辑一致。

三、对C语言发展的思考

1. C语言的特性与局限性

(1)优势:C语言的高效性、底层操控能力使其在算法实现中仍具不可替代性,角谷猜想的循环与数值计算能充分体现其执行效率;语法简洁性也让核心逻辑易于表达。

(2)局限:本次代码暴露的移植性问题,反映出C语言缺乏跨平台的标准库支持(如控制台操作、输入输出),需依赖第三方库或系统调用;同时,C语言的弱类型检查(如格式符与参数不匹配仅报警告)易导致运行时错误,对编程者的规范性要求较高。

2. C语言的发展趋势与适配性

(1)标准化与现代化:C11/C17/C23标准不断完善,新增了安全函数(如scanf_s)、泛型编程等特性,可有效解决传统编码中的安全与移植性问题,在角谷猜想代码中,使用scanf_s替代scanf能减少缓冲区溢出风险。

(2)与现代编程的结合:C语言虽为底层语言,但可通过与Python、Java等高级语言混合编程,弥补其在跨平台、快速开发上的不足;例如,用Python实现跨平台的输入输出,用C语言实现角谷猜想的核心计算,兼顾效率与便捷性。

(3) 嵌入式与高性能计算场景的持续应用:角谷猜想作为数论算法,其大规模验证(如超大数计算)需依赖C语言的高性能,结合GPU加速、并行计算等技术,可进一步提升算法效率,这也体现了C语言在高性能计算领域的不可替代性。

3. 对编程实践的启示

(1)标准化编程是基础:本次代码的语法问题源于对C语言标准的忽视,实际开发中需严格遵循标准,减少因编译器差异导致的兼容性问题。

(2)算法与语言特性的结合:在实现数学算法时,需充分利用C语言的数值计算特性,同时规避其语法陷阱(如整数溢出、循环边界);对于角谷猜想的超大数验证,可结合C语言的long long或第三方大数库,突破原生数值类型的范围限制。

修复古老代码,可以了解以前的代码和现在的差异,虽然调试的过程很枯燥,但结果运行出来的那一刻还是很激动的,并且通过调试代码,可以丰富C语言知识面,了解更多代码错误类型。

修复古老代码,可以了解以前的代码和现在的差异,虽然调试的过程很枯燥,但结果运行出来的那一刻还是很激动的,并且通过调试代码,可以丰富C语言知识面,了解更多代码错误类型。

附录

代码地址https://gitee.com/leng-ganan/mycode.git

相关参考资料【VSCode运行c或者c++代码-哔哩哔哩】 https://b23.tv/wHC2ogS

                      【如何使用vscode编写和运行c或者c++代码-哔哩哔哩】 https://b23.tv/41nicwB

                      【vscode使用教程【2025最新】vscode安装教程vscode配置c/c++教程vscode怎么                          设置中文-哔哩哔哩】 https://b23.tv/M7EPN14

                      【3_VSCode+git上传代码到gitee仓库-哔哩哔哩】 https://b23.tv/DNkq7pn

                      【推送自己本地的项目到gitee远程仓库-哔哩哔哩】 https://b23.tv/3L3wkVh

                      【VSCode提交代码到gitee码云-哔哩哔哩】 https://b23.tv/M2ac7n7

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐