C++新手项目:穿衣小助手简介:
最近天气越来越暖和了,需要开始换衣服了,就想写一个“穿衣小助手”的C++小练习,
这样的程序适合C++的初学者,
没有使用动态数组、以及过多的函数、类等知识点,
只是融合了C++的基础语法,如果你有能力,可以自己提高一下难度。

一 逻辑说明
以下是这个程序的基本逻辑框架:
- 输出,显示菜单:
- 随机生成当天的温度;
- 显示温度提示;
- 显示衣橱的衣服,以供选择;
- 输入:请玩家根据温度,选择合适的衣服;
- 处理数据,根据玩家所选计算保暖值;
- 输出:根据保暖值进行冷暖的提示;
二 重要知识点
1. 使用结构体定义衣服的种类和保暖值:
struct Clothes {
string name; // 衣服名称
int warmth; // 保暖值(数值越大越暖和)
};C++初始化衣服数组的数据
Clothes clothes[] = {
{"背心", 1},
{"短袖T恤", 2},
{"长袖单衣", 3},
{"保暖内衣", 5},
{"毛衣", 7},
{"夹克外套", 8},
{"薄羽绒服", 10},
{"厚羽绒服", 14}
};C++2. 生成随机温度
这里我们还是使用rand;
并随机生成 -25到38的温度(% 为求余数)
srand(time(0));
temp = rand()%64-25;C++3. 记录玩家的输入
这里还是使用C++基础的数组,以便更好的掌握,
不使用string字符串、vector等。
记录玩家输入的多个整数,int c[10],n 记录输入的衣服件数
while (cin >> t){
c[n] = t;
n++;
}C++while (cin >> input) 表示当用户输入的数据不为空时执行。
4. 其他
其他的知识点都不太难,
还有个别的知识点见避坑指南和程序的全部源代码;
三 避坑指南
1. 结束数组输入的问题
我在当初学习数组时,在输入数据的过程中,想通过按下空格或回车来结束输入,
事实证明这是无效的。
在这个程序中,结束数组的输入,需要使用 Ctrl+Z。
Ctrl+Z 本身只是一个字符(ASCII 26)
只有当它单独出现在一行开头时,才被识别为“输入结束”
所以正确操作是:输完数字 → 按回车 → 按 Ctrl+Z → 再按回车
2. “不可理解”的无限循环
在上面第1项输入整数之后,大概就要经历“不明所以”的无限循环,
这是因为 cin 没有处理完。
解决方案:
cin.clear()
cin.ignore()C++四 程序源代码
#include <bits/stdc++.h>
using namespace std;
struct Clothes{
string name;
int warmth;
};
int main(){
Clothes clothes[10]={
{"背心", 1},
{"短袖T恤", 2},
{"长袖单衣", 3},
{"保暖内衣", 5},
{"毛衣", 7},
{"夹克外套", 8},
{"薄羽绒服", 10},
{"厚羽绒服", 14},
};
srand(time(0));
do {
int c[10];
int temp, total_warmth=0;
int t, n=0;
temp = rand()%64-25;
cout << "今天的温度是: "
<< temp << "°C" << endl << endl;
cout << "你当前的衣服有:"<< endl;
int m = sizeof(clothes)/sizeof(clothes[0]);
for (int i=0; i<m; i++){
cout << i+1 << "."
<< clothes[i].name
<< " "
<< clothes[i].warmth
<< endl;
}
cout << "请输入你的穿衣计划," << endl;
cout << "输入衣服编号并用空格隔开," << endl;
cout << "输完按 Ctrl+Z 回车 结束):\n";
while (cin >> t){
if (t<1){
cout << "警告:无效编号" << endl;
continue;
}
if (n>=10){
cout << "你穿的太多了,都成大狗熊了!";
break;
}
c[n] = t;
n++;
}
cin.clear();
cin.ignore();
cout << "你选择了:";
for(int i=0; i<n;i++){
int choice = c[i]-1;
cout << clothes[choice].name << " ";
total_warmth += clothes[choice].warmth;
}
cout << "\n总保暖值: " << total_warmth << endl;
total_warmth+=temp;
// 舒适度判断
if (total_warmth < 10) {
cout << "太冷了!成冰棍了,快加衣服!\n";
} else if (total_warmth < 16) {
cout << "有点凉,建议加件外套。\n";
} else if (total_warmth <= 25) {
cout << "刚刚好!很舒服!\n";
} else if (total_warmth <= 30) {
cout << "有点热,暴汗,可以脱一件。\n";
} else {
cout << "太热了!穿太多啦!\n";
}
// 询问是否继续
cout << "\n按 Enter 开始新的一天,输入 q 退出: ";
string cmd;
getline(cin, cmd);
if (cmd == "q") break;
cout << "\n====================\n";
}while (true);
return 0;
}C++你可以在上面程序的基础上,增加新的功能,如:
- 加上风力对温度的影响;
- 同样衣服穿多了提示;
- 各种恶意输入可能造成的BUG等;

一条评论