《课设学生成绩管理系统.doc》由会员分享,可在线阅读,更多相关《课设学生成绩管理系统.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、武汉理工大学汇编语言程序设计课程设计说明书目 录 1.需求说明32.设计说明(简要的分析与概要设计)32。1开发平台与开发工具32。2基本原理32。3数据结构42.4模块说明52.4.1数据的了录入52。4。2 打印以及记录的学生信息52.4。3数据存档62.4。4从文件中读取数据62.4.5 查找并修改学生记录信息62.4。6 删除已经记录学生的信息73。详细的算法描述74源程序与执行结果(含测试方法和测试结果)74.1数据的录入84。2数据和显示84。3数据存档94.4从文件中读取94.5 查询并修改同学记录信息104.6 删除记录105。使用说明11 5.1自我评价与总结11 5.2 本
2、次课程设计的缺点和不足126.参考教材127。附源程序12课程设计任务书学生姓名: 娄俊凯 专业班级: 计算机0809 指导教师: 姚寒冰 工作单位:计算机科学与技术学院 题目: 学生成绩管理初始条件:理论:完成了汇编语言程序设计课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计.具体的设计
3、任务及要求:1) 编写学生成绩信息管理程序,学生信息采用文件存储;2) 要求能实现学生成绩信息的增、删、改、查;3) 程序采用子程序结构,结构清晰;4) 友好清晰的用户界面,能识别输入错误并控制错误的修改。在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书.阅读资料:1)IBMPC汇编语言程序设计实验教程实验2.42)IBMPC汇编语言程序设计(第2版)例6.11时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试,和验收。周5:撰写课程设计报告.指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日学生成绩管理系统的
4、设计1.需求说明用汇编语言编写一个学生成绩管理系统,实现基本的学生成绩管理,功能包括建立成绩档案,添加学生成绩记录(包括学号、姓名、语文、数学、英语、综合),每条记录能自动计算并显示总分、平均分。能按学号或姓名进行查询学生各科成绩,能修改学生的单科成绩,能删除某个学生的成绩记录,每条学生成绩记录包含学号、姓名、语文、数学、英语、综合、总分、平均分等信息,所有信息最终用文件保存。要求程序界面友好,有输入界输出提示,有菜单等。2。设计说明(简要的分析与概要设计)2.1开发平台与开发工具该程序使用基于DOS操作系统的16位实模式汇编语言编写,使用的编译器为微软的MASM 5。0,调试工具为DOS下的
5、debug。exe程序.2.2基本原理本程序使用了DOS系统功能调用(INT 21H),程序中用到的系统功能调用如下:AH功能调用参数返回参数02显示输出DL=输出字符09显示字符串DS:DX=串地址字符串以符结束3C建立文件DS:DX=ASCIZ串地址CX=文件属性成功:AX=文件代号失败:AX=错误代码3D打开文件DS:DX=ASCIZ串地址AL=访问文件和共享方式0=读,1=写,2=读/写成功:AX=文件代号失败:AX=错误代码3E关闭文件BX=文件代号失败:AX=错误代码3F读文件或设备DS:DX=缓冲区首地址BX=文件代号CX=读取的字节数成功:AX=实际读取的字节数AX=0已到文件
6、尾失败:AX=错误代码40写文件或设备DS:DX=缓冲区首地址BX=文件代号CX=写入的字节数成功:AX=实际写入的字节数失败:AX=错误代码2.3数据结构程序采用静态链表的方式来存储学生成绩信息,链表结点描述如下:StructNodeequ32 ;表达式赋值微操作equ Node_nameequ0;类似defineNode_numequ12Node_mathsequ18Node_englishequ20Node_chineseequ22Node_othersequ24Node_totalequ26Node_avgequ28Node_nextequ30max_recordequ100max_m
7、enu_indexequ9说明:结点大小为32字节,其中name占20字节,剩下的六个字段,每一个都是一个字,占两个字节。2.4模块说明该程序一共分为七大模块:分别完成数据的录入,打印录入的学生记录信息,存档,文件读取数据,查找同时进行修改(包括名字和各科成绩的修改,如果不需要修改,则按原来的相应输入),删除记录以及退出。各模块分别介绍如下:2。4。1数据的了录入数据的录入项目包括学生的学号、姓名,各科成绩(分别为数学、英语、语文、综合4科成绩).数据录入后,程序自动计算出每位学生的平均成绩和总成绩.(1)姓名的输入方式首先利用09号系统调用,将字符串输入到内存缓冲区,然后用字符串传送指令将缓
8、冲区中的字符串传送到记录结点。程序自动在输入的字符串后加上美元符号“$”,目的是方便使用系统调用将其输出.(2)成绩的输入方式为了方便输入,首先利用09号系统调用,让用户以10进制的形式输入成绩到内存缓冲区,然后调用子程序将字符串转换成二进制数值,并保存到记录中相应的字段里。2.4。2 打印以及记录的学生信息 打印出学生的信息包括学生的学号、姓名,各科成绩(分别为数学、英语、语文、综合4科成绩),以及总分和平均分。2.4.3数据存档文件格式采用二进制格式,即直接将内存中的数据复制到文件中而不经过任何转换.文件开头的两个字节表示文件中记录的总数,之后的每32个字节存储一条记录。文件的结构如下图所
9、示:记录总数:2个字节记录1:20个字节记录2:20个字节记录n:20个字节2。4。4从文件中读取数据由于该程序生成的文件为二进制格式,因此读取过程十分简单,是写入过程的逆过程:首先读取文件开头的两个字节,便知道了文件中记录的总数,然后循环读取之后的每一条记录。2。4。5 查找并修改学生记录信息通过输入要查找学生的学号,并接着输入要修改学号为多少,因为一般情况下不会修改学生的姓名,所以接着并没有提示学生姓名的修改,直接提示各科成绩的修改,程序然后自动算出该生的总分和平均分。2.4.6 删除已经记录学生的信息 通过学号找到欲删除的学生记录,输入学号,成功删除该学生的成绩记录信息3.详细的算法描述
10、添加记录:继续输入?依次输入各字段的值分配一个新结点返回4源程序与执行结果(含测试方法和测试结果)程序共一个可执行文件,可以在DOS系统或者直接在Windows下运行,程序运行后在屏幕上显示主菜单,如下图所示:图1.主菜单选择相应的菜单项可使用对应的功能,以下为各个功能模块的详细说明:4。1数据的录入在主菜单下选择“1”,进入记录输入模块,按照提示输入各字段的值,如下图所示:图2。输入数据4。2数据和显示在主菜单下选择“2,进入记录输出模块。下图为添加了5条记录后打印的效果: 图3. 打印全部记录4。3数据存档在主菜单下选择“3,将当前在内中的全部记录保存到文件中(c:student。txt)
11、,如下图所示: 图4.保存文件 图5.C盘中保存的文件4。4从文件中读取在主菜单下选择“4”,将当前在内中的全部记录保存到文件中(c:student.txt),如下图所示:图6:从文件中读取4.5 查询并修改同学记录信息 在主菜单下选择5,按相应提示输入正确信息,将学号为3的同学改为学号为5,并对其的成绩做修改,如下图所示: 图7.查询修改 图8。修改后学生成绩4.6 删除记录 在主菜单下选择6,输入学号2,将学号为2的学生成绩记录删去,如下图所示: 图9。删除后的学生成绩记录5。使用说明程序的使用方法可参见上一节中介绍的测试方法,在此不再重复。5.1自我评价与总结通过为期一周的令人兴奋的课程
12、设计实践活动,感觉很有收获.在此之前,大多数时候都在用高级语言编写程序,已经习惯了高级语言的方便灵活的语法形式。一下子突然转为用汇编语言进行程序设计,总是要经过一个很不习惯的适应过程。不过,这些是很有必要的。通过使用汇编语言,可以让我们更好地理解程序设计的本质和原理。对以后的学习和工作都带好很多好处.而且,这门语言也有它自己特点-高效。在特定场合,高级语言无法完成的任务,还是得靠它。这次在编写和调式汇编程序过程中体会最深的就是,没有好的工具,汇编程序的调式工作太困难了!这次使用的是微软的masm5.0编译工具,是DOS底下的编译工具,这倒还可以,但是没有其它可视化的调式工具,只能利用DOS底下
13、的debug命令进行调式.程序稍微长一点的时候,调试起来就不是那么方便了,主要问题是在debug中虽然可以反汇编,但是反汇编后的源程序与自己写的不太一样了(符号常量和标号都变成了数字地址),不方便辨认当前调式程序对应于源代码中的哪一行。通过列表文件中的地址与源代码对应关系可以确认,只是不方便。5。2 本次课程设计的缺点和不足(1)程序中不足的地方是:成绩都是用整数表示的,没有实现浮点运算;(2)查询和修改结合到一个功能上去了,使用起来不是较方便;(3)查询只能通过学号查询,没有实现学号或者通过姓名查询的选择;(4)打印所有已经录入学生的记录时界面不够完美,有待改正;(5)主菜单界面设计不够人性
14、化,不够简单明了,缺少美观6.参考教材 1沈美明、温冬婵等编著,IBMPC汇编语言程序设计(第2版)。清华大出 版社.2001年12月 2IBMPC汇编语言程序设计实验教程实验2.4 3IBM-PC汇编语言程序设计(第2版)例6。117。附源程序18;=学生成绩管理系统=;*;EQU STATEMENTS GO HEREStructNodeequ32 ;表达式赋值微操作equ page133Node_nameequ0;类似defineNode_numequ12Node_mathsequ18Node_englishequ20Node_chineseequ22Node_othersequ24Nod
15、e_totalequ26Node_avgequ28Node_nextequ30max_recordequ100max_menu_indexequ9;*;*data_seg segment;define data segment;DATA GOES HEREbuf1DB30buf1_slenDB?buf1_dataDB30 dup(?)bufnameDB20bufname_slenDB?bufname_dataDB20 dup(?)bufgetintDB32bufgetint_slenDB?bufgetint_dataDB32 dup(?)str_menuDB0dH, 0aH, =Student
16、 marks system=, 0dH, 0aH, 0dH, 0aHDB1)Add Record, 0dH, 0aH, 0dH, 0aHDB2)Print All, 0dH, 0aH, 0dH, 0aHDB3)Save, 0dH, 0aH, 0dH, 0aHDB4)Open, 0dH, 0aH, 0dH, 0aH, 0dH, 0aHDB5)Find, 0dH, 0aH, 0dH, 0aH, 0dH, 0aHDB6)Delete, 0dH, 0aH, 0dH, 0aH, 0dH, 0aHDB0)Exit, 0dH, 0aHDBChoice:;Error Stringsstr_error_1DBE
17、rror input!, 0dH, 0aH, $jump_tbDWcase_0DWcase_1DWcase_2DWcase_3DWcase_4DWcase_5DWcase_6headDW?;表头指针info_0dbinput num:, $info_1dbinput math:, $info_2dbinput english:, info_3dbinput chinese:, info_4dbinput others:, info_5dbinput name:, $str_tb_headdbNum, 9,Name, 9, Maths, 9, English, 9, Chinese, 9,Oth
18、ers, 9, Total, 9, Avg, 0dH, 0aHdb=, 0dH, 0aH,$str_tabdb9, rdatadb(StructNode * (max_record+1) dup(?);全部结点32 (100+1)rdata_pdwrdata;下一个可用结点rcountdw00H;当前已分配的结点数newnodedw?pnodedw?file_namedbc:student.txt, 00Hfile_error1dbFailed create file.。, 0DH, 0AH, $file_error2dbFailed write file。., 0DH, 0AH, $file
19、_error3dbFailed open the file.。., 0DH, 0AH, $file_error4dbFailed read file.。, 0DH, 0AH, $file_info_1dbsaving the file.。, 0DH, 0AH, $file_info_2dbWrite to file successfully!, 0DH, 0AH, file_info_3dbopening the file。, 0DH, 0AH, $file_info_4dbread the file successfully!, 0DH, 0AH, fp1dw?;文件指针data_seg e
20、nds;*;*extdata_seg segment;define extra data segment;EXTRA DATA GOES HEREextdata_seg ends;*;*stack_seg segment stack;define extra data segment;STACK DATA GOES HEREDB100H dup(?)stack_seg ends;*;*program segment;define code segment;*main proc far;main part of programassume cs:program, ds:data_seg, es:
21、extdata_seg, ss:stack_segstart:;set up stack for returnpush dssub ax, axpush ax;set DS register to current data segmentmov ax, data_seg;data_seg segment addrmov ds, ax;into DS registermov ax, extdata_seg;extdata_seg segment addrmov es, ax;into ES registermov ax, stack_seg;stack_seg segment addrmov s
22、s, ax;into SS register;MAIN PART OF PROGRAM GOES HERE;分配链表头结点mov ax, rdata_pmov head, ax;当前头指针就是 rdata_padd rdata_p, StructNodemov bx, headmov word ptr bx+Node_next, 00Hlb_print_menu:;打印菜单lea dx, str_menumov ah, 09Hint 21Hcall far ptr getintcmp dx, max_menu_indexja lb_print_menumov di, dxshl di, 1jm
23、p jump_tbdijmp lb_print_menucase_0:;Exitretcase_1:;添加记录call far ptr addrecordjmp lb_print_menucase_2:;打印所有记录call far ptr print_recordjmp lb_print_menucase_3:;保存到文件call far ptr save_recordjmp lb_print_menucase_4:;从文件中读取call far ptr read_recordjmp lb_print_menucase_5:;查找call far ptr find_recordjmp lb_
24、print_menucase_6:;删除call far ptr delete_recordjmp lb_print_menuret;return to DOSmain endp;end of main part of program;*;*sub1 proc near;define subprocedurepush axpush bxpush cxpush dx;main port of sub procedure;exit sub procedurepop dxpop cxpop bxpop axretsub1 endp;end of subprocedure;*;*;print CRLF
25、crlf proc farpush dxpush axmov dl, 0dHmov ah, 02Hint 21Hmov dl, 0aHmov ah, 02Hint 21hpop axpop dxretcrlf endp;*;*;从键盘输入一个整数,结果保存到dx中getint proc far;define subprocedurepush axpush bxpush cx;main port of sub proceduremov dx, offset bufgetint;offset 偏移地址mov ah, 0aHint 21Hcall far ptr crlfmov ax, offset
26、 bufgetint_datapush ax;字符串首地址mov al, bufgetint_slencbw;字节转字push ax;字符串长度push ax;返回值call far ptr decibinpop dxpop axpop ax;exit sub procedurepop cxpop bxpop axretgetint endp;end of subprocedure;*;*;把以十制进数形式存储在字符串中的数转成整数;栈中的参数:;0字符串首地址;1字符串长度;2存放结果decibin_para_lenequ3decibin_str1equword ptrbp+4+(decib
27、in_para_len0)*2decibin_str1lenequword ptrbp+4+(decibin_para_len-1)*2decibin_retsultequword ptrbp+4+(decibin_para_len2)*2decibin proc far;save registerspush bpmov bp, sppush axpush bxpush cxpush dxpush sipush dimov bx, 00Hmov cx, decibin_str1lenmov di, decibin_str1decibin_loop1:mov al, byte ptr di ;
28、di为偏移量 以字节为单位 把地址送入al and al, 0fHcbwxchg bx, axmov si, 10mul siadd bx, axinc diloop decibin_loop1mov decibin_retsult, bxexit_decibin:;恢复寄存器pop dipop sipop dxpop cxpop bxpop axpop bpretdecibin endp;*;*;把bx中的数以十进制形式输出;输入:数据存放在bx中binidec proc farpush axpush bxpush cxpush dxpush simov si, 01Hmov cx,1000
29、0d;各位依次输出call dec_divmov cx,1000dcall dec_divmov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1dmov si, 00Hcall dec_divpop sipop dxpop cxpop bxpop axretbinidec endpdec_div proc nearmov ax,bxmov dx,0div cxmov bx,dx;保留余数mov dl,al;商送入dlcmp si, 00H;输出这一位je lb1_dec_divcmp dl, 00H;处理完毕je exit_dec_divmo
30、v si, 00Hlb1_dec_div:add dl,30hmov ah, 02Hint 21Hexit_dec_div:retdec_div endp ;*;*addrecord proc far;define subprocedurepush axpush bxpush cxpush dxpush sipush dipush es;main port of sub proceduremov ax, rdata_p;当前指针移入axmov newnode, ax;再移入newnode存储单元中add rdata_p, StructNode;相当于指针加一add rcount, 1;计数器加
31、一mov bx, ax;当前指针(newnode所指)移入bxmov cx, 00H ;计算总分mov word ptr bx+Node_next, 00H;Node_next置0lea dx, info_0mov ah, 09Hint 21Hcall far ptr getintcall crlfmov word ptr bx+Node_num, dxlea dx, info_1mov ah, 09Hint 21Hcall far ptr getintcall crlfadd cx, dxmov word ptr bx+Node_maths, dxlea dx, info_2mov ah,
32、09Hint 21Hcall far ptr getintcall crlfadd cx, dxmov word ptr bx+Node_english, dxlea dx, info_3mov ah, 09Hint 21Hcall far ptr getintcall crlfadd cx, dxmov word ptr bx+Node_chinese, dxlea dx, info_4mov ah, 09Hint 21Hcall far ptr getintcall crlfadd cx, dxmov word ptr bx+Node_others, dxmov word ptr bx+N
33、ode_total, cx;计算平均成绩mov ax, cxcwdmov cx, 4div cxmov word ptr bx+Node_avg, axlea dx, info_5mov ah, 09Hint 21H;输入姓名lea dx, bufnamemov ah, 0aHint 21Hcall far ptr crlfmov ax, dsmov es, axmov al, bufname_slencbwmov bx, axmov byte ptr bufname_databx, $lea si, bufname_datamov di, newnodemov cx, bxinc cxcld
34、rep movsb;add the new node to the listmov di, newnode;newnode现在存放的是当前项的地址mov si, head;head存放的是头指针mov ax, word ptr si+Node_nextmov word ptr di+Node_next, ax;当前加入项指向上次项(head指向的送当前项指针Node_next)mov word ptr si+Node_next, di;头指针指向当前加入项(当前项的地址送head);exit sub procedurepop espop dipop sipop dxpop cxpop bxpo
35、p axretaddrecord endp;end of subprocedure;*;*print_record proc far;define subprocedurepush axpush bxpush cxpush dxpush sipush di;main port of sub procedurelea dx, str_tb_headmov ah, 09Hint 21Hmov ax, headmov pnode, axloop1_print_record:mov si, pnodemov ax, si+Node_nextmov pnode, axcmp ax, 00Hje exit_print_record1mov si, pnode;打印学号mov bx, si+Node_numcall far ptr binidec;打印制表符lea dx, str_tabmov ah, 09Hint 21H exit_print_record1: cmp ax,00hje exi