学生成绩管理系统(最终版)

本次优化了一下界面,还添加了一项平均分的功能。

主要知识点还是结构体数组和指针,希望能对你有帮助。

 话不多说,直接附上源码!!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
// 描述学生信息的结构体
struct student
{
    char name[18];   // 名字
    int num;         // 学号
    double score[3]; // 数学,英语,C语言的成绩
    double sum;      // 总分
    double average;  // 平均分
};

// 学生所有信息的结构体
struct stuSystem
{
    struct student stu[MAX];  //系统用学生的信息的结构体数组stu[]来储存学生的信息
    int curSize;    //当前系统中有的学生数
};

// 创建系统的函数
struct stuSystem* createSystem()
{
    //初始化结构体指针
    struct stuSystem* pSystem = (struct stuSystem*)calloc(sizeof(struct stuSystem), 1);
    return pSystem;
};

// 制作菜单
void makeMenu()
{
    printf("************!欢迎使用学生成绩管理系统!*********\n");
    printf("-------------------------------------------------\n");
    printf("***************!亲!请按照提示操作!************\n");
    printf("-----\t\t\t\t\t--------*\n");
    printf("**\t\t 0. 退出系统 \t\t\t*\n");
    printf("**\t\t 1. 录入信息 \t\t\t*\n");
    printf("**\t\t 2. 浏览信息 \t\t\t*\n");
    printf("**\t\t 3. 删除信息 \t\t\t*\n");
    printf("**\t\t 4. 修改信息 \t\t\t*\n");
    printf("**\t\t 5. 查找信息 \t\t\t*\n");
    printf("**\t\t 6. 排序信息 \t\t\t*\n");
    printf("-----\t\t\t\t\t--------*\n");
    printf("-----\t\t\t\t\t--------*\n");
    printf("*************************************************\n");
    printf("---------请输入(0 ~ 7):");
}

// 录入学生信息的函数
void inputStu(struct stuSystem* pSystem)
{
    struct student temp; // 结构体变量,临时储存用户输入的信息
    printf("请输入学生的姓名和学号:");
    scanf("%s%d",temp.name, &temp.num);
    printf("请分别输入此学生数学 英语 C语言3门课的成绩:");
    temp.sum = 0;
    temp.average = 0;
    for(int i = 0; i < 3; i++)
    {
        scanf("%lf",&temp.score[i]);
        temp.sum += temp.score[i];
    }
    temp.average = temp.sum / 3;
    insertArray(pSystem, temp); // 插入数组函数(用于将用户输入的信息插入并储存在数组中)
}

// 插入(学生信息)数组函数
void insertArray(struct stuSystem* pSystem,struct student stuInfo)
{
    if(pSystem -> curSize >= MAX) // 如果数组已经存满
    {
        printf("学生人数已满,无法录入!\n");
            return;              // 直接返回
    }
    // 若没有存满
    pSystem ->stu[pSystem ->curSize] = stuInfo; // 指针指向学生信息的数组并赋值
    pSystem ->curSize++;   // 指向现在已经存在学生数
}

//打印(学生信息)数组函数
void printfArray(struct stuSystem* pSystem)
{
    printf("姓名\t编号\t数学\t英语\tC语言\t总分\t平均分\n");
    for(int i = 0; i < pSystem ->curSize; i++)
    {
        printf("%s\t%d\t",pSystem ->stu[i].name, pSystem ->stu[i].num); //打印姓名和学号
        for(int j = 0; j < 3; j++)
        {
            printf("%.llf\t",pSystem ->stu[i].score[j]); // 打印各科成绩
        }
        printf("%.llf\t%.1lf\n",pSystem ->stu[i].sum,pSystem ->stu[i].average);  // 打印总分和平均分
    }
}

//查找学生姓名函数
int searchArray(struct stuSystem* pSystem, const char* name)
{
    for(int i = 0; i < pSystem ->curSize; i++)
    {
        if(strcmp(pSystem ->stu[i].name, name) == 0) // 运用比较字符串进行比较
            return i;             // 如果成功找到,返回数组下标
    }
    return -1;   // 没有找到,返回-1
}

//删除(学生信息)数组函数(数组的移位操作)
void deleteArray(struct stuSystem* pSystem, const char* name)
{
    int pos = searchArray(pSystem, name);
    if(pos == -1)
    {
        printf("没有找到此学生,无法删除!\n");
    }
    else
    {
        //利用指针的移位删除数组
        for(int i = pos; i < pSystem ->curSize - 1; i++)
        {
            pSystem ->stu[i] = pSystem -> stu[i + 1];
        }
        pSystem ->curSize--;
        printf("删除成功!\n");
    }
}

//修改(学生信息)数组函数
void modifyArray(struct stuSystem* pSystem, const char* name)
{
    int pos = searchArray(pSystem, name);
    if(pos == -1)
    {
        printf("没有找到此学生,无法修改!\n");
    }
    else
    {
        printf("请输入该生新的姓名和学号:");
        scanf("%s%d",pSystem ->stu[pos].name,&pSystem ->stu[pos].num);
        printf("请输入新的三门课的成绩:");
        pSystem ->stu[pos].sum = 0;  //初始为零
        for(int i = 0; i < 3; i++)   //重新赋值
        {
            scanf("%lf",&pSystem ->stu[pos].score[i]);
            pSystem ->stu[pos].sum += pSystem ->stu[pos].score[i];
        }
        pSystem ->stu[pos].average =  pSystem ->stu[pos].sum / 3;
        printf("修改成功 \n");
    }
}

