摘要

        本报告基于选题编号78的古老C语言代码,完成了一个糖果分配平衡模拟程序的现代化改造与深度分析。通过系统性的问题解决流程,将原始代码成功迁移至现代开发环境,并实现了完整的技术文档化。

1.选题与准备

1.1选题

  • 选题编号:78

  • 程序功能:糖果分配平衡模拟

  • 原始文件:78.c

1.2环境准备

  • 操作系统:Windows 11

  • 编译器:Dev-C++ 5.11 / VSCode + MinGW

  • 调试工具:GCC

  • 辅助工具:百度引擎,CSDN

2.编译调试过程

2.1初始编译与错误分析

       将78号文件夹复制至本地工作路径后,用Dev - C++打开78.c文件并执行编译操作,系统提示多项编译错误。经分析,错误根源均为代码采用的老式C语言语法与现行C语言标准不兼容,具体错误如下:

1.    D:\Download\GameCode155\078\78.c    [Error] stray '\32' in program

  • 在程序中出现了不合法的字符'\32'

  • \32 是八进制表示,对应十进制的 26,这是一个不可见的控制字符

2.[{
    "resource": "/d:/Download/GameCode155/078/78.c",
    "owner": "cpptools",
    "severity": 4,
    "message": "implicit declaration of function 'clrscr'; did you mean '_lrotr'? [-Wimplicit-function-declaration]",
    "source": "gcc",
    "startLineNumber": 10,
    "startColumn": 5,
    "endLineNumber": 10,
    "endColumn": 5
}]

  • implicit declaration of function 'clrscr':编译器发现你使用了 clrscr() 这个函数,但没有找到它的声明

  • did you mean '_lrotr'?:编译器猜测你可能想用的是 _lrotr 函数(因为名字相似)

  • [-Wimplicit-function-declaration]:这是一个警告,告诉你函数没有显式声明

3.[{
    "resource": "/d:/Download/GameCode155/078/78.c",
    "owner": "cpptools",
    "severity": 4,
    "message": "implicit declaration of function 'getch'; did you mean 'getc'? [-Wimplicit-function-declaration]",
    "source": "gcc",
    "startLineNumber": 28,
    "startColumn": 5,
    "endLineNumber": 28,
    "endColumn": 5
}]

getch() 函数在旧版本的 Turbo C 等编译器中存在于 conio.h 头文件中,但在现代C编译器中:

  • 要么不存在

  • 要么需要不同的头文件

  • 要么有不同的名称

2.2错误修正

1.代码中出现了一个编译器无法识别的非法字符,这通常是由于从网页、文档等地方复制粘贴代码时,带入了一些隐藏的、不可见的特殊字符,统一使用无 BOM 的 UTF-8 编码即可。    

2.

#include<stdlib.h>  // 添加这个头文件
system("cls");  // 替换 clrscr()

3.

// 把这一行:
printf("\n Press any key to quit...");
getch();

// 改为:
printf("\n Press Enter to quit...");
getchar();

2..3反复调试

经纠错代码,对齐运行系统与文件编码后,成功实现了编译并运行如下图:

3.代码理解与重命名

3.1运行测试

 对修改后的程序进行完整运行测试,其执行流程与功能表现如下:

主要表现为

模拟10个孩子围成一圈进行糖果分配的过程,直到所有孩子拥有相同数量的糖果为止。

3.2代码解析

1. 初始化阶段

  • 初始化10个孩子的糖果数:[10,2,8,22,16,4,10,6,14,20]

  • t[10] 用于临时存储每个孩子分出去的糖果数

2. 显示初始状态

打印初始状态

3. 核心循环逻辑

1)分糖规则(重点)

if (sweet[i] % 2 == 0)
    t[i] = sweet[i] = sweet[i] / 2;      // 情况A:偶数直接分
else
    t[i] = sweet[i] = (sweet[i] + 1) / 2; // 情况B:奇数先加1再分

关键点分析:
• t[i]:临时存储每个孩子要分出的糖果数
• sweet[i] = ...:更新孩子自己剩余的糖果数
• 这个过程完成后,每个孩子手中剩下原来一半(或一半减0.5)的糖果。

2)传递规则

for (l = 0; l < 9; l++)
    sweet[l + 1] = sweet[l + 1] + t[l];  // 前9个孩子向右传递
sweet[0] += t[9];  // 第10个孩子传递给第1个孩子

环形结构实现:
• 这是一个典型的约瑟夫环结构模拟
• 第i个孩子分给第i+1个孩子,最后一个分给第一个
• 确保了系统的封闭性(糖果总数可能变化,但没有糖果丢失)

