C语言 课程设计 大作业 学生成绩管理系统 含源代码、docx详细报告


东 华 大 学

C语言课程设计

报告书

班 级:通信1403

姓 名:

学 号:

指导老师: 廖小飞

2015-1-2

学生成绩管理系统

功能需求分析
该系统(学生成绩管理系统)可实现对学生基本信息及成绩的管理,用户根据提示输入10个学生及5门课程的相关信息后,可调用以下功能:

求出每名学生的平均成绩和总成绩。
求出每门课程的平均分、及格率、最高成绩和最低成绩。
输出总成绩前5名的学生学号、各科成绩和总分。
输出各科补考学生的学号和成绩。
系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。主要功能需求描述如下:

1.系统主控平台 允许用户选择想要的操作,通过输入相应序号选择相应操作。

2.添加信息 用户根据提示输入5门课程的名称,10个学生的学号及各科成绩。

3.计算 计算学生的平均分、总分,课程的平均分、及格率、最高分、最低分等。

4.排名 根据学生总成绩进行排序,并输出前5名的学生的相关信息。

5.筛选 筛选出每门课程成绩小于60分的学生,并输出相应信息。

6.退出 退出系统。

总体设计
功能模块设计
系统界面
提供一个简单的人机界面,使用户可以根据提示输入操作项。首先调用print_menu_title()函数显示系统的标题。然后,打印出目录,并按一定格式显示,引导用户进行选择。最后,读取用户输入的选项,调用相应的功能模块。
输入课程及学生信息
在主菜单中选择1时,调用input_score()函数,输入课程及学生信息。首先建立一个二维字符型数组和一个结构体数组,分别用来存放用户输入的课程名称和学生信息。输入完毕后返回主菜单界面。
计算学生总分和平均分
主菜单中选择2的时候计算学生的总分和平均分。调用stu_ave()函数,先后计算学生的总分、平均分。然后,调用print_table_head_ave()函数显示计算总分、平均分结果的表头。再将计算结果按一定格式打印在屏幕上。最后,调用print_table_buttom_ave()函数显示计算结果的表尾。
计算课程平均分、及格率、最高成绩和最低成绩
主菜单中选择3的时候,调用cour_ave()函数,分别计算出每门课程的平均分、及格率、最高成绩和最低成绩。然后,调用print_table_head_cour()函数显示计算结果的表头。再按一定格式显示计算的结果。最后,调用print_table_buttom_cour()函数打印计算结果的表尾。
输出总成绩前5的学生的相关信息
主菜单中选择4的时候,调用sort()函数,先计算出每个学生的总成绩,并且使用“冒泡法”找出总成绩前5的学生。然后,调用print_table_head_sort()函数打印输出结果的表头。再按一定格式分别显示总成绩前5的学生的相关信息。最后,调用print_table_buttom_sort()函数显示输出结果的表尾。
输出各科补考学生的信息
主菜单中选择5的时候,调用bukao()函数,分别检测每门课每个学生的成绩,筛选出成绩小于60分的学生。然后调用print_table_head_bukao()函数显示各科补考名单的表头。再按一定格式分别输出各科补考学生的学号、成绩。最后,调用print_table_buttom_bukao()函数打印补考名单的表尾。
退出
主菜单中选择6的时候,退出系统。

学生成绩管理系统的功能模块如图2-1所示。

图2-1 学生成绩管理系统的功能模块

程序处理流程
系统的执行应从系统菜单的选择开始,允许用户输入1~6之间的数值来选择要进行的操作,输入其他字符是无效的,系统会保持等待直到用户输入合法的选项。

若用户输入1,则调用input_score()函数,进行输入课程及学生信息操作。

若输入2,则调用stu_ave()函数,进行计算学生成绩操作。最后提示用户按任意键返回主菜单。

若输入3,则调用cour_ave()函数,进行计算各科成绩操作。最后提示用户按任意键返回主菜单。

若输入4,则调用sort()函数,进行学生排名操作。最后提示用户按任意键返回主菜单。

若输入5,则调用bukao()函数,进行筛选各科补考学生操作。最后提示用户按任意键返回主菜单。

若输入6,则退出系统。

系统的处理流程如图2-2所示。

图2-2 程序流程图

