Qt教程—学生管理系统(文件)

  记录并处理学生成绩信息。

  1)添加新的;

  2)根据学号对已有的进行修改;

  3)根据学号删除已存在的学生信息;

  4)根据学号查询学生信息;

  5)根据各门成绩与平均成绩进行排序。

  1)菜单窗口;

  2)添加学生窗口;

  3)修改信息窗口(包括删除信息);

  4)查询学生窗口

  5)排序窗口;

  以一个类StudentInfo储存单个学生信息,学生类中包括:

  姓名(字符串)

  学号(整型)

  数学成绩(整型)

  英语成绩(整型)

  C语言程序设计成绩(整型)

  平均成绩(双浮点数)

  打开Qt Creator 文件->新建文件或项目(Ctrl+N)->其他项目->空的Qt项目(Empty qmacke Project)

  将其命名为StudentManagementSystem_Qt一路下一步到结束。

  右击项目名称->Add New->Qt -> Qt设计师界面模板选择Widget下一步,我们当前建立的是菜单窗口,所以将其类名命名为MenuWidget一路下一步到结束。

  以同样的方式建立添加学生窗口:AddStudentWidget、修改信息窗口:ModifyWidget、查询窗口:SelectWidget、排序窗口:SortWidget。

  完成后的项目资源管理器页面中应该有如下文件

  我们可以看到Qt中建立模板为widget的设计师界面就是建立了一个c++类(继承自QWidget)与其对应的ui文件 ,这个ui文件便是Qt Designer设计文件,它会在编译时生成一个ui_*.h文件,这样我们便可以用c++的方式对其进行调用。

  Qt Designer的详细使用方法可以看官方的手册:https://doc.qt.io/archives/qt-4.8/designer-manual.html

  之后打开我们的menuwidget.h,会发现其中存在错误。

  这是因为我们的项目中没有连接Qt Widgets库,在StudentManagementSystem_Qt.pro中添加

可解决问题。

  现在,就是实现我们新建立的几个窗口之间的窗口切换问题的时候了,这里我打算使用QStackedLayout实现窗口切换。

  QStackedLayout继承自QLayout,提供了多页面切换的布局,一次只能看到一个界面,在我的Qt5——从零开始的Hello World教程(Qt Creator) 中提到过,大部分控件都继承自QFrame,而QFrame又继承自QWidget,所以QStackedLayout完全可以实现窗口之间的切换。

  现在我们用与上一步相同的方法建立一个窗口MainWidget。并添加一个main.cpp来写main函数

  在mainwidget.h中修改MainWidget的定义,为其添加成员

当然,也需要引用其对应的头文件。

在MainWidget.cpp中将MainWidget设为stackLayout布局,声明我们需要的窗口,并将其加入stackLayout布局中去。

在MainWidget.cpp中显示调用MainWidget构造函数。

  处添加。

之后就需要使用Qt designer 设计页面了(当然在对应类中手动添加成员控件也没有任何问题)。

双击menuwidget.ui就打开了设计页面

在menuwidget中添加如下按钮(push button)

  以同样的方法在addstudentwidget,selectwidget,modifywidget,sortwidget中都添加一个返回按钮returnButton。

  为这些按钮设计点击槽函数。

还需要一个方法作为stackLayout切换页面的信号

在menuwidget.cpp中给出函数定义

emit 把connect把信号和槽进行关联,emit某个信号,就相当于调用这个信号connect时所关联的槽函数。至于更多关于 emit信息诸位可以搜索或者看帮助文档。

之后为addstudentwidget,selectwidget,modifywidget,sortwidget窗口中的按钮设计信号与槽函数

在(类名).h中添加

在(类名).cpp中添加

  现在可以使用的只有退出按钮,跳转按钮还需要在mainwidget.cpp中用connect函数连接。

  到此为止便完成了页面切换功能。

  到次为止的源码:

https://github.com/suvvm/StudentManagementSystem_Qt/tree/master/StudentManagementSystem_Qt