总而言之总结为:

// 当糖果数不相等时继续循
// 第一步:每个孩子分出一半糖果
// 偶数直接分一半
// 奇数加1后分一半
// 第二步:传递糖果给右边邻居
// 右边孩子接收左边孩子的糖果  
// 第一个孩子接收最后一个孩子的糖果
// 打印本轮结果

终止条件

judge() 函数检查所有元素是否相等:

3.3重命名

据程序功能,我将其命名为“78+糖果分配问题”。

4.使用VS Code 管理项目

4.1VSCode环境配置

4.1.1 必要扩展安装
  • C/C++ (Microsoft)

  • C/C++ Extension Pack

  • Code Runner

4.1.2配置文件

配置gcc编译器:安装gcc编译器后,在Windows系统环境变量的Path路径中添加gcc安装目录,确保VSCode能够调用编译器。

4.2在VSCode中编译运行

# 在VSCode终端中编译
gcc -o 78+糖果分配问题.exe 78+糖果分配问题.c

# 运行程序
./78+糖果分配问题.exe

#与Dev - C++运行效果完全一致,实现了代码在VSCode中的稳定运行。

5.代码版本管理

5.1前期准备工作

  1. 安装 Git
    访问 Git 官网 下载并安装 Git。安装后,在终端输入 git --version 验证安装成功。

  2. 在VS code中gitee和gielens两个插件可以实现vscode与gitee的稳定传输。

  3. 配置 Git 用户信息
    打开 VSCode 终端,设置用户名和邮箱(提交记录会使用这些信息):

    bash

    git config --global user.name "用户名"
    git config --global user.email "邮箱"

  4. 注册 Gitee 账号并创建仓库

    • 访问 Gitee 官网 注册账号。

    • 登录后,点击页面右上角的 “+” 号,选择 “新建仓库”

    • 填写仓库名称

5.2上传项目到 Gitee

  1. 在 VSCode 中初始化 Git 仓库

    • 用 VSCode 打开 C语言项目文件夹

    • 点击左侧活动栏的 源代码管理图标(或按 Ctrl+Shift+G),在源代码管理面板中点击 “初始化仓库”。这会在你的项目根目录创建一个 .git 文件夹。

  2. 关联 Gitee 远程仓库
    在 VSCode 终端中执行(将 用户名 和 仓库名 替换为实际信息):

    bash

    git remote add origin https://gitee.com/用户名/仓库名.git

    使用 git remote -v 可以检查是否关联成功。

  3. 提交并推送代码

    • 在 VSCode 源代码管理面板,暂存更改:点击文件旁边的 + 号,或使用 git add . 命令。

    • 提交更改:在提交信息框输入简要说明(如 "初次提交:糖果"),然后按 Ctrl+Enter 提交。

    • 推送到 Gitee:在终端执行 git push -u origin master(这里以推送到 master 分支为例)。首次推送需要输入 Gitee 的用户名和密码。

  4. 在暂存区同步代码

                 点击下方同步按键即可在gitee仓库同步自己的代码。

6.总结

6.1学习收获

1.语法与调试能力:掌握了老式语法与现代语法的区别,总结为库的更改,以及函数的定义形式的改变,并通过相关论坛改正其错误。

2.掌握了“环形分配”算法的核心思想:通过数组操作模拟了糖果的传递过程,并处理了首尾相连的环形边界条件。

3.工具运用能力:掌握vscode与gitee库的基本链接过程,掌握vscode环境配置方法以及在dev c++中的错误纠正过程有了明确的思路与途径。

6.2学习不足

1.在vscode的环境配置过程中对路径的盲目,分不清配置环境导致实际作业时间大大延长。

2.在vscode与gitee的上传过程中,一味的询问ai,实际上ai并不能理解我的问题。导致问题迟迟没有解决。

3.在学习b站视频的过程中,囫囵吞枣,其中一个看似不起眼的过程确是卡住我的一个大问题。后续再次观看视频时,发现问题及时更正。

4.b站视频参差不齐,我观看的视频其中缺少很多过程,需要别的视频辅助来完成串起整个过程。

附录

gitee仓库链接糖果分配问题: 编程经典问题--小孩分糖果

参考资料:b站《vscode与gitee连接。gitee管理vscode代码。》

b站《git_05_git设置用户名和邮箱》

b站《git的安装和配置》

b站《vscode使用教程【2025最新】vscode安装教程vscode配置c/c++教程vscode怎么设置中文》

CSDN《C语言clrscr与getch函数替代方案》

Logo

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

更多推荐