(汇编)学生成绩管理系统

  • 格式:docx
  • 大小:224.80 KB
  • 文档页数:8

学生成绩管理系统 一、 实验题目 设计学生成绩管理程序(3门课程),实现以下功能: 1. 各科成绩的录入、修改和删除(10个学生,每人3门成绩,分别按学生存 放。即学

生编号*,语文成绩*,语文成绩名次,数学成绩*,数学成绩名次,英 语成绩*,英语成绩名次,后面的三个单元存放该生总成绩、名次、平均成绩) 带*号的为录入值 2. 排序:

(1) 单科课程成绩排序(分数从高到低):结果放到每门成绩之后的名次单 元中

(2) 总成绩排序(分数从高到低):结果放到每个学生后面的名次单元中

3查找:

(1) 查询某位同学某课程成绩及名次;总成绩及名次• (2) 查询单科课程不及格同学名单

4.统计:

(1) 单科平均分

(2) 总成绩平均分

(3) 单科各分数段人数(60 以下,60~70, 70~80, 80~90, 90~100)

二、 设计思路 1. 数据定义。

每个学生记录由学生编号,语文成绩,语文成绩名次,数学成绩,数学成 绩名次,英语成绩,英语成绩名次,总成绩、名次、平均成绩组成。 其它数据,单科平均成绩,总成绩平均分,单科各分数段人数。 学生编号二0{数字字符串}5 成绩二0{数字字符串}3 名次二1{数字字符串}2 分数段人数二5 {数字字符串}5 索引表元素二无符号双字节数 所有成绩数据,语文成绩、数字成绩、英语成绩、总成绩、平均成绩,均 采用上述成绩的定义;所有名次数据,均采用上述名次定义。 2. 数据存储。

所有数据存储于文件中。每条学生记录占用 70个字节,实际有效字节为 24字节,记录最后两个字节是回车换行符,其余字节为空字符,学生记录从第0 个字节开

始存储。第1000个字节开始用以存储索引表。单科平均成绩,总成绩 平均分,单科各分数段人数存储在所有学生记录之后的单元中。 成绩数据,占用 三个字节,排名数据占用两个字节,学号数据占用五个字节,各科分数段人数占 用五个字节,有效字节不足时,在其后补上空字符,即0,如,成绩 100存储为 31H,30H,30H; 90存为 39H,30H,00H。

3. 系统结构 系统分为四部分:插入记录、删除记录、数据处理和查询。结构图如下: 3.1. 插入模块,包括建立成绩表、插入一条学生记录两个子模块。插入 一条学生

记录子模块,搜索可用单元,接收输入的记录,并写入文件。建立成绩 表子模块,控制输入界面,并多次调用插入记录子模块,完成成绩的建立。 3.2. 删除模块,包括学号查询匹配、删除处理子模块。学号设计为定长, 长度为

2字节,搜索以完全匹配的方式进行。删除处理,完成对索引表的修改。

3.3. 数据处理模块,包括计算个人总分、平均分,计算单科平均分,成 绩排名处

理,统计各科分数段人数子模块,各子模块完成相应的功能,并把结果 写入文件。 3.4. 查询模块,完成数据的显示功能,包括查询某个学生个人记录,查 询不及格

名单,查询各科分数段人数及输出所有记录

三、 算法设计。

1. 所有

数据在文件中的修改以覆盖的方式进行,因此将为每个数据分配固 定长度的存储空间。根据以上数据的定义,数据写入文件前必须“规格化” ,使 其符合定义。从键盘输入学号、成绩数据到缓冲区,最后一个字符是 ODH且长 度不等,需去掉回车符,补上空字符。 从字符串到数字的转换算法流程图 从数字转换成字符串,算法程序图: 总分、平均分的计算。从文件中读出数据,需先转换成二进制数再进行计算, 结果必须转换成符合格式的字符串写入文件。 如下: STR表示从文件读出的符合格式的字符串 第一个循环用以算出有效数字 位数,作为第

二个循环的循环次数。 第二个循环,AX作累加器,循 环体是“乘10、加上数字”,循环结 束算出其值

0 开始 位为0? [STR+BX]J个位数字 FLAG- 1

BX — [STR+BX]—百位数字

SI — 0

SI — SI+1

[STR+SI]+30h

