C++智能购物清单 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析

C++智能购物清单 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析_第1张图片

C++智能购物清单

全国信息素养大赛 C++复赛/决赛模拟训练题

博主推荐

  • 所有考级比赛学习相关资料合集【推荐收藏】

1、C++专栏 

  1. 电子学会C++一级历年真题解析
  2. 电子学会C++二级历年真题解析
  3. 蓝桥杯C++选拔赛真题解析
  4. 信息素养大赛C++算法编程挑战赛

 2、Python专栏

  1. 蓝桥杯python选拔赛真题详解
  2. 蓝桥杯python省赛真题详解
  3. 蓝桥杯python国赛真题详解
  4. 信息素养大赛python编程挑战赛
  5. python等级一级真题解析【电子学会】
  6. python等级二级真题解析【电子学会】
  7. python等级三级真题解析【电子学会】

一、题目要求

1、编程实现

小华是一位忙碌的上班族,他想通过一个智能购物清单程序来帮助自己管理日常购物。这个程序可以根据他以往的购物习惯推荐商品,并允许他添加或删除清单上的物品。编写一个程序,输入一系列商品及其购买频率。程序应能够根据购买频率对商品进行排序,并允许用户添加或删除特定的商品。

2、输入输出

输入描述:输入一个正整数N,表示商品的数量。接下来N行,每行输入一个商品名称和一个整数,整数代表购买频率。输入一个特殊的命令行,可以是"ADD"来添加新商品,或"DEL"来删除现有商品,随后输入商品名称。

输出描述:首先输出所有商品按购买频率降序排列的清单。对于"ADD"命令,输出更新后的清单。对于"DEL"命令,输出删除商品后的清单

输入样例:

5
牛奶 45
鸡蛋 30
面包 20
苹果 15
巧克力 10
ADD 薯片 25
DEL 巧克力

输出样例:

牛奶 45
鸡蛋 30
面包 20
苹果 15
巧克力 10

牛奶 45
鸡蛋 30
薯片 25
面包 20
苹果 15
巧克力 10

牛奶 45
鸡蛋 30
薯片 25
面包 20
苹果 15

二、算法分析

  1. 从给定题目的初步分析可以看出,本题是要进行多次的互动操作,可以使用结构体对商品进行描述,同时使用vector对所有的商品进行存储
  2. 输入完所有商品数据之后可以使用排序sort对商品进行排序,只是排序规则要重新写一个按购买评率降序实现,然后遍历输出排序后的商品清单
  3. 接着由于命令行的输入是不确定的,所以可以使用while循环不断获取输入的命令行实现
  4. 输入不同的命令可以使用分支语句if实现,如果是ADD添加商品,同样可以直接使用vector,然后重新排序并输出商品清单
  5. 如果是DEL,这时候是需要删除原先已经存在的商品,可以借助remove函数以及erase函数实现删除,但是由于我们要删除的是结构体的数据,所以需要在定义结构体的时候实现一个比较等的运算符重载,因为删除的时候只输入了商品名称,所以运算符重载等于号的时候只实现商品名称的等即可
  6. 最后再次重新排序并输出商品清单

三、程序编写

#include 
#include 
#include 
#include 
using namespace std;
struct Pro{
	string name;
	int k;
 	bool operator==(const Pro& other) const {
        return name == other.name; // 按名称进行比较 
    }
};
bool cmp(Pro &a,Pro &b)
{
	return a.k > b.k;
}
void coutt(vector pr)
{
	for(auto p : pr)
		cout << p.name << ' ' << p.k << endl;
}
int main(){
	int n;
	cin >> n;
	vector pro;
	for(int i = 0;i < n;i++){
		string s;
		int t;
		cin >> s >> t;
		pro.push_back({s,t});
	}
	sort(pro.begin(),pro.end(),cmp);
	coutt(pro);
	string cmd;
	while(cin >> cmd){
		if(cmd == "ADD"){
			string s;
			int t;
			cin >> s >> t;
			pro.push_back({s,t});
			sort(pro.begin(),pro.end(),cmp);
			coutt(pro);
		}
		if(cmd == "DEL"){
			string s;
			cin >> s;
			Pro pt = {s,0};
			pro.erase(remove(pro.begin(),pro.end(),pt),pro.end());
			sort(pro.begin(),pro.end(),cmp);
			coutt(pro);
		}
	}
	return 0;
}

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

四、运行结果

​5
牛奶 45
鸡蛋 30
面包 20
苹果 15
巧克力 10

牛奶 45
鸡蛋 30
面包 20
苹果 15
巧克力 10

​ADD 薯片 25
牛奶 45
鸡蛋 30
薯片 25
面包 20
苹果 15
巧克力 10

DEL 巧克力
牛奶 45
鸡蛋 30
薯片 25
面包 20
苹果 15

五、考点分析

难度级别:难,这题相对而言有一定难度,具体主要考察如下:

  1. 分析题目 找到解题思路
  2. 充分掌握结构体的定义和使用
  3. 掌握动态数组vector的定义和使用
  4. 学会输入流对象cin的使用,从键盘读入相应的数据
  5. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  6. 学会while循环的使用,在不确定循环次数的时候推荐使用
  7. 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
  8. 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
  9. 掌握STL里面的sort函数、erase函数以及remove函数的使用
  10. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  11. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  12. 充分掌握结构体定义和使用、vector、循环语句和简单算法知识的使用及输入输出的用法

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

你可能感兴趣的:(C++信息素养大赛复赛题,信息素养大赛c++复赛真题,信息素养大赛决赛题目,c++智能购物清单,c++结构体案例,c++智能算法挑战赛复赛题,c++信息素有大赛决赛题)