目录

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)统计每个班中总分最高的前三名和总分最低的后三名,并输出。

(d)统计获得励志奖学金的学生信息。励志奖学金的获取条件为:平均分>=90分且各科成绩>=85分且在班级的排名为前三名。

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;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