详细设计与程序实现
预处理
学生成绩管理系统涉及到10名学生、5门课程,需要使用数组进行处理。系统运行时还应进行清屏等操作。故预处理时应包含stdio.h stdlib.h string.h三个头文件。
数据结构定义
该系统中,每名学生都有其各自的学号、各科成绩、总分、平均分等数据,他们是有联系的。使用单纯的数组来存放这些信息,显得冗杂且难以操作。故定义一个结构体类型Student,该类型的变量中包含学生的学号、各科成绩、平均分和总分四项信息。
函数及变量声明
该程序的函数包括主要处理函数和辅助函数。主要处理函数用来进行输入信息、计算成绩等操作。为了让系统显得更加规范,可操作性强,还编写了一些控制显示的辅助函数。
在主要处理函数中,系统需多次调用课程及学生信息,故该程序包含两个全局变量:一个是course[5][10],用来存放5门课的名称;另一个是结构体数组struct Student stu[10],用来存放10个学生的各项信息。
main函数
在主函数中调用函数print_menu_title(),显示主菜单和选项列表,等待用户输入。
主要处理函数
1.输入信息函数
函数名称:input_score
函数功能:用户在主菜单选择1时,调用此函数,用来输入课程和学生信息。
处理过程:
(1)使用循环语句提示用户依次输入课程的名称,存放到字符数组course[5][10]中。
(2)使用循环语句,先输入一名学生的学号,再提示用户依次输入该学生各科成绩。循环到10名学生的信息均输入完毕。
(3)清屏,返回主菜单。
2.计算学生成绩函数
函数名称:stu_ave
函数功能:用户在主菜单选择2时,调用此函数,用来对学生的成绩进行计算。
处理过程:
(1)使用循环语句令每名学生的总成绩初始化为0。
(2)计算每名学生的总分。
(3)用总分除以5得到每名学生的平均分。
(4)依次打印表头、结果、表尾。
3.计算课程成绩函数
函数名称:cour_ave
函数功能:用户在主菜单选择3时,调用此函数,用来计算各科的平均分、及格率、最高成绩和最低成绩。
处理过程:
(1)使用循环语句计算各科成绩的总分,再除去10,得到各科平均分。
(2)依次检索各科每名学生的成绩,统计各科成绩大于等于60分的人数,求得及格率。
(3)依次检索各科每名学生的成绩,求出最高分和最低分。
(4)依次打印表头、结果、表尾。
4.学生排名函数
函数名称:sort
函数功能:用户在主菜单选择4时,调用此函数,用来对学生进行排名。
处理过程:
(1)创建一个结构体指针数组p[10],令其依次指向stu[0] stu[1]……stu[9]。
(2)计算每名学生的总成绩。
(3)使用“冒泡法”对结构体指针进行排序,令p[0] p[1] p[2] p[3] p[4]分别指向总成绩前5名的学生对应的结构体变量。
(4)依次打印表头、结果、表尾。
5.筛选补考学生函数
函数名称:bukao
函数功能:用户在主菜单选择5时,调用此函数,用来筛选出各科补考的学生。
处理过程:
(1)打印标题及表头。
(2)依次检索各科每名学生的成绩,若其成绩小于60,则输出其学号及成绩。
(3)打印表尾。
辅助函数功能介绍
1.显示主菜单标题 函数名称:print_menu_title

2.显示总分、平均分表格头部的函数 函数名称:print_table_head_ave

3.显示总分、平均分表格底部的函数 函数名称:print_table_buttom_ave

4.显示课程成绩表格头部的函数 函数名称:print_table_head_cour

5.显示课程成绩表格底部的函数 函数名称:print_table_buttom_cour

6.显示排名前5学生表格头部的函数 函数名称:print_table_head_sort

7.显示排名前5学生表格底部的函数 函数名称:print_table_buttom_sort

8.显示各科补考学生表格头部的函数 函数名称:print_table_head_bukao

9.显示各科补考学生表格底部的函数 函数名称:print_table_buttom_bukao

系统实现截图
1.主界面

系统运行后,首先进入主菜单界面,允许用户输入1~6之间的不同的数字,来实现不同的操作。主菜单界面如图4-1所示。

2.输入课程及学生信息

进入主菜单界面后,输入数字1进入输入课程名称及学生学号、各科成绩界面,用户可以根据提示信息输入5门课程的名称和10个学生的学号、各科成绩,输入完成后返回主菜单。输入信息界面如图4-2、4-3所示。

3.计算学生总分、平均分

