学生成绩管理系统的设计与实现.docx

上传人:b****6 文档编号:7269651 上传时间:2023-01-22 格式:DOCX 页数:52 大小:213.53KB
下载 相关 举报
学生成绩管理系统的设计与实现.docx_第1页
第1页 / 共52页
学生成绩管理系统的设计与实现.docx_第2页
第2页 / 共52页
学生成绩管理系统的设计与实现.docx_第3页
第3页 / 共52页
学生成绩管理系统的设计与实现.docx_第4页
第4页 / 共52页
学生成绩管理系统的设计与实现.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

学生成绩管理系统的设计与实现.docx

《学生成绩管理系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统的设计与实现.docx(52页珍藏版)》请在冰豆网上搜索。

学生成绩管理系统的设计与实现.docx

学生成绩管理系统的设计与实现

学号:

0120810680427

课程设计

 

题目

学生成绩管理系统的设计与实现

学院

计算机科学与技术

专业

软件工程

班级

0804班

姓名

张琦

指导教师

王云华

 

2011

1

6

课程设计任务书………………………………………………………………3

设计目的与内容………………………………………………………………4

设计环境与工具………………………………………………………………4

算法描述………….………………………………………………………………4

程序流程图………………………………………………………………………10

程序源代码…….…………………….…………………………..…………11

执行结果与分析………………………………….…………………………41

总结…….………………………….………………………………………….……42

参考文献……………………………………………………………………………43

 

课程设计任务书

学生姓名:

张琦专业班级:

软件工程0804班

指导教师:

王云华工作单位:

计算机学院

题目:

学生成绩管理系统程序设计

初始条件:

DOS操作系统。

编辑,汇编,连接,调试工具:

edit、masm、link、debug

要求完成的主要任务:

该程序要求具备的功能:

清晰且易于操作的用户界面,在文本编辑界面中输入学生成绩。

其中“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

RET

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

CMPBL,'9'

JAEE

INCSI;si指向十进制位串的下一个字符

SUBBX,30H;将每一位的ASCII码值减去30H,变成十进制值

ADDAX,BX;加上该位的值

loopM1;loop一次cx减少1

M2:

RET

EE:

MOVERROR,1

CALLFARPTRERR_INF

RET

EXCH_ASCENDP

EXCH_ASPROCFAR;将SI指向的ascii字符串转换为十进制值,保存在AX中,CX为字符串长度

PUSHREG1

PUSHSI

XORAX,AX;清零ax寄存器

JCXZLL2;测试cx寄存器的内容,cx为十进制字串的长度,cx为0的时候转M2

LL1:

MOVBX,10;设置进制为10

MULBX;ax乘以10

MOVBL,[SI];将si指向的字符放入bl寄存器

INCSI;si指向十进制位串的下一个字符

SUBBX,30H;将每一位的ASCII码值减去30H,变成十进制值

ADDAX,BX;加上该位的值

loopLL1;loop一次cx减少1

LL2:

POPSI

POPREG1

RET

EXCH_ASENDP

CHECK_LPROCFAR;检查输入学号是否合法

JCXZM22

M11:

MOVBL,[SI];将si指向的字符放入bl寄存器

CMPBL,'0'

JBEEE

CMPBL,'9'

JAEEE

INCSI

LOOPM1

M22:

RET

EEE:

MOVERROR,1

RET

CHECK_LENDP

CHECK_OKPROCFAR;检查输入成绩是否合法

PUSHBX

CALLFARPTREXCH_ASC

CMPAX,100

JAINRE

POPBX

RET

INRE:

POPBX

CALLFARPTRERR_INF

MOVERROR,1

RET

CHECK_OKENDP

ERR_INFPROCFAR;输出错误信息一,成绩不合法

PUSHBX

CALLFARPTROP_WIN_F

CURSOR8,64

PUTERR_INFO1

CURSOR1064

PUTERR_INFO2

CURSOR1164

PUTERR_INFO3

CURSOR1264

PUTERR_INFO4

POPBX

RET

ERR_INFENDP

ERR_INF2PROCFAR;输出错误信息二,输入为空

PUSHBX

CALLFARPTROP_WIN_F

CURSOR8,64

PUTERR_INF21

CURSOR1064

PUTERR_INF22

CURSOR1164

PUTERR_INF23

POPBX

RET

ERR_INF2ENDP

ERR_INF3PROCFAR;输出错误信息三,学号不合法

PUSHBX

CALLFARPTROP_WIN_F

CURSOR8,64

PUTERR_INF31

CURSOR1064

PUTERR_INF32

CURSOR1264

PUTERR_INF33

POPBX

RET

ERR_INF3ENDP

ERR_INF4PROCFAR;输出查找失败信息

PUSHREG

CURSOR10,64

PUTERR_INF51

POPREG

RET

ERR_INF4ENDP

SHOWPROCFAR;初始化输出窗口

CALLFARPTROP_WIN_F

CURSOR8,64

PUTMSG31

PUSHREG

PUSHSI

MOVSI,0

MOVOP_N[SI],'0'

POPSI

LEADI,OP_N+1

CALLFARPTRDEC_ASC

POPREG

CURSOR8,74

PUTOP_N

CURSOR9,64

PUTMSG32

RET

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

RET

INI_MENDP

INI_EPROCFAR;初始化编辑窗体

CLRSCRN0,0,30,4FH,1FH

CURSOR1,0

PUTMSG_EDIT

CLRSCRN3,0,19,61,10100000B

PUTC_MAG

CALLFARPTROP_WIN_F

CLRSCRN21,0,24,61,10000101B

CLRSCRN22,1,23,60,11110000B

RET

INI_EENDP

INI_PPROCFAR

CLRSCRN0,0,30,4FH,1FH

CURSOR1,0

PUTMSG_PRINT

CLRSCRN3,0,19,61,10100000B

PUTC_MAG

CALLFARPTRSHOW

CLRSCRN21,0,24,61,10000101B

CLRSCRN22,1,23,60,11110000B

RET

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

PUSHREG

CURSORLINE_N,2

PUSHBX

ADDBX,2

PUT[BX]

POPBX

CURSORLINE_N,14

PUSHBX

ADDBX,15

PUT[BX]

POPBX

CURSORLINE_N,24

PUSHBX

ADDBX,24

PUT[BX]

POPBX

CURSORLINE_N,31

PUSHBX

ADDBX,30

PUT[BX]

POPBX

CURSORLINE_N,38

PUSHBX

ADDBX,36

PUT[BX]

POPBX

ADDLINE_N,2

POPREG

RET

PRINT_FENDP

SEARCH_FPROCFAR;查找学号为STU_N的学生

PUSHREG

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

JNZLAB

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

CURSOR21,1

PUTMSG2

MOVLINE_N,23

MOVROW_M,1

BRUSH40,LINE_N,RO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1