实现“期末学生总评成绩统计”程序的C语言课程设计

本文详细描述了一个C语言课程设计项目,设计了一个控制台应用程序,用于统计和展示学生的期末总评成绩。程序包括读取数据、计算成绩指标、显示成绩信息、绘制直方图等功能。通过结构体存储学生信息,使用菜单驱动的界面供用户交互。在开发过程中遇到了一些问题,如数组初始化、编译器兼容性等,但最终成功解决并完成了程序的运行和截图展示。
摘要由CSDN通过智能技术生成

C语言课程设计报告

               

  • 设计目的

根据课程设计题目要求,编写C代码,完成设计任务。

  • 设计内容
  1. 仔细研读《课程设计题目和说明》文档,理解需要设计的功能;
  2. 使用自己熟悉的C IDE编程工具,实现具体功能;
  3. 设计“期末学生总评成绩统计”程序(详见课程设计题目与说明文档)
  4. 编码调试程序,运行结果截图。
  5. 撰写课程设计报告,提交源代码和课程设计报告到网络学习平台,现场答辩。
  • 功能设计记录

3.1 系统功能描述

编写了控制台应用程序,采用功能菜单函数(menu)的方式,用户可以选择功能选项,执行相关功能。

3.2 程序整体设计说明

1读数功能(读取的成绩保存在数组中);2成绩计算功能(计算及格率、最高分、最低分、平均分、标准差、众数、中位数等。计算得到的数据可以保存在相关数组中,用于后面的显示与绘图);3显示总评成绩与分数分段占比信息;4绘制分数分段占比的直方图;5显示成绩的其他指标(最高分、最低分、平均分、标准差等);6显示排名前十的学生信息;0退出程序。

3.3 结构体设计

typedef struct student

{

    long id;

    int score[M];

} STUDENT;

3.4 main函数设计

int main ()

{

    STUDENT stu[SIZE];

    int num = readData(stu);

    int sum=num;

    int max, min;

    double pass = 0;

    double ave[SIZE],stdDev[SIZE];

    int grade[11]= {0};

    while(1)

    {

        switch(menu())

        {

        case 1:

        {

            display(stu, num);

            break;

        }

        case 2:

        {

            countPassRadio(&max,&min, &pass, stu, sum);

            countStdDev(ave,stdDev, stu,sum);

            break;

        }

        case 3:

        {

            ShowData1(stdDev,stu,sum,grade);

            break;

        }

        case 4:

        {

            draw(grade);

            break;

        }

        case 5:

        {

            printf("及格率=%6.2f%% 最高分=%3d 最低分=%3d\n\n",pass,max,min);

            printf("平时成绩平均分 = %5.2f 平时成绩标准差= %5.2f\n\n",ave[0],stdDev[0]);

            printf("期末成绩平均分 = %5.2f 期末成绩标准差= %5.2f\n\n",ave[1],stdDev[1]);

            printf("总评成绩平均分 = %5.2f 总评成绩标准差= %5.2f\n\n",ave[2],stdDev[2]);

            break;

        }

        case 6:

        {

            top(stu,sum);

            break;

        }

        case 0:

        {

            exit(0);

            break;

        }

        default:

            break;

        }

    }

    return 0;

}

3.5 menu菜单函数设计

int menu(void)

{

    int itemSelected;

    printf("\n=========Student Score Analysis=========\n");

    printf("              1. Read data\n");

    printf("              2. Count\n");

    printf("              3. Show data 1\n");

    printf("              4. Draw Histogram\n");

    printf("              5. Show data 2\n");

    printf("              6. Top 10 Students\n");

    printf("              0. Exit\n");

    printf("======================================\n");

    printf("Your choice: ");

    scanf("%d", &itemSelected);

    return itemSelected;

}

3.6 功能函数一设计

void ShowData1(double stdDev[],STUDENT stu[], int sum,int grade[])

{

    for(int i=0; i<sum; i++)

    {

        if(stu[i].score[2]==100)

        {

            grade[10]+=1;

        }

        else if(stu[i].score[2]>89)

        {

            grade[9]+=1;

        }

        else if(stu[i].score[2]>79)

        {

            grade[8]+=1;

        }

        else if(stu[i].score[2]>69)

        {

            grade[7]+=1;

        }

        else if (stu[i].score[2]>59)

        {

            grade[6]+=1;

        }

        else if(stu[i].score[2]>49)

        {

            grade[5]+=1;

        }

        else if(stu[i].score[2]>39)

        {

            grade[4]+=1;

        }

        else if(stu[i].score[2]>29)

        {

            grade[3]+=1;

        }

        else if(stu[i].score[2]>19)

        {

            grade[2]+=1;

        }

        else if(stu[i].score[2]>9)

        {

            grade[1]+=1;

        }

    }

    for (int i=0; i<sum; i++)

    {

        printf("%3d%4d%4d%4d\n",i+1,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

    }

    float rate;

    for (int i=10; i>0; i--)

    {

        if (grade[i]==0)

        {

            rate=0;

        }

        else

            rate=(float)grade[i]/sum*100;

        printf("Grade%3d: %d,%0.2f %%\n",i,grade[i],rate);

    }

}

3.6 功能函数二设计

void top(STUDENT stu[],int sum)

{

    STUDENT temp;

    for(int i =0; i<sum-1; i++)

    {

        for(int j = 0; j<sum-1-i; j++)

        {

            if(stu[j].score[2]<stu[j+1].score[2])

            {

                temp=stu[j+1];

                stu[j+1]=stu[j];

                stu[j]=temp;

            }

        }

    }

    for (int i=0; i<10; i++)

    {

        printf("The top 10 students are %ld,scores are %3d %3d %3d\n",stu[i].id,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

    }

}

3.7 运行截图分析

 

 

 

 

 

  • 课程设计小结设计心得、对改进系统功能的思考、对C的理解等)

本程序的实现完全按照题目所给的要求进行实现,可能是所有作品中完成度最高的。

Show data2部分没有采用函数的形式,是考虑到此步已经不需要进行任何数据的运算,只需要单纯输出count函数得出的结果

代码在运行前有很多bug,经过不懈努力终于修复完成。

可能是编译器不同的问题,我使用的codeblocks要求switch语句中每一句都带上大括号。

在grade数组中,我一开始得到了几个乱码的数据。究其原因,是一开始没有为数组赋初始值0。

在根据总评高低给结构体进行排序时一开始出现了语法错误,后来把用于交换的中间变量temp改成了结构体的类型才得以正常运行

最后我本人在自己电脑上运行时,所有的中文全部乱码,经查证是编译器的问题,因为代码在同学的电脑上可以正确运行。为了让考官能直观感受到程序本身的好坏,本人所提供的运行截图是在同学的电脑上进行的,望周知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Enza、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值