问答题 某中学录取100名新生,学生成绩由键盘输入。要求统计在180~200、160~179、140~159、120~139、120分以下各分数段内各有多少人。统计总平均分为多少。并以表格方式将统计结果显示在屏幕上。
【正确答案】DATA  SEGMENT PARA PUBLIC'CODE'
   DBUF   DB    5   ;定义0AH功能的起始地址
          DB    ?
          DB    5DUP(?)
   SCORE  DB    100DUP(?)    ;记录新生分数
   COUNT  DB    0   ;统计新生总人数
   CNT180DB    0   ;统计180以上分数段新生人数
   CNT160DB    0   ;统计160以上分数段新生人数
   CNT140DB    0   ;统计140以上分数段新生人数
   CNT120DB    0     ;统计120以上分数段新生人数
   CNT119DB    0   ;统计120以下分数段新生人数
   AVG1  DB    0   ;平均分数
   HUN    DB1  00
   TEN    DB    10
   EROR   DB    0DH,0AH,'THIS IS A ILLIGAL NUMBER!$'  ;错误信息
   INDM   DB    0DH,0AH,'PLEASE INPUT: '    ;输入提示信息
          DB    0DH,0AH,'$'
   DATA  ENDS
   CODE    SEGMENT PUBLIC'CODE'
     ASSUME CS: CODE,DS: DATA
   MAIN:   MOV  AX,DATA
           MOV  DS,AX
           LEA  DX,1NDM    ;显示提示信息
           MOV  AH,09H
           INT  21H
           CALL INPT    ;输入新生成绩
           CALL DDS1   ;对成绩进行分类
           CALL AVG    ;求平均分数
           MOV  AH,4CH    ;返回DOS
           INT  21H
   CODE    ENDS
          ;新生成绩输入子程序
   INPT     PROC
   BEG:     LEA  DX,DBUF    ;输入一名新生成绩到存储区
            MOV  AH,0AH
            INT  21H
             ;判断输入数据是否有效
            LEA  SI,DBUF+2   ;置新生成绩存储区首地址
            MOV  CX,DBUF+1   ;取成绩位数
            CMP  CX,3   ;新生成绩高于200视为无效
            JA   ERR
            MOV  BL,[SI]    ;输入3位数,最高位不能大于2
            CMP  BL,'2'
            JA   ERR
            MOV  AL,100
            AND  BL,0FH    ;取低4位
            MUL  BL
            MOV  DH,AL    ;暂存百位数
            INC  SI    ;调整指针
            MOV  BL,[SI]    ;输入2位数成绩,在O~199之间
            CMP  BL,'9'    ;如输入数据大于数字9视为无效
            JA   ERR
            MOV  AL,10
            AND  BL,0FH
            MUL  BL
            ADD  DL,AL    ;求百位和十位数之和
            INC  SI    ;调整指针
            MOV  BL,[SI]
            CMP  BL,'9'
            JA   ERR
            AND  BL,0FH
            ADD  AL,DL    ;学生的成绩
            MOV  SCORE,AL    ;将输入有效成绩存入SCORE区
            INC  SCORE
            INC  COUNT
            CMP  COUNT,100
            JC   BEG    ;不足100人,继续输入
   ERR:     LEA  DX,EROR    ;显示提示输入错误信息
            MOV  AH,09H
            INT  21H
            JMP  BEG    ;重新输入有效分数
            RET
   ENDP
            ;新生成绩分类子程序
   DDS1   PROC
           LEA  SI,SCORE    ;置新生成绩存储区首地址
           MOV  CX,COUNT    ;新生数量
   LP:     MOV  AL,[SI]    ;取学生成绩
           CMP  AL,180
           JB   179
           INC  CNT180   ;统计180~200分数段新生人数
   179:    CMP  AL,160
           JB   159
           INC  CNT160   ;统计160~179分数段新生人数
   159:    CMP  AL,140
           JB   139
           INC  CNT140   ;统计140~159分数段新生人数
           CMP  AL,120
           JB   119
           INC  CNT120   ;统计120~139分数段新生人数
   119:    INC  CNT119   ;统计120分以下新生人数
           INC  SI
           LOOP LP
           RET
   ENDP
        ;求新生平均分数
   AVG    PROC
          LEA  SI,SCORE
          MOV  CX,100—1
          MOV  AL,[SI]    ;求成绩总和
          MOV  AH,0
   LP2:   ADD  AL,[SI+1]
          ADC  AH,0
          INC  SI
          LOOP LP2
          MOV  BL,100   ;求平均成绩
          MOV  AVG1,AL    ;将平均分数送AVGl
【答案解析】本题要求从键盘输入学生成绩,并对成绩进行分类统计和显示。需要进行人机交互对话。每名学生的成绩占用1个字节,为无符号二进制整数。需要调用INT 21H的OA号子功能,以回车键作为结束条件。并判断输入数据是否有效:数据在0~200之间,且第一位数不允许为零。否则视为无效,重新输入,直到输入完100名学生成绩数据为止。显示部分请参考教材显示部分。