编制一个简单日历查询工具,输入年、月、日,能够判断当日的星期数,并进行输出,数据的输入和结果的输出要有必要的提示,且提示独占一行。

查阅资料

​ 经过查阅资料,发现有两个相关的算法可以解决这个问题:

  1. 蔡勒公式
    W=[C/4]−2C+Y+[Y/4]+[13∗(M+1)/5]+D−1W=[C/4]-2C+Y+[Y/4]+[13*(M+1)/5]+D-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:日
    • [ ]代表取整,即只要整数部分。
  2. 基姆拉尔森计算公式
    Week=(d+2∗m+3∗(m+1)/5+y+y/4−y/100+y/400+1)mod7Week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7 Week=(d+2∗m+3∗(m+1)/5+y+y/4−y/100+y/400+1)mod7
    公式中的符号含义如下:

    • y : 年份(四位数)
    • m: 月份(m大于等于3,小于等于14,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算
    • d : 日期
    • 当Week==0Week==0Week==0的时候为周日

设计构思

基姆拉尔森计算公式的输入更加友好,因此我决定使用基姆拉尔森计算公式解决问题。

​ 公式主要涉及加减乘除四则运算,输入主要是年月日三个数字。输出为星期数。

​ 因此主要的工作有:

  • 提示用户输入年月日,并进行错误检查(检查是否是数字,位数是否错误)
  • 检查月份是否在正确的范围内(0~12)
  • 检查日期是否在正确的范围内
    • 是否小于1
    • 是否大于该月的最大日期
    • 是否是闰月,如果是闰月需要特别对待
  • 使用基姆拉尔森计算公式计算星期数
  • 输出结果,并询问是否再次输入

流程图


实现代码

ASSUME cs:CODE, ds:DATA, ss:STACK DATA SEGMENTS_Year     db  5,0,5 dup(0)S_Month db  3,0,3 dup(0)S_Day   db  3,0,3 dup(0)YearIn  db  'please input year(eg:2020):$'MonthIn db  'please    input month(eg:05):$'DayIn db  'please input day(eg:01):$'WrongInfo db 'your input is illegal,please input again!$'ReaptInfo db 'Would you like to check again?(Y/n)  $'year     dw  0month  db  0day    db  0Max_Day db 0,31,28,31,30,31,30,31,31,30,31,30,31tmp        dw  0week1  db  'Monday$'week2    db  'Tuesday$'week3   db  'Wednesday$'week4 db  'Thursday$'week5  db  'Friday$'week6    db  'Saturday$'week7  db  'Sunday$'hint db  ' is $'DATA ENDSSTACK SEGMENTdb 256   dup(0)
STACK ENDSCODE SEGMENTNEXTLINE PROC NEAR    ;输出换行mov ah, 02Hmov dl, 0DHint 21Hmov dl, 0AHint 21Hret
NEXTLINE ENDPMAIN PROC
START:mov ax,DATAmov ds,ax  ;初始化
INPUTYEAR:call NEXTLINElea dx, YearIn   ;提示输入yearmov ah, 09Hint 21Hlea dx, S_Year   ;读入yearmov ah, 0AHint 21Hcall NEXTLINE  ;换行;检查Year是否合法mov cl, S_Year+1 ;将实际长度保存到cx中mov ch, 0cmp cx, 4      ;检查长度,同时计算year的值jnz WRONGYEARmov year, 0mov si, 2
CHECKYEAR:;判断是否是数字mov dl, S_Year[si]cmp dl, '0'jl WRONGYEARcmp dl, '9'jg    WRONGYEAR;是数字,计算yearmov ax, yearmov bx, 10mul bxmov dl, S_Year[si]sub dl, '0'mov dh, 0add ax, dxmov year, axinc siloop CHECKYEAR;year计算完毕jp    INPUTMONTHWRONGYEAR:lea dx, WrongInfo   ;输出错误信息mov ah, 09Hint 21Hcall NEXTLINE      ;换行jp   INPUTYEAR       ;重新输入INPUTMONTH:lea dx, MonthIn     ;提示输入monthmov ah, 09Hint 21Hlea dx, S_Month     ;读入monthmov ah, 0AHint 21Hcall NEXTLINE     ;换行;检查Month是否合法mov cl, S_Month+1   ;将实际长度保存到cx中mov ch, 0cmp cx, 2          ;检查长度,同时计算month的值jnz WRONGMONTHmov month, 0mov si, 2
CHECKMONTH:;判断是否是数字mov dl, S_Month[si]cmp dl, '0'jl   WRONGMONTHcmp dl, '9'jg   WRONGMONTH;是数字,计算monthmov al, monthmov bl, 10mul blsub dl, '0'add al, dlmov month, alinc siloop CHECKMONTH;month计算完毕;判断month是否在合法范围内mov dl, monthcmp dl, 1jl   WRONGMONTHcmp dl, 12jg  WRONGMONTHjmp INPUTDAYWRONGMONTH:lea dx, WrongInfo  ;输出错误信息mov ah, 09Hint 21Hcall NEXTLINE      ;换行jmp  INPUTMONTH      ;重新输入INPUTDAY:lea dx, DayIn ;提示输入daymov ah, 09Hint 21Hlea dx, S_Day     ;读入daymov ah, 0AHint 21Hcall NEXTLINE   ;换行;检查day是否合法mov cl, S_Day+1   ;将实际长度保存到cx中mov ch, 0cmp cx, 2      ;检查长度,同时计算day的值jnz WRONGDAY_TMPmov si, 2mov day, 0
CHECKDAY:;判断是否是数字mov dl, S_Day[si]cmp dl, '0'jl   WRONGDAY_TMPcmp dl, '9'jg WRONGDAY_TMP;是数字,计算daymov al, daymov bl, 10mul blsub dl, '0'add al, dlmov day, alinc siloop CHECKDAY;day计算完毕;检查day是否在合法范围内mov dl, daycmp dl, 1jl   WRONGDAYmov cl, monthmov ch, 0mov si, cxcmp dl, Max_Day[si] ;检查有没有该月份最大的一天jg    CHECKLEAP       ;检查是不是闰月jmp INPUTEND        ;输入结束WRONGDAY_TMP:jmp WRONGDAYCHECKLEAP:mov dh, monthcmp dh, 2jne WRONGDAY      ;如果不是2月就肯定不对;判断是不是闰年if(year%4==0 && year%100!=0 || year%400==0) 是闰年mov ax, yearmov dx, 0mov bx, 400div bxcmp dx, 0je   ISLEAP          ;可以被400整除说明是闰月mov ax, yearmov dx, 0mov bx, 4div bxcmp dx, 0jne ISNOTLEAP        ;不能被4整除说明不是闰月mov ax, yearmov dx, 0mov bx, 100div bxcmp dx, 0je  ISNOTLEAP       ;能被100整除说明不是闰月
ISLEAP:mov dl, daycmp dl, 29            jg  WRONGDAY        ;比29还大jmp   INPUTEND        ;输入结束ISNOTLEAP:
WRONGDAY:lea dx, WrongInfo  ;输出错误信息mov ah, 09Hint 21Hcall NEXTLINE      ;换行jmp  INPUTDAY        ;重新输入INPUTEND:              ;输入合法,开始使用基姆拉尔森公式计算答案mov dl, monthcmp dl, 1je    ADDMONTHcmp dl, 2je     ADDMONTHjmp CALCULATEADDMONTH:mov al, monthadd al, 12mov month, almov ax, yearsub ax, 1mov year, axCALCULATE:mov bl, daymov bh, 0           ;bx := dayadd bl, monthadd bl, month       ;bx += 2*monthmov al, monthadd al, 1mov ah, aladd al, ah add al, ah           ;al := 3*(month+1)mov ah, 0mov cl, 5div clmov ah, 0           ;ax := al/5add bx, ax          ;bx += axadd bx, year         ;bx += yearmov ax, yearmov dx, 0mov cx, 4div cxadd bx, ax         ;bx += year/4mov ax, yearmov dx, 0mov cx, 100div cxsub bx, ax         ;bx -= year/100mov ax, yearmov dx, 0mov cx, 400div cxadd bx, ax            ;bx += year/400add bx, 1          ;bx += 1mov ax, bxmov dx, 0mov cx, 7div cx                ;bx %= 7mov bx, dx;基姆拉尔森公式计算完毕OUTPUT:call NEXTLINEmov al, S_Year+1add al, 2mov ah, 0mov si, ax    mov S_Year[si], '$'   ;加上字符串终结符$lea dx, S_Year+2 ;输出年份mov ah, 09Hint 21Hmov dl, '\'mov ah, 02Hint 21Hmov al, S_Month+1add al, 2mov ah, 0mov si, ax    mov S_Month[si], '$'lea dx, S_Month+2mov ah, 09Hint 21Hmov dl, '\'mov ah, 02Hint 21Hmov al, S_Day+1add al, 2mov ah, 0mov si, ax   mov S_Day[si], '$'lea dx, S_Day+2mov ah, 09Hint 21Hlea   dx, hintmov ah, 09Hint 21Hmov al, blcmp al, 0jnz D1lea dx, week7mov ah, 09Hint 21Hjmp   D7INPUTYEAR_TMP1:call NEXTLINEjmp INPUTYEARD1:  cmp al, 1jnz D2lea dx, week1mov ah, 09Hint 21Hjmp    D7
D2:cmp al, 2jnz D3lea dx, week2mov ah, 09Hint 21Hjmp    D7
D3:cmp al, 3jnz D4lea dx, week3mov ah, 09Hint 21Hjmp    D7
D4:cmp al, 4jnz D5lea dx, week4mov ah, 09Hint 21Hjmp    D7
D5:cmp al, 5jnz D6lea dx, week5mov ah, 09Hint 21Hjmp    D7
D6:cmp al, 6jnz D7lea dx, week6mov ah, 09Hint 21H
D7:call NEXTLINEcall NEXTLINElea dx, ReaptInfo  ;输出重复查询信息mov ah, 09Hint 21Hmov ah, 01H          ;输入字符int 21Hcmp al, 'Y'jz INPUTYEAR_TMP1  ;跳转到中继点1cmp al, 'y'jz INPUTYEAR_TMP1  ;跳转到中继点1mov ax, 4C00H       ;程序结束int 21H
MAIN ENDPCODE ENDS
END START

运行结果

我将自己运行结果的视频上传在CSDN上啦:传送门

汇编:实现日历星期数查询工具相关推荐

  1. 日历-星期数计算方式(可计算2000年后的星期数)

    #define UCLIP(a,b,c) ((a<b)?(b):((a>c)?c:a)) uint8 week_day[7]={6,7,1,2,3,4,5};//这个定义是依据2000年1 ...

  2. 微信小程序+OLAMI自然语言API接口制作智能查询工具--快递、聊天、日历等

    微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...

  3. 万年历农历法定节假日数据查询工具

    1.数据来源于百度搜索置顶日历: 2.代码: http调用及数据处理均采用了hutool, 也可以用别的工具. hutool 依赖如下: <dependency><groupId&g ...

  4. 个人小程序智能对话查询工具完整代码分享--快递、身份证、词典、诗词等

    这篇文章的原文地址:http://blog.csdn.net/huangmeimao/article/details/76418753 转载请标明出处,谢谢. 我们经常在电影中看到机器和人对答如流,随 ...

  5. 网络推广人员需要掌握的九大查询工具

    网络推广人员需要掌握的九大查询工具 随着网络推广意识的不断加强,越来越多的人开始加入到网络推广的大军当中.要想在激烈的竞争中取得胜利,我们网络推广人员一定要做到"知己知 彼".知己 ...

  6. 10.18 nslookup:域名查询工具

    功能说明 nslookup命令是常用的域名解析查询工具. 如果系统没有nslookup命令,则需要安装下面的软件包: yum -y install bind-utils 语法格式 nslookup [ ...

  7. java记事本获取当前时间_calendar 用Java写的日历,有查询时间日期,还有记事本以及到点提醒功能。 Develop 238万源代码下载- www.pudn.com...

    文件名称: calendar下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 4465 KB 上传时间: 2013-06-30 下载次数: 3 提 供 者: 陈园园 ...

  8. MySQL记录变化工具_MySQL 表记录数对比工具

    工具介绍: 以下介绍一个实时对比两个MySQL实例的中表记录数的工具 checkcount.py . 工具大多用于迁移后或者主从数据快速比较 , 快速验证两个mysql数据库实例每个表是否具有相同记录 ...

  9. Mac软件序列号查询工具:KCNScrew for mac

    KCNScrew Pack for mac (Mac软件序列号查询工具)是MAC 平台上一款非常好用且功能强大的Mac软件序列号工具,kcnscrew pack mac版内置强大的序列号数据库,包含数 ...

最新文章

  1. matlab中用于小数取整的函数的用法
  2. cssbefore图片大小_两小时学会CSS-before after 伪元素
  3. TC260-001《汽车采集数据处理安全指南》
  4. Facebook 开源高质量实例分割数据集 LVIS
  5. JAVA取数两个数组交集,考虑重复和不重复元素
  6. C语言高级编程:结构体中定义数组的“妙用”
  7. 统计字符串中某个字出现的次数
  8. php查到的内容追加到html,javascript - 请问php中如何将查询出来的结果数组转化成自己想要的格式,并在前台利用js输出到html中...
  9. 一键重装深度linux系统下载,一键安装操作系统下载win7
  10. ZZNU-OJ-2118 -(台球桌面碰来碰去,求总距离)——模拟到爆炸【超时】的不能AC的代码...
  11. ResponseEntity和ResponseBody比较
  12. 负数二进制转换十进制
  13. MySQL死锁问题如何分析锁表后查看死锁和去除死锁快速解决方法
  14. 大型、超大型数据中心园区设计如何审查与优化
  15. 【软考软件评测师】2013综合知识历年真题
  16. 【system verilog】继续探究IC前端仿真中的“时间”,timescale,timeunit/timeprecision设置
  17. 大数据面试杀器__大数据股市指数项目思维导图
  18. 基于元胞自动机的城市规划
  19. 理工科er怎么发一作SCI
  20. MSC阿里比赛第三题详解

热门文章

  1. Http(s)与后台交互方式
  2. 页面传值的方法 和JSON与字符串和对象之间的转换
  3. 充实的日子里忙忙碌碌
  4. 风雨20年:我所积累的20条编程经验 (转)
  5. android监控指纹信息变化,android监听指纹变化(解决反射思路在android10不生效的问题)...
  6. mybatis-plus分页查询_SpringBoot + MyBatisPlus 快速入门
  7. linux php自动执行_linux下实现定时执行php脚本
  8. Drawwhile计算机软件,计算机程序设计、小女纸又怒编一程序、求鉴定、
  9. html5布局总结,HTML5网页布局的总结
  10. 运行 java classnotfound_JAR运行出现ClassNotFoundException异常的解决办法