以下是一个C++程序,实现了记录分析学生信息,并添加了注释,方便你查看:
以下是一个C++程序,实现了记录分析学生信息,并满足题目所需的要求:
```c++
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
// 学生信息结构体
struct Student {
string class_name; // 班级名称
string stu_id; // 学号
string name; // 姓名
int score1, score2, score3; // 三门课程分数
int sum_score; // 总分数
int rank; // 名次
};
// 课程信息结构体
struct Course {
string name; // 课程名称
int max_score; // 最高分
int min_score; // 最低分
Student max_student; // 最高分的学生
Student min_student; // 最低分的学生
};
// 比较函数,用于sort排序(按照总分从高到低排序)
bool cmp(const Student& s1, const Student& s2) {
if (s1.sum_score == s2.sum_score) {
return s1.score1 > s2.score1; // 总分相等,按照第一门课程分数排序
}
return s1.sum_score > s2.sum_score;
}
int main() {
int n, m;
cout << "输入班级数和每个班级的学生数:";
cin >> n >> m;
// 初始化课程信息
Course course1 = { "课程1", -1, 101 }; // 最高分、最低分的初值
Course course2 = { "课程2", -1, 101 };
Course course3 = { "课程3", -1, 101 };
// 初始化班级学生信息
Student students[n][m];
for (int i = 0; i < n; i++) {
cout << "输入第" << i + 1 << "个班级的信息:" << endl;
for (int j = 0; j < m; j++) {
cout << "输入第" << j + 1 << "个学生的信息:" << endl;
cin >> students[i][j].class_name >> students[i][j].stu_id >> students[i][j].name
>> students[i][j].score1 >> students[i][j].score2 >> students[i][j].score3;
// 更新课程信息
if (students[i][j].score1 > course1.max_score) {
course1.max_score = students[i][j].score1;
course1.max_student = students[i][j];
}
if (students[i][j].score1 < course1.min_score) {
course1.min_score = students[i][j].score1;
course1.min_student = students[i][j];
}
if (students[i][j].score2 > course2.max_score) {
course2.max_score = students[i][j].score2;
course2.max_student = students[i][j];
}
if (students[i][j].score2 < course2.min_score) {
course2.min_score = students[i][j].score2;
course2.min_student = students[i][j];
}
if (students[i][j].score3 > course3.max_score) {
course3.max_score = students[i][j].score3;
course3.max_student = students[i][j];
}
if (students[i][j].score3 < course3.min_score) {
course3.min_score = students[i][j].score3;
course3.min_student = students[i][j];
}
// 计算总分数
students[i][j].sum_score = students[i][j].score1 + students[i][j].score2 + students[i][j].score3;
}
// 对每个班级的学生排序并计算名次
sort(students[i], students[i] + m, cmp);
for (int k = 0; k < m; k++) {
if (k == 0 || students[i][k].sum_score != students[i][k - 1].sum_score) {
students[i][k].rank = k + 1;
}
else {
students[i][k].rank = students[i][k - 1].rank;
}
}
}
// 输出各门课程最高分、最低分的学生和对应课程信息
cout << course1.name << "最高分为:" << course1.max_score << ",学生信息:" << course1.max_student.class_name
<< " " << course1.max_student.stu_id << " " << course1.max_student.name << endl;
cout << course1.name << "最低分为:" << course1.min_score << ",学生信息:" << course1.min_student.class_name
<< " " << course1.min_student.stu_id << " " << course1.min_student.name << endl;
cout << course2.name << "最高分为:" << course2.max_score << ",学生信息:" << course2.max_student.class_name
<< " " << course2.max_student.stu_id << " " << course2.max_student.name << endl;
cout << course2.name << "最低分为:"
输入:
输入班级数和每个班级的学生数:2 3
输入第1个班级的信息:
输入第1个学生的信息: class1 1001 Tom 80 70 90
输入第2个学生的信息: class1 1002 Jack 90 80 70
输入第3个学生的信息: class1 1003 Mike 70 90 80
输入第2个班级的信息:
输入第1个学生的信息: class2 2001 Lily 60 70 80
输入第2个学生的信息: class2 2002 Lucy 70 60 90
输入第3个学生的信息: class2 2003 Jane 80 90 70
输出:
课程1最高分为:90,学生信息:class1 1002 Jack
课程1最低分为:70,学生信息:class1 1003 Mike
课程2最高分为:90,学生信息:class1 1003 Mike
课程2最低分为:60,学生信息:class2 2001 Lily
课程3最高分为:90,学生信息:class1 1001 Tom
课程3最低分为:70,学生信息:class2 2003 Jane
目标:
使用对象数组,完成多个学生信息的增加、删除、查询和修改等功能。
重点:
通过建立对象数组,用数组的地址来作为函数参数,来达到对数据成员进行操作的效果。
感想:
其实这里的类更像结构体,因为我没有在类中建立private类型的数据成员,但搞了几天也大多实现了功能,有小小的成就感。
这里感谢一下博主“编程一只蝶”的参考,文末有他的文章链接。
效果图如下:
#include<iostream>
#include<string>
using namespace std;
#define max 5
static int num = 4;//学生数量
class Student//创建学生类
{
public:
Student()
{
SID = 0;
score = 0;
Name = "\0";
Sex = "\0";
};
Student(int a, string name, string sex, float Score)
{
SID = a;
Name = name;
Sex = sex;
score = Score;
}
void set();//修改学生信息
void show();//输出学生信息
//将数据成员也归为public,便于访问
int SID;
string Name;
string Sex;
float score;
};
void Student::set()//设置数据成员的函数
{
cout << "输入SID:";
cin >> SID;
cout << "输入姓名:";
cin >> Name;
cout << "输入性别:";
cin >> Sex;
cout << "输入成绩:";
cin >> score;
}
void Student::show()//展示数据成员的函数
{
;
cout << SID << "," << Name << "," << Sex<<","<<score<<endl;
}
int main()
{
void order_by_SID(Student s[]);
void view();
void order_by_score(Student s[]);
void view1();
void Research(Student s[], int m);
void add(Student s[]);
void Delete(Student s[], int m);
void insert(Student s[], int m);
view();
void show_all(Student s[]);//以上为函数声明
Student s[max] = { {20200001,"小张","男",70},{20200002,"小红","女",80},{20200003,"李华","男",99},{20201786,"唐葆程","男",100} };//基础成员
while (true)
{
int n=-1;
int m=-1;
int h = -1;
cout << "------------------------------------------" << endl;
cout << "请输入序号进行操作:" ;
cin >> n;
switch (n) {
case 1:
cout << "------------------------------------------" << endl;
cout << "您选择了[1.添加学生信息],下面请按照提示完成操作!" << endl;
add(s);
view1();
break;
case 2:
cout << "------------------------------------------" << endl;
cout << "您选择了[2.删除学生信息],下面请按照提示完成操作!" << endl;
cout << "要删除学生的SID为:";
cin >> m;
Delete(s, m);
view1();
break;
case 3:
cout << "------------------------------------------" << endl;
cout << "您选择了[3.查看已经录入的学生成绩]" << endl;
show_all(s);
cout << "查看完毕" << endl;
view1();
break;
case 4:
cout << "------------------------------------------" << endl;
cout << "您选择了[4.查询学生信息],下面请按照提示完成操作!" << endl;
cout << "输入要查询的学生的SID:" << endl;
cin >> m;
Research(s, m);
view1();
break;
case 5:
cout << "------------------------------------------" << endl;
cout << "您选择了[5.学生信息排序],下面请按照提示完成操作!" << endl;
cout << "\t\t请选择排序依据(降序排序):\n\t\t1.成绩\n\t\t2.学号\n\t\t3.返回上级\n输入序号进行操作:";
cin >> h;
switch (h)
{
case 1:
order_by_score(s);
break;
case 2:
order_by_SID(s);
break;
case 3:
break;
default:
cout << "------------------------------------------" << endl;
cout << "输入不合法,请重新输入:";
}
; break;
case 6:
cout << "------------------------------------------" << endl;
cout << "您选择了[6.插入学生信息],下面请按照提示完成操作!" << endl;
cout << "输入要插入在几号之后:";
cin >> m;
insert(s, m);
break;
case 0:
cout << "------------------------------------------" << endl;
cout << "您选择了[0.退出],您已退出本产品,谢谢使用!" << endl;
exit(0);
break;
default:
cout << "------------------------------------------" << endl;
cout << "输入不合法,请重新输入:";
}
}
show_all(s);
s[num+1].set();
s[num+1].show();
return 0;
}
void show_all(Student s[])//通过地址来传输对象数组
{
cout << "当前全部学生信息如下:" << endl;
int i = 0;
for (;i <num;i++)
{
cout << "序号:" << i+1<<",";
s[i].show();
}
}//展示全部学生信息
void view()//视图层
{
cout << "\t\t**********************************************************" << endl;
cout << "\t\t**\t\t欢迎进入学生信息管理系统" << "\t\t" << "**" << endl;
cout << "\t\t**\t\t1.添加学生信息" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t2.删除学生成绩" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t3.已经录入的学生成绩" << "\t\t\t" << "**" << endl;
cout << "\t\t**\t\t4.查询学生信息" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t5.学生信息排序" << "\t\t\t\t**" << endl;
cout << "\t\t**\t\t6.插入学生信息" << "\t\t\t\t**" << endl;
cout << "\t\t**\t\t0.退出系统" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**********************************************************" << endl << endl;
}//操作界面
void add(Student s[])//增加学生信息的函数
{
if (num < max)
{
int a = num;
s[a].set();
num++;
}
else cout << "超过最大学生人数!!!" << endl;
}
void Delete(Student s[], int m)//删除学生信息的函数
{
int i=0;
int a = num;
for (; i <num; i++)
{
while (s[i].SID == m)
{
int o = i;
cout << "\t\t该学生的信息为:" << endl<<"\t\t";
s[i].show();
for (; o < num; o++)
{
s[o] = s[o + 1];
}
num--;
cout << "\t\t删除成功" <<endl ;
break;
}
}
if (a== num)
{
cout << "未找到该学生" << endl;
}
}
void Research(Student s[], int m)//通过学号搜索学生信息的函数
{
int i = 0;
for (; i < num; i++)
{
while (s[i].SID == m)
{
cout << "\t\t该学生的信息为:" << endl << "\t\t";
s[i].show();
break;
}
}
}
void view1()//操作界面2
{
cout << "\t\t**********************************************************" << endl;
cout << "\t\t**\t\t欢迎继续使用学生信息管理系统" << "\t\t" << "**" << endl;
cout << "\t\t**\t\t1.添加学生信息" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t2.删除学生成绩" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t3.已经录入的学生成绩" << "\t\t\t" << "**" << endl;
cout << "\t\t**\t\t4.查询学生信息" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**\t\t5.学生信息排序" << "\t\t\t\t**" << endl;
cout << "\t\t**\t\t6.插入学生信息" << "\t\t\t\t**" << endl;
cout << "\t\t**\t\t0.退出系统" << "\t\t\t\t" << "**" << endl;
cout << "\t\t**********************************************************" << endl << endl;
}
void order_by_score(Student s[])//根据成绩用冒泡法对学生进行排序
{
int t = 0,a=num,k=0;
int i = 0, j;
Student T;
for (k = 1; k < num ; k++)
{
for (i = 0; i < a; i++)
{
j = i + 1;
if (s[i].score <= s[j].score)
{
T = s[i];
s[i] = s[j];
s[j] = T;
}
}
a--;
}
cout << "排序成功输入 3 来查看结果" << endl;
}
void order_by_SID(Student s[])//同为冒泡法
{
int t = 0, a = num, k = 0;
int i = 0, j;
Student T;
for (k = 1; k < num; k++)
{
for (i = 0; i < a; i++)
{
j = i + 1;
if (s[i].SID <= s[j].SID)
{
T = s[i];
s[i] = s[j];
s[j] = T;
}
}
a--;
}
cout << "排序成功输入 3 来查看结果" << endl;
}
void insert(Student s[], int m)//插入的学生函数
{
Student T;
if (num == max)
cout << "超过最大学生人数!!\n";
else
{
num++;
for (int i=num;i>m;i--)
{
s[i] = s[i-1 ];
}
s[m].set();
cout << "插入成功!\n\t\t输入 3 来查看结果\n";
}
}
//函数功能由本人实现,结构和界面有借鉴csdn博主:编程一只蝶
//原文链接:https ://blog.csdn.net/weixin_43691058/article/details/103662562