- 期中考前小练习2
按以下要求编写程序
题目说明
请各位考生从课程信息发布网站下载数据文件data.txt,然后将该数据文件手动保存在C
盘根目录中。在该文件中以文本文件的方式存放了若干用于表示用户信息的结构体类型数据,
每个用户信息占一行,每个用户的各数据之间以空格来间隔。
结构体及相关辅助类型的声明如下所示:
typedef struct {
int id;
string name;
int age;
char sex;
vector interest; //该向量存储用户的多个兴趣
} User;
文件中,兴趣用整数0 表示music,1 表示movie,2 表示reading,3 表示travel。
部分文件内容如下所示:
10180 Alice 24 F 1
2023 Ben 18 M 0 1
11066 Edward 24 M 0 1 2 3
在上述示例内容中,兴趣0,1,2,3 分别表示music, movie, reading, travel。可以看出,Alice
有一个兴趣:movie,Ben 有2 个兴趣music 和movie,而Edward 有4 个兴趣:music, movie,
reading, travel。
请按要求依次完成如下操作:
1、 编写一个函数,读取data.txt 文件中的用户数据,将所有用户信息保存在一个用户向量
vec_user 中。
2、 编写一个函数,将向量vec_user 中的元素按照如下规则进行排序:首先按照用户兴趣的
数目降序排列,如果用户具有相同的兴趣数目,则按照年龄升序排列。
3、 编写一个函数,将向量vec_user 中所有用户的信息显示在屏幕上,显示格式要求如下:
用户编号
5 列
左对齐
姓名
10 列
右对齐
年龄
3 列
右对齐
性别
3 列
右对齐
兴趣
用英文单词表示
每个单词占10 列
右对齐
10180 Alice 24 F movie
11066 Edward 24 M music movie reading travel
4、 编写一个myfilter 函数,将向量vec_user 中对X 有兴趣的用户数据输出到新的向量vec_a
中,并按照第3 步中相同的要求显示向量vec_a。如果不输入兴趣项X,X 等于music。
5、 编写一个与第4 步中同名的myfilter 函数,将向量vec_a 中年龄大于等于L 并且小于等于
H 的用户数据输出到新的向量vec_b 中,并按照第3 步中相同的要求显示向量vec_b,如
果不输入年龄范围L 和H,那么L=20,H=30。
6、 main 函数如下:
int main() {
string filename = “d:\data.txt”;
vector vec_user, vec_a, vec_b;
read_data(filename, vec_user);
sort(vec_user);
cout << “排序后用户信息:” << endl;
print(vec_user);
myfilter(vec_user, vec_a, 1);
cout << “对电影感兴趣的用户信息:” << endl;
print(vec_a);
vec_b = myfilter(vec_a, 22);
cout << “对电影感兴趣且年龄在22岁和30岁之间的用户信息:” << endl;
print(vec_b);
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<istream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
typedef struct {
int id;
string name;
int age;
char sex;
vector<int> interest; //该向量存储用户的多个兴趣
} User;
int read_data(string &filename,vector<User>& vec_user) {
vec_user.clear();
ifstream data(filename, ios::in);
if(!data)