还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
学生信息管理系统.安变为别1使用汇编语言编程.安空曲宏彳实变的29学生的信息包括姓名、班级、学号和成绩,其中成绩精确到1位小数编写程序实现以下功能1可以录入学生的信息,成绩以十进制形式录入,并显示;2可以按成绩进行排序显示;3可以统计平均成绩;4可以统计不及格、
6070、
7080、
8090、90~100各分数段的人数〜〜〜.安经瞪备环俵3Windows7操作系统的pc机,使用QASM270编译器环境下编写.安绘宓弛2秒及方法4首先数据采用二维数组的形式进行存储,分为学生信息部分与成绩部分然后将输入学生数也保存在一个一维数组中然后再信息的存储过程中,对于字符串输入进行转换,以二进制的形式存储在数据段中然后采用冒泡排序,对于数据段中的人员信息进行排序以成绩为参数然后再对每个人员成绩进行遍历,统计各个数据层次中人员数,然后再成绩遍历的同时,将平均成绩也同时求出,在求平时成绩的时候,首先先将整数部分乘10然后再加上小数部分,以便于后续的输出将排序后的人员信息及成绩显示出来,然后将平均成绩也同时打印出来,还有各个分数层次中的人员数也都一并显示出来下面是一些主要代码来实现上述过程;数据部分NUMBER DB3DUP0;第一个存个/十位ASCII码,第二个存个位ASCH码,第三个存学生数二进制;用20字节单元表示学生信息,0T9中0对应最大字符,1对应实际输入,2-18对应输入信息,19对应$INFORMATION DB99DUP20DUP0;用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数GRADE DB99DUP7DUP0AVERAGE_GRADE_BUFFER DB2DUP0;第一个存整数部分二进制形式,MOV DX,0MOVDL,NUMBER+2L00P1:;使用冒泡排序法MOV CX,DXMOV DI,0MOV SI,0LOOP2:;先比整数部分,再比小数部分MOV AL,GRADE[DI+5]CMP AL,GRADE[DI+12]JG NEXT;大于,向下个移动JL SWAP1;小于,交换成绩,名字;等于,比较小数部分MOV AL,GRADE[DI+6]CMP AL,GRADE[DI+13]JGE NEXT;大于或等于,向下个移动JL SWAP1;小于,交换成绩,名字SWAP1:MOV BX,SISWAP11:;交换学生信息MOVAL,INFORMATION[BX+2]XCHG AL,INFORMATION[BX+22]MOV INFORMATION[BX+2],ALINC BXCMP AL,$JNZ SWAP11PUSH BXMOV BX,0SWAP2:;交换学生成绩MOVAL,GRADE[DI+BX]XCHG AL,GRADE[DI+BX+7]MOV GRADE[DI+BX],ALBXINCCMP BX,7JNZ SWAP2POP BXNEXT:ADD SI,20ADD DI,7DEC CXJNZL00P2DEC DXJNZLOOP1POP DIPOPSIPOP DXPOPCXPOP BXPOPAXRETSORT ENDP;******************显示最后结果的函数******************FIND_RESULT PROCPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV BX,0MOV CX,0MOV CL,NUMBER+2;cl中保存学生人数MOV DI,0MOV SI,0Fl:MOV AL,GRADE[DI+5]CMP AL,100JG FOUT;大于100JZ F90;等于100;小于100CMP AL,90JGE F90;大于等于90;小于90CMP AL,80JGE F80;大于等于80;小于80CMP AL,70JGE F70;大于等于70;小于70CMP AL,60JGE F60;大于等于60;小于60;处理(60MOV DL,N4INC DLMOVN4,DLFNEXT:;处理平均成绩处理方式整数部分*10+小数部分,结果先除以学生人数,再输出(输出整数时除以10)MOV AL,GRADE[DI+5]MOV DL,10MUL DLMOV DL,GRADE[DI+6]MOV DH,0ADD AX,DXADD BX,AXJMP F2FOUT:POP DIPOPSIPOP DXPOPCXPOP BXPOPAXF90:;处理>=90MOV DL,NOINC DLMOVNO,DLJMP FNEXT;处理大于等于80小于90F80:MOV DL,N1INC DLMOVN1,DLJMP FNEXTF70:;处理大于等于70小于80MOV DL,N2INC DLMOVN2,DL FNEXTJMPF60:;处理大于等于60小于70MOV DL,N3INC DLMOVN3,DLJMP FNEXTF2:ADD DI,7DEC CXJNZFl;处理所有学生MOV DX,OFFSET KAISHISHUCHU;打印一段************MOV AH,09INT21HMOV DX,OFFSET AVERAGE_GRADE;打印平均成绩MOV AH,09INT21HMOV AX,BXMOV DX,0MOV CX,0MOV CL,NUMBER+2DIV CXMOV CL,10DIV CLCALLSHOW;先打印平均成绩的整数部分PUSH AXMOV DL,.;打印.MOV AH,2INT21HPOP AXMOV AL,AHCALL SHOW;再打印平均成绩的小数部分MOV DX,OFFSET RESULT1;输出大于等于90的人数MOV AH,09INT2111MOV AL,NOSHOWCALLMOV DX,OFFSET RESULT2;输出大于等于80并〃于90的人数MOV AH,09INT21HMOV AL,N1CALL SHOWMOV DX,OFFSET RESULTS;输出大于等于70并〃于80的人数MOV AH,09INT21HMOV AL,N2CALL snowMOV DX,OFFSET RESULT4;输出大于等于60并〃于70的人数MOV AH,09INT2111MOV AL,N3CALL SHOWMOV DX,OFFSET RESULTS;输出小于60的人数MOV AH,09INT21HMOV AL,N4CALL snowRETFIND_RESULT ENDP;******************输出分数排序的函数******************_DISPLAY PROCPUSHAXPUSH BXPUSHCXPUSH DXPUSHSIPUSH DIMOV DX,OFFSET GRADE_RANKMOV AH,09INT21HMOV CX,0MOV CL,NUMBER+2;C1中保存学生人数MOV DT,0MOV SI,0DI:MOV DX,OFFSET INFORMATIONADD DX,SIADD DX,2MOV All,09INT21HMOV DX,OFFSET BLANK;打印一段空白MOV AH,09INT2111mov Al,GRADE[DI+5]push axMOV GRADE[DI+5],,$,;将保存成绩的单兀中第6个字节置为$,便于输出MOVDX,OFFSET GRADE;输出成绩ADDDX,DIMOV AH,09INT21Hpop axmovGRADE[DI+5],AlMOV DX,OFFSET HUANHANG;打印换行MOV AH,09INT2111ADD SI,20ADD DI,7DEC CXJNZDI;直至将所有成绩都辆出POP DIPOPSIPOP DXPOPCXPOP BXPOPAXRETDISPLAY ENDP;******************将二进制数输出的函数******************SHOW PROCPUSHAXPUSH DXPUSHCXPUSH BXMOV CL,100MOV AH,0DIV CL;将41中的二进制数除以100MOV BX,AX;保存CMP AL,0JZ XI;如果商为0,则表示原数小于100;否则将百位数打印出来MOV DL,ALADD DL,30HMOV AH,2INT21HXI:MOV AL,BIIMOV AH,0MOVCL,10DIV CL;将融中的二进制数除以10MOVBX,AX;保存CMPAL,0JZ X2;如果商为o,则表示原数小于10;否则)将十位打印出来MOVDL,ALADD DL,30HMOV AH,2INT2111X2:;打印个位MOVDL,BHADD DL,30HMOV AH,2INT2111POP BXPOPCXPOP DXPOPAXRETSHOW ENDP2*7*7^7^slz*lz xl*%L**Jz slz%lz slzsix*lz VT1f•包*q」■[1*Jz slzst**A**dz*lz slz slz slzs£*7*p**Jz%lzslzxlz*A**A*CODES ENDSENDSTART•7*7*7*7*7*7*7*2*2*7x7“
7.!7”7,1-\—..[I_L,Lq irii%t*2*7*2*7^7z%tzs£*2*7*7x*lz%lxsix7*7*7^inm4,不不不不不不不不不不不不不不不不不不三又口不不不不不不不不不不不不不不不不不不STORE STUDENTNUM;存储学生总数,结果送CXSTORE STUDENTINFORMATION中;存储学生信息STORE_STUDENT_GRADE;存储每个学生成绩SORT;采用冒泡排序_DI SPLAY;显小结果FIND_RESULT;显示平均成绩和分段人数冒泡排序算法:返回关键算法的流程图关于分段人数与总成绩的计算〉-Please input the number of students99:3Please inputthe student informat ionclassid name:121wangyuanPlease inputthe studentgrade
0.0-
100.0:
87.5Please input12the studentinformat ionclassid name:2heqing Pleaseinput
77.8the studentgrade
0.0-
100.0:Please input123liujie Pleasethe studentinformat ionclassid name:input
93.2the studentgrade
0.0-
100.0:The grade listhigh to lowis:123liujie
93.121wangyuan
87.122heqing
77.The averagegrade is:
86.1The numberof studentin[=90]is:lThe numberof studentin[80-90]is:lThe numberof studentin[70-80]is:lThe numberof studentin[60-70]is:0Please inputthe studentgrade
0.0-
100.0:
92.5Please inputthe studentinformat ionclassid name:124liujiePlease inputthe studentgrade
0.0-
100.0:
77.5Please inputthe studentinformat ionclassid name:125heqingPlease inputthe studentgrade
0.0-
100.0:
56.4输入5人信息,并将其打印出来The gradelisthigh tolowis:123wangyuan
92.5121dongli
87.5122Ivyan
83.2124liuj ie
77.5125heqing
56.4The averagegrade is:
79.4The numberof studentin[=90]is:lThe numberof studentin[80-90]is:2The numberof studentin[70-80]is:lThe numberof studentin[60-70]is:0The numberof studentin[=60]is:l.安弟Q得6通过编写学生管理系统的汇编实验,让我对汇编语言有了很深的了解,对于语言的熟悉度也提高了很多在编写的过程中遇到了很多的问题,由于汇编语言使用起来比较繁琐(个人感觉),很多内部运行的数据不能很好的呈现出来,所以对数据的保存,处理等方面出现了很大的错误,主要是在字符的输入与二进制的转换,还有就是在数据处理的时候会出现很多标志位,这些标准为对于处理后数据的保存有很大的影响,但是通过课本上的实验例子,对于这些问题基本上都能得到一定的解决还有就是在需要跳转的时候,由于跳转指令使用对标志位或者条件使用比较灵活,有很多种的跳转指令,这些指令在使用起来是很方便但是由于判断条件很多,可能不小心就出现了跳转出错还有就是,跳转不到想要跳转的地方这些问题需要在编写的过程中非常的小心,同时也能将这些指令得使用规则得到一个很好的理解与记忆总之,在此次的汇编实验的编写过程中,理解了很多在课堂上学习到的知识,也同时记忆了这些指令的使用规则与方法对于汇编语言有了一定程度的理解与掌握源程序DATAS SEGMENT;此处输入数据段代码;输入输出提示字符STUDENT_NUM DBPlease inputthe numberof students1-99STUDENT」NFORMATION DB ODH,OAH,J Please inputthe studentinformation classid name:,ODH,OAH,$STUDENT GRADE DB ODH,OAH,Pleaseinputthestudentgrade
0.0-
100.0:\ODH,OAH,,$,AVERAGE-GRADE DB ODH,OAH,,The averagegrade is:,DBBLANKODH,OAH,$DBHUANHANGRESULT1DB ODH,OAH,J The numberof studentin[=90];各分数段人数RESULT2DBODH,OAH,The numberof studentin[80-90]RESULTS DBODH,OAH,The numberof studentin[70-80]is:;$,RESULT4DBODH,OAH,The numberof studentin[60-70]is:WRESULTS DBODH,OAH,,Thenumberofstudentin[=60]GRADE_RANK DBODH,OAH,J Thegradelisthightolowis:,ODH,OAH,$打印排名KAISHISHUCHU DB***********************************,ODH,OAH,$ODH,OAH,;数据NUMBER DB3DUP
(0);第一个存个/十位(ASCH码),第二个存个位(ASCH码),第三个存学生数(二进制);用20字节单元表示学生信息,0-19中0对应最大字符,1对应实际输入,2-18对应输入信息,19对应$INFORMATION DB99DUP(20DUP
(0));用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数GRADEDB99DUP7DUP0AVERAGE_GRADE_BUFFER DB2DUPO;第一个存整数部分二进制形式,第二个存〃数部分二进制形式NO DB0;各分数段人数存储区二进制形式N1DB0N2DB0N3DB0N4DB0DATAS ENDSCODESSEGMENTASSUME CS:CODES,DS;:DATASSTART:;此处输入代码段代码MOV AX,DATASMOV DS,AXMOV SI,0;指向每个学生信息MOV DI,0;指向每个学生成绩MOV CX,100;初始化学生数MOVDX,OFFSET STUDENT_NUM;请求输入学生总数MOV AH,09INT21HCALL STORE_STUDENT_NUM;存储学生总数,结果送ex中CMP ex,0;输入为退出JLE OUTTODOSCMP CX,100;学生数超出本程序范围,退出JGE OUTTODOSINPUT:MOVDX,OFFSET STUDENT_INFORMATION;请求输入学生信息MOV AH,09INT21HCALL STORE_STUDENT_INFORMATI ON;存储学生信息ADD SI.20;指向下一个学生信息MOVMOVDX,OFFSET STUDENT.GRADE;请求输入学生成绩INTAH,0921HCALL STORE_STUDENT_GRADE;存储每个学生成绩ADD DI,7;指向下一个学生LOOP INPUT;循环,直到输入所有学生成绩CALL SORT;排序CALL_DI SPLAY;显小结果CALL FIND_RESULT;显示平均成绩和分段人数OUTTODOS:AH,1;任意键结束MOV21HINTMOV AX,4C00H;返回DOSINT21HSTORE_STUDENT_NUM PROC;调用之后,ex中存储了学生数(二进制)PUSHAXPUSH BXMOV BX,0S1:MOV AH,1INT21HCMP AL,ODH;是否为回车JE S2AND AL,OFH;转换为非压缩的BCD码MOV NUMBER[BX],ALINC BXJMPSIS2:CMP BX,2JG S5;大于2JZ S3;等于2;小于2MOV AL,NUMBERJMP S4S3:MOV AH,NUMBERMOV AL,NUMBER+1S4:MOV NUMBER+2,ALMOV CX,0MOVCL,NUMBER+2S5:POP BXPOP AXRETSTORE STUDENTNUM ENDPAAD;BCD码转换为二进制数;******************存储学生彳言息的函数******************STORE_STUDENT_INFORMATIONPROCPUSH AXPUSH BXPUSH DXMOV AL,18MOV INFORMATION[SI],ALLEA DX,INFORMATION[SI]MOV AH,OAHINT21HMOV BL,INFORMATIONESI+1];实际输入的字符个数MOV AL/MOV INFORMATION[SI+BX+2],AL;将回车换成’’MOV INFORMATION[SH19],,$,;将每个存储单元的最后一个字节置为$以便输出POP DXPOPBXPOPAXRETSTORE_STUDENT_INFORMATION ENDP******************存储学生成绩的函数******************STORE_STUDENT_GRADE PROCPUSHAXPUSHBXPUSHCXPUSH DXMOVBX,0MOV CX,0MOVDX,DIDEALO:MOV AH,1INT21HCMP AL,ODH;判断是否为回车DEAL2JZ;是回车CMPAL,「;是否为小数点JNZ DEAL1;不是小数点MOVBX,CX;bx指向小数点处;标记〃数点字符出现在第几个位INC BX置DEAL1:PUSHBXMOVBX,DXMOV GRADE[BX],ALPOP BXINCCX;记录输入字符的个数INC DXJMP DEALODEAL2:CMP BX,0JNZ DEAL3;有小数点;无〃数点CMP CX,3JG GOUT;大于100JZ DEAL4;小于100;等于100CMPCX,2JZ DEAL5;个;输入数目为2位数位数DEAL6:;处理个位数MOV AL,GRADE[DI]SUB AL/OMOV GRADE[DI+5],ALJMP GOUTDEAL5:;处理2位数MOV AH,GRADE[DI]AND AH,OFHMOV AL,GRADE[DI+1]AND AL,OFHAADMOVGRADE[DI+5],ALJMP GOUTDEAL4:;处理3位数MOVAL,100MOVGRADE[DI+5],ALJMP GOUT;处理带有小数部分的成绩DEAL3:MOVAL,GRADE[DI+BX];将小数部分处理SUB AL,OMOV GRADE[DI+6],ALCMP BX,4JZ DEAL4出现在输入字符的第四位,则输入的整数部分为3位数JG GOUT;整数部分大于3位数CMP BX,3JZ DEAL5;.出现在输入字符的第二位,则输入的整数部分为2位数JMPDEAL6;否则为个位数GOUT:POP DXPOPCXPOP BXPOPAXRETSTORE_STUDENT_GRADE ENDP;******************排序学生成绩的函数******************SORTPROCPUSH AXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDI。
个人认证
优秀文档
获得点赞 0