题目来源: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+ 等)创建一个简单的图形界面程序,例如计算器、日历程序等。
这些搏掘祥题目只是一些建议,您也可以根据自己的兴趣和能力选择其他题目。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)