c语言学生学习成绩管理系统Word下载.docx
- 文档编号:19703556
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:45
- 大小:140.85KB
c语言学生学习成绩管理系统Word下载.docx
《c语言学生学习成绩管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《c语言学生学习成绩管理系统Word下载.docx(45页珍藏版)》请在冰豆网上搜索。
追加记录到文件
逻辑删除
退出管理系统
分数分级子菜单
按均分排序
计算总分和均分
读取文件
保存文件
查找某项记录
显示所有记录
修改某项记录
物理删除
主程序
90-100
80-90
70-80
0-60
60-70
图1 程序功能模块结构图
五.程序设计及各模块函数功能简述
1.数据结构
链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。
线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
链表的最大的优点是对表的添加、删除、查找、排序等操作比较方便,因此采用链表来存储学生相关信息。
且对结点的定义如下:
typedefstructS1
{charno[11];
/*10位学号*/
charname[15];
/*姓名*/
intscore[4];
/*成绩*/
floatsum;
/*总分*/
floataverage;
/*平均分*/
intorder;
/*排名*/
structS1*next;
}STUDENT;
2.main()主函数
主函数是程序入口,采用模块化设计。
首先在主程序中打印欢迎界面,声明一些必要变量,作一无限循环程序,循环体为一开关语句,该语句设置一个断点,其条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的功能函数,同时设置一个断点,当返回值为一定条件时结束程序。
menu_select=?
13
12
11
9
8
7
6
5
4
3
2
1
10
调用menu函数
输入menu_select的值
图2 主函数流程图
3.menu_select()主菜单
为了美化界面,制作双边框窗口,在窗口中显示主菜单。
通过putch()输出图形符号的ASCII码值(十六进制),达到显示的目的。
利用Windows函数制作显示窗口,该窗口比边框略小一点,且正好包含在边框中,能过仔细计算且多次调试后得到其坐标值,用函数gotoxy()来实现光标的移动。
设置文本和背景色输出菜单项。
恢复原窗口,设计输入选择项,返回主函数。
相关的一些函数如下:
window、textbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、putch。
putch(0xc9);
/*输出左上角边框┏*/
putch(0xcd);
/*输出水平线*/
putch(0xbb);
/*输出右上角边框┓*/
putch(0xba);
/*输出左垂直线*/
putch(0xc8);
/*输出左上角边框┗*/
putch(0xbc);
/*输出右下角边框┛*/
4.init()初始化
单链表需要一个头指针来指向表的第一个结点,对单链表的访问是从头指针开始的。
初始化单链表为空,用NULL表示,该值在头文件stdio.h中定义为常数0。
A
5.create()创建链表
当用户选择输入增加记录后,进入该函数,经过密码验证之后(密码为abcdef),能够输入学生信息,并把信息加入链表。
在输入过程中,有相关提示,如学号是十位,格式为0901070328,性别是M或者F,且针对本次设计的相关要求,对score所表示的科目作了相关说明,即score1---score4分别对应外语、高数、C语言、物理。
当输入结束后,系统自动计算该生的总分和平均分,并将名次置0,待排序结束后赋予新值。
数据输入结束后返回链表的头指针到方函数。
Yes
6.insert()插入结点
在指定结点前面插入新结点,申请空间得到指针info,输入新结点信息,存放info中,设链表头指针为h,p为指定结点的指针,q为p的前趋指针。
从头结点开始循环移动指针p查找指定结点,查找和插入时分两种情况处理:
1).指针p为空,如果p等于h,说明链表为空,则新结点即为头结点,修改指针h=info。
否则,说明表中没有指定结点,则新结点插入在表尾部,此是q把指的结点是最后一个结点,所以修改指针q->
next=info。
2).指针p不为空,如果p等于h,说明新结点插入在当前第一个结点之前,为新的头结点,修改指针info->
next=p,h=info。
否则,说明新结点的位置应在q和p两个结点之间,修改指针info->
next=p,q->
结束
7.删除结点
两种删除方法:
逻辑删除logic_delete()和物理删除physics_delete()。
物理删除:
输入要删除的结点的学号,经过密码验证之后(密码为abcdef),根据学号顺序查找结点,如果没找到,则输出没有找到的信息;
否则显示找到的结点信息。
如果删除的是头结点,则修改头指针,将该结点的前趋指针指向其后继结点,然后释放该结点
跳到下一结点
物理删除学生记录模块流程图
逻辑删除:
调用函数后,屏幕显示所有学生的数据。
输入要删除的结点的学号,根据学号顺序查找结点,如果没找到,则输出没有找到的信息;
提示是否删除该结点,输入y删除,输入n返回主菜单。
删除之后有提示是否恢复,输入y恢复,输入n返回主菜单。
8、修改某项记录modify()
修改某个指定学号的学生数据记录。
进行密码验证之后(密码为abcdef),输入要修改的结点的学号,根据学号顺序查找结点,如果没找到,则输出没有找到的信息;
否则显示找到的结点信息,确认是否进行修改。
9.print()显示所有记录
采用顺序访问的方法显示和查找记录,定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所记录的数据后,将指针后移一个记录,直到p指针值为空,则所有记录输出完毕。
P为空?
10.search()查找结点
按学号来查询数据。
从头结点开始顺序查找,当输入要查找的学生学号,用strcmp()函数将输入的学号,与表中学生的学号相比较,没有相同记录显示没有,遇到第一个匹配的记录则显示此记录,继续查找链表,仍有相同记录则继续显示,直到尾结点结束。
11.save()保存记录到文件
将学生信息保存到指定的文件中。
按照文件读写要求,先定义一个指向文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定的位置;
如果只要文件名,则文件保存在TC默认的路径。
如果文件打不开,则退出程序,否则选择一种写文件方式,打开文件。
如果文件打不开,则退出程序,否则选择一种写文件方式,从链表的头指针开始,顺序将记录写入文件,直到所有记录写完,标志就是移动指针为空。
关闭文件
12.load()从文件中加载记录
按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的打开方式。
如果文件打不开,则退出函数,否则选择一种读文件方式,从文件头开始,将记录读入内存,直到文件尾。
文件打开方式和读入方式的确定要依据输出文件的打开方式和写入方式,以名数据读入错误。
如果输出文件是二进制文件,块写操作,读入也应设置为二进制打开方式,块读取方式。
每读入一条记录,都要做好指针链接关系,本函数将新结点链接到当前链表的尾部,链表的顺序和文件保存的顺序一致。
读到数据
puter()计算各门课程的平均成绩和总平均成绩
顺序查找学生的各科成绩和总成绩,将不同学生的同一门课程成绩相加,同时计算所有学生的总成绩之和。
当指针结束时计算结束,再将所得的数据除以指针移动的次数即学生人数,即可以得到各门课程的总成绩和平均成绩。
指针后移
14.sort()排序
本函数实现按总分排序的功能。
课程设计要求按照平均分排序,容易看到,对与本程序来说,每个学生的总成绩 = 平均成绩 ×
4 ,按总成绩排序和按平均分排序结果一致,由于计算平均成绩会多出一步运算,所以程序用总分代替平均分排序。
同时也可以按各科成绩来排序,没一种排序方法的算法一致,都是用选择法。
在算法上,选择直接插入算法,即:
每步将一个待排序的按其排序码值的大小插到前面已经排好序的表中,直到全部插入为止。
先将链表的头结点看作是已经排好序的结点,然后取下一个结点作为待排序的结点,插入到已排好序的表中。
其具体做法为:
(1).先将原表头结点作为新排好序表的头结点h,原表下一个结点作为原表头结点h1。
(2).原表头结点为待排序结点,将其总分与新表结点的总分进行比较,如果待排序结点
总分大,则插在表头,否则插入在其后,原表头结点后移一位。
(3).重复第二步,即将原表头结点的总分和新表结点的总分进行比较,如果待排序结点总分小,则移动新表指针,直到找到合适的位置将其插入。
当原表为空时,所有结点排序完毕。
排好序后,系统自动将名次数据写入结点数据域的order中。
15.class()学生成绩分段函数
制作子菜单,分段显示不同分数段的学生成绩及每门课程的成绩。
实现方法和main()函数相似。
Yes
16.submenu()子菜单函数
子菜单函数,列出不同分数段,让用户选择显示。
当用户选定一分数段后,调用相应的函数,统计分数在这一段的学生、相关科目和成绩。
17.class0()-class9()成绩分段显示函数
当用户选择某一分数段之后,调用函数。
函数的具体实现为:
从链表头开始对每个学生各科成绩进行扫描,当扫描到第一个满足条件的科目时,打印学生相关信息,这一科科目代号和成绩,接着扫描这个学生的其他科目成绩。
当一个学生扫描结束时,表指针指向下一个结点,对下一个结点进行扫描。
直到表尾为止。
六、实验结果及使用方法
1、欢迎界面
2、开始菜单
3、输入界面
4、插入界面
5、删除界面
6、修改界面
7、显示界面
8、搜索界面
9、排序界面
10、平均分界面
11、统计界面
12、统计信息界面
七、总结与体会
实验设计最主要的目的是“学以致用”,通过实验的方法来更好的掌握所学的知识,并用于实践。
在这次c语言课程设计中,我对C语言由了更加深刻的认识,特别是有关链表和文件的有关操作。
通过查阅资料,我对如何用C语言进行图形界面操作有了初步的认识,知道了怎样创建窗口,怎样处理背景色和文字的颜色和怎样画简单的直线。
程序中的主函数和删除函数是参考了书本上的“图书馆管理系统”。
课程设计,除了能让我们更好的掌握知识外,我觉得,更加重要的是他能够锻炼我们分析和处理问题的能力,增强我们的逻辑思维和系统分析能力。
程序设计具有很强的逻辑性和创造性,它要求我们必须全面和系统的分析整个程序,先确定整个程序的框架,然后再自顶向下,逐步细化,逐步求精,然而这些是建立在对给定问题进行透彻的了解和详细的分析的基础上。
所以,在这次课程设计中我最大的收获应该是我逻辑思维能力和系统分析能力的提升。
在设计的过程中,遇到了很多问题,比如说动态链表如何终止,密码问题,还有逻辑删除处理等等,这些问题基本上都是通过查找资料或者跟同学讨论而解决的,同时也参考了一下别人的设计。
主菜单的界面和其中几个函数的界面是套用书上的。
在基本程序完成之后,根据软件工程的思想,也对程序本身进行了不同类型的测试。
在测试过程中发现了程序的很多错误和漏洞。
列举如下:
1.对于代码来说,在TC,Win-TC下进行编译都弹出了警告。
警告内容为grade()函数中的head可能在未定义前被使用。
但是程序执行以后该部分功能没有问题。
2.程序的输入模块、查找模块等有学生信息录入的地方必须严格按照相应格式进行输入。
比如姓名字段不能出现空格等等。
否则就会出现死循环。
3.按查找模块运行不稳定,有时候显示查找信息后不能显示Pressanykeytocontinue...,导致程序无法退出。
4.保存文件时不能用长文件名,通常用两个字母到四个字母即可,否则就会出再读取错误。
这个问题始终没有得到解决,应该是写文件模块的问题。
上面的这些的内容有的会导致程序致命性崩溃。
解决的办法是在输入时对用户进行提示,要求按照相应的格式输入。
对于一个课程设计来说可以这样稍为动一下程序,用标准输入来规范信息,从避免这些错误。
但是对于一个软件开发商来说,这是绝对不允许出现的。
作为一个程序员,也应该输入信息进行严格的规范,这样,即使用户有意或者无意中输入错误类型的数据都系统都会做出正确处理,当然,这也是一个比较麻烦的工作,因为对所有有输入的地方都要编写相应的函数。
本次课程设计只要求能实现一些功能,对系统的测试没有作严格要求,所以在运行软件的时候用printf()给出相应提示,以防止进行错误输入。
对于第三个问题,通过修改源代码,在循环体后加入getchar()语句,当手动输入任何字符时返回到主菜单,修改之后基本上可正常使用。
总的来说,通过本次课程设计的学习,学会了很多东西,了解了开发一个系统的一些步骤。
虽然有些代码是从书本上修改而来的,但是在编写代码过程中还是加深了对链表的了解程度。
开发工具用的是TC2.0,而目前用得比较多的应用程序的开发系统都是可视化的集成开发环境,比如VisualC++等,但是在底层开发比如硬件驱动程序的开发上,直接写出优秀的源代码还是一个程序员必须掌握的。
所以无论是Windows平台下的TC开发,还是Linux/Unix平台下的GCC开发,作为自动化专业的学生,我们都应该努力去做好!
附:
程序原代码
#include<
stdio.h>
stdlib.h>
malloc.h>
string.h>
conio.h>
#defineN4
#defineNULL0
typedefstructs1
{charno[40];
intscore[N];
structs1*next;
charpasswd[64]="
"
;
charpw[64]="
abcdef"
STUDENT*init();
STUDENT*create();
STUDENT*logic_delete(STUDENT*h);
STUDENT*physics_delete(STUDENT*h);
STUDENT*modify(STUDENT*h);
STUDENT*insert(STUDENT*h);
voidgetPasswd(constchar*prompt);
voidprint(STUDENT*h);
voidsearch(STUDENT*h);
voidsave(STUDENT*h);
STUDENT*load();
voidcomputer(STUDENT*h);
voidgrade();
voidappend();
STUDENT*sort(STUDENT*h);
STUDENT*s_average(STUDENT*h);
STUDENT*s_English(STUDENT*h);
STUDENT*s_maths(STUDENT*h);
STUDENT*s_c(STUDENT*h);
STUDENT*s_physics(STUDENT*h);
intmenu_select();
intsubmenu1();
intsubmenu2();
voidgrade00(STUDENT*h);
voidgrade60(STUDENT*h);
voidgrade70(STUDENT*h);
voidgrade80(STUDENT*h);
voidgrade90(STUDENT*h);
/******main*******/
main()
{inti
STUDENT*head;
head=init();
clrscr();
window(1,1,80,200);
textbackground(BLUE);
textcolor(YELLOW);
gotoxy(6,5);
cprintf("
***************************************************************"
);
gotoxy(6,6);
cprintf("
*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*"
gotoxy(6,7);
gotoxy(6,8);
*MMMWELCOMETOMYSTUDENT'
SSCORESYSTENMMMMM*"
gotoxy(6,9);
*MMMDesignedbyYuQiangMMMMM*"
gotoxy(6,10);
*MMMAutomation0703MMMMM*"
gotoxy(6,11);
*MMMCentralSouthUniversityMMMMM*"
gotoxy(6,12);
*MMM2008-07MMMMM*"
gotoxy(6,13);
*MMM*--**--**--*MMMMM*"
gotoxy(6,14);
gotoxy(6,15);
gotoxy(6,16);
for(;
)
{switch(menu_select())
{case0:
head=init();
break;
case1:
head=create();
case2:
head=insert(head);
break;
case3:
head=logic_delete(head);
case4:
head=physics_delete(head);
case5:
head=modify(head);
case6:
print(head);
case7:
search(head);
case8:
save(head);
case9:
head=load();
case10:
computer(head);
case11:
head=sort(head);
case12:
grade();
case13:
exit(0);
}
}
/******mainmenu******/
menu_select()
{char*menu[]={"
*************MENU*************"
"
0.Initlist"
1.Addrecordstolist"
2.Insertarecordtolist"
3.Logicdelete"
4.Physicsdelete"
5.Modifyarecordfromlist"
6.Printlist"
7.Searcharecordfromlist"
8.Savethefile"
9.Loadthefile"
10.Averageofeachscore"
11.SortandOrder"
12.Classificationthescore"
13.Quit"
};
chars[3];
intc,i;
gotoxy(10,20);
printf("
Pressanykeytocontinue...\n"
getch();
gotoxy(1,1);
textbackground(BL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学生 学习 成绩管理系统