我们需要提示标签来指明输入的数据,也需要输入框来接收用户的输入,QLabel与QLineEdit可以满足我们的要求。

  QLabel,QLineEdit有方法setText(“内容”)来改变其显示的文字,有方法setGeometry (起始横坐标,起始纵坐标,宽, 高)来设置左上角起始位置与大小。

  当然这些都可以在Qt Designer中直接设置。打开addstudentwidget.ui。

  根据之前设计的数据结构,需要nameLineEdit、idLineEdit、mathLineEdit、enLineEdit、cLineEdit五个QLineEdit接收学生的姓名、学号、数学成绩、英语成绩、C语言成绩(平均成绩由计算得出),需要nameLabel、idLabel、mathLabel、enLabel、cLabel五个QLabel提醒用户输入数据,需要addButton 一个QPushButton来添加学生。

  最终将addstudentwidget页面设计为。

  我们需要nameLineEdit、idLineEdit、mathLineEdit、enLineEdit、cLineEdit五个QLineEdit接收学生的姓名、学号、数学成绩、英语成绩、C语言成绩(平均成绩由计算得出),需要nameLabel、idLabel、mathLabel、enLabel、cLabel五个QLabel提醒用户输入数据,需要deleteButton、modifyButton 两个QPushButton来根据学号删除学生,和根据学号修改学生信息。

  我们需要idLabel一个QLabel提醒用户输入数据,需要idLineEdit一个QLineEdit接收学生的学号,之后需要nameLabel、avgLabel、mathLabel、enLabel、cLabel五个QLabel提醒用户显示的数据,需要showNameLabel、showMathLabel、showEnLabel、showCLabel、showAvgLabel五个QLabel来接收查询到的数据,需要selectButton一个QPushButton来提交查询。

  QRadioButton单选框可以解决我们的排序根据选择问题

  (当然,许多方法都可以,这里只演示QRadioButton)

  QTableWidget表格可以用来显示排序后的信息。

  我们需要mathRadioButton、enRadioButton、cRadioButton、avgRadioButton四个QRadioButton来选择排序的根据,需要sortButton一个QPushButton来提交排序,需要tableWidget一个 QTableWidget来显示排序结果。

到此为止的源码:

https://github.com/suvvm/StudentManagementSystem_Qt/tree/master/StudentManagementSystem_Qt_1(uiOnly)

之前在数据结构设计中我们已经设计好了,以一个类StudentInfo储存单个学生信息,学生类中包括:

姓名(字符串)

学号(整型)

数学成绩(整型)

英语成绩(整型)

C语言程序设计成绩(整型)

平均成绩(双浮点数)

现在着手去实现它

右击项目Add New选择C++ C++Class 为它起名叫StudentInfo之后下一步到完成,在studentinfo.h中为其创建对应的私有变量,及其对应的get与set函数。

打开addstudentwidget.h为”添加”按钮设计点击槽函数,由于我们设计用文件对学生信息进行储存,所以需要引用QFile,这里我使用对话框来提示用户操作中的各种问题,所以需要引入QMessageBox。

  QMessageBox中有很多类型的对话框,各对话框的用法这里就不详细介绍了,这里我们只介绍我们即将用到的QMessageBox::about

  QMessageBox::about(NULL, \”About\”, \”About this application\”);

  其中三个参数分别对应,父窗口对象, 对话框标题, 对话框内容。

  在addstudentwidget.cpp中给出函数定义:

  在lineEdit中取出用户输入的数据,lineEdit拥有text()方法,会返回一个QString,而QString中又拥有入toInt() toDouble()等各种类型转换函数,可以适应我们的大多数要求。

  打开数据文件将我们刚刚获取的数据追加在文件结尾。

运行一下

  显示插入成功,打开项目文件夹所在目录build-StudentManagementSystem开头的文件夹,我们的数据文件student就会出现在此处

打开看一看

这样,我们的添加信息模块就完成了。

以上源代码:

https://github.com/suvvm/StudentManagementSystem_Qt/tree/master/StudentManagementSystem_Qt_2(add)

  打开modifywidget.h为”删除”与”修改”按钮设计点击槽函数,在modifywidget.cpp中给出函数定义。

  对于删除和修改操作这里我打算以文件中的数据建立一个数据类型为StudentInfo的QVector容器,容器中盛放全体学生信息。对容器进行删改操作,最后以容器内的数据覆盖原有的数据即可。

这样,修改模块就完成了

以上源代码:

https://github.com/suvvm/StudentManagementSystem_Qt/tree/master/StudentManagementSystem_Qt%20_3(add%2Cmodify)

  打开selectwidget.h为”删除”与”修改”按钮设计点击槽函数,在selectwidget.cpp中给出函数定义。

  查询可以在从文件读取时判断是否会读取到id为输入id的学生,也可以向修改一样江所有学生信息先读入到数据类型为StudentInfo的QVector容器中,在从容器中查询数据,这里我选择读入到容器的方法。

以上源代码

https://github.com/suvvm/StudentManagementSystem_Qt/tree/master/StudentManagementSystem_Qt_4(add%2Cmodify%2Cselect)

  老样子,将数据从文件中读入数据类型为StudentInfo的QVector容器后进行排序就容易很多了。

  我们需要排序时只能根据数学、英语、C语言、平均成绩中的一种进行排序,所以我们要做到代表这四种排序方式的QRedioButton有且只有一个能被选中,我们可以将其加入一个QButtonGroup,这样便可以实现这个需求,至于显示排序后的数据我们可以显示在表格控件QTableWidget中。

  QButtonGroup直接继承自QObject,他有一个属性exclusive当这个属性为真时,所有在QButtonGroup内的按钮同一时间只有一个可以被选择。

  QButtonGroup我们用到了addButton添加按钮 与checkedId获取选中按钮的id两个方法,其他方法诸位可以自己去搜索。

  QTableWidget继承自QTableView,QTableView可以自定义的数据模型显示内容(setModel)但是QTableWidget不行,QTableWidget有固定的数据模型,在像其中填入数据时只需要一个单元格一个单元格的填好就可以了(setItem)

  QTableWidget我们用到了setHorizontalHeaderLabels设置水平表头标签horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); 设置根据总宽度调整列宽;setRowCount设置行数;setItem设置单元格,其他方法诸位可以自己去搜索。

