• C++
  • C++ 学习笔记:糖果游戏与类型转换实践

  • @ 2025-8-13 19:09:05

C++ 学习笔记:糖果游戏与类型转换实践

一、前言

本次学习围绕 C++ 编程,结合 “糖果游戏” 题目练习、代码实现,以及数据类型转换知识展开。通过实际案例,深入理解编程逻辑和类型转换规则,提升代码编写与问题解决能力。

二、糖果游戏题目解析与实现

(一)题目回顾

幼儿园有 5 个编号 1 - 5 的小朋友围坐圆桌,按顺序从 1 号开始,把自己糖果均分三份(多余吃掉),自己留一份,另两份给相邻小朋友,2 - 5 号依次操作,求一轮后各小朋友糖果数。输入 5 个小朋友初始糖果数,按 5 位宽度输出结果。

(二)代码实现(untitled10.cpp 详细注释版)

#include<iostream>
#include<iomanip>// 包含 setw() 等格式化输出函数,用于控制输出宽度
using namespace std;

int main(){
    // 定义 5 个变量,分别存储 5 个小朋友的糖果数
    int a, b, c, d, e;
    // 从键盘输入 5 个小朋友的初始糖果数
    cin >> a >> b >> c >> d >> e;

    // 1 号小朋友分糖果逻辑
    // 自己糖果均分 3 份,多余吃掉,自己留 1 份,另两份给相邻的 5 号(e)和 2 号(b)
    b += a / 3;  // 2 号小朋友获得 1 号的 1/3 糖果,复合赋值运算符,等价于 b = b + (a / 3)
    e += a / 3;  // 5 号小朋友获得 1 号的 1/3 糖果
    a = a / 3;   // 1 号小朋友保留自己的 1/3 糖果(整数除法,自动丢弃余数,即多余糖果吃掉)

    // 2 号小朋友分糖果逻辑
    // 分给相邻的 1 号(a)和 3 号(c)
    c += b / 3;  // 3 号小朋友获得 2 号的 1/3 糖果
    a += b / 3;  // 1 号小朋友获得 2 号的 1/3 糖果
    b = b / 3;   // 2 号小朋友保留自己的 1/3 糖果

    // 3 号小朋友分糖果逻辑
    // 分给相邻的 2 号(b)和 4 号(d)
    d += c / 3;  // 4 号小朋友获得 3 号的 1/3 糖果
    b += c / 3;  // 2 号小朋友获得 3 号的 1/3 糖果
    c = c / 3;   // 3 号小朋友保留自己的 1/3 糖果

    // 4 号小朋友分糖果逻辑
    // 分给相邻的 3 号(c)和 5 号(e)
    e += d / 3;  // 5 号小朋友获得 4 号的 1/3 糖果
    c += d / 3;  // 3 号小朋友获得 4 号的 1/3 糖果
    d = d / 3;   // 4 号小朋友保留自己的 1/3 糖果

    // 5 号小朋友分糖果逻辑
    // 分给相邻的 4 号(d)和 1 号(a)
    a += e / 3;  // 1 号小朋友获得 5 号的 1/3 糖果
    d += e / 3;  // 4 号小朋友获得 5 号的 1/3 糖果
    e = e / 3;   // 5 号小朋友保留自己的 1/3 糖果

    // setw(n) 用法说明:
    // 1. 用于设置输出字段的宽度为 n 个字符,这里 n = 5,即每个输出占 5 个字符宽度
    // 2. 只对紧随其后的第一个输出项有效,所以每个变量输出前都要调用 setw(5)
    // 3. 默认采用右对齐方式显示内容,让输出更整齐
    // 4. 如果输出内容的长度超过 5,则会全部输出,不会截断
    cout << setw(5) << a << setw(5) << b << setw(5) << c << setw(5) << d << setw(5) << e;

    return 0;
}

