苏小红版 c语言程序设计(第三版)系列实验题:学生成绩管理系统V6.0

github:https://github.com/Jackie0Feng/SAMS
#系统需求描述

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,考试科目最多不超过6门(具体门数由键盘输入)。学生成绩管理系统是一个非常实用的程序,如果能把用户输入的数据存盘,下次运行时独处,就更有用了。增加文件读写的功能编程实现如下菜单驱动的学生成绩管理系统:
(1)录入每个学生的学号,姓名和各科考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分
(4)按每个学生的总分由高到低排出名次表;
(5)按每个学生的总分由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名的字典顺序排出成绩表;
(8)按学号查询学生排名及其各科考试成绩;
(9)按姓名查询学生排名及其各科考试成绩;
(10)按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;
(11)输出每个学生的学号、姓名,各科考试成绩,总分,平均分,以及每门课程的总分和平均分。
(12)将每个学生的记录信息写入文件。
(13)从文件中读出每个学生的记录信息并显示。
要求程序运行后先显示如下菜单,并提示用户输入选项:
1.Input record
2.Caculate total and average score of every course
3.Caculate total and average score of every student
4.Sort in descending order by total score of every student
5.Sort in ascending order by total score of every student
6.Sort in ascending order by number
7.Sort in dictionary order by name
8.Search by number
9.serch by name
10.Statistic analysis
11.List record
12.Write to a file
13.Read from a file
0.Exit
Please enter your choice:
根据用户输入的选项执行相应的操作
实验目的:在学生管理系统V4.0的基础上,通过增加任务要求,熟悉文件的基本操作,模块化程序设计,增量测试方法。

#顶层设计
最后一个版本就是添加文件功能,其实就是简单的讲我们的数据存储下来,以后要用的时候不用输入了,而是从本地读取。连文件管理都算不上,不过这就算操作系统的最基础的文件管理功能了。以后回看操作系统知识时脑中的概念会更加具象。

/*程序功能:   学生成绩管理
编码者:   JackieFeng
日期:  14/11/2021
版本号:6.0
备注:
某班有最多不超过30人(具体人数由键盘输入)参加期末考试,考试科目最多不超过6门(具体门数由键盘输入)。
学生成绩管理系统是一个非常实用的程序,如果能把用户输入的数据存盘,下次运行时独处,就更有用了。
增加文件读写的功能编程实现如下菜单驱动的学生成绩管理系统:
(1)录入每个学生的学号,姓名和各科考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分
(4)按每个学生的总分由高到低排出名次表;
(5)按每个学生的总分由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名的字典顺序排出成绩表;
(8)按学号查询学生排名及其各科考试成绩;
(9)按姓名查询学生排名及其各科考试成绩;
(10)按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;
(11)输出每个学生的学号、姓名,各科考试成绩,总分,平均分,以及每门课程的总分和平均分。
(12)将每个学生的记录信息写入文件。
(13)从文件中读出每个学生的记录信息并显示。*/
#include <stdio.h>
#include "SAMS.h"
#include <string.h>
#include <stdlib.h>
//#pragma warning(disable : 4996)

