学习资料
InfiniTensor冬季训练营实践编程基础课第二课《C++实践2》
发表于:

1月6日,InfiniTensor 大模型与人工智能系统训练营编程基础课第二课开讲,课程主题为《C++实践2》。

本课程通过实践形式,帮助学生掌握C++编程基础,同时引入命令行操作、版本管理工具Git以及代码风格规范等实用技能,提升综合编程能力。

函数优化与模块化设计

1. 函数拆分与命名规范

  • 问题:input函数功能冗余(输入与计算混合)。
  • 解决方案:拆分为input(输入)和calculate(计算)函数。
  • 命名规范:函数名应准确反映功能(如calculate替代原input中的计算部分)。

2. 参数传递与常量修饰

  • 引用传递:使用double&传递参数以避免拷贝。
  • 常量修饰:对无需修改的参数添加const(如const double& x)。
  • 示例:
void input(double& x, double& y, char& op); // 输入函数
double calculate(const double& x, const double& y, const char& op); // 计算函数

命令行工具与版本控制(Git)

1. Git基础操作

  • 初始化仓库:git init
  • 状态查看:git status
  • 添加文件:git add <file>
  • 提交更改:git commit -m "message"
  • 日志查看:git log

2. 版本管理实践

  • 忽略生成文件:如编译结果main不应纳入版本控制。
  • 分阶段提交:通过git add选择部分更改提交,保持提交记录清晰。

代码风格与格式化工具

1. 代码风格规范(如 Google 的 llvm)

  • 缩进
  • 花括号位置
  • 行长度限制
  • 命名规则

2. 自动化格式化工具

  • Clang-Format:通过配置文件(.clang-format)统一代码风格。
  • IDE集成:VS Code中通过快捷键Shift+Alt+F格式化代码。

C++进阶:数组与指针

1. 数组基础

  • 定义与初始化:double numbers[2] = {1.0, 2.0};
  • 访问元素:通过索引(如numbers[0])。

2. 指针与数组关系

  • 指针本质:数组名即首元素地址(如numbers等价于&numbers[0])。
  • 指针传递:函数参数中使用指针替代数组(如void process(double* arr, int size))。

3. 动态大小处理

  • 循环遍历:使用for循环处理变长数组。
  • 示例:求和函数
double sum(const double* numbers, int size) {
    double result = 0.0;
    for (int i = 0; i < size; ++i) {
        result += numbers[i];
    }
    return result;
}

结构体与数据封装

1. 结构体定义

  • 目的:将相关数据绑定为一个整体(如size与data数组)。

2. 结构体应用

  • 简化函数参数:传递单个结构体而非多个独立参数。
  • 内存管理:动态分配数组时需手动释放内存。

变长输入处理与字符串流

1. 行输入处理

  • getline函数:读取整行输入(如getline(cin, line))。
  • 字符串流(stringstream):解析行中的多个数值。
  • 示例:
string line;
getline(cin, line);
istringstream iss(line);
double num;
while (iss >> num) {
    // 处理每个数值
}

2. 终止条件设计
行结束标志:以换行符为输入终止条件,支持变长操作数。

总结与展望

本节课通过实践形式,帮助学生掌握了C+ +编程基础、命令行操作、Git版本管理以及代码风格规范等实用技能。通过模块化编程思维和良好代码习惯的培养,可以具备独立开发小型项目的能力。后续课程将继续深入讲解C++高级特性,并引入更多实际项目案例,帮助大家更好地理解和应用所学知识。

📚 训练营报名持续进行中

扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名