求15000之间的素数课程设计.docx
《求15000之间的素数课程设计.docx》由会员分享,可在线阅读,更多相关《求15000之间的素数课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
求15000之间的素数课程设计
学号:
0120810340621
汇编课程设计
题目
求1-5000之间的素数
学院
计算机科学与技术学院
专业
计算机科学与技术专业
班级
计算机科学与技术0902班
姓名
庞竞强
指导教师
刘伟
2011
年
12
月
30
日
课程设计任务书
学生姓名:
庞竞强专业班级:
计算机0902班
指导教师:
刘伟工作单位:
计算机科学与技术学院
题目:
求1-5000之间的素数
初始条件:
理论:
完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:
完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:
1)熟悉汇编语言循环结构;
2)打印出1-5000之间的素数;
3)程序采用子程序结构,结构清晰;
4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试,和验收。
周5:
撰写课程设计报告。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
1.设计题目
1.1题目:
求1~5000之间的所有素数
1.2初始条件及参数:
1.2.1初始条件
理论:
学完汇编课程,掌握汇编语言的使用。
实践:
计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
1.2.2参数
所求素数范围应为1~5000,而且是在此范围内的所有素数。
2.设计要求
本次课程设计着重于运用设计,同时培养动手能力。
要求运用自己所学知识进行设计实现,体现自己的知识掌握水平,严禁抄袭(发现后抄袭者和被抄袭者一律不及格)。
所作设计需进行论证,一方面是从理论上进行推理验证,另一方面是实验论证。
具体如下:
2.1运用自己所学知识进行设计实现
2.2熟悉开发工具MASM
2.3进一步理解汇编语言的应用,巩固所学的知识
2.4了解及初步学会汇编程序的调试、测试
2.5能够成功地完成设计要求,通过适当的算法查找到1~5000之间的素数并能正确输出,其格式如下:
XXXXXXXXXXXX......
3.设计思路
3.1设计总体思路与分析
题目只要求输出1~5000之间的素数,然而由于屏幕的大小限制,不可能使得1~5000之内的素数都同时显示给用户,所以应该分批地显示,让用户输入要查找的素数的范围,例如用户可以输入1000,2000等等的数值范围,程序在屏幕上打印出数值范围内的素数,这样的话既灵活,又能够达到题目的要求,还扩展了程序的功能。
程序总体分析如下:
3.1.1模块的层次设计
程序由三个模块组成,分别是主程序模块main,接受数值并转化运算模块check和查找素数模块,他们的模块框图如下所示:
3.1.2各功能模块的设计说明
3.1.2.1模块名:
main为总控制模块
输入:
从键盘输入一个数字0或1,分别代表退出和进入查找。
输出:
屏幕上提示用户选择相应的选项。
功能:
总体控制界面显示,提示用户选择是否进入查找,
如果用户选择查找则:
调用模块check完成接受用户输入的查找范围并完成ASCII码到数字的转换的功能。
调用模块outputNumList完成查找输入范围内的素数的查找并在屏幕上显示的功能。
如果用户选择查找则退出程序。
3.1.2.2模块名:
check
输入:
用户从键盘输入一个10000以内的数字字符串,保存在缓冲区buf内。
输出:
将转换得到的查找范围放在BX内,并置是否含有非数字字符的标志just。
功能:
将用户输入的数值字符串转换为数字,同时检查是否输入了非数字字符,其算法如下:
依次从buf内取出输入的各个字符,检查它是否为数字字符,如果是的话根据其位置乘以相应的权值,加到BX,继续取下一个;如果为否的话,则置just为0退出模块。
如果输入没有非数字字符的话则置just为1,转化成功,退出模块
3.1.2.3模块名:
outputNumList
输入:
check模块中转换得到的查找范围BX的内容
输出:
屏幕上打印用户要求的查找范围内的所有素数。
功能:
根据check模块中转换得到的查找范围,从2开始检查,从小到大依次让查找范围内的所有数除以比它小而大于等于2的所有数,如果不能除尽的话则是素数,在屏幕上打印。
3.2算法设计
根据设计总体思路与分析,对程序的全貌有了基本的了解之后,对各模块所对应的程序框图设计如下:
3.2.1主程序main的程序框图如下:
3.2.2子程序check的程序框图如下:
3.2.3子程序outputNumList的程序框图如下:
4.程序清单
;-------------------------------
;数据段定义:
datareasegment
;定义缓冲区接收用户输入的查找范围字符串
bufdb10
db?
db10dup(?
)
;定义输入是否有非数字字符标志
justdb1
;用以权值的增加或减少
factordw10
;输入数字的每一位的权值
mulfactordw1
strdb13,10,'Pleaseinputanumberbetween1~~10000:
',13,10,'$'
str_alarmdb13,10,'Pleaseselectanitem!
0:
exit,1:
start',13,10,'$'
str_errdb13,10,'Pleaseinputnumbercharaters!
',13,10,'$'
str_enterdb13,10,'$'
str_allNdb13,10,'Alloftheprimenumbersneededare:
',13,10,'$'datareaends
;--------------------------------------------------------
codesegment
;----------------------------------------------------------
assumecs:
code,ds:
datarea
start:
;---------------------------------------
pushds
pushax
;---------------------------------------
;把数据段首地址赋予ds
movax,datarea
movds,ax
;---------------------------------------
;主程序main
mainprocfar
p1:
;要求用户选择进入查找还是推出
leadx,str_alarm
movah,9
int21h
;接收用户的选择
movah,01
int21h
;判断用户是否输入正确的选项
cmpal,'0'
jep3
cmpal,'1'
jnep1
;调用check子程序,将用户输入字符串转化为数字
callcheck
;判断用户的输入是否都是数字字符
cmpjust,0
jep2
;调用outputNumList子程序,查找并输出相应的素数列表
calloutputNumList
jmpp1
;输出提示输入数字字符
p2:
leadx,str_err
movah,09h
int21h
jmpp1
p3:
ret
popax
popds
movax,004ch
int21h
mainendp
;---------------------------------------
;子程序check
checkproc
;初始化
movbx,0
movmulfactor,1
movfactor,0ah
;输出提示用户输入要查询素数的范围
leadx,str
movah,09h
int21h
;接收用户的输入,保存于缓冲区
leadx,buf
movah,0ah
int21h
;----------------------------------------
;将输入的字符的个数保存于si,用于计数
moval,buf[1]
cbw
movsi,ax
Sum:
;取第si+1个字符,判断它是否为数字字符
moval,buf[si+1]
cmpal,'0'
jbg1
cmpal,'9'
jag1
andax,000fh
;将此位数字乘以相应的权值并加到bx
mulmulfactor
addbx,ax
;将权值乘以10
movax,mulfactor
mulfactor
movmulfactor,ax
decsi
jnzSum
;置是否包含字符标志位
movjust,1
jmpg2
g1:
movjust,0
g2:
ret
checkendp
;-------------------------------------
;子程序outputNumList
outputNumListproc
leadx,str_enter
movah,09h
int21h
leadx,str_allN
movah,09h
int21h
;把mulfactor初始化为输入数值的最高位权值
;因在check子程序中,mulfactor多乘了一次10
movax,mulfactor
cwd
divfactor
movmulfactor,ax
;CX←输入的数值
movcx,bx
movsi,1h
;恢复ax的值
recoverAx:
movax,si
;检查下一个数值
next:
incax
cmpax,cx
jaExit
;除数应该从2开始
movbx,2h
;判断一个数是否能被比它小的数整除
text:
cmpbx,ax
jnbcontinue
movsi,ax
cwd
divbx
cmpdx,0000H
jerecoverAx
incbx
movax,si
jmptext
;打印当前素数
continue:
movbx,ax
anddx,0h
movdi,mulfactor
l1:
divdi
addax,30h
movsi,dx;saveremain
movdl,al
movah,2h
int21h
movax,di
cwd
divfactor
movdi,ax
movax,si
cwd
cmpdi,0h
jnel1
;输出一个空格
movdl,20h
movah,2h
int21h
movax,bx
cmpax,cx
jbnext
Exit:
ret
outputNumListendp
;-------------------------------------
codeends
endstart
5.运行结果
5.1运行各个阶段的结果
经过调试并改正错误后,题目的要求的输出已经实现,具体的运行结果如下:
5.1.1进入程序界面
5.1.2求得的1~2010之间的素数
5.1.3求得的2011~5000之间的素数
5.1.4退出时的界面
5.2运行结果分析
从程序的设计过程及结果可以知道,本程序其实算法比较简单,主要是界面的设计及输出时需要技巧,程序能够正确地输出所要求地结果,至于不能够一次性地显示5000以内地所有素数,主要原因在于“命令提示符”环境的最大尺寸本身有限制。
各个功能模块都能够正确地执行,并且所有选项都正确有效。
6.心得体会
通过本次课程设计,我进一步了解了MASM运行环境,巩固了自己的汇编语言理论知识,提高了自己的动手的能力。
在本次设计过程中我运用了过程化设计方法,进行程序总体分析与设计,规划出程序的总体机构,每个功能的分布情况,形成了程序的框架设计,并成功地运用IBM-PC汇编语言完成了程序的编写。
经过调试和测试程序成功的输出了1~5000之间的所有素数,完成了题目的要求,下面是我对自己在本次设计过程中的表现的自我评价:
6.1比较好的几方面:
6.1.1汇编语言知识掌握得比较扎实,基本上不用参考什么资料就能够成功得设计和编写出程序,完成题目要求的功能。
6.1.2在设计过程中能够总体把握,逐层深入地设计程序,总体与局部地配合比较合理。
6.1.3程序的界面设计得友好,让用户进行关键步骤地选择。
6.1.4适当地扩展了要求,既实现了预期目标又增加了程序地灵活性。
6.2不足之处
6.2.1在执行check子程序时,如果用户输入的字符串含有非数字字符,则会退回到主程序,让用户从头开始选择,虽然有提示信息,但不免会让用户感到繁琐,更好的方法是在用户输入非数字字符时,提示用户再次正确输入数字字符而不跳出。
其改正方法是在check子程序检查到用户输入含有非数字字符时提示用户输入数字字符,然后跳到本子程序前面部分的接收用户输入语句,而不应该退出check子程序;因为用户既然已经选择了进行素数查询就表示他/她一般不会想退出。
6.2.2本次课程设计涉及的专业知识面相对要窄一些,对自己的知识的巩固作用也相应地较小,所以对自己的知识掌握程度也没有达到足够的了解,老师课堂上未讲的内容也没有主动地去学习。
6.3在程序地编写、编译和调试过程中,遇到的一些问题
6.3.1编程的过程中出现了一些逻辑上的错误从而得不到正确的结果,特别是在跳转发生是寄存器内容的变化方面需要进行细致的处理,稍有不留心就会出现错误,这样的错误通常不是语法的错误,而是逻辑的错误以及自己的主观臆断而导致的错误,这要经过自己的耐心调试,才能够发现其中的错误。
6.3.2输出的时候刚开始由于没有把相应得数字转换位ASCII码而出现在屏幕上打印乱码的情况,而输出提示时会在其前面出现乱码的情况,后来才发现原来自己忘了在程序开始之时把数据段首地址赋予DS段寄存器。
6.3.3开发中期则出现除法溢出,后来才发现原来是因为只用了8位的寄存器存储商,而不是16位的,出现溢出,不能得到所有的素数。
6.3.4求得的素数范围比输入的范围大一点等问题,经过调试才发现原来问题出在程序先判断一个数是否是素数然后输出再判断是否越界。
但是正所谓凡事都有应该一分为二地看,虽然这些问题不免在编程的过程中让人感到有些受挫,但是经过自己严密的分析和仔细反复的调试都得到了很好的解决,让自己学到了很多编写和调试程序的知识,丰富了自己的编程经验,提高了自身编程技巧。
总之通过这次试验让我更进一步的体会到汇编语言与高级语言之间的巨大差异,也让我了解到计算机底层控制的繁琐以及实现控制所需要的技巧,我一定会更进一步学习汇编知识以使自己的实力更上一层楼。
参考文献:
【1】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计(第二版),清华大学出版社,201
【2】沈美明,温冬婵,2001,IBM-PC汇编语言程序设计实验教程,清华大学出版社,88
本科生课程设计成绩评定表
班级:
计算机0902班 姓名:
庞竞强学号:
0120810340621
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年 月 日