学生信息管理系统

发布时间 2024-01-06 21:25:27作者: du463
#include<bits/stdc++.h>
using namespace std;

struct PNode{
    int xuehao;
    char name[20];
    double c;
    double m;
    double e;
    double ans;
};

struct LinkList{
    struct PNode data;
    struct LinkList *next;
};

// 定义链表头指针
struct LinkList *head = NULL;

// 添加学生信息到链表中
void add_student() {
    cout<<"请选择要添加的人数:"<<endl;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    struct LinkList *p, *q;
    p = (struct LinkList*)malloc(sizeof(struct LinkList));
    printf("请输入学生学号:");
    scanf("%d", &p->data.xuehao);
    printf("请输入学生姓名:");
    scanf("%s", p->data.name);
    printf("请输入学生语文成绩:");
    scanf("%lf", &p->data.c);
    printf("请输入学生数学成绩:");
    scanf("%lf", &p->data.m);
    printf("请输入学生英语成绩:");
    scanf("%lf", &p->data.e);
    p->data.ans=p->data.c + p->data.m + p->data.e;
    p->next = NULL;
    if (head == NULL) {
        head = p;
    } else {
        q = head;
        while (q->next != NULL) {
            q = q->next;
        }
        q->next = p;
    }
    printf("添加成功!\n");
    }
}

// 从链表中删除学生信息
void delete_student() {
    int xuehao;
    struct LinkList *p, *q;
    printf("请输入要删除的学生学号:");
    scanf("%d", &xuehao);
    p = head;
    while (p != NULL && p->data.xuehao != xuehao) {
        q = p;
        p = p->next;
    }
    if (p == NULL) {
        printf("未找到该学生!\n");
    } else {
        if (p == head) {
            head = p->next;
        } else {
            q->next = p->next;
        }
        free(p);
        printf("删除成功!\n");
    }
}

// 修改学生信息
void modify_student() {
    int xuehao;
    struct LinkList *p;
    printf("请输入要修改的学生学号:");
    scanf("%d", &xuehao);
    p = head;
    while (p != NULL && p->data.xuehao != xuehao) {
        p = p->next;
    }
    if (p == NULL) {
        printf("未找到该学生!\n");
    } else {
        printf("请输入学生姓名:");
        scanf("%s", p->data.name);
        printf("请输入学生语文成绩:");
        scanf("%lf", &p->data.c);
        printf("请输入学生数学成绩:");
        scanf("%lf", &p->data.m);
        printf("请输入学生英语成绩:");
        scanf("%lf", &p->data.e);
        p->data.ans = (p->data.c + p->data.m + p->data.e) / 3.0;
        printf("修改成功!\n");
    }
}

// 查询学生信息
void query_student() {
    cout<<"请选择查找方式:"<<endl;
    cout<<"1.按学号查找"<<endl;
    cout<<"2.按成绩查找"<<endl;
    int a;
    cin>>a;
    if(a==1){
        bool flag =false;

        LinkList *p;
        p=head;
        cout<<"请输入要查找的学号:"<<endl;
        int f;
        cin>>f;
        while(p!=NULL){
            if(p->data.xuehao==f){
                flag=true;
                break;
            }
            else{
                p=p->next;

            }
        }
        if(flag){
            cout<<p->data.xuehao<<" "<<p->data.name<<" "<<p->data.ans<<endl;

        }
        else{
            cout<<"查无此人"<<endl;

        }
    }
    else if(a==2){
         cout<<"请输入需要按哪科成绩查找:"<<endl;
                cout<<"1.语文"<<endl;
                cout<<"2.数学"<<endl;
                cout<<"3.英语"<<endl;
                cout<<"4.总分"<<endl;
                int x;
                cin>>x;
                if(x==1){
                    cout<<"请输入对应的成绩:"<<endl;
                        int y;
                        cin>>y;
                        LinkList *e;
                        e=head;

                        bool flag=false;

                        while(e!=NULL){//可能无法判断最后一个
                            if(e->data.c==y){
                                flag=true;

                                cout<<e->data.xuehao<<" "<<e->data.name<<endl;
                                e=e->next;

                            }
                            else{
                                e=e->next;
                            }
                        }
                        if(!flag){
                            cout<<"查无此人"<<endl;

                        }
                }
                else if(x==2){
                     cout<<"请输入对应的成绩:"<<endl;
                        int y;
                        cin>>y;
                        LinkList *e;
                        e=head;

                        bool flag=false;

                        while(e!=NULL){//可能无法判断最后一个
                            if(e->data.m==y){
                                flag=true;

                                cout<<e->data.xuehao<<" "<<e->data.name<<endl;
                                e=e->next;

                            }
                            else{
                                e=e->next;
                            }
                        }
                        if(!flag){
                            cout<<"查无此人"<<endl;

                        }
                }
                else if(x==3){
                     cout<<"请输入对应的成绩:"<<endl;
                        int y;
                        cin>>y;
                        LinkList *e1;
                        e1=head;

                        bool flag=false;

                        while(e1!=NULL){//可能无法判断最后一个
                            if(e1->data.e==y){
                                flag=true;

                                cout<<e1->data.xuehao<<" "<<e1->data.name<<endl;
                                e1=e1->next;

                            }
                            else{
                                e1=e1->next;
                            }
                        }
                        if(!flag){
                            cout<<"查无此人"<<endl;

                        }
                }
                else{
                     cout<<"请输入对应的成绩:"<<endl;
                        int y;
                        cin>>y;
                        LinkList *e;
                        e=head;

                        bool flag=false;

                        while(e!=NULL){//可能无法判断最后一个
                            if(e->data.ans==y){
                                flag=true;

                                cout<<e->data.xuehao<<" "<<e->data.name<<endl;
                                e=e->next;

                            }
                            else{
                                e=e->next;
                            }
                        }
                        if(!flag){
                            cout<<"查无此人"<<endl;

                        }
                }
    }
    else{
        cout<<"输入选项错误"<<endl;

    }
}

