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

这个小项目实际上是来自苏小红版的c语言程序设计(第三版)后面的系列实验题。设计的学生成绩管理系统总共有六版,层层改进。纯粹依靠c语言标准库,实现所有功能。作为算是一个半路出家的程序员,想要体验到编程的乐趣,从零开始完成一个小系统,这样的行为是淳朴的,我认为也是有意义的。

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

某班有最多不超过30人(具体人数由键盘输入)参加某门课的考试:用一维数组作函数参数编程实现如下学生成绩管理:
(1)录入每个学生的学号和考试成绩;
(2)计算课程的总分和平均分;
(3)按成绩由高到低排出名次表;
(4)按学号由小到大排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
(7)输出每个学生的学号、考试成绩,课程总分和平均分。
实验目的:熟悉一维数组作函数参数,排序,查找,统计分析等常用算法,模块化程序设计以及增量测试方法。
[思考题]如果要求程序运行后先显示如下菜单,并提示用户输入选项:
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please enter your choice:
然后根据用户输入的选项执行相应的操作,那么程序应该如何修改呢?

#自顶向下的设计
先按照要求把主程序做出来,菜单做出来明白自己要做哪些功能。
接着大概设计一下函数接口,一边实现一遍修改

int main()
{
    int order = -1;//用户指令
    
    /*int n;
    long num[STU_NUM];
    float score[STU_NUM];*/
    //初始数据
    int n = 5;
    long num[STU_NUM] = { 10001,10002,10003,10004,10005 };
    float score[STU_NUM] = { 20.0,80.0,50.0,66.0,95.0 };
    Mean();//显示菜单
    //使用系统
    while (1)
    {
        scanf_s("%d", &order);
        switch (order)
        {
        case 1://录入成绩
            n = ReadScore(num, score, n);
            break;
        case 2://求平均分和总分
            AverSumofScore(score, n);
            break;
        case 3://按成绩降序排名
            DeSortbyScore(num, score, n);
            printf("Scorted scores:\n");
            PrintScore(num, score, n);
            break;
        case 4://按学号升序排名
            AsSortbyNum(num, score, n);
            printf("Scorted scores:\n");
            PrintScore(num, score, n);
            break;
        case 5://按学号查询学生排名及其考试成绩
        {//如果想在case标签初始化变量,必须加大括号{}
            int rank = -1;//学生排名
            int x;//被查询学号
            printf("Please enter the student ID queried\n");
            scanf_s("%d", &x);
            DeSortbyScore(num, score, n);//先排序
            rank = SearchbyNum(num, x, n);//即使排名也是所在数组的位置
            printf("The student's rank is %d and his grade is %f\n", rank+1, score[rank]);//索引+1为排名
            break;
        }
        case 6://按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,
                   //统计每个类别的人数以及所占的百分比;
            StatistAnalysis( score, n);
            break;
        case 7://输出每个学生的学号、考试成绩,课程总分和平均分
            PrintScore(num, score, n);
            AverSumofScore(score, n);
            break;
        case 0://退出系统
            printf("Good Bye!\n");
            return 0;
            break;
        default:
            break;
        }
        printf("Please enter your choice : \n");
    }
    return 0;
}

int Mean(void)
{
    printf("1.Input record\n");
    printf("2.Caculate total and average score of course\n");
    printf("3.Sort in descending order by score\n");
    printf("4.Sort in ascending order by number\n");
    printf("5.Search by number\n");
    printf("6.Statistic analysis\n");
    printf("7.List record\n");
    printf("0.Exit\n");
    printf("Please enter your choice : \n");
    return 0;
}

项目头文件

/*程序功能:   学生成绩管理
编码者:   JackieFeng
日期:  04/11/2021
版本号:1.1
备注:
某班有最多不超过30人(具体人数由键盘输入)国实现如下学生成绩管理:用一维数组作区函数参数编程实现如下学生成绩管理:
(1)录入每个学生的学号和考试成绩;
(2)计算课程的总分和平均分;
(3)按成绩由高到低排出名次表;
(4)按学号由小到大排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
(7)输出每个学生的学号、考试成绩,课程总分和平均分。*/
#pragma once
#define STU_NUM 30
/*
函数名称:   ReadScore
功能描述:   录入每个学生的学号和成绩,并返回总人数
参数:
    num[]:学号
    score[]:分数
返回:总人数
备注:*/
int ReadScore(long num[], float score[], int n);
/*
函数名称:   AverSumofScore
功能描述:   计算总分和平均值并输出
参数:
    score[]:分数
    n:总分
返回:
备注:*/
int AverSumofScore(float score[], int n);
/*
函数名称:   DeSortbyScore
功能描述:   按照成绩降序排列名次表
参数:
    num[]:学号
    score[]:分数
    n:总人数
返回:
备注:*/
void DeSortbyScore(long num[], float score[], int n);
/*
函数名称:   AsSortbyNum
功能描述:   按照学号升序排列
参数:
    num[]:学号
    score[]:分数
    n:总人数
返回:
备注:*/
void AsSortbyNum(long num[], float score[], int n);
/*
函数名称:   SearchbyNum
功能描述:   按学号查询学生排名及其考试成绩
参数:
    num[]:学号
    x:查询学号
    n:总人数
返回:索引号,-1为没找到
备注:*/
int SearchbyNum(long num[], long x, int n);
/*
函数名称:   StatistAnalysis
功能描述:   按优秀(90 - 100)、良好(80 - 89)、中等(70 - 79)、及格(60 - 69)、不及格(0 - 59)5个类别, 
                 统计每个类别的人数以及所占的百分比;
参数:
    num[]:学号
    score[]:分数
    n:总人数
返回:
备注:*/
void StatistAnalysis( float score[], int n);
/*
函数名称:   PrintScore
功能描述:   打印每位学生的成绩
参数:
    num[]:学号
    score[]:分数
    n:总人数
返回:
备注:*/
void PrintScore(long num[], float score[],int n);