在主菜单选择2,则进入计算学生成绩界面。系统按照预定格式将学生学号、平均成绩和总分打印出来,界面如图4-4所示。

图4-2 输入课程名称界面

图4-1 学生成绩管理系统主菜单界面


 

图4-3 输入学生学号及成绩界面

图4-4 计算学生总分、平均分界面

4.计算课程平均分、及格率、最高分、最低分

在主菜单中选择3,则进入计算课程成绩界面。系统按照预定格式将课程名称、最高分、最低分、平均分、及格率打印出来,界面如图4-5所示。

5.打印总成绩前5名的学生学号、各科成绩和总分

在主菜单中选择4时,则进入打印总成绩前5的学生信息界面。系统按照预定格式将名次、学号、各科成绩和总分打印出来,界面如图4-6所示。


 

图4-6 输出总成绩前5名的学生信息界面

图4-5 计算课程成绩界面

6.输出各科补考学生的学号和成绩

在主菜单中选择5时,则进入输出补考学生名单界面。系统按照预定格式将科目、学号和成绩打印出来,界面如图4-7、4-8所示。


 

图4-7 输出各科补考学生的学号和成绩界面

图4-8 输出各科补考学生的学号和成绩界面

附:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

void input_score(void);

void stu_ave(void);

void cour_ave(void);

void sort(void);

void bukao(void);

void print_menu_title(void);

void print_table_head_ave(void);

void print_table_buttom_ave(void);

void print_table_head_cour(void);

void print_table_buttom_cour(void);

void print_table_head_sort(void);

void print_table_buttom_sort(void);

void print_table_head_bukao(int);

void print_table_buttom_bukao(void); //函数声明

char course[5][10]; //用来存放课程名称的全局变量

struct Student //定义一个存放学生信息的结构体

{int num; //学号

float score[5]; //各科成绩

float ave; //平均分

float sum; //总分

};

struct Student stu[10]; //用来存放学生信息的全局变量

int main()

{int i;

char c;

do

{system("cls"); //清屏

print_menu_title(); //打印标题

printf("| 1:输入课程名称及学生学号、成绩\n");

printf("| 2:每名学生的平均成绩和总分\n");

printf("| 3:每门课程的平均分、及格率、最高成绩和最低成绩\n");

printf("| 4:总成绩前5名的学生学号、各科成绩和总分\n");

printf("| 5:各科补考学生的学号和成绩\n");

printf("| 6:退出\n");

for(i=0;i<80;i++)

printf("="); //打印一行"="用于分割界面

printf(">请输入选项[1\\2\\3\\4\\5\\6]:"); //“\\”转义为“\”

do

c=getchar();

while(c<'1'||c>'6'); //持续等待直到用户输入合法选项

fflush(stdin); //清空输入缓冲区,确保不影响后方的数据读取

switch(c)

{case'1':input_score();break;

case'2':stu_ave();break;

case'3':cour_ave();break;

case'4':sort();break;

case'5':bukao();break;

case'6':exit(0);

}

printf("按任意键返回主菜单");

getchar(); //暂停

}

while(1); //循环条件始终为真,只有当用户输入“6”时,系统退出

}

void input_score(void)

{int i;

for(i=0;i<5;i++)

{printf("请输入课程%d的名称:",i+1);

gets(course[i]);

}

system("cls"); //清屏

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

{printf("请输入学生的学号:");

scanf("%d",&stu[i].num);

printf("请依次输入学号%d学生的%s、%s、%s、%s、%s科目成绩:\n"

,stu[i].num,course[0],course[1],course[2],course[3],course[4]);

scanf("%f %f %f %f %f",&stu[i].score[0],&stu[i].score[1],

&stu[i].score[2],&stu[i].score[3],&stu[i].score[4]);

}

}

void stu_ave(void)

{int i,j;

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

stu[i].sum=0; //将每个学生的总分初始化为0

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

for(j=0;j<5;j++)

stu[i].sum+=stu[i].score[j]; //求总分

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

stu[i].ave=stu[i].sum/5.0; //求平均分

print_table_head_ave(); //打印表格头部

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

printf("|%5d |%6.1f |%6.1f |\n",stu[i].num,stu[i].sum,stu[i].ave);

print_table_buttom_ave(); //打印表格底部

}

void cour_ave(void)

