用c语言实现简单学生信息管理

#define MAX_NAME_LEN 10

#define MAX_STUDENTS 10


1、定义一个结构题来存放学生的姓名、数学成绩、语文成绩、英语成绩、总成绩。其中学生名字使用char数组来存放,需要使用到宏定义MAX_NAME_LEN,数学成绩、语文成绩、英语成绩的类型unsigned char总成绩sum是unsigned short。

2、从文件读入学生信息并将学生信息存放在结构体数组中。

3、定义的一个My_Print函数,要求:输出学生的名字各科成绩和总成绩,一个学生的信息打印在一行。
4、使用冒泡排序或选择排序,给学生进行排名,按照总成绩从高到低。

5、使用姓名对学生进行查到,并且返回指向这个学生信息的指针

6、定义一个main函数,首先读取学生信息,然后打印所有学生的信息,接着对学生信息进行排序,再打印排序后的学生信息,最后查找特定学生(张三)的信息并打印。

———————————————————————————————————————————

1、定义一个结构题来存放学生的姓名、数学成绩、语文成绩、英语成绩、总成绩。其中学生名字使用char数组来存放,需要使用到宏定义MAX_NAME_LEN,数学成绩、语文成绩、英语成绩的类型unsigned char总成绩sum是unsigned short。

typedef struct student
{
    char name[MAX_NAME_LEN];
    unsigned char score[3];
    unsigned short sum;
} student;

2、从文件读入学生信息并将学生信息存放在结构体数组中。

test.txt文件如下:

张三 85 90 88 263
李四 78 82 85 245
王五 92 88 91 271
赵六 88 92 85 265
陈七 91 87 89 267
刘八 84 86 90 260
孙九 89 91 88 268
周十 82 85 83 250
吴十 87 89 84 260
郑二 90 85 88 263

 读取函数

int reTxt(student stu[])//返回学生数量
{
    int count=0;

    //从文件中读取学生信息
    FILE *fp=fopen("test.txt","r");
    if(fp==NULL)
    {
        printf("文件打开失败\n");
        return 1;
    }

    while(fscanf(fp,"%s %hhu %hhu %hhu %hu",
                 stu[count].name,
                 &stu[count].score[0],//数学成绩
                 &stu[count].score[1],//语文成绩
                 &stu[count].score[2],//英语成绩
                 &stu[count].sum)==5)
    {
        printf("成功读取学生:%s\n", stu[count].name); // 调试信息
        count++;
        if(count>MAX_STUDENTS)
        {
            printf("学生数量超出容量");
            break;
        }
    }
    fclose(fp);
    return count;
}

3、定义的一个My_Print函数,要求:输出学生的名字各科成绩和总成绩,一个学生的信息打印在一行。

//打印一个学生信息
void My_Print(student stu)
{
    printf("姓名:%s,数学成绩:%hhu,语文成绩:%hhu,英语成绩:%hhu,总成绩:%hu\n",
           stu.name,stu.score[0],stu.score[1],stu.score[2],stu.sum);

}

4、使用冒泡排序或选择排序,给学生进行排名,按照总成绩从高到低。

//冒泡排序,按总成绩从高到低
void bubble(student *stu,int count)
{
    student temp;
    int i,j;
    for(i=0; i<count-1; i++)
    {
        for(j=0; j<count-i; j++)
        {
            if(stu[j].sum<stu[j+1].sum)
            {
                temp=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=temp;
            }
        }
    }
}

//选择排序,按成绩从低到高
void xuanZeSort(student *stu,int count)
{
    int i,j;
    student temp;
    int minIndex;
    for(i=0; i<count-1; i++)
    {
        minIndex=i;
        for(j=i; j<count; j++)
        {
            if(stu[j].sum<stu[minIndex].sum)
            {
                minIndex=j;
            }
        }
        if(minIndex!=i)
        {
            temp=stu[minIndex];
            stu[minIndex]=stu[i];
            stu[i]=temp;
        }

    }

}

5、使用姓名对学生进行查到,并且返回指向这个学生信息的指针

//使用学生姓名查找,返回学生信息指针
student *searchByName(student stu[],char stuName[],int count)
{
    int i;
    for(i=0; i<count; i++)
    {
        if(strcmp(stu[i].name,stuName)==0)
        {
            return &stu[i];
        }
    }
}

6、定义一个main函数,首先读取学生信息,然后打印所有学生的信息,接着对学生信息进行排序,再打印排序后的学生信息,最后查找特定学生(张三)的信息并打印。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 10
#define MAX_STUDENTS 10

int main()
{
    int count;
    student stu[MAX_STUDENTS];
    count=reTxt(stu);
    printf("\n");

    //打印学生信息
    if(count==0)
    {
        printf("没有检测到学生");
    }
    else
    {
        int i;
        for(i=0; i<count; i++)
        {
            My_Print(stu[i]);
        }
    }

    printf("\n冒泡排序\n");
    bubble(stu,count);    //调用冒泡排序,按总成绩从高到低
    if(count==0)
    {
        printf("没有检测到学生");
    }
    else
    {
        int i;
        for(i=0; i<count; i++)
        {
            My_Print(stu[i]);
        }
    }

    printf("\n选择排序\n");
    xuanZeSort(stu,count);    //调用选择排序,按总成绩从低到高
    if(count==0)
    {
        printf("没有检测到学生");
    }
    else
    {
        int i;
        for(i=0; i<count; i++)
        {
            printf("%2d、",i+1);
            My_Print(stu[i]);
        }
    }

    //查找学生信息
    char byname[MAX_NAME_LEN];
    printf("\n请输入要查找的学生姓名:\n");
    scanf("%s",byname);
    student *result=searchByName(stu,byname,count);
    if(result!=NULL)
    {
        My_Print(*result);
    }


    return 0;
}

 运行结果截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值