到此为止我们整个项目便完成。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:

VBA编程,Excel 制作学生成绩管理系统,实践图解 01

Excel制作一个成绩管理系统,本系统将是一个全功能性的学生成绩管理应用,可以根据不同班、考场、学号等关键字段进行学生成绩的添加、修改、删除、统计、打印等功能。

同时将在完整地应用这后有些成绩排序、比较等图示化输出结果。

给不同的教学目标起到一定的指导作用。

考试成绩管理,如下所示:

可以实现成绩录入,批量录入,修改,删除,打印,查询等基本功能。

效率很高,使用便捷,本示例通过操作验证,数据准确可靠,运行速度快。

实际上Excel对于成绩管理是最理想的一个应用,不仅可以有效地对于学生的信息进行有条理地管理,也可以方便地统计出学生的学习成绩状态。

课程管理

课程管理是一前提性操作,首先要对学生的课程进行一个编辑,以达到后续的成绩添加进行选择。

如下图所示,课程管理也进行了一个系统化编辑,操作十分简单。

学生信息管理

同理,学生信息是一个很重要的管理方面。

要准确完整地把学生信息收集完整,以适配相应的成绩。

学生信息管理可能比较麻烦,于是,此方面将以导入的方式进行操作,以方便已经有学生信息的操作,更便捷地初始化学生信息。

导入功能在下次更新完善操作。

添加信息

添加信息使用了一个统计的表单来进行,无论是成绩管理,还是学生信息管理或课程管理。

至于为什么统一成一个表单来制作,那就是为了更加精简程序代码,这个处理过程还是十分有用的。

经过一个选择语句,创建不同的输入表单,很有意思。

实际操作当中,并不会利用上面的成绩录入方法,似乎并不理想,没人愿意一个一个录入学生信息,然后单击添加一次。

所以,下面的批量录入就更加有用了。

可以根据班级和课程提取全部学生信息,然后输入成绩。

这样,每一个考试只需要在这里一次性输入即可。

以前也做过类似成绩管理应用,使用效果很好。本次作为升级版本,创新了一些编程思想,逻辑管理又有了新的理解,所以对于一个优秀的管理应用,是十分必要的。

成绩管理将作为一个重点项目来进行,所以,在接下来的文章里,会努力体现出其应用的优点。

欢迎关注、收藏

—END—

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

东 华 大 学

C语言课程设计

报告书

班 级:通信1403

姓 名:

学 号:

指导老师: 廖小飞

2015-1-2

学生成绩管理系统

  1. 功能需求分析

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

  1. 求出每名学生的平均成绩和总成绩。
  2. 求出每门课程的平均分、及格率、最高成绩和最低成绩。
  3. 输出总成绩前5名的学生学号、各科成绩和总分。
  4. 输出各科补考学生的学号和成绩。

系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。主要功能需求描述如下:

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

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

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

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

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

6.退出 退出系统。

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

主菜单中选择6的时候,退出系统。

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

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

  1. 程序处理流程

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

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

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

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

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

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

若输入6,则退出系统。

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

图2-2 程序流程图

  1. 详细设计与程序实现
  2. 预处理学生成绩管理系统涉及到10名学生、5门课程,需要使用数组进行处理。系统运行时还应进行清屏等操作。故预处理时应包含stdio.h stdlib.h string.h三个头文件。
  3. 数据结构定义该系统中,每名学生都有其各自的学号、各科成绩、总分、平均分等数据,他们是有联系的。使用单纯的数组来存放这些信息,显得冗杂且难以操作。故定义一个结构体类型Student,该类型的变量中包含学生的学号、各科成绩、平均分和总分四项信息。
  4. 函数及变量声明该程序的函数包括主要处理函数和辅助函数。主要处理函数用来进行输入信息、计算成绩等操作。为了让系统显得更加规范,可操作性强,还编写了一些控制显示的辅助函数。在主要处理函数中,系统需多次调用课程及学生信息,故该程序包含两个全局变量:一个是course[5][10],用来存放5门课的名称;另一个是结构体数组struct Student stu[10],用来存放10个学生的各项信息。
  5. main函数在主函数中调用函数print_menu_title(),显示主菜单和选项列表,等待用户输入。
  6. 主要处理函数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)打印表尾。
  7. 辅助函数功能介绍

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.主界面

系统运行后,首先进入主菜单界面,允许用户输入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\”);

}

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。