{int i,j,jgs[5]={0};

float courave[5],max[5],min[5],jgl[5],coursum[5]={0};

for(i=0;i<5;i++)

for(j=0;j<10;j++)

coursum[i]+=stu[j].score[i]; //求总分

for(i=0;i<5;i++)

courave[i]=coursum[i]/10.0; //求各科平均分

for(i=0;i<5;i++)

for(j=0;j<10;j++)

if(stu[j].score[i]>=60)

jgs[i]++; //若某门课某名学生的成绩≥60,及格数+1

for(i=0;i<5;i++)

jgl[i]=jgs[i]/10.0*100.0; //及格数除以10再乘100,得到及格率的百分数

for(i=0;i<5;i++)

max[i]=min[i]=stu[0].score[i]; //假设第1名学生的第i门课成绩为最高(低)分

for(i=0;i<5;i++)

for(j=0;j<10;j++)

{if(max[i]<stu[j].score[i])

max[i]=stu[j].score[i];

if(min[i]>stu[j].score[i])

min[i]=stu[j].score[i]; //求最高(低)成绩

}

print_table_head_cour(); //打印表格头部

for(i=0;i<5;i++)

printf("| %s |%6.1f |%6.1f |%6.1f |%6.1f%% |\n" //%符号用2个%转义

,course[i],max[i],min[i],courave[i],jgl[i]);

print_table_buttom_cour(); //打印表格底部

}

void sort (void)

{int i,j;

struct Student *temp,*p[10]; //利用指针进行排序,避免数据的变换

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

p[i]=&stu[i]; //p[0]~p[9]分别指向stu[0]~stu[9]

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

stu[i].sum=0; //初始化总分为0

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

for(j=0;j<5;j++)

stu[i].sum+=stu[i].score[j]; //求每名学生的总分

for(j=9;j>4;j--) //要求找出前5名,只需要进行5轮"冒泡",故循环条件为j>4

for(i=9;i>9-j;i--)

if(p[i]->sum>p[i-1]->sum)

{temp=p[i-1];p[i-1]=p[i];p[i]=temp;} //使用"冒泡法"找出前5名

print_table_head_sort(); //打印表格头部

for(i=0;i<5;i++)

printf("|%4d |%5d |%5.1f |%5.1f |%5.1f |%5.1f |%5.1f |%6.1f|\n",

i+1,p[i]->num,p[i]->score[0],p[i]->score[1],p[i]->score[2],p[i]->score[3],p[i]->score[4],p[i]->sum);

print_table_buttom_sort(); //打印表格底部

}

void bukao(void)

{int i,j;

printf("各科补考名单:\n");

for(i=0;i<5;i++)

{print_table_head_bukao(i); //打印表格头部

for(j=0;j<10;j++)

if(stu[j].score[i]<60) //依次检测成绩是否小于60

printf("|%5d |%5.1f |\n",stu[j].num,stu[j].score[i]);

print_table_buttom_bukao(); //打印表格底部

}

}

void print_menu_title(void) //以下均为控制显示的辅助函数,不再赘述

{int i;

for(i=0;i<80;i++)

printf("=");

printf("| 学生成绩管理系统\n");

for(i=0;i<80;i++)

printf("-");

}

void print_table_head_ave(void)

{printf("+-----------------------+\n");

printf("| 学号 | 总分 | 平均分 |\n");

printf("|------+-------+--------|\n");

}

void print_table_buttom_ave(void)

{printf("+-----------------------+\n");

}

void print_table_head_cour(void)

{printf("+------------------------------------------+\n");

printf("| 课程 | 最高分 | 最低分 | 平均分 | 及格率 |\n");

printf("|------+--------+--------+--------+--------|\n");

}

void print_table_buttom_cour(void)

{printf("+------------------------------------------+\n");

}

void print_table_head_sort(void)

{printf("+-------------------------------------------------------+\n");

printf("| 名次 | 学号 | %s | %s | %s | %s | %s | 总分 |\n"

,course[0],course[1],course[2],course[3],course[4]);

printf("|------+------+------+------+------+------+------+------+\n");

}

void print_table_buttom_sort(void)

{printf("+-------------------------------------------------------+\n");

}

void print_table_head_bukao(int i)

{printf("+-------------+\n");

printf("|%8s |\n",course[i]);

printf("+-------------+\n");

printf("| 学号 | 成绩 |\n");

}

void print_table_buttom_bukao(void)

{printf("+-------------+\n\n");

}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_66999594/article/details/139567334

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值