/*
函数名称:   Mean
功能描述:   显示菜单页面,提示用户如何使用
参数:
返回:
备注:*/
int Mean(void);

#具体实现

int ReadScore(long num[], float score[],int n)
{
    printf("正在录入学号和成绩...\n");
    printf("同时输入两个-1结束录入\n");
    int i = n-1;
    do
    {
        i++;
        printf("正在录入第%d个学生的学号和成绩\n", i + 1);
        scanf_s("%ld%*c%f", &num[i], &score[i]);
    } while (score[i] > 0 && i <= 30);
    printf("录入完成总共录入%d人\n", i);
    return i;
}

int AverSumofScore(float score[], int n)
{
    float sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += score[i];
    }
    printf("课程总分为%f,平均分为%f\n", sum, sum / n);
    return sum;
}

void DeSortbyScore(long num[], float score[], int n)//选择排序
{
    long nTemp;
    float sTemp;
    //选择排序,第一层循环整个数组,每次归一位
    for (int i = 0; i < n-1; i++)
    {
        int max = i;//最大位索引值,每次初始化为乱序区第一位
        //第二层循环乱序位,每次从乱序列中选择最大一位
        for (int j = i+1; j < n; j++)
        {
            if (score[max] < score[j])
            {
                max = j;
            }
        }
        //发生改变,交换
        if (i != max)
        {
            nTemp = num[i];
            num[i] = num[max];
            num[max] = nTemp;

            sTemp = score[i];
            score[i] = score[max];
            score[max] = sTemp;
        }
    }
}

void AsSortbyNum(long num[], float score[], int n)
{
    long nTemp;
    float sTemp;
    //选择排序,第一层循环整个数组,每次归一位
    for (int i = 0; i < n - 1; i++)
    {
        int min = i;//最小位索引值,每次初始化为乱序区第一位
        //第二层循环乱序位,每次从乱序列中选择学号最小的一位
        for (int j = i+1; j < n; j++)
        {
            if (num[min] > num[j])
            {
                min = j;
            }
        }
        //发生改变,交换
        if (i != min)
        {
            nTemp = num[i];
            num[i] = num[min];
            num[min] = nTemp;

            sTemp = score[i];
            score[i] = score[min];
            score[min] = sTemp;
        }
    }
}
int SearchbyNum(long num[], long x, int n)
{
    //顺序查找
    for (int i = 0; i < n; i++)
    {
        if (x == num[i])
        {
            return i;
        }
    }
    return -1;
}

void StatistAnalysis(float score[], int n)
{
    int ranks[5] = {0};// 各种档次的人数,首位赋值为0,后续位补充为0
    for (int i = 0; i < n; i++)//遍历整个成绩,统计数据
    {
        if (score[i] < 60)
        {
            ranks[0]++;
        }
        else if (score[i] < 70 && score[i] >= 60) 
        {
            ranks[1]++;
        }
        else if (score[i] < 80 && score[i] >= 70)
        {
            ranks[2]++;
        }
        else if (score[i] < 90 && score[i] >= 80)
        {
            ranks[3]++;
        }
        else//90到100档
        {
            ranks[4]++;
        }
    }
    //输出统计数据
    printf("rank            amount            percent\n");
    printf("0-59            %d                  %.0f%%\n", ranks[0], ranks[0] / (float)n * 100);
    printf("60-69           %d                  %.0f%%\n", ranks[1], ranks[1] / (float)n * 100);
    printf("70-79           %d                  %.0f%%\n", ranks[2], ranks[2] / (float)n * 100);
    printf("80-89           %d                  %.0f%%\n", ranks[3], ranks[3] / (float)n * 100);
    printf("90-100          %d                  %.0f%%\n", ranks[4], ranks[4] / (float)n * 100);
}

void PrintScore(long num[], float score[], int n)
{
    printf("学号      成绩      \n");
    for (int i = 0; i < n; i++)
    {
        printf("%d      %f      \n", num[i], score[i]);
    }
}

猜你喜欢

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