星期判断程序.docx
《星期判断程序.docx》由会员分享,可在线阅读,更多相关《星期判断程序.docx(20页珍藏版)》请在冰点文库上搜索。
星期判断程序
目录
概述…………………………………………………………1
一 设计内容与要求………………………………………1
二 设计思想…………………………………………………1
三 程序流程图……………………………………………2
四 程序源代码……………………………………………3
五 设计过程中遇到的问题及解决方法……………………24
六 设计心得…………………………………………………24
星期判断程序
概述
判断星期程序是一个简单实用的应用程序,只要按程序要求,输入正确的年月日,该程序就会正确显示当天是星期几,当输入错误的年月日信息时,改程序会提示输入错误,并且提示重新输入,当一次输入操作完成后,按Y继续,按N结束。
一、设计内容与要求
输入年、月、日,能够判断当日的星期数,并进行输出。
(可设某年的1月1日为起点,
二、设计思想
年月日信息储在一个数据区里,并对年月日信息进行判断,看是否为正确的年月日信息,然后根据蔡勒公式W=[C/4]-2C+y+[y/4]+[13*(M+1)/5]+d–1(其中w:
星期;w对7取模得:
0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六;c:
世纪减1(年份前两位数);y:
年(后两位数);m:
月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:
日;[]代表取整,即只要整数部分。
)再通过调用,显示出来。
三、程序流程图
四、程序源代码
stacksSEGMENTstack
DB200DUP(0)
stacksENDS
datasegment
Yeardw0
Monthdb0
Daydb0
tempdb10dup(0)
countdw?
ErrMsgdb0dh,0ah,'Inputwrong!
pleaseinputagain!
','$'
str1db0dh,0ah,'pleaseinputyearmonthday:
',0dh,0ah,'$'
str2db0dh,0ah,'WhetherornottocontinueinquiriesYes/No',0dh,0ah,'$'
weekstr0db'TodayisSunday','$'
weekstr1db'TodayisMonday','$'
weekstr2db'TodayisTuesday','$'
weekstr3db'TodayisWednesday','$'
weekstr4db'TodayisThursday','$'
weekstr5db'TodayisFriday','$'
weekstr6db'TodayisSaturday','$'
adw?
bdw?
ccdw?
ddw?
wdb?
dataends;定义了变量和信息
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,data
movds,ax
leadx,str1;提醒你输入年月日
movah,9h;显示字符串
int21h
callGetYearMonthDay;调用子程序输入正确的年月日
calldisplay;调用子程序通过计算得出星期
sel:
leadx,str2;提醒你选择退出程序还是继续
movah,9h
int21h
movah,1;输入你的选择(键盘输入并回显)
int21h
cmpal,'Y'
jestart
cmpal,'y';输入y或Y继续程序
jestart
cmpal,'N'
jeexit
cmpal,'n';输入n或N退出程序
jeexit
jmpsel
exit:
movah,4ch
int21h;退出
;主程序
GetYearMonthDayprocnear;子程序输入正确的年月日
pushax
pushcx
pushsi
pushdi;压栈
inputagain:
movYear,0
movMonth,0
movDay,0
movsi,0;把年月日重新归零
repeatY:
movah,1;输入年
int21h
cmpal,0dh;换行
jeEndY;回车结束年的输入
cmpal,20h;判断是否是是空格键SP
jeEndY;空格结束年的输入
cmpal,1bh;判断是否是退出ESC
jeExitDos0;退出键则退出程序
cmpal,30h;和0比较
jbErr;小于0转到错误提示
cmpal,39h;和9比较
jaErr;大于9转到错误提示
subal,30h;把读入的数据转化为二进制保存到temp[si]中
movtemp[si],al
incsi;si加1
jmprepeatY
Err:
;出错调用
leadx,ErrMsg;提示错误
movah,9h
int21h
movah,2;显示输出
movdl,0dh
int21h;换行
movdl,0ah
int21h;回车
jmpinputagain;跳回到inputagain重新输入年月日
EndY:
movbx,10;把10存入bx
movdi,si;把si的值传给di
movsi,0;再把si清零
NextYBit:
movah,0
moval,temp[si];再把存在temp[si]中的数据存入al
movcount,di;把di中的转到count
subcount,si;count=count-si
deccount;count-1
movcx,count;把自减后的count存入cx
jcxzskipY;cx为0转移
lopmul:
mulbx;*10,主要实现把年按千位,百位,十位,各位存放
looplopmul;cx-1循环
skipY:
addYear,ax;把ax中存入的年的值赋给year
incsi;si自加1
cmpsi,di;比较si和di
jneNextYBit;不相等转移
;主要实现把年按千位,百位,十位,各位存放
pushdx
movah,2
movdl,0dh;换行
int21h
movdl,0ah;回车
int21h
popdx
jmpskiplap;跳到月的输入
ExitDos0:
jmpExitDos;退出
skiplap:
movsi,0;si清零
repeatM:
movah,1;输入月数
int21h
cmpal,0dh
jeEndMon;换行
cmpal,20h
jeEndMon;空格结束输入
cmpal,1bh
jeExitDos1;ESC退出程序
cmpal,30h
jbErr1;小于0报错
cmpal,39h
jaErr1;大于9报错
subal,30h;转为二进制存贮
movtemp[si],al;把读入的数据转化为二进制保存到temp[si]中
incsi;si加1
jmprepeat;重新输入下一个字符
Err1:
jmpErr
ExitDos1:
jmpExitDos
EndMon:
movdi,si;把si的值传给di
movsi,0;再把si清零
movbl,10;把10存入bl
NextMBit:
moval,temp[si]
movcount,di
subcount,si
deccount
movcx,count
jcxzskipM
lpmul:
mulbl
looplpmul
skipM:
addMonth,al
incsi
cmpsi,di
jneNextMBit
cmpMonth,12;大于12报错
jaErr1;把月按十位,各位存贮
pushdx
movah,2
movdl,0dh;回车
int21h
movdl,0ah;换行
int21h
popdx
jmpskiplap1
skiplap1:
movsi,0
repeatD:
movah,1
int21h
cmpal,0dh
jeEndDay;换行
cmpal,20h
jeEndDay;空格结束输入
cmpal,1bh
jeExitDos;ESC退出程序
cmpal,30h
jbErr2;小于0报错
cmpal,39h;大于9报错
jaErr2
subal,30h;转为二进制存贮
movtemp[si],al;把读入的数据转化为二进制保存到temp[si]中
incsi;si加1
jmprepeatD;重新输入下一个字符
Err2:
jmpErr1
EndDay:
movdi,si;把si的值传给di
movsi,0;再把si清零
movbl,10;把10存入bl
NextDBit:
moval,temp[si]
movcount,di
subcount,si
deccount
movcx,count
jcxzskipD
lpmul1:
mulbl
looplpmul1
skipD:
addDay,al
incsi
cmpsi,di
jneNextDBit
callGetrightday;调用子程序确定每个月的最大天数
moval,[si];把寄存器si中的值存入al
cmpDay,al;用输入的day和al比较
jaErr2;若day大于al则报错
;把日按十位,各位存贮
pushdx
movah,2
movdl,0dh
int21h
movdl,0ah
int21h
popdx
popdi
popsi
popcx
popax
ret
ExitDos:
movah,4ch
int21h
GetYearMonthDayendp
;************闰年**********
Getrightdayprocnear;此子程序用来判断年份是否为闰年
pushbx;保存寄存器状态
pushcx
pushdx
movsi,offsetw
movax,Year
movcx,ax;把转换后的年份的数值存入cx
movdx,0;计算年份是否为4的整数倍
movbx,4
divbx
movb,dx;把此刻的余数赋给b,便于后面天数计算
cmpdx,0
jnzlab1;不能被4整除,不为闰年
movax,cx;接着判断年份是否为100的倍数
movbx,100
divbx
movcc,dx;把此刻的余数赋给cc,便于后面天数计算
cmpdx,0
jnzlab2;不为100的倍数,则为闰年
movax,cx;再判断是否为400的倍数
movbx,400
divbx
movd,dx;把此刻的余数赋给d,便于后面天数计算
cmpdx,0
jzlab2;为400的倍数,则为闰年
lab1:
;确定平年各月的天数
cmpMonth,1
jel1
cmpMonth,3
jel1
cmpMonth,5
jel1
cmpMonth,7
jel1
cmpMonth,8
jel1
cmpMonth,10
jel1
cmpMonth,12
jel1
cmpMonth,4
jel2
cmpMonth,6
jel2
cmpMonth,9
jel2
cmpMonth,11
jel2
moval,28
mov[si],al;平年2月为28天
jmplab3;判断结束
l1:
moval,31
mov[si],al
jmplab3
l2:
moval,30
mov[si],al
jmplab3
lab2:
;确定闰年各月的天数
cmpMonth,1
jel1
cmpMonth,3
jel1
cmpMonth,5
jel1
cmpMonth,7
jel1
cmpMonth,8
jel1
cmpMonth,10
jel1
cmpMonth,12
jel1
cmpMonth,4
jel2
cmpMonth,6
jel2
cmpMonth,9
jel2
cmpMonth,11
jel2
moval,29
mov[si],al;闰年的2月为29天
jmplab3
lab3:
popdx;恢复寄存器状态
popcx
popbx
ret
Getrightdayendp
displayprocnear;子程序利用年月日计算星期,利用蔡勒公式求W
cmpmonth,2
jglab11;月大于2直接计算
addmonth,12
subyear,1;小于等于2则月加12,年再减1再计算
lab11:
xorax,ax
xorbx,bx
xorcx,cx
xordx,dx;先把各种要用的寄存器清零
decyear
movax,year
movcx,ax;year自减1再存入cx
movdx,0
movbl,4
divbx
addcx,ax;把[Y-1]/4的商加入cx
xorax,ax
xorbx,bx
movax,year
movdx,0
movbl,100
divbx
subcx,ax;用cx中的值减去[Y-1]/100的商
xorax,ax
xorbx,bx
xordx,dx
movax,year
movbx,400
divbx
addcx,ax;把[Y-1]/400的商加入cx
xorax,ax
movdx,0
movbx,0
incmonth
moval,month
movbl,13
mulbl;月加1后乘以13
xorbx,bx
movbl,5
divbx
addcx,ax;把上面得到的月除以5取整加入cx
xorax,ax
xordx,dx
cmpmonth,13
janoaddd;当此时month大于13时,即月为1、2月时不用考虑加1
cmpb,0
jnenoaddd
cmpcc,0
jneaddd
cmpd,0
jeaddd;当是闰年而且月为3到12时,day要加1
addd:
addday,1;day+1
jmpdod
noaddd:
jmpdod;day不用加1
dod:
moval,day
addcx,ax;把day送个cx
xorax,ax
xorbx,bx
xordx,dx;把要用到的寄存器先清零
movax,cx
movbl,7
divbx
mova,dx;把由公式的来的和除以7,取余
cmpa,0;由余数确定星期
jes0
cmpa,1
jes1
cmpa,2
jes2
cmpa,3
jes3
cmpa,4
jes4
cmpa,5
jes5
leadx,weekstr6
movah,9h
int21h
jmpexit1
s0:
leadx,weekstr0;显示各个星期
movah,9h
int21h
jmpexit1
s1:
leadx,weekstr1
movah,9h
int21h
jmpexit1
s2:
leadx,weekstr2
movah,9h
int21h
jmpexit1
s3:
leadx,weekstr3
movah,9h
int21h
jmpexit1
s4:
leadx,weekstr4
movah,9h
int21h
jmpexit1
s5:
leadx,weekstr5
movah,9h
int21h
exit1:
ret
displayendp
codeends
endstart
五、设计过程中遇到的问题及解决方法
首先是环境搭建的问题,由于系统是64位,环境搭建比较麻烦,需要装虚拟机,所以直接把系统换成了32位,以便简单操作。
其次最主要的问题是没有核心算法,开始研究了很多种算法,比如以某一天为起点,分别计算与这一天相差的天数,但是由于这样计算,如果时间相差太远,会导致数字巨大,为此查阅了相关资料,找到了专用于求星期几的蔡勒公式,从而解决了核心算法的问题。
六、设计心得
在解老师的指导下,这周的课程设计很快就结束了,通过这次课程设计,首先我发现了自己的许多不足之处,让我明白了,书本的知识在现实中运用起来并不是那么容易,现实中遇见的问题往往也不是像书上那么简单,并且在实习中也发现了许多未知的问题,让我无从下手。
幸好在老师的指导下,让我找到了解决问题的方法,从而顺利完成此次程序设计,因此通过这次课程设计,让我明白了实践的重要性,书上说的理论,并不一定百分百正确,唯有实践才能出真理!
今天,我会更努力的学习课本知识,同时也加强一些自己的动手能力,在有条件的前提下,多对书上的课题进行实践练习,让自己多做一些实践训练,为将来走入社会做准备。
最后在此特别谢谢解老师这一学期对我们的辛勤教导!