匯編:實現日歷星期數查詢工具

編制一個簡單日歷查詢工具,輸入年、月、日,能夠判斷當日的星期數,并進行輸出,數據的輸入和結果的輸出要有必要的提示,且提示獨占一行。

查閱資料

? 經過查閱資料,發現有兩個相關的算法可以解決這個問題:

  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上啦:傳送門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383649.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383649.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個通用純C隊列的實現

https://blog.csdn.net/kxcfzyk/article/details/31728179 隊列并不是很復雜的數據結構,但是非常實用,這里實現一個隊列是因為在我的另一篇博客非常精簡的Linux線程池實現中要用到。 隊列API定義如下: //queue.h #ifndef QUEUE_H_INCLUDED…

Dijkstra算法介紹+正確性證明+性能分析

算法介紹 源點s,數組d[u]表示s到u的最短距離,空集S,點集Q初始化:將源點s從點集中去掉,加入S,d[s]0,?v∈Q,d[v]w[s][v]\forall v\in Q ,d[v]w[s][v]?v∈Q,d[v]w[s][v]將Q中d[v]最小的點去掉加入S,并對u∈…

Linux C 實現一個簡單的線程池

https://www.cnblogs.com/GyForever1004/p/9185240.html 線程池的定義 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級…

斐波那契數列求解+尾遞歸

1.普通遞歸 這里觀察f[4]的遞歸樹代替f[10]的遞歸樹(后者比較大,畫不下)。 使用遞歸求解的時候復雜度為T(n)T(n?1)T(n?2)T(n)T(n-1)T(n-2)T(n)T(n?1)T(n?2),觀察遞歸樹,發現降速最快的是最右邊每次減2&#xff0c…

循環服務器,并發服務器模型以及I/O多路轉接模型

https://blog.csdn.net/xinianbuxiu/article/details/53455784 一、基于TCP/IP協議的基本循環服務器 tcp_server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #incl…

c++繼承父類的子類,如何調用父類的同名函數?

https://blog.csdn.net/qq_26399665/article/details/52080215 子類調用父類的同名函數&#xff1a; 子類和父類返回值參數相同&#xff0c;函數名相同&#xff0c;有virtual關鍵字&#xff0c;則由對象的類型決定調用哪個函數。 子類和父類只要函數名相同&#xff0c;沒有vi…

LCS最長公共子串

問題介紹 LCS問題(longest common subsequence problem)指的是求解兩個字符串最長公共子序列問題。這里的子序列是可以不連續的。LCS問題廣泛地出現在計算生物學中&#xff08;DNA序列、系統生成樹等等&#xff09;。這里介紹如何解決LCS問題&#xff0c;以及算法的正確性證明…

將字符串中的空格用%20替換

如果不需要原地操作&#xff0c;則一遍遍歷&#xff0c;將非空串復制&#xff0c;遇到空格加上%20&#xff0c;如果需要原地操作&#xff0c;首先進行遍歷出空格的個數x,然后擴容2x,從后往前遍歷實現。如果非空格字符串比空格字符串多的多的時候而且字符串非常長的時候使用原地…

12步輕松搞定python裝飾器

http://python.jobbole.com/81683/ 呵呵&#xff01;作為一名教python的老師&#xff0c;我發現學生們基本上一開始很難搞定python的裝飾器&#xff0c;也許因為裝飾器確實很難懂。搞定裝飾器需要你了解一些函數式編程的概念&#xff0c;當然還有理解在python中定義和調用函數…

操作系統【六】虛擬內存

傳統存儲管理方式的不足 一次性&#xff1a;作業必須一次性全部裝入內存后才能開始運行。這會造成&#xff1a;當作也很大時不能全部裝入內存&#xff1b;當大量作業要求運行時&#xff0c;由于內存無法容納所有作業&#xff0c;因此只有少量作業能夠運行&#xff0c;導致多道…

python裝飾器詳解

https://blog.csdn.net/xiangxianghehe/article/details/77170585 你會Python嘛&#xff1f; 我會&#xff01; 那你給我講下Python裝飾器吧&#xff01; Python裝飾器啊&#xff1f;我沒用過哎 以上是我一個哥們面試時候發生的真實對白。 ———————————————-分…

SQL Server【一】簡介和基本概念和命令

數據結構和數據庫的區別 數據庫是應用軟件級別研究數據的存儲和操作&#xff08;主要針對磁盤上的數據&#xff09; 數據結構是在系統軟件級別研究數據的存儲和操作&#xff08;主要是針對內存中的數據&#xff09; 對硬盤數操作是數據庫的強項&#xff0c;是數據庫研究的核心…

SQL Server【二】單表查詢

查詢 計算列 select * from emp; -- *通配符&#xff0c;表示所有的字段 -- from emp 從emp表查詢select empno, ename from emp; select ename as "員工姓名", sal*12 as "年薪" from emp;-- as可以省略&#xff0c;用于設置字段名 -- 注意用雙引號將字…

SQL Server【三】連接查詢

將兩個表或者兩個以上的表以一定的連接條件連接起來&#xff0c;從中檢索出滿足條件的數據。 內連接 使用inner join&#xff0c;inner可以省略 -- 查詢員工的姓名和部門名稱 select "E".ename as "員工姓名", "D".dname as "部門名稱&q…

Linux下網絡socket編程——實現服務器(select)與多個客戶端通信

一、關于socket通信 服務器端工作流程&#xff1a; 調用 socket() 函數創建套接字 用 bind() 函數將創建的套接字與服務端IP地址綁定調用listen()函數監聽socket() 函數創建的套接字&#xff0c;等待客戶端連接 當客戶端請求到來之后調用 accept()函數接受連接請求&#xff0c…

SQL Server【四】

identity 主鍵自動增長&#xff0c;用戶不需要為identity修飾的主鍵賦值 create table student (std_id int primary key identity(10,5),--(10,5)可以省略&#xff0c;默認為(1,1)std_name nvarchar(200) not null ) select * from student insert into student values (張三…

TCP服務器/客戶端實例(C/C )

1.1、Linux下的TCP服務器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h>void error_handling(char *mess…

pip代理解決pip下載失敗問題

在用pip下載各種庫的時候發現速度實在是太慢了&#xff0c;還會有各種奇奇怪怪的問題&#xff0c;動不動就玄學失敗。 在網上找來找去找到知乎上一位大佬的回答&#xff1a;傳送門&#xff0c;用了豆瓣的代理。哇咔咔&#xff0c;媽媽再也不用擔心我下載失敗了。 代理&#x…

實現Linux select IO復用C/S服務器代碼

服務器端#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include <sys/select.h>#define MAXBUF 256 #define MAXLISTEN…

Bellman-Ford算法和SPFA算法

Belloman-Ford算法 算法介紹 Dijkstra可以解決單源無負邊最短路徑問題。但是當遇到含有負邊的單源最短路徑問題就需要使用Bellman-Ford算法來解決。Bellman-Ford算法還可以檢測出負環。 算法步驟 源點s,數組d[u]d[u]d[u]表示s到u的最短距離初始化&#xff1a;d[s]0d[s]0d[s…