C语言小白结构体进阶练习,统计某班学生学号姓名成绩并实现查询和排序功能

利用结构体实现某班学生学号姓名的学号成绩学分等的统计,并能实现排序和查找某一学生的功能。
在这里插入图片描述`


```csharp
#include <stdio.h>
#include <string.h>
typedef struct stu{
    char a[20];//学号
    char name[10];//姓名
    int math;
    int cl;//c语言
    int sports;
    int english;
    int phical;
    float scoreall;  //总分
    float scoreav;   //平均分
    float getscore;    //存储学分
} STU;
STU *p;
float score[5] = {5, 3.5 , 2 , 3 , 2};
void getsoc(int n){//成绩录入
    int i = 0;
    for(i = 0 ; i<n ; i++){
       printf("输入学号  姓名:");
       scanf("%s  %s", (p+i)->a, (p+i)->name);
       printf("输入数学 c语言 体育 英语 近代史成绩:\n");
       scanf("%d",&p[i].math);
       scanf("%d",&p[i].cl);
       scanf("%d",&p[i].sports );
       scanf("%d",&p[i].english);
       scanf("%d",&p[i].phical);
       printf("%s  %s\n", (p+i)->a, (p+i)->name);
       p[i].scoreall = (float)(p[i].math + p[i].cl + p[i].sports + p[i].english + p[i].phical);
       p[i].scoreav = p[i].scoreall/5;
       p[i].getscore = 0;
       if(p[i].math >= 60)
            p[i].getscore += score[0];
       if(p[i].cl >= 60)
            p[i].getscore += score[1];
       if(p[i].sports >= 60)
            p[i].getscore += score[2];
       if(p[i].english >= 60)
            p[i].getscore += score[3];
       if(p[i].phical >= 60)
            p[i].getscore += score[4];
        printf("总分%5.2f 均分%5.2f 学分%5.2f\n", p[i].scoreall , p[i].scoreav ,p[i].getscore);
    }
}
void print2(int i){//打印某一学生信息
            printf("%d\n",i+1);
            printf("%s  %s\n", (p+i)->a, (p+i)->name);
            printf("%3d %3d %3d %3d %3d \n", p[i].math, p[i].cl, p[i].sports , p[i].english , p[i].phical);
            printf("总分%5.2f 均分%5.2f 学分%5.2f\n", p[i].scoreall , p[i].scoreav ,p[i].getscore);
            printf("\n");
}
void print1(int n){//按学分排序
    int i = 0 , j = 0;
    STU temp = p[0];
    for(i = 0 ; i<n ; i++){
        for(j = 0 ; j<n-1 ; j++){//冒泡排序
            if(p[j].getscore>p[j+1].getscore){
                temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
            }
        }
    }
}
void findst(int n){
    int i = 0;
    char numb[20];
    scanf("%s",numb);
    for(i=0 ; i<n ; i++){
        if(strcmp(numb,p[i].a) == 0){
            print2(i);
            break;
        }
    }
    if(i == n){
        printf("未查询到该学生信息\n");
    }
}
int main()
{
    int n , m;
    int i = 0;
    printf("请输入要录入的学生人数");
    scanf("%d",&n);
    STU st[n];
    p = st;
    getsoc(n);
    print1(n);
    for(;;){
    printf("情选择菜单 1--查询 , 2--按学分打印所有学生信息\n");
       scanf("%d" ,&m);
       switch(m){
            case 1:  findst(n); break ;
            case 2:  for(i = 0 ; i<n ; i++)  print2(i);
                break;
       }
    }
    return 0;
}
更好的方法其实可以使用动态链表统计学生信息,方便学生信息的增删改查,对上述代码块稍作改进即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值