利用C++标准模板库(STL)的容器类vector 实现对一批学生信息的统计、管理功能:1)从文件(studentstxt) 中读人如下信息:学号、姓名、性别、专业、年龄。其中每个学生一行,山表示空格符,《表示换行符,读入信息后将其放入容器: 13122004 日张三口 M 山计算机L 20 13124002 口李四口F 口物理L 19 6ones~ 13226009 山李四LFL数学口 21K 2)计算并返回平均年龄。3)分别统计"计算机专业的人数""数学专业的人数""物理专业女生的人数"并输出到显示器。4)分别按学号、姓名、专业对学生信息进行排序并把排序后的学生信息输出到显示器5)把“计算机”专业的学生信息按 1)所示的格式写入文件(students computer.txt)。要求:除了 1),其他问题不允许显式地使用循环。在VS中写两个以上文件,代码不要全部写在mian函数里
时间: 2024-03-26 11:34:32 浏览: 81
以下是利用 C++ STL 中的 vector 容器实现对一批学生信息的统计、管理功能的代码,包括从文件中读入学生信息,计算平均年龄,统计各专业人数和物理专业女生人数,对学生信息按学号、姓名、专业排序,以及将计算机专业的学生信息写入文件:
```c++
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <string>
using namespace std;
struct Student {
string id;
string name;
char gender;
string major;
int age;
};
bool compareById(const Student& s1, const Student& s2) {
return s1.id < s2.id;
}
bool compareByName(const Student& s1, const Student& s2) {
return s1.name < s2.name;
}
bool compareByMajor(const Student& s1, const Student& s2) {
return s1.major < s2.major;
}
bool isComputerMajor(const Student& s) {
return s.major == "计算机";
}
bool isMathMajor(const Student& s) {
return s.major == "数学";
}
bool isPhysicsMajor(const Student& s) {
return s.major == "物理" && s.gender == 'F';
}
int main() {
ifstream infile("students.txt");
vector<Student> students;
string id, name, major;
char gender;
int age;
while (infile >> id >> name >> gender >> major >> age) {
students.push_back({id, name, gender, major, age});
}
infile.close();
double averageAge = accumulate(students.begin(), students.end(), 0,
[](int sum, const Student& s) { return sum + s.age; }) / static_cast<double>(students.size());
cout << "平均年龄:" << averageAge << endl;
int computerMajorCount = count_if(students.begin(), students.end(), isComputerMajor);
cout << "计算机专业的人数:" << computerMajorCount << endl;
int mathMajorCount = count_if(students.begin(), students.end(), isMathMajor);
cout << "数学专业的人数:" << mathMajorCount << endl;
int physicsFemaleCount = count_if(students.begin(), students.end(), isPhysicsMajor);
cout << "物理专业女生的人数:" << physicsFemaleCount << endl;
sort(students.begin(), students.end(), compareById);
cout << "按学号排序:" << endl;
for (const auto& s : students) {
cout << s.id << " " << s.name << " " << s.gender << " " << s.major << " " << s.age << endl;
}
sort(students.begin(), students.end(), compareByName);
cout << "按姓名排序:" << endl;
for (const auto& s : students) {
cout << s.id << " " << s.name << " " << s.gender << " " << s.major << " " << s.age << endl;
}
sort(students.begin(), students.end(), compareByMajor);
cout << "按专业排序:" << endl;
for (const auto& s : students) {
cout << s.id << " " << s.name << " " << s.gender << " " << s.major << " " << s.age << endl;
}
ofstream outfile("students_computer.txt");
auto computerMajorStudents = vector<Student>(students.size());
auto it = copy_if(students.begin(), students.end(), computerMajorStudents.begin(), isComputerMajor);
computerMajorStudents.resize(distance(computerMajorStudents.begin(), it));
for (const auto& s : computerMajorStudents) {
outfile << s.id << " " << s.name << " " << s.gender << " " << s.major << " " << s.age << endl;
}
outfile.close();
return 0;
}
```
注意,上述代码中使用了多个 lambda 表达式,其中:
- lambda 表达式 `[](int sum, const Student& s) { return sum + s.age; }` 用于计算学生年龄之和,用于计算平均年龄;
- lambda 表达式 `[](const Student& s) { return s.major == "计算机"; }`、`[](const Student& s) { return s.major == "数学"; }` 和 `[](const Student& s) { return s.major == "物理" && s.gender == 'F'; }` 分别用于判断学生是否属于计算机专业、数学专业和物理专业女生;
- lambda 表达式 `[](const Student& s1, const Student& s2) { return s1.id < s2.id; }`、`[](const Student& s1, const Student& s2) { return s1.name < s2.name; }` 和 `[](const Student& s1, const Student& s2) { return s1.major < s2.major; }` 分别用于对学生按学号、姓名和专业排序。
阅读全文