进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:
输入一个三位整数n;
将小于n的水仙花数打印出来(各位数字的立方和等于该数本身);
程序要有子程序结构或宏指令,结构清晰;
友好清晰的用户界面,能识别输入错误并控制错误的修改。
两种方法实现:计算法、查表法
所谓“水仙花数”是指一个3位数,其个、十、百位数字的立方和等于其本身。
程序可以输入一个三位数,若输入有误则提示错误,并提示重新输入,若输入正确,系统将显示出所有大于等于 100,并且小于等于输入数字的水仙花数。 然后提示是否继续,若用户输入y或Y,则系统回到最开始的状态,若输入 n或N,则退出系统,若为其他则提示错误,并重新输入。
程序主体流程由四大部分组成,分别为输入模块,运算模块,输出模块与错误识别模块。其中运算模块按照课程设计要求,分为查表法模块与运算法模块。
错误识别模块分别针对三种可能发生的输入错误,做出了相应提示,并要求用户重新输入,分别为上限数字输入有误,运算方法选择有误与是否继续选择有误。其中上限数字输入有误细分为输入位数错误,含有数字以外的字符或三位数的首尾为0.
DATA SEGMENT USE16
BUF DB 10 ; 保存输入的字符串
BUF_L DB ? ; 输入字符串的长度
BUF_S DB 10 DUP(0) ; 输入的字符
INPUT DB 'PLEASE IPUT X(100~999): $' ; 输入提示
INERR DB 'INPUT ERROR! TRY AGAIN.', 0AH, 0DH, '$' ; 错误输入提示
CHOOSE DB '1. LOOKUP', 0AH, 0DH, '2. CALCULATE', 0AH, 0DH, 'CHOOSE METHOD YOU WANT: $'
OUT_S DB 'ALL NARCISSISTIC NUMBER UNDER $' ;输出语句
RES_S DB 'WANNA PLAY AGAIN? (Y/N): $' ; 是否继续使用
TAB DW 153, 370, 371, 407 ; 查表法
= 8 ; 表长度 (字节)
RANGE DW ? ; 实际输入的数字(转换后)
OUT_BUF DB 10 DUP(0) ; 输出缓冲区
TMP DW 0 ; 累加
DATA ENDS
宏指令:
1. CRLF | 输出换行 |
---|---|
2. READ A | 从读取一段字符串存取缓冲区A中 |
3. WRITE A | 输出字符串A |
4. GETC | 从控制台读取一个字符存入AL |
TONUM 将读取的字符串转换为数字(已经过合法性检查)子程序:
QUAD 按照水仙花数规则计算AX中的三位数映射,并存入变量TMP
CLN_A 清空所有存储器,防止多次执行时数据紊乱
IS_NUM 判断AL中的字符是否为数字字符,是则AH=0,否则AH=1
RADIX 将AX中的数字转换为BX进制,存入SI指向的缓冲区中
源程序代码
见附件main.asm
输入数字:
左:查表法右:计算法