(三)代码逻辑梳理

  1. 变量与输入:用 a - e 存储 5 个小朋友糖果数,通过 cin 从键盘获取初始值。
  2. 分糖果流程:按 1 - 5 号顺序,每次处理当前小朋友糖果,先给相邻小朋友分,再更新自己剩余糖果(整数除法实现均分与多余处理 )。
  3. 输出控制:借助 setw(5) 让每个输出占 5 字符宽度,右对齐,使结果整齐,符合题目输出要求。

三、数据类型转换知识

(一)隐式转换

不同数据类型(intlong longfloatdouble 等)运算时,会自动按 double > float > long long > int > char 规则转换。比如计算球体积,若用 4 / 3(整数除法结果为 1 ,不符合实际需求),应写成 4.0 / 3.0 (转成浮点运算,结果更合理 )。

(二)强制转换

1. 概念与语法

强制转换是显式把一种数据类型转成另一种的操作,常用两种语法:

  • C 风格(目标类型)变量名 ,如 (int)a ,把变量 a 转成 int 类型。
  • C++ 风格目标类型(变量名) ,如 int(a) ,功能和 C 风格类似,写法有差异。

2. 代码示例与分析(untitled11.cpp 详细注释版)

#include<iostream>
using namespace std;

int main() {
    // 定义 double 类型变量 a,赋值 3.4
    double a = 3.4;
    // C 风格强制转换:(int)a 把 double 类型的 a 转成 int ,直接截断小数,输出 3
    cout << (int)a << endl;  
    // C++ 风格强制转换:int(a) 同样截断小数,输出 3
    cout << int(a) << endl;  
    // 带括号的 C 风格转换,和 (int)a 效果一样,增加可读性,输出 3
    cout << (int)(a) << endl;  
    return 0;
}
/*
### 强制类型转换简短教程:
1. **什么是强制类型转换**:
强制类型转换是将一种数据类型的值转换为另一种数据类型的操作,用于在不同类型之间进行显式转换。

2. **两种常用语法**:
- C 风格:`(目标类型)变量名`  例:`(int)a`
- C++ 风格:`目标类型(变量名)`  例:`int(a)`

3. **注意事项**:
- 对于浮点数转整数,会直接截断小数部分(不是四舍五入)
- 强制转换可能导致数据精度丢失或溢出,使用时需谨慎
- 增加括号 `(int)(a)` 可以提高复杂表达式的可读性,但功能与 `(int)a` 相同

以上代码中,三种转换方式效果完全一致,均将 3.4 转换为整数 3 并输出。
*/

3. 注意事项

  • 浮点数转整数,直接截断小数(非四舍五入 ),可能丢失精度。
  • 强制转换要谨慎,不合理转换易造成数据溢出、结果错误,需结合场景判断是否适用。

四、作业页面与拓展

(一)作业信息

作业包含多道题目(如保留小数、输出字符三角形等 ),状态已结束,有开始、截止时间和可延期时长,可在对应平台回顾练习,巩固不同编程知识点。

(二)拓展建议

  1. 题目练习:把作业里其他题目(像 P27【例7.1】保留3位小数 )找出来,用 C++ 实现,强化输入输出、格式控制等知识。
  2. 代码优化:针对糖果游戏代码,思考能否用数组、循环简化(比如用数组存储小朋友糖果,通过循环处理 1 - 5 号分糖果逻辑 ),提升代码复用性和简洁性。
  3. 调试实践:故意给糖果游戏代码加 “小错误”(如改 b += a / 3b = a / 3 ),用调试工具(编译器自带调试功能 )一步步找问题、修复,提升调试排错能力。

五、总结

通过糖果游戏题目实践,掌握编程逻辑、输入输出与流程控制;借助类型转换知识,明白不同数据类型运算规则,避免因类型问题出错。结合作业拓展,持续练习可不断提升 C++ 编程水平,从基础语法到实际问题解决,逐步筑牢编程基础 。

0 条评论

目前还没有评论...