星期判断程序.docx

上传人:b****1 文档编号:13492753 上传时间:2023-06-14 格式:DOCX 页数:20 大小:44.11KB
下载 相关 举报
星期判断程序.docx_第1页
第1页 / 共20页
星期判断程序.docx_第2页
第2页 / 共20页
星期判断程序.docx_第3页
第3页 / 共20页
星期判断程序.docx_第4页
第4页 / 共20页
星期判断程序.docx_第5页
第5页 / 共20页
星期判断程序.docx_第6页
第6页 / 共20页
星期判断程序.docx_第7页
第7页 / 共20页
星期判断程序.docx_第8页
第8页 / 共20页
星期判断程序.docx_第9页
第9页 / 共20页
星期判断程序.docx_第10页
第10页 / 共20页
星期判断程序.docx_第11页
第11页 / 共20页
星期判断程序.docx_第12页
第12页 / 共20页
星期判断程序.docx_第13页
第13页 / 共20页
星期判断程序.docx_第14页
第14页 / 共20页
星期判断程序.docx_第15页
第15页 / 共20页
星期判断程序.docx_第16页
第16页 / 共20页
星期判断程序.docx_第17页
第17页 / 共20页
星期判断程序.docx_第18页
第18页 / 共20页
星期判断程序.docx_第19页
第19页 / 共20页
星期判断程序.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

星期判断程序.docx

《星期判断程序.docx》由会员分享,可在线阅读,更多相关《星期判断程序.docx(20页珍藏版)》请在冰点文库上搜索。

星期判断程序.docx

星期判断程序

目录

概述…………………………………………………………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位,以便简单操作。

其次最主要的问题是没有核心算法,开始研究了很多种算法,比如以某一天为起点,分别计算与这一天相差的天数,但是由于这样计算,如果时间相差太远,会导致数字巨大,为此查阅了相关资料,找到了专用于求星期几的蔡勒公式,从而解决了核心算法的问题。

六、设计心得

在解老师的指导下,这周的课程设计很快就结束了,通过这次课程设计,首先我发现了自己的许多不足之处,让我明白了,书本的知识在现实中运用起来并不是那么容易,现实中遇见的问题往往也不是像书上那么简单,并且在实习中也发现了许多未知的问题,让我无从下手。

幸好在老师的指导下,让我找到了解决问题的方法,从而顺利完成此次程序设计,因此通过这次课程设计,让我明白了实践的重要性,书上说的理论,并不一定百分百正确,唯有实践才能出真理!

今天,我会更努力的学习课本知识,同时也加强一些自己的动手能力,在有条件的前提下,多对书上的课题进行实践练习,让自己多做一些实践训练,为将来走入社会做准备。

最后在此特别谢谢解老师这一学期对我们的辛勤教导!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2