BX>3? [STR+BX]—十位数字 [否

BX^ BX+1

1 I

BX — BX+1

结束

2. 程序采用索引表的方式,完成记录的删除、插入与查询;由于不要求学 号有序,因

而可以采用索引表,对记录和文件空间进行管理。其优点是管理较为 简单,可以进行随机访问,能够满足插入删除的需求;缺点是难以实现学号有序。 索引表设计如下:记录最大容量设计为 MAX,链表长度为2*MAX+2个字节, 即MAX+个字长。最后一个字存放尾指针目前学生记录数目; 空闲的位置值为0, 否则为1. 学生的记录从第0个字节的位置开始存放,每70个字节为一条记录。程序 初始化时,将索引表读取到缓冲区INDEX 索引位置表LP与相应文件空间的指 针FP换算方式是: FP= (LP/2) * 70 例如,WORDTR[INDEX+4]值为1,它所表示文件中开始指针值为140,长 度为70字节的空间已经使用,即已经存有记录;否则表示空间可用。 遍历索引表,搜索全部记录:

BX — BX+1

否 十位为0?

是 否

SI>BX? 否 从索引表第一个字开始,顺序扫描索引表。找到非 0,将索引表位置LP转换 成文件指针FP,读取数据,直到遇到0结束。转换成文件指针的宏定义是: LOCATE MACRO BXREG MUL BX PUSH AX MOV DX,AX PUSH BX POP BX

MOV AX,BXREG POP AX

MOV BX,2 ENDM DIV BL

MOV BX,70

LOCAT宏参数是目前索引表位置BX,结果得到对应记录的文件指针送 BX 3. 插入模块

插入学生记录操作流程:(1)比较目前记录数 NUM与设计最大容量 MAX 相等操作结束;(2)接收数据(3)搜索可用文件单元(4)修改索引表、写 入文件。搜索可用文件单元,顺序扫描 INDEX直到[INDEX+BX]为0,根据BX 可转换成可用的文件单元指针。 4. 删除模块:

删除学生记录操作流程:(1)接收搜索条件,程序设计学号长度为最大为 5 (2)根据索引表,搜索匹配学号。(3)修改索引表。数据处理模块。修改索引 表只需

要将相应记录的在表中索引值改为 0. 5. 数据处理模块。

模块中排名处理、学科平均成绩计算、分数段人数统计操作,均需取出某一 学科的所有学生成绩,因而此操作作为公用子程序以供调用。 个人总分及平均分 处理较为简单,根据索引逐条处理记录。 学科平均成绩计算、分数段人数计算,取出学科成绩到数据缓冲区,再进行 相应操作,并将结果写入文件相应位置。结果在文件中的位置相对固定,直接写 入文件。 排名处理。排名结果为一维数组,与学科成绩存在对应关系。排名结果写入 文件操作需多次进行,所以设计成子程序。程序段如下: DATA_IN PROC MOV DX,SI PUSHREG WRITE DX,CX MOV BX,NUMP ADD SI,2 MOV CX,[INDEX+BX] JMP DIN_NEXT2

MOV BX,0 DIN_NEXT1 DATA_LP1 INC CX PUSH CX DIN_NEXT2 PUSH BX POP BX MOV DX,[INDEX+BX] POP CX

CMP DX,0 ADD BX,2 JZ DIN_NEXT1 LOOP DATA_LP1 LOCATE BX

ADD DX,DI DATA_EXIT: MOVE DX POPREG

MOV CX,CXTEM RET DATA IN ENDP 排名处理算法流程图: NUM是数据个数,作为循环计数。每次循 环,找出最大的数,并将其改为1— CX除 最

后一次循环外,1— CX将是负数,由于成 绩不存在负数,故不影响下一次循环找出最 大数。如NUM为10,第一次找到的最大数将改 为-9。最后一次将改成

0. 循环结束后,所有数据由1— CX到0 组成,加上NU碉整后,数据变成由1到NUM 组成,即排名数据。

6. 查询模块。

模块由学生记录查询、学科分数段人数 查询、学科不及格学号查询、显示所有数据 子模块组成。所有数据,除索引表外,均以 定长字符的形式进行存储,方便输出。查询 学科分数段人数、所有记录操作,可以直接 将数据输出;查询学生记录,先进行学号匹 配,再输出一条记录;查询学科不及格学号, 根据索引表,读取有效记录的某学科成绩, 符合成绩不及格者输出其学号记录。 模块算法较为简单,界面处理较为复杂 界面总体背景在程序启动时进行初始化,此 模块中各子模块关键在于控制结果输出显示。

四、实验结果 显示所有记录