//(数组的)排序函数(冒泡排序)
void SortBySum(struct stuSystem* pSystem)
{
    //按照总分排序
    for(int i = 0; i < pSystem ->curSize; i++)
    {
        for(int j = 0; j < pSystem ->curSize - i - 1; j++)
        {
            if(pSystem ->stu[j].sum < pSystem ->stu[j + 1].sum)
            {
                struct student temp = pSystem ->stu[j];
                pSystem ->stu[j] = pSystem ->stu[j + 1];
                pSystem ->stu[j + 1] = temp;
            }
        }
    }
}

//整个系统的文件操作就是数组的文件操作
void readFile(struct stuSystem* pSystem, const char* fileName)
{
    FILE* read = fopen(fileName, "r"); //打开文件
    if(read == NULL) //如果打开失败
    {
        read = fopen(fileName, "w+"); //创立一个新的文件
        fclose(read); //关闭文件
    }
    else
    {
        pSystem ->curSize = 0;
        while(1) //feof--检测文件的末尾指示器是否被设置
        {
            if(feof(read))
            {
                break;
            }
            //如果没有设置,重新设置
            int result = fscanf(read, "%s\t%d\t", pSystem ->stu[pSystem->curSize].name, &pSystem->stu[pSystem->curSize].name);
            for(int j = 0; j < 3; j++)
            {
                result = fscanf(read, "%lf\t", &pSystem->stu[pSystem->curSize].score[j]);
            }
            result = fscanf(read, "%lf\t", &pSystem->stu[pSystem->curSize].sum);
            pSystem->curSize++;
        }
    }
}

//更改文件操作
void saveFile(struct stuSystem* pSystem, const char* fileName)
{
    FILE* save = fopen(fileName, "w"); //从文件头开始写入
    for(int i = 0; i < pSystem->curSize; i++)
    {
        //用打印文件函数将所有的信息打印在文件中
        fprintf(save,"%s\t%d\t", pSystem->stu[i].name,pSystem->stu[i].num);
        for(int j = 0; j < 3; j++)
        {
            fprintf(save, "%.1lf\t",pSystem->stu[i].score[j]);
        }
        fprintf(save, "%.1lf\n", pSystem->stu[i].sum);
    }
    fclose(save); //关闭文件
}

//寻找并打开某一个系统的函数(打开系统的钥匙)
void keyDown(struct stuSystem* pSystem)
{
    // 按键输入+开关语句(switch)
    int userKey = 0;
    scanf("%d",&userKey); // 输入钥匙
    int result = userKey;
    int pos = 0;         //  查找判断
    char name[18] = "";
    switch(userKey)      // 用钥匙打开系统的某个操作
    {
    case 0:
        printf("------------退出系统-----------\n");
        printf("退出成功 \n");
        system("pause");
        exit(0); //退出界面函数
        break;
    case 1:
        printf("------------录入学生信息-----------\n");
        inputStu(pSystem);  //调用输入函数
        saveFile(pSystem, "student.txt"); //调用修改文件操作函数
        break;
    case 2:
        printf("------------浏览学生信息-----------\n");
        printfArray(pSystem); //调用打印学生信息函数
        break;
    case 3:
        printf("------------删除学生信息-----------\n");
        printf("请输入要删除学生的姓名:");
        scanf("%s",name);
        deleteArray(pSystem, name); //调用删除函数
        break;
    case 4:
        printf("------------修改学生信息-----------\n");
        printf("请输入修改学生的姓名:");
        scanf("%s", name);
        modifyArray(pSystem, name);//调用修改函数
        saveFile(pSystem, "student.txt");  //调用修改文件操作函数
        break;
    case 5:
        printf("------------查找学生信息-----------\n");
        printf("请输入要查找的学生的姓名:");
        scanf("%s",name);
        pos = searchArray(pSystem, name); // 调用查找函数
        if(pos == -1)
        {
            printf("未找到相关学生信息!\n");
        }
        else
        {
            printf("姓名\t编号\t数学\t英语\t体育\t总分\n");
            printf("%s\t%d\t",pSystem ->stu[pos].name, pSystem ->stu[pos].num); //打印姓名和学号
            for(int i = 0; i < 3; i++)
            {
                printf("%.lf\t", pSystem ->stu[pos].score[i]); // 打印各科成绩
            }
            printf("%.lf\n", pSystem ->stu[pos].sum);  // 打印总分
        }
        break;
    case 6:
        printf("------------学生排序信息-----------\n");
        SortBySum(pSystem);  //调用排序函数
        printfArray(pSystem);  //然后调用打印函数打印信息
        break;
    default:
        printf("输入错误!请重新输入!\n");
        break;

    }
}

int main()
{
    struct stuSystem* pSystem = createSystem(); //创建一个结构指针插入某个系统
    readFile(pSystem, "student.txt"); // 调用(读取/系统)文件操作函数并设立一个文件
    while (1)
    {
        makeMenu();   // 调用函数并打印出菜单
        keyDown(pSystem);  //调用打开系统函数
        system("pause");
        system("cls"); // 刷新屏幕
    }
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永夜天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值