用汇编语言设计单词记忆测试器程序设计

用汇编语言设计单词记忆测试器程序设计,第1张

题目名称:单词记忆测试

题目来源:http://zhidao.baidu.com/question/127688555.html

*** 作说明:

一、输入单词:

1、提示输入单词,输入最少5个、最多255个英文单词,每个单词不超过20个字符;

2、若直接回车,则结束单词输入,进入单词测试;

3、输足20个字符,自动进入下一个单词的输入;

4、不足20个字符个字符,按回车键进入下一个单词的输入。

二、单词记忆测试:

1、从输入的第一个单词开始测试

2、键入'y'(不分大小写)或'n',回答是否认识,不需按回车键确认,其它按键无效;

3、紧接着,没有提示,可按上移键或下移键循环测试;

4、按Esc键结束测试。

三、计算单词识别率并显示输出

四、提示是否进行下一组单词的输入和测试,键入'y'(不分大小写)或'n'选择是否继续,不需按回车键确认,其它按键无效。

本程序在MASMPlus 1.2集成环境下携仔颤通过编译,经过调试,运行正确。

Code Segment

Assume CS:Code,DS:Code

-------------------------------------

功能:显示指定地址(Str_Addr)的字符串

入口:

Str_Addr=字符串地址(要求戚薯在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

push ax

lea dx,Str_Addr

mov ah,9

int 21h

pop ax

EndM

-------------------------------------

功能:输出一个字符

入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr endp

-------------------------------------

功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

-------------------------------------

功能:把AX中的二进制辩败无符号数转换成显式的十进制ASCII码,并送显示屏显示

入口:AX=二进制数

出口:在当前光标位置显示转换后的ASCII码数字

Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[6]

mov BYTE ptr [di],'$'

dec di

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,0ffffh

jnz @@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 7 dup(?)

Dec_ASCII EndP

-------------------------------------

功能:键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回

入口:无

出口:若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。

Yes_or_No proc Near

push dx

push ax

@@Input_Chr: mov ah,7 不带回显的键盘输入

int 21h

mov dl,al

and al,0dfh

cmp al,'Y'

jnz $+5

stc

jmp $+7

cmp al,'N'

jnz @@Input_Chr

clc

mov ah,2

int 21h

pop ax

pop dx

ret

Yes_or_No Endp

-------------------------------------

Input_Words Proc Near 输入一组单词

xor cl,cl 输入的单词数目初值

lea bx,Buffer 数据缓冲区地址

mov di,bx

Output Prompt_Str1 提示输入单词

@@Input_Words: cmp cl,255

jz @@Termanate 限定最多255个单词

mov [bx.Recognise],No 初始化识别标志

mov [bx.previous],di 前一个节点地址

mov [bx.Next],Chrs+1 每个单词最多字符数

mov di,bx

lea dx,[bx.Next] 键盘输入缓冲区地址

mov ah,0ah 输入单词

int 21h

mov si,dx

inc si

lodsb 读入实际输入的字符个数,即单词长度

test al,al 直接回车?

jz @@Termanate 是,结束单词输入

inc cl 累计输入的单词数目

xor ah,ah

add si,ax

mov [si],'$' 使之能用dos功能调用9号功能显示这个字符串(单词)

inc si

mov [bx.Next],si 下一个节点地址

mov bx,si

call Output_CTLF 输出一个回车、换行

jmp @@Input_Words 输入下一个单词

@@Termanate: cmp cl,5

jb @@Input_Words 限定最少5个单词

mov Words,cl 保存单词数目

lea si,Buffer 数据缓冲区地址

mov bx,[bx.previous]

mov [si.previous],bx 把第一个节点的前一个节点地址指向最后一个节点

mov [bx.Next],si 把最后一个节点的下一个节点地址指向第一个节点,形成循环链表

call Output_CTLF

ret

Input_Words EndP

-------------------------------------

Test_Words Proc Near

call Output_CTLF

call Output_CTLF

lea dx,[si.Next][2]

mov ah,9

int 21h

call Output_CTLF

Output Prompt_Str2 要求回答是否认识这个词汇,回答字母不分大小写

@@Recognise: or [si.Recognise],Yes

call Yes_or_No

jc @@Up_Down

and [si.Recognise],No

@@Up_Down: xor ah,ah

int 16h

cmp ah,KBEsc

jnz $+3

ret

cmp ah,KBUp

jnz @@Next_KBDown

mov si,[si.previous]

jmp Test_Words

@@Next_KBDown: cmp ah,KBDown

jnz @@Up_Down

mov si,[si.Next]

jmp Test_Words

Test_Words EndP

-------------------------------------

Statics_Words Proc Near 计算单词识别率

mov cl,Words 取单词数

xor ch,ch

lea si,Buffer 数据缓冲区地址

mov bx,[si.Next]

xor ax,ax

@@L0: add al,[si.Recognise] 累加识别率

mov si,[si.Next]

loop @@L0

mov bl,100

mul bl

div Words

Output Prompt_Str3 提示显示单词识别率

call Dec_ASCII 把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

mov dl,'%'

call Output_Chr 显示输出一个字符

ret

Statics_Words EndP

-------------------------------------

Chrs equ 20 单词最多字符数

Yesequ 1 认识

No equ 0 不认识

KBEscequ 1 Esc键扫描码

KBUp equ 48H ↑键扫描码

KBDown equ 50H ↓键扫描码

-------------------------------------

定义结构类型

Words_Table Struc 单词链表

Recognise db ? 识别标志(是否认识这个单词)

previous dw ? 前一个节点地址

Next dw ? 下一个节点地址

Words_Table EndS

-------------------------------------

Prompt_Str1 db 'Please input words:',13,10,'$' “请输入单词”提示信息

Prompt_Str2 db 'do you know it ?(y/n):$' “是否认识单词”提示信息

Prompt_Str3 db 7,13,10,13,10,'your answer rate is: $' “单词识别率”提示信息

Prompt_Str4 db 7,13,10,13,10,'Do you want to test again(y/n)?$' “测试下一组单词?”提示信息

Words db 0 实际输入的单词数目

Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$' *** 作完成按任意键结束程序提示信息

Start:push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

@@InputWord: call Input_Words 输入一组单词

call Test_Words 测试识别率

call Statics_Words 计算单词识别率

Output Prompt_Str4 再测试一组单词?

call Yes_or_No

call Output_CTLF

call Output_CTLF

jc @@InputWord

-------------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Buffer: 数据缓冲区

Code ENDS

END Start 编译到此结束

你的代码逻辑有点乱,我初步看了,至少册裂雹在第37-39行是有问题的,这3行的意思是:如果读取的字符不是字母就继续读,可是如果到了文件末尾,你的代码也不会停下来,因为你没有调用feof(in)测试是否到达了源隐文件末尾。这种文本统计的问题,用C做实在费事。我用C++做过,也很费事。后来用Perl做过,只需要一行代码就够了。perl

-E

"for(){$n{$_}++

for

/(\w+)/g}

say

$n{$_},

'

',$_

for

sort

keys

%n"

file.txt你可以安装perl后州帆,试试。有C的基础,建议你学学Perl或其他动态语言,对日常工作帮助会很大。祝你成功!

大一c语言课设可以选择各种不同的题目,以便提高自己的编程技能和对 c 语言的理解。下面是一些建议的课设题目:

简单散链的数学计算器:可以让用户输入两个数字和一个运算符(加、减、乘、除),然后输出运算结果。

猜数字游戏:程序随机生成一个数字,用户输入一个数字并根据提示继续猜测。程序会告诉基搏用户猜的数字是大了还是小了,直到用户猜对为止。

字符串处理:让用户输入一个字符串,然后实现字符串的反转、排序等功能。

简单的文本编辑器:可以实现文本的编辑、保存和打开功能。

简单的图形界面程序:可以使用 c 语言的图形库(例如 SDL、GTK+ 等)创建一个简单的图形界面程序,例如计算器、日历程序等。

这些搏掘祥题目只是一些建议,您也可以根据自己的兴趣和能力选择其他题目。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12499002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存