C++新手趣味项目:写个“穿衣小助手”

C++新手项目:穿衣小助手简介:

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

一 逻辑说明

以下是这个程序的基本逻辑框架:

  1. 输出,显示菜单:
    • 随机生成当天的温度;
    • 显示温度提示;
    • 显示衣橱的衣服,以供选择;
  2. 输入:请玩家根据温度,选择合适的衣服;
  3. 处理数据,根据玩家所选计算保暖值;
  4. 输出:根据保暖值进行冷暖的提示;

二 重要知识点

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等;

一条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注