- 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;
}
(三)代码逻辑梳理
- 变量与输入:用
a
-e
存储 5 个小朋友糖果数,通过cin
从键盘获取初始值。 - 分糖果流程:按 1 - 5 号顺序,每次处理当前小朋友糖果,先给相邻小朋友分,再更新自己剩余糖果(整数除法实现均分与多余处理 )。
- 输出控制:借助
setw(5)
让每个输出占 5 字符宽度,右对齐,使结果整齐,符合题目输出要求。
三、数据类型转换知识
(一)隐式转换
不同数据类型(int
、long long
、float
、double
等)运算时,会自动按 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. 注意事项
- 浮点数转整数,直接截断小数(非四舍五入 ),可能丢失精度。
- 强制转换要谨慎,不合理转换易造成数据溢出、结果错误,需结合场景判断是否适用。
四、作业页面与拓展
(一)作业信息
作业包含多道题目(如保留小数、输出字符三角形等 ),状态已结束,有开始、截止时间和可延期时长,可在对应平台回顾练习,巩固不同编程知识点。
(二)拓展建议
- 题目练习:把作业里其他题目(像
P27【例7.1】保留3位小数
)找出来,用 C++ 实现,强化输入输出、格式控制等知识。 - 代码优化:针对糖果游戏代码,思考能否用数组、循环简化(比如用数组存储小朋友糖果,通过循环处理 1 - 5 号分糖果逻辑 ),提升代码复用性和简洁性。
- 调试实践:故意给糖果游戏代码加 “小错误”(如改
b += a / 3
为b = a / 3
),用调试工具(编译器自带调试功能 )一步步找问题、修复,提升调试排错能力。
五、总结
通过糖果游戏题目实践,掌握编程逻辑、输入输出与流程控制;借助类型转换知识,明白不同数据类型运算规则,避免因类型问题出错。结合作业拓展,持续练习可不断提升 C++ 编程水平,从基础语法到实际问题解决,逐步筑牢编程基础 。
0 条评论
目前还没有评论...