int main()
{
    int order = -1;//用户指令
    
    /*int n;
    long num[STU_NUM];
    float score[STU_NUM];*/
    //初始数据
    int n = 5;//学生人数
    int m = 3;//课程数

    long num[STU_NUM] = { 10001,10002,10003,10004,10005 };
    char name[][MAX_LEN] = { "tom","jack","bill","amy","jackie" };
    float score[STU_NUM] = { 20.0,80.0,50.0,66.0,95.0 };
    float score2[STU_NUM][COURSE_NUM] = { {20.0,80.0,50.0},//2表示二维
                                                                        {66.0,95.0,77.0},
                                                                        {63.0,77.0,81.0},
                                                                        {86.0,43.0,72.0},
                                                                        {96.0,95.0,89.0} };
    /*这次改变了一个字段,将一维的课程升级为了二维数组,
    又新增了一个功能统计每个学生所有课程的平均分和总分,
    所以需要新增两个一维数组sum[],aver[]存储一下此信息.*/
   /* float sum[STU_NUM] = { 0 };
    float aver[STU_NUM] = { 0 };*/
    //AverSumofEveryStudent(score2, sum, aver, n, m);

    //初始化结构体数组数据
    STU students[STU_NUM];
    for (int i = 0; i < n; i++)
    {
        students[i].num = num[i];
        strcpy_s(students[i].name, MAX_LEN, name[i]);
        for (int j = 0; j < m; j++)
        {
            students[i].score[j] = score2[i][j];
        }
    }
    AverSumofEveryStudent(students, n, m);

    Mean();//显示菜单
    //使用系统
    while (1)
    {
        printf("Please enter your choice : \n");
        scanf_s("%d", &order);
        getchar();//读走缓存里的回车符
        switch (order)
        {
        case 1://录入成绩
            //n = ReadScore(num, score, n);
            n = ReadScore(students, n, m);
            AverSumofEveryStudent(students, n, m);//每次录入结束后都得重新计算
            break;
        case 2://计算每门课程的总分和平均分;
            AverSumofEveryCourse(students, n, m);
            break;
        case 3://计算每个学生的总分和平均分
            AverSumofEveryStudent(students, n, m);
            printf("已经重新计算总分和平均分\n");
            break;
        case 4://按每个学生的总分由高到低排出名次表;
            SortbyScore(students, n, m, Descending);
            printf("Descendingly scorted by scores:\n");
            PrintScore(students, n, m);
            break;
        case 5://按每个学生的总分由低到高排出名次表;
            SortbyScore(students, n, m, Ascending);
            printf("Ascendingly scorted by scores:\n");
            PrintScore(students, n, m);
            break;
        case 6://按学号升序排名
            SortbyNum(students, n, m, Ascending);
            printf("Ascendingly scorted by num:\n");
            PrintScore(students, n, m);
            break;
        case 7://按姓名的字典顺序排出成绩表;
            SortbyName(students, n, m);
            printf("Dictionarily scorted by name:\n");
            PrintScore(students, n, m);
            break;
        case 8://按学号查询学生排名及其各科考试成绩;
            SearchbyNum(students, n, m);
            break;
        case 9://按姓名查询学生排名及其各科考试成绩;
            SearchbyName(students, n, m);
            break;
        case 10://按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,
                   //统计每个类别的人数以及所占的百分比;
            StatistAnalysis(students, n, m);
            break;
        case 11://输出每个学生的学号、姓名,各科考试成绩,总分,平均分,以及每门课程的总分和平均分。
            PrintScore(students, n, m);
            AverSumofEveryCourse(students, n, m);
            break;
        case 12://将每个学生的记录信息写入文件。
            puts("正在写入students.txt文件");
            WritetoFile(students, n, m);
            break;
        case 13://从文件中读出每个学生的记录信息并显示。
            STU  studentsNew[STU_NUM];
            ReadfromFile(studentsNew, n, m);
            puts("新文件内容如下");
            PrintScore(studentsNew, n, m);
            break;
        case 0://退出系统
            printf("Good Bye!\n");
            exit(0);//建议main函数用exit(0)表示正常结束
        default:
            Mean();
            break;
        }
    }
}

int Mean(void)
{
    printf("1.Input record\n");
    printf("2.Caculate total and average score of every course\n");
    printf("3.Caculate total and average score of every student\n");
    printf("4.Sort in descending order by total score of every student\n");
    printf("5.Sort in ascending order by total score of every student\n");
    printf("6.Sort in ascending order by number\n");
    printf("7.Sort in dictionary order by name\n");
    printf("8.Search by number\n");
    printf("9.Search by name\n");
    printf("10.Statistic analysis\n");
    printf("11.List record\n");
    printf("12.Write to a file\n");
    printf("13.Read from a file\n");
    printf("0.Exit\n");
    printf("666.Show mean\n");
    return 0;
}

头文件

/*
函数名称:   WritetoFile
功能描述:   将每个学生的记录信息写入文件
参数:
    STU students:学生结构体数组
    n:总人数
    m:课程总数
返回:
备注:*/
void WritetoFile(STU students[], int n, int m);
/*
函数名称:   ReadfromFile
功能描述:   从文件中读出每个学生的记录信息并显示
参数:
    STU students:学生结构体数组
    n:总人数
    m:课程总数
返回:
备注:*/
void ReadfromFile(STU students[], int n, int m);

#具体实现

void WritetoFile(STU students[], int n, int m)
{
    FILE* fp;
    if (fopen_s(&fp,"students.txt", "w") != 0)
    {
        puts("文件打开失败");
        exit(0);
    }
    else//按数据块读写文件
    {
        int num = fwrite(students, sizeof(STU), n, fp);
        printf("成功写入%d条数据\n", num);
        fclose(fp);
    }
}

void ReadfromFile(STU students[], int n, int m)
{
    FILE* fp;
    if (fopen_s(&fp, "students.txt", "r") != 0)
    {
        puts("文件打开失败");
        exit(0);
    }
    else//按数据块读写文件
    {
        int num = fread(students, sizeof(STU), n, fp);
        printf("成功写入%d条数据\n", num);
        fclose(fp);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43231912/article/details/122284270