// 统计学生信息
void statistics_student() {
    int count = 0;
    double sum = 0.0, max = 0.0, min = 100.0;
    struct LinkList *p = head;
    while (p != NULL) {
        count++;
        sum += p->data.ans;
        if (p->data.ans > max) {
            max = p->data.ans;
        }
        if (p->data.ans < min) {
            min = p->data.ans;
        }
        p = p->next;
    }
    printf("学生总数:%d\n", count);
    printf("平均成绩:%.2lf\n", sum / count);
    printf("最高成绩:%.2lf\n", max);
    printf("最低成绩:%.2lf\n", min);
}
void display(){
    LinkList *p;
    p=head;
    if(p==NULL){
        cout<<"成绩单为空"<<endl;

    }
    else{
        printf("\n-----------------------学生成绩信息展示-----------------------\n");
    printf(" 排名\t学号\t姓名\t 语文\t  数学\t  英语\t    总分\n"); 
    int l=1;
        while(p!=NULL){ 
        printf("%d\t %d\t %s%12lf %6lf %6lf %6lf\n",l++,p->data.xuehao,p->data.name,p->data.c,p->data.m,p->data.e,p->data.ans);
        p=p->next;
        } 
    printf("\n-----------------------学生成绩完成展示-----------------------\n");
    }
}
void sortList(){
     printf("请输入排序的依据:\n");
    printf("1.数学    2.语文   3.英语    4.总分\n");
    int a;
    scanf("%d",&a);
    PNode s;
    LinkList *p1,*p2;
    p1=head;
    switch(a){
    case 1:
        if(p1==NULL){
            cout<<"成绩单为空"<<endl;

        }
        else{
            while(p1->next!=NULL){
                p2=p1->next;
                while(p2!=NULL){
                    if(p1->data.m<p2->data.m){
                        s=p1->data;
                        p1->data=p2->data;
                        p2->data=s;

                    }
                    p2=p2->next;

                }
                p1=p1->next;

            }
            cout<<"排序完成"<<endl;
        }
        break;
    case 2:
        if(p1==NULL){
            cout<<"成绩单为空"<<endl;

        }
        else{
            while(p1->next!=NULL){
                p2=p1->next;
                while(p2!=NULL){
                    if(p1->data.c<p2->data.c){
                        s=p1->data;
                        p1->data=p2->data;
                        p2->data=s;

                    }
                    p2=p2->next;

                }
                p1=p1->next;

            }
            cout<<"排序完成"<<endl;
        }
        break;
    case 3:
        if(p1==NULL){
            cout<<"成绩单为空"<<endl;

        }
        else{
            while(p1->next!=NULL){
                p2=p1->next;
                while(p2!=NULL){
                    if(p1->data.e<p2->data.e){
                        s=p1->data;
                        p1->data=p2->data;
                        p2->data=s;

                    }
                    p2=p2->next;

                }
                p1=p1->next;

            }
            cout<<"排序完成"<<endl;
        }
        break;
    case 4:
        if(p1==NULL){
            cout<<"成绩单为空"<<endl;

        }
        else{
            while(p1->next!=NULL){
                p2=p1->next;
                while(p2!=NULL){
                    if(p1->data.ans<p2->data.ans){
                        s=p1->data;
                        p1->data=p2->data;
                        p2->data=s;

                    }
                    p2=p2->next;

                }
                p1=p1->next;

            }
            cout<<"排序完成"<<endl;
            cout<<"是否选择删除最后一名学生"<<endl;
            cout<<"1.删除"<<endl;
            cout<<"2.保留"<<endl;
            int x;
            cin>>x;
            if(x==1){
				    struct LinkList *p, *q;
				    p = head;
				    while (p->next!= NULL) {
				        q = p;
				        p = p->next;
				    }
				    q->next=NULL;
				    cout<<"删除成功"<<endl;
			}
			else{
				cout<<"保留成功"<<endl;
				
			}
        }
        break;
    default:
        printf("输入有误!\n"); 
    }
}
int main() {
    int choice;
    while (1) {
    	printf("**********学生信息管理系统***********\n");
    	
        printf("1. 添加学生信息\n");
        printf("2. 删除学生信息\n");
        printf("3. 修改学生信息\n");
        printf("4. 查询学生信息\n");
        printf("5. 统计学生信息\n");
        printf("6. 显示学生信息\n");
        printf("7. 给学生排序\n");
        printf("8. 退出程序\n");
        printf("请选择操作:");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                add_student();
                break;
            case 2:
                delete_student();
                break;
            case 3:
                modify_student();
                break;
            case 4:
                query_student();
                break;
            case 5:
                statistics_student();
                break;
            case 6:
                display();
                break;
            case 7:
                sortList();
                display();
                break;
            case 8:
                exit(0);
            default:
                printf("无效操作!\n");
                break;
        }
    }
    return 0;
}