当前位置:首页 > 技术 > 正文内容

基于Git与自动化脚本的C++项目构建与测试实践

访客 技术 2026年9月27日 14

本实践旨在完成一个结构清晰、可维护的C++程序项目,涵盖版本控制、编译自动化、单元测试及命令行文件输入功能的实现。项目基于寒假作业一的代码基础,通过优化架构、统一命名规范、编写构建与测试脚本,并集成Git版本管理,提升工程化开发能力。

1. 项目仓库初始化

使用GitHub Desktop创建公开仓库,步骤如下:

  • 启动GitHub Desktop,选择 File > New Repository
  • 填写仓库名称(如 cplus-homework2)、描述,选择本地存储路径
  • 确保取消勾选 Keep this code private,使仓库公开可访问
  • 点击 Create Repository 完成初始化

随后,将本地代码克隆至该仓库目录,添加源码文件(如 main.cpp、utils.cpp)、测试文件与脚本,提交并推送:

  • 在GitHub Desktop中点击 Commit to master
  • 点击 Push origin 推送至远程仓库

为避免提交编译中间文件,创建 .gitignore 文件,内容如下:

*.exe
*.o
*.obj
Debug/
Release/

2. 代码架构与命名优化

原代码中长函数被拆分为多个职责单一的函数,每函数长度控制在15行以内。命名遵循小驼峰式(camelCase)规范,例如:

  • changeChineseToDigit() 替代原 change()
  • readInputFromFile() 替代直接使用 scanf
  • 常量使用全大写加下划线:MAX_INPUT_LEN

核心函数 changeChineseToDigit() 实现中文数字到整数的映射:

#include <string.h>

int changeChineseToDigit(const char* chineseNum) {
    if (strcmp(chineseNum, "零") == 0) return 0;
    if (strcmp(chineseNum, "一") == 0) return 1;
    if (strcmp(chineseNum, "二") == 0) return 2;
    if (strcmp(chineseNum, "三") == 0) return 3;
    if (strcmp(chineseNum, "四") == 0) return 4;
    if (strcmp(chineseNum, "五") == 0) return 5;
    if (strcmp(chineseNum, "六") == 0) return 6;
    if (strcmp(chineseNum, "七") == 0) return 7;
    if (strcmp(chineseNum, "八") == 0) return 8;
    if (strcmp(chineseNum, "九") == 0) return 9;
    if (strcmp(chineseNum, "十") == 0) return 10;
    return -1;
}

3. 编译脚本设计

采用Windows批处理(.bat)实现一键编译。脚本 build.bat 内容如下:

@echo off
setlocal enabledelayedexpansion

echo [构建] 请输入源文件路径(不含扩展名):
set /p sourceName=

set "sourceFile=!sourceName!.cpp"
if not exist "!sourceFile!" (
    echo [错误] 源文件 !sourceFile! 不存在!
    pause
    exit /b 1
)

echo [构建] 正在编译 !sourceFile! ...
gcc "!sourceFile!" -o output.exe

if exist "output.exe" (
    echo [成功] 编译完成:output.exe
) else (
    echo [失败] 编译失败,请检查GCC配置
    exit /b 1
)

pause

若系统提示 gcc: command not found,需将MinGW的bin目录(如 C:\Program Files\Dev-Cpp\MinGW64\bin)添加至系统环境变量 PATH 中。

4. 单元测试框架

设计测试用例覆盖正常与异常输入,测试函数 testChineseToDigit():

#include <stdio.h>
#include <string.h>

// 假设此函数已定义于 utils.cpp
int changeChineseToDigit(const char* chineseNum);

int main() {
    const char* validCases[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
    const char* invalidCases[] = {"皮", "卡", "丘", "天", "线", "宝", "宝", "百"};

    printf("=== 正常输入测试 ===\n");
    for (int i = 0; i < 11; i++) {
        int result = changeChineseToDigit(validCases[i]);
        printf("输入: %-2s -> 结果: %d %s\n", 
               validCases[i], result, result != -1 ? "[通过]" : "[失败]");
    }

    printf("\n=== 异常输入测试 ===\n");
    for (int i = 0; i < 8; i++) {
        int result = changeChineseToDigit(invalidCases[i]);
        printf("输入: %-2s -> 结果: %d %s\n", 
               invalidCases[i], result, result == -1 ? "[通过]" : "[失败]");
    }

    return 0;
}

配套测试脚本 test.bat:

@echo off
cd /d D:\cplus-homework2
echo [测试] 启动单元测试...
output.exe
echo [测试] 执行完毕
pause

5. 命令行文件输入功能

使用 freopen() 重定向标准输入,实现从文件读取数据:

#include <stdio.h>

int main() {
    char filename[100];
    printf("请输入输入文件名(如 input.txt):\n");
    scanf("%99s", filename);

    FILE* input = freopen(filename, "r", stdin);
    if (!input) {
        printf("错误:无法打开文件 %s\n", filename);
        return 1;
    }

    char buffer[256];
    while (scanf("%255s", buffer) != EOF) {
        int digit = changeChineseToDigit(buffer);
        if (digit != -1) {
            printf("转换结果:%d\n", digit);
        } else {
            printf("未知字符:%s\n", buffer);
        }
    }

    return 0;
}

测试文件 input.txt 内容示例:

一
三
五
皮
九

运行程序后输入 input.txt,即可自动读取并转换文件中的中文数字。

标签: gitGitHub

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。