目录
1.环境
2.知识图
3.程序的功能
4.程序的源代码
1.环境
vs code
2.知识图
快排+哈希
3.程序的功能
(1)程序中的数据存储到文件中。
(2) 录入学生成绩,格式如下:
(学号(12位) 、姓名、性别、专业、班级、课程成绩(5门课程),总分)其中,总分通过程序计算求得。
(3)输出所有学生成绩。
(a)按某门课程成绩降序输出。
(b)按总分降序输出所有成绩,总分相同的再按学号升序输c)按班级升序输出所有成绩,同一个班级的按总分降序输出。
(4)可以删除某个学生的成绩(删除时按学号删除)。
(5)成绩查询
(a)根据姓名查找该生的成绩信息,若有同名,则输出所有同名学生的成绩信息。
(b)根据班级查找该班的所有成绩信息,并按总分降序输出。
(6)统计
(a)统计每个学生的平均分,按平均分降序输出。
(b)统计每个专业的平均分,按平均分降序输出。
(c)统计每个班中总分最高的前三名和总分最低的后三名,并输出。文章来源:https://www.toymoban.com/news/detail-766188.html
(d)统计获得励志奖学金的学生信息。励志奖学金的获取条件为:平均分>=90分且各科成绩>=85分且在班级的排名为前三名。文章来源地址https://www.toymoban.com/news/detail-766188.html
4.程序的源代码
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1000;
typedef struct{
string xuehao;//学号
string name;//姓名
string sex;//性别
string zhuanye;//专业
string banji;//班级
int a,b,c,d,e;//五门课的成绩
int sum;//总成绩
float ave;//平均分
float zy_sum;
}stu;
stu student[N];
int n;//学生人数
void init()//初始化
{
n=0;
return ;
}
void readfile()//录入学生成绩
{
int i=0;
init();
ifstream infile("D:\\下载2\\student.txt");
while(!infile.eof())
{
infile>>student[i].xuehao;
infile>>student[i].name;
infile>>student[i].sex;
infile>>student[i].zhuanye;
infile>>student[i].banji;
infile>>student[i].a;
infile>>student[i].b;
infile>>student[i].c;
infile>>student[i].d;
infile>>student[i].e;
i++;
}
n=i;
infile.close();
for(int i=0;i<n;i++)
{
student[i].sum=student[i].a+student[i].b+student[i].c+student[i].d+student[i].e;
student[i].ave=student[i].sum/5;
}
return ;
}
void quick_sort(stu student[],int l,int r,int op)//课程快速排序
{
if(l>=r) return ;
int i=l-1,j=r+1;
if(op==1)
{
int x=student[l+r>>1].a;
while(i<j)
{
do i++;while(student[i].a>x);
do j--;while(student[j].a<x);
if(i<j)//交换学生信息
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
else if(op==2)
{
int x=student[l+r>>1].b;
while(i<j)
{
do i++;while(student[i].b>x);
do j--;while(student[j].b<x);
if(i<j)
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
else if(op==3)
{
int x=student[l+r>>1].c;
while(i<j)
{
do i++;while(student[i].c>x);
do j--;while(student[j].c<x);
if(i<j)
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
else if(op==4)
{
int x=student[l+r>>1].d;
while(i<j)
{
do i++;while(student[i].d>x);
do j--;while(student[j].d<x);
if(i<j)
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
else if(op==5)
{
int x=student[l+r>>1].e;
while(i<j)
{
do i++;while(student[i].e>x);
do j--;while(student[j].e<x);
if(i<j)
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
else if(op==6)//按总分降序输出
{
int x=student[l+r>>1].sum;
while(i<j)
{
do i++;while(student[i].sum>x);
do j--;while(student[j].sum<x);
if(i<j)
{
stu student1=student[i];
student[i]=student[j];
student[j]=student1;
}
}
}
//递归+分治
quick_sort(student,l,j,op);
quick_sort(student,j+1,r,op);
}
void score_sort()//按总分降序,冒泡,多关键字排序,总分相同的按学号升序
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(student[j].sum<student[j+1].sum)
{
stu student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
else if(student[j].sum==student[j+1].sum)
{
if(student[j].xuehao>student[j+1].xuehao)
{
stu student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
}
}
}
return ;
}
void bj_sort()//班级升序,同一个班级按总分降序
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(student[j].banji>student[j+1].banji)
{
stu student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
else if(student[j].banji==student[j+1].banji)
{
if(student[j].sum<student[j+1].sum)
{
stu student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
}
}
}
return ;
}
void dele()//按学号删除
{
string x;
cout<<"输入要输出学生的学号:";
cin>>x;
int ans=0;
for(int i=0;i<n;i++)
if(student[i].xuehao==x)
{
ans=i;
break;
}
for(int i=ans;i<n;i++)
student[i]=student[i+1];
if(ans==0) cout<<"要删除的学生信息不存在!";
else
{
cout<<"已经删除!"<<endl;
n--;//线性表长度--
}
return ;
}
void name_search()//根据姓名查找学生信息
{
string x;
cout<<"请输入查找的姓名:";
cin>>x;
int ans=0;
int f=0;
for(int i=0;i<n;i++)
{
if(student[i].name==x)
{
++f;
printf("第%d名学生信息:",f);
cout<<student[i].xuehao<<" "<<student[i].name<<" "<<student[i].sex<<" "<<student[i].zhuanye<<" "<<student[i].banji<<" "<<student[i].a<<" "<<student[i].b<<" "<<student[i].c<<" "<<student[i].d<<" "<<student[i].e<<endl;
}
}
if(f==0) cout<<"不存在该学生!"<<endl;
return ;
}
void bj_search()//按班级查找
{
string x;
cout<<"请输入要查询的班级:"<<endl;
cin>>x;
stu student1[N];
int ans=0,f=0;
for(int i=0;i<n;i++)
{
if(student[i].banji==x)
{
f++;
student1[ans++]=student[i];
}
}
if(f==0)
{
cout<<"不存在该班级!";
return ;
}
quick_sort(student1,0,ans-1,6);//按总分降序输出
for(int i=0;i<ans;i++)
{
cout<<student1[i].xuehao<<" "<<student1[i].name<<" "<<student1[i].sex<<" "<<student1[i].zhuanye<<" "<<student1[i].banji<<" "<<student1[i].a<<" "<<student1[i].b<<" "<<student1[i].c<<" "<<student1[i].d<<" "<<student1[i].e<<endl;
}
}
void zy_sort()//统计每个专业的平均分,按平均分降序输出
{
map<string,int> h;//STL里面的哈希表,也可以手写哈希表
for(int i=0;i<n;i++)
{
h[student[i].zhuanye]++;
}
for(map<string,int>::iterator it=h.begin();it!=h.end();it++)
{
double sum=0;
for(int i=0;i<n;i++)
{
if(student[i].zhuanye==it->first)
{
sum+=student[i].sum;
}
}
sum/=it->second;//专业的平均分
for(int i=0;i<n;i++)
{
if(student[i].zhuanye==it->first)
{
student[i].zy_sum=sum;
}
}
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(student[j].zy_sum>student[j+1].zy_sum)
{
stu student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
}
}
return ;
}
void bjtj()//统计每个班最高的前三名和最低的后三名
{
map<string,int> h;
for(int i=0;i<n;i++)
{
h[student[i].banji]++;
}
for(map<string,int>::iterator it=h.begin();it!=h.end();it++)
{
stu student1[N];
int ans=0;
for(int i=0;i<n;i++)
{
if(student[i].banji==it->first)
{
student1[ans++]=student[i];
}
}
quick_sort(student1,0,ans-1,6);//排序每个班
cout<<it->first<<endl<<"最高的前三名学生信息:"<<endl;
for(int i=0;i<3;i++)
cout<<student1[i].xuehao<<" "<<student1[i].name<<" "<<student1[i].sex<<" "<<student1[i].zhuanye<<" "<<student1[i].banji<<" "<<student1[i].a<<" "<<student1[i].b<<" "<<student1[i].c<<" "<<student1[i].d<<" "<<student1[i].e<<endl;
cout<<"最低的后三名学生信息:"<<endl;
for(int i=ans-1;i>=ans-3;i--)
cout<<student1[i].xuehao<<" "<<student1[i].name<<" "<<student1[i].sex<<" "<<student1[i].zhuanye<<" "<<student1[i].banji<<" "<<student1[i].a<<" "<<student1[i].b<<" "<<student1[i].c<<" "<<student1[i].d<<" "<<student1[i].e<<endl;
}
return ;
}
void lizhi()//统计奖学金
{
map<string,int> h;
int m=0;
for(int i=0;i<n;i++)
{
h[student[i].banji]++;
}
for(map<string,int>::iterator it=h.begin();it!=h.end();it++)
{
stu student1[N];
int ans=0;
for(int i=0;i<n;i++)
{
if(student[i].banji==it->first)
{
student1[ans++]=student[i];
}
}
quick_sort(student1,0,ans-1,6);//排序每个班
for(int i=0;i<3;i++)
{
if(student1[i].ave>=90&&student1[i].a>=85&&student1[i].b>=85&&student1[i].c>=85&&student1[i].d>=85&&student1[i].e>=85)
{
m++;
printf("第%d名学生信息:\n",m);
cout<<student1[i].xuehao<<" "<<student1[i].name<<" "<<student1[i].sex<<" "<<student1[i].zhuanye<<" "<<student1[i].banji<<" "<<student1[i].a<<" "<<student1[i].b<<" "<<student1[i].c<<" "<<student1[i].d<<" "<<student1[i].e<<endl;
}
}
}
return ;
}
void menu()
{
printf("\t\t欢迎进入学生成绩管理系统\n");
printf("\t\t==============================\n");
printf("\t\t*选择操作 *\n");
printf("\t\t*1退出系统 *\n");
printf("\t\t*2按某门课程成绩降序输出 *\n");
printf("\t\t*3按总分降序输出所有成绩 *\n");//总分相同,按学号升序输出
printf("\t\t*4按班级升序输出所有成绩 *\n");//同一个班级按总分降序
printf("\t\t*5按学号删除某个学生成绩 *\n");
printf("\t\t*6按姓名查找某个学生成绩 *\n");//若有重名,输出所有同名学生的信息
printf("\t\t*7按班级查找该班所有成绩 *\n");//按总分降序输出
printf("\t\t*8按照平均分降序输出成绩 *\n");
printf("\t\t*9按专业的平均分降序输出 *\n");
printf("\t\t*10统计每个班前三和后三名 *\n");
printf("\t\t*11统计获得励志奖学金学生 *\n");
printf("\t\t==============================\n");
}
void menu1()
{
cout<<"请输入按照排序的课程的序号:";
int op;
cin>>op;
quick_sort(student,0,n-1,op);
}
void print()
{
for(int i=0;i<n;i++)
{
printf("第%d名学生信息:\n",i+1);
cout<<student[i].xuehao<<" "<<student[i].name<<" "<<student[i].sex<<" "<<student[i].zhuanye<<" "<<student[i].banji<<" "<<student[i].a<<" "<<student[i].b<<" "<<student[i].c<<" "<<student[i].d<<" "<<student[i].e<<endl;
}
}
int main()
{
readfile();
while(1)
{
menu();
puts("");
int op;
cout<<"请输入一个序号:";
cin>>op;
switch(op)
{
case 1:
cout<<"欢迎下次使用!"<<endl;
return 0;
break;
case 2:
menu1();
print();
break;
case 3:
score_sort();
print();
break;
case 4:
bj_sort();
print();
break;
case 5:
dele();
break;
case 6:
name_search();
break;
case 7:
bj_search();
break;
case 8:
quick_sort(student,0,n-1,6);
print();
break;
case 9:
zy_sort();
print();
break;
case 10:
bjtj();
break;
case 11:
lizhi();
break;
default:cout<<"序号错误!";
break;
}
}
return 0;
}
到了这里,关于数据结构设计--学生信息管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!