学生成绩管理系统的设计与实现Word文件下载.docx
《学生成绩管理系统的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统的设计与实现Word文件下载.docx(52页珍藏版)》请在冰豆网上搜索。
该程序要求具备的功能:
清晰且易于操作的用户界面,在文本编辑界面中输入学生成绩。
其中“I”表示插入,“L”表示浏览,“Q”表示查询,“E”表示退出,“D”表示删除,“M”表示修改,“c”表示统计各分数段人数,“P”表示打印.以上各功能应该能单独运行和连续运行。
课程设计报告书写要求:
1.封面(使用教务处统一格式)
2.报告书目录
3.课程设计任务书
4.设计目的、设计内容、完成时间
5.设计环境与工具
6.程序设计算法说明、框图
7.运行结果记录
8.设计结果测试、分析
9.参考文献
10.其他
11.评分表
12.封底
时间安排:
课程设计时间为18周一周。
指导教师签名:
2011年1月6日
系主任(或责任教师)签名:
2011年1月6日
1设计目的与内容
建立成绩档案;
添加学生成绩记录(包括学号、姓名、语文、数学、英语、综合);
每条记录能自动计算并显示总分、平均分;
能按学号或姓名进行查询学生各科成绩;
能修改学生的单科成绩;
能删除某个学生的成绩记录;
每条学生成绩记录包含学号、姓名、语文、数学、英语、综合、总分、平均分等信息,所有信息最终用文件保存。
为了提高学工处方便的查找信息,突破手工处理方式的忙乱,跟上现代化的步伐,所以特开发一套对学生进行管理的软件,做到信息的即时化,准确化。
整个程序采用主程序调用子程序的方法。
主程序完成菜单的显示,子程序完成一个独立功能的实现。
最后输入设定的功能键自动返回DOS.
2设计环境与工具
DOS、BIOS操作系统,文本编辑器,MASM.EXE,LINK.EXE,DEBUG.EXE,以及汇编IDE开发环境(轻松汇编)。
3算法描述
3.1总体结构分析
整个程序采用总程序调用子程序的方式。
主程序完成菜单的显示,子程序完成一个独立功能的方法实现。
各子程序的实现方法简要描述如下:
2.1.1设计Insert(录入)子程序时,先打开文件SCORE.TXT,并置文件指针到文件尾,然后调用GET_REC子程序接受用户的输入,再把用户的输入写入文件,最后关闭文件返回主程序。
2.1.2设计Delete(删除)子程序时,先打开文件,再调用宏GETIN得到要删除的学生的姓名,然后读文件中的记录,直到其记录的名与所输入的名字相同为止,把文件指针后退8个字符(即4门课程所占的空间),写入8个“0”字符,关闭文件返回主程序。
(1)设计List(浏览)子程序时,先打开文件,然后读一个记录,并通过调用宏SHOW_ITEM将其显示到屏幕上,若文件指针没有到达文件尾,则继续读记录并显示,当文件指针到达文件尾时,则关闭文件返回主程序。
(2)设计Modify(修改)子程序时,先打开文件SCORE.TXT,调用GET_RECZ子程序得到要修改的记录,然后读文件中的记录,并与用户输入的记录作比较(只比较记录中的名字部分),若不同则读下一个记录,若相同则将文件指针后退23个字符(一个记录为23个字符的长度),然后把用户输入的记录写入文件,最后关闭文件返回主程序。
(3)设计Count(统计)子程序,先打开文件,然后读记录,比较记录的第16个字符(数学成绩的高位)并统计,直到文件指针到达文件尾,最后关闭文件调用宏SHOW_ITEM显示统计结果,返回主程序。
(4)设计Query(查询)子程序时,先打开文件,通过宏GETIN得到要查找学生的姓名,然后读文件记录,并同要查找的学生姓名比较,若相同则输出,若不同则继续读文件记录,最后显示查询结果,关闭文件返回程序。
3.2单元子程序设计:
下面详细分析程序中用到的主要的子程序。
(1)INSERT子程序
INSERT子程序的功能是录入一条记录。
首先保留现场入栈。
然后用DOS中断3d号功能打开FNAME指定的文件。
然后用宏CLEARI清除屏幕右半部的记录输入区域。
在记录的第一项处置光标,用GET_REC子程序获取内容。
用DOS中断42h号功能将指针移到文件末尾。
在用DOS中断40h号功能将放在BUFFER缓冲区的23个字节的内容写到文件中,接着关闭文件,重新设置光标置在显示记录位置。
最后弹栈恢复现场。
(2)GET_REC子程序的功能是获取新的记录内容。
GET_REC子程序的功能是获取新的记录内容。
首先用宏GETIN获取学生的姓名,放入BUFFER2中,最多15个字符,如果遇到回车键则提前结束。
再用循环方式格将BUFFER2中的15个字符送到BUFFER1中。
然后用宏SET_PI将光标置于数字成绩输入项后,等待键盘输入。
输入的成绩,先放在BUFFER2中,然后加到BUFFER1中的姓名后面。
输入为2个字符或遇到回车键时提前结束。
接着用同样的方法输入英语成绩、计算机成绩和中文成绩。
完成后,这个子程序就得到了一个记录的所以信息。
(3)OPENF子程序
OPENF是一个非常简单的子程序。
它的作用是打开一个文件并把文件句柄保存在数据段的handle缓冲区中。
(4)QUERY子程序
QUERY子程序的作用上查询一条记录。
首先保留现场(这些操作每个子程序都基本相同,以后不在赘述)。
然后分别清除界面右上方和下边的区域。
打开FNAME指定的文件并保留文件句柄。
将光标置于界面的下半空白部分开始处,用宏GETIN获取最多15个字符的输入(姓名),放在BUFFER1中。
显示记录各字段的标题。
然后用下面这段程序读出一条记录(23个字节)放在BUFFER2中,然后将BUFFER1中的内容和BUFFER2中进行比较,看是否相同。
如果不同,再继续向下从文件中读出23个字节比较,循环向下,直到相同或文件结束为止。
如果相同,则显示该条记录,然后关闭文件,恢复现场。
B:
MOV3FH
MOVCX,23
MOVDX,OFFSETBUFFER2
INT21H
LEASI,BUFFER2
LEADI,BUFFER1
MOVCX,15
C:
MOVAL,BYTEPTR[SI]
CMPAL,BYTEPTR[DI]
JNZB
INCSI
INCDI
LOOPC
(5)MODIFY子程序
MODIFY子程序的功能是修改记录。
先保护现场,然后清除右上部分的记录输入区域,接着打开文件。
用FET_REC子程序获取输入的记录信息,并存入BUFFER1中。
从打开的文件中读取一个记录的内容(23个字节)放在BUFFER2中。
比较记录前面的15个字节(姓名),如果不同,则读取下一个记录;
如果相同,则回移一个记录的指针,回到刚才这条记录的位置(因为读取一个记录,指针已移到下一个记录上)。
将放在FUFFER1中的输入的记录内容写到刚才这条记录在文件中的位置上,从而实现此记录的修改。
最后关闭程序,恢复现场。
(6)DELETE子程序
DELETE子程序的功能是删除一条记录。
首先保留现场,清除屏幕。
然后打开文件,保留文件句柄。
用宏GETIN获取15个字节的姓名字符,放在FUFFER1中。
读取一条记录(23个字节),将其放在FUFFER2中,然后和FUFFER1中的内容进行比较,如果不同,再读取下一个记录。
如果姓名相同,则把指针后移8个字符(4门课程所占空间),写入8个“0‘字符。
关闭文件,恢复现场并退出。
(7)LIST子程序
LIST子程序的作用是显示文件中的记录。
首先清除记录输入区和显示区域。
然后显示记录字段的标题。
打开文件,保存文件句柄。
读取一个记录的内容放在缓冲区BUFFER1中,并判断是否到了文件末尾,如果不是,则显示这条记录。
循环读取直到文件结束。
(8)PRINT子程序
PRINT子程序打开文件。
读取一条记录,汇编语言提供了自定义数据结构的结构定义语句,可将不同的数据类型放在同一个数据结构中,便于处理,在本程序中的记录就采用了结构定义语句。
这里读取记录也用了结构的方法。
接着用DOS中断21H的5号功能,逐字打印存放在FUFFER1中的所有字符。
一条记录打完后,打印回车符换行。
然后用同样方法继续读取下一个记录并打印,直到文件结束为止。
最后关闭文件退出。
(9)COT子程序
COT子程序的作用是统计各分数段学生的人数,为简化程序,作为示例,本程序只统计记录数学各分数段的人数。
首先显示统计结果的标题:
maths<
60<
70<
80<
90<
100。
然后打开文件。
读取记录,将记录的第16个字符(数学分数的高位)取出比较。
统计结果依次放在以BUFFER3开始的内存单元中,如果小于60,则将小于60的记录单元BUFFER3加1;
若小于70,则将小于70的记录单元BUFFER3+1,即BUFFER3下一个地址单元内容加1,以此类推。
处理完后再读取下一个记录,作同样处理,直到文件结束为止。
接着显示放在BUFFER3中的各分数段的人数的统计结果,最后关闭文件结束。
从程序中可以看出,统计时程序有个限制,本例每个分数段最多不能超过9个人。
3.3宏的分析:
本设计中使用了下列宏,其作用如下:
(1)SHOW:
用来指定地址的显示字符串,有一个地址参数。
(2)SET_P1:
设置光标位置,有一个可变参数a,作用是将光标置于坐标(a,36)处,使用了BIOS中断10H的2号功能。
(3)SET_P2:
将光标置于坐标(12,2)处。
(4)SET_P3:
将光标置于坐标(1,30)处。
(5)CLEAR:
清除整个屏幕,用BIOS中断10H的7号功能实现,范围是从坐标(0,0)到(24,79),将整个区域变为空白。
(6)CLEAR1:
清除右半部分屏幕,清除范围是从坐标(4,36)到(10,79),结果是擦除此区域的显示内容。
(7)CLEAR2:
清除下半部分屏幕,清除范围是从坐标(12,0)到(24,79),结果是擦除此区域的显示内容。
(8)NEWLINE:
回车换行。
(9)SHOW_ITEM:
显示记录内容。
执行后先显示名称,然后依次显示4项功课成绩,各项成绩间空3个空格,最后换行。
这个宏包含的语句较多,如果每次都直接用语句实现非常冗长,使用宏后则主程序就很简洁,充分体现了使用宏的优点。
GETIN:
获取学生的信息。
这也是一个使用频繁的宏,其中含有很多的指令。
它带有ADDRS和COUNT2两个参数,ADDRS是存放信息的数据段位置,COUNT2是接受的字符数。
4、程序流程图
5.程序源代码
4.1COM_CODE程序:
HELPM_FPROCFAR;
初始化主菜单帮助信息
CLRSCRN0,56,24,78,01001110B
CLRSCRN1,57,23,77,11100001B
CURSOR2,58
PUTMSG_HP1
CURSOR4,58
PUTMSG_HP2
CURSOR5,60
PUTMSG_HP21
CURSOR7,58
PUTMSG_HP3
CURSOR8,60
PUTMSG_HP31
CURSOR10,58
PUTMSG_HP4
CURSOR11,60
PUTMSG_HP41
CURSOR13,58
PUTMSG_HP5
CURSOR14,60
PUTMSG_HP51
CURSOR16,58
PUTMSG_HP6
CURSOR17,60
PUTMSG_HP61
CURSOR18,60
PUTMSG_HP62
CURSOR19,60
PUTMSG_HP63
CURSOR21,58
PUTMSG_HP7
CURSOR22,60
PUTMSG_HP71
RET
HELPM_FENDP
OP_WIN_FPROCFAR;
初始化提示信息窗体
CLRSCRN0,62,24,79,01001110B
CLRSCRN1,63,23,78,11100011B
CURSOR2,64
PUTMSG_W
OP_WIN_FENDP
EXCH_ASCPROCFAR;
将成绩转换为二进制保存在AX中
XORAX,AX;
清零ax寄存器
JCXZM2;
测试cx寄存器的内容,cx为十进制字串的长度,cx为0的时候转M2
M1:
MOVBX,10;
设置进制为10
MULBX;
ax乘以10
MOVBL,[SI];
将si指向的字符放入bl寄存器
CMPBL,'
0'
JBEE
9'
JAEE
INCSI;
si指向十进制位串的下一个字符
SUBBX,30H;
将每一位的ASCII码值减去30H,变成十进制值
ADDAX,BX;
加上该位的值
loopM1;
loop一次cx减少1
M2:
EE:
MOVERROR,1
CALLFARPTRERR_INF
EXCH_ASCENDP
EXCH_ASPROCFAR;
将SI指向的ascii字符串转换为十进制值,保存在AX中,CX为字符串长度
PUSHREG1
PUSHSI
JCXZLL2;
LL1:
loopLL1;
LL2:
POPSI
POPREG1
EXCH_ASENDP
CHECK_LPROCFAR;
检查输入学号是否合法
JCXZM22
M11:
MOVBL,[SI];
JBEEE
JAEEE
INCSI
LOOPM1
M22:
EEE:
CHECK_LENDP
CHECK_OKPROCFAR;
检查输入成绩是否合法
PUSHBX
CALLFARPTREXCH_ASC
CMPAX,100
JAINRE
POPBX
INRE:
CHECK_OKENDP
ERR_INFPROCFAR;
输出错误信息一,成绩不合法
CALLFARPTROP_WIN_F
CURSOR8,64
PUTERR_INFO1
CURSOR1064
PUTERR_INFO2
CURSOR1164
PUTERR_INFO3
CURSOR1264
PUTERR_INFO4
ERR_INFENDP
ERR_INF2PROCFAR;
输出错误信息二,输入为空
PUTERR_INF21
PUTERR_INF22
PUTERR_INF23
ERR_INF2ENDP
ERR_INF3PROCFAR;
输出错误信息三,学号不合法
PUTERR_INF31
PUTERR_INF32
PUTERR_INF33
ERR_INF3ENDP
ERR_INF4PROCFAR;
输出查找失败信息
PUSHREG
CURSOR10,64
PUTERR_INF51
POPREG
ERR_INF4ENDP
SHOWPROCFAR;
初始化输出窗口
PUTMSG31
MOVSI,0
MOVOP_N[SI],'
LEADI,OP_N+1
CALLFARPTRDEC_ASC
CURSOR8,74
PUTOP_N
CURSOR9,64
PUTMSG32
SHOWENDP
INI_MPROCFAR;
初始化主窗体
CLRSCRN0,0,30,4FH,1FH
CURSOR1,0
PUTMSG1
CLRSCRN7,16,21,40,00011100B
PUTHEART
CLRSCRN21,0,24,55,10000101B
CLRSCRN22,1,23,5411110000B
CURSOR21,1
PUTMSG2
CALLFARPTRHELPM_F
INI_MENDP
INI_EPROCFAR;
初始化编辑窗体
PUTMSG_EDIT
CLRSCRN3,0,19,61,10100000B
PUTC_MAG
CLRSCRN21,0,24,61,10000101B
CLRSCRN22,1,23,60,11110000B
INI_EENDP
INI_PPROCFAR
PUTMSG_PRINT
CALLFARPTRSHOW
INI_PENDP
DEC_ASCPROCFAR
MOVBX,10
MOVAX,CN
DE1:
CMPAX,0
JZDE2
MOVDX,0
DIVBX
ORDL,30H;
转换为ASCII
MOV[DI],DL;
送至输出缓冲区OUTPUT中di所指的位置
DECDI;
di指向下一个位置
JMPDE1;
循环
DE2:
RET
DEC_ASCENDP
PRINT_FPROCFAR
CURSORLINE_N,2
ADDBX,2
PUT[BX]
CURSORLINE_N,14
ADDBX,15
CURSORLINE_N,24
ADDBX,24
CURSORLINE_N,31
ADDBX,30
CURSORLINE_N,38
ADDBX,36
ADDLINE_N,2
PRINT_FENDP
SEARCH_FPROCFAR;
查找学号为STU_N的学生
MOVCX,CN
CMPCX,0
JES_NOT_FOUND
LEABX,STUDENTS
NEXT_CMP:
MOVSI,BX;
把已存的学生的结构首地址放入SI
PUSHCX
LEADI,STU_N;
DI指向要查找的学号
MOVCL,STU_N+1;
CH为学号的长度
CMPCL,[SI+1]
JNZLAB
CLD
XORCH,CH
ADDCX,2
REPECMPSB
STC
POPCX
JMPS_FOUND
LAB:
CLC
POPCX
ADDBX,53
LOOPNEXT_CMP
S_NOT_FOUND:
CALLFARPTRERR_INF4
MOVLINE_N,21
MOVROW_M,1
BRUSH40,LINE_N,ROW_M,'
'
10000101B
PUTMSG2
MOVLINE_N,23
BRUSH40,LINE_N,RO