C语言程序设计

2、计算每位同学的平均分编写一个学生成绩管理的程序。由键盘输入数据(最好要考虑输入数据输入的格式及输入数据的有效性),然后进行以下的功能实现。程序要求主函数是一个功能选择菜单,其它各功能都用各自的函数实现。
要求至少有20个学生的原始数据。原始数据如下:
学号 姓名 C程序设计 高等数学 英语 线性代数
1 王.. 80 80 80 80
2 张.. 90 90 90 90

功能要求如下:
1、数据的输入

3、计算每门课程的平均分
4、计算各分数段(90-100、80-89、60-79、60以下)的人数
5、对这10位同学的成绩按平均分排序,给出名次。
6、对数据可以进行增、删、改的编辑操作。
7、对数据可进行查询操作。
8、最后输出结果如下:
学号 姓名 C程序设计 高等数学 英语 线性代数 平均分 名次
1 王.. 80 80 80 80 80 2
2 张.. 90 90 90 90 90 1

各科平均分 85 85 85 85 85
90-100 1 1 1 1 1
80-89 1 1 1 1 1
60-69 0 0 0 0 0
60以下 0 0 0 0 0

#include <stdio.h>
#include <stdlib.h>
    int n;
 typedef struct student{
    int num;
    int mingci;
    char name[20];
    double a[4];
    double sum;
    double avreage;

    struct student *next;
} STU;
    STU *creat();
    void add_student(STU *);
    void show(STU *);
    STU *delete_student(STU *);
    void paiming(STU *);
    void show_one(STU *s);
    int panduan(double l);

    int main()  {
            int choose;
             STU *head=creat();

            while(1){
                        printf("1 录入信息\n");
                        printf("2 查询学生信息\n");
                        printf("3 删除学生信息\n");


                    scanf("%d",&choose);
                switch(choose){
                case 1:add_student(head);break;
                case 2:show(head);break;
                 case 3:head=delete_student(head);break;
                default: break;

                }

            }



    return 0;
}
//创建链表表头
STU *creat(){
    n=0;
    STU *head;

    head=(STU *)malloc(sizeof(STU));
     head->next=NULL;
    return head;
    }
//录入学生信息
void add_student(STU *s){
    STU *p=s;
    STU *p1;
    while(p->next!=NULL){
        p=p->next;
    }   while(1){

        printf("请输入学号:学号为0表示输入结束输入!");
        scanf("%d",&p->num);
        if(p->num!=0){
                 n++;
        printf("请输入姓名:");
        scanf("%s",p->name);
         printf("请输入成绩 格式C程序设计 高等数学 英语 线性代数:");
        scanf("%lf%lf%lf%lf",&p->a[0],&p->a[1],&p->a[2],&p->a[3]);
        p->sum=p->a[0]+p->a[1]+p->a[2]+p->a[3];
        p->avreage=p->sum/4;
        p->mingci=0;

        p1=(STU *)malloc(sizeof(STU));
        p->next=p1;
        p1->next=NULL;
        p=p1;
        }else
            {
            printf("录入结束!\n");
            paiming(s);
            break;
                        }

        }
}
//根据学号删除学生信息
STU *delete_student(STU *s){
    int num;
    STU *p=s,*p1;
    printf("请输入要删除学生的学号:");
    scanf("%d",&num);
    while(p->next!=NULL){

        if(p->num==num&&s==p){
                n--;
            return p->next;
            }else if(p->num==num){
                n--;
                p1->next=p->next;
                paiming(s);
                return s;

            }   p1=p;
                p=p->next;


            }
            if(n==0){printf("数据库目前为空,请录入信息!\n");}
            else{
            printf("没有发现你输入的学号!\n");}
            return s;

}
//显示学生数据库信息
void show(STU *s){
    STU *head=s;
        if(n==0){
            printf("数据库为空,请先录入信息!\n");
    }
        else{
            while(s->next!=NULL){
            printf("学号:%d 姓名:%s 成绩:%.2lf %.2lf %.2lf %.2lf 平均分:%.2lf 名次:%d \n",s->num,s->name,s->a[0],s->a[1],s->a[2],s->a[3],s->avreage,s->mingci);
            s=s->next;
    }
    show_one(head);
}
}
//对学生按平均分排名
 void paiming(STU *s){
     double score[n];
     int j,i=0;
     STU *head=s;
     while(s->next!=NULL){

        score[i]=s->avreage;
        s=s->next;
        i++;
     }
     double temp;
     for(i=0;i<n;i++){
        for(j=i;j<n;j++){
               if(score[i]<score[j]){
                temp=score[i];
                score[i]=score[j];
                score[j]=temp;
               }

        }
     }


    for(i=0;i<n;i++){
            if(score[i]!=0){
                s=head;
            while(s->next!=NULL){
               if(s->mingci==0){

                    if(score[i]==s->avreage){
                        score[i]=0;
                        s->mingci=i+1;
                        break;
                                            }

                               }
                s=s->next;
        }
    }
}



}
//单科平均分统计
void show_one(STU *s){

    double ar[4]={0};
    int b[4][4]={{0},{0},{0},{0}};
    int i;
    while(s->next!=NULL){

            for(i=0;i<4;i++){
                b[i][panduan(s->a[i])]++;
                ar[i]+=s->a[i];
            }
        s=s->next;
    }
    printf("各科平均分 %.2lf %.2lf %.2lf %.2lf\n",ar[0]/n,ar[1]/n,ar[2]/n,ar[3]/n);
    printf("90-100分 %d %d %d %d\n",b[0][0],b[1][0],b[2][0],b[3][0]);
    printf("80-89分 %d %d %d %d\n",b[0][1],b[1][1],b[2][1],b[3][1]);
    printf("60-79分 %d %d %d %d\n",b[0][2],b[1][2],b[2][2],b[3][2]);
    printf("60分以下 %d %d %d %d\n",b[0][3],b[1][3],b[2][3],b[3][3]);

}

int panduan(double l){

    if(l>=90&&l<=100) return 0;
   else if(l>=80&&l<=89) return 1;
    else  if(l>=60&&l<=79) return 2;
    else return 3;

}

追问

不错

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-02-27
写了没追问

写了一半

第2个回答  2018-02-27
需要帮你做吗?我可以做追问

嗯嗯,谢谢啦

追答

1123665434

相似回答