1闰年判断流程图
- 格式:ppt
- 大小:462.00 KB
- 文档页数:1
第3期-判断闰年1 问题描述闰年(Leap Year)是为了弥补因⼈为历法规定造成的年度天数与地球实际公转周期的时间差⽽设⽴的,补上时间差的年份为闰年,闰年共有366天请输⼊⼀个年份,判断输出是否为闰年2 解题思路闰年是历法中的名词,分为普通闰年和世纪闰年。
1582年以来设置闰年的规则:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
也就是说普通闰年:能被4整除,不能被100整除世纪闰年:能被400整除在Python中,判断⼀个数能否被另⼀个数整除,可⽤取模(%)的算法;判断年份是否为闰年可⽤if条件语句3 解题⽅法⽅法⼀year = int(input("输⼊⼀个年份: "))if year % 4 == 0:if year % 100 == 0:if year % 400 == 0:print(f"{year} 年是世纪闰年") # 整百年能被400整除的是闰年else:print(f"{year} 年不是闰年")else:print(f"{year} 年是普通闰年") # ⾮整百年能被4整除的为闰年else:print(f"{year} 年不是闰年")View Code第1⾏:⽤input函数请⽤户输⼊⼀个年份,int函数将input()的字符串转换成整型,并赋值给变量year第3⾏:判断该年份能否被4整除,不能被4整除,转到第11⾏,输出该年不是闰年第4⾏:若能被4整除,则继续判断该年份能否被100整除,不能被100整除,转到第9⾏,输出该年是普通闰年第5-8⾏:若能被100整除,继续判断该年能否被400整除,若能被400整除,则为世纪闰年,不能被400整除,则不是闰年在这⾥⽤到了f-string的⽅法格式化字符串,f是“格式化(format)”的意思,如f"Hello {somevar}",这种f、引号和{}的组合相当于告诉Python:“嘿!这是⼀个格式化字符串,把这些变量放到那⼏个位置”。
基于汇编语言的闰年判断程序设计第一章设计方案一、设计内容根据提示信息输入任意年份,编写判断闰年的程序,如果是闰年,则在屏幕上显示“Y”,否则显示“N”。
二、设计分析利用DOS 21H中断类型的10号键盘功能调用,将键盘接受到的年份数值的字符串按字节存入缓冲区。
将字符串中的每个字符转换为对应的十进制数值(利用0-9这10个数的ASCⅡ码值比其本身大30H的关系),利用判断某年是否为闰年的表达式,输入该年是否为闰年的信息。
三、算法分析闰年计算是一个非常经典的问题,在学习各种语言时都会遇到这个问题,用来判断某年是否为闰年。
具体算法为如果该年份的数值正整数若能被100整除,又能被400整除,或者不能被100整除,却能被4整除,则该数值代表的年份为闰年。
四、程序流程图本框图列出了此次课程设计的总流程,显示信息,输入数据,判断格式,判断闰年和结束程序。
客观显示了设计的顺序结构,循环结构及分支结构。
图2-1 程序流程图第二章程序设计一、程序分析主程序:显示提示输入年份以及输入的字符内容,和最后输出的判断。
子程序:1.判断输入:该模块是对输入的年份的格式的判断,若是错误则显示错误Error,正确则进行下面的操作。
2.字符串转换格式:将数字字符串转换成数字,以便进行下面的程序操作。
3.判断闰年:判断输入的年份是否为闰年,若是则输出“This is a leapyear!”,若不是则输出“This is not a leap year!”,然后退出。
二、汇编程序data segmentinbuff db5,?,5dup(?)prompt db 'Please input the year:','$'errmsg db 'Input illegal!','$'yes db ' is a leap year','$'no db ' is not a leap year','$'mess db 'Continue?(y/n):','$'newline db13,10,'$' ;回车换行data endscode segmentmain proc farassume cs:code,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,axlop0:call inputcall judgelea dx,messmov ah,09hint21h;是否继续输入年份的判断mov ah,01hint21hcmp al,'n'je exitcontinue:lea dx,newlinemov ah,09hint21hjmp lop0exit:retmain endp;输入一个具体的年份,并转换成10进制;返回:;(ax)=输入的年份input proc nearpush bxpush cxpush dxs1:lea dx,promptmov ah,09hint21h;提示输出lea dx,inbuffmov ah,0ahint21h;键盘输入mov dl,byte ptr inbuff[1] ;把有效地址为inbuff的字节送给dl cmp dl,4;输入的值判断是否为4位数jne error ;调用输入不合条件时的错误处理mov cx,4lea bx,inbuffadd bx,2mov ax,0mov dx,0lop1: ;检查输入有效性mov dl,10mul dlmov dl,byte ptr [bx]sub dl,30h;将字符转化为数值cmp dl,0jb errorcmp dl,9ja erroradd ax,dxinc bx;循环体中字符在字符串中的位置bx+1 loop lop1jmp s2error: ;错误处理lea dx,newlinemov ah,09hint21hlea dx,errmsgmov ah,09hint21hlea dx,newlineint21hjmp s1s2:mov cx,axlea dx,newlinemov ah,09hint21hmov ax,cxpop dxpop cxpop bx;现场恢复retinput endp;判断一个年份是否闰年;输入:;(ax)=年份judge proc nearpush bxpush cxpush dxpush ax;保存ax;输出要判断的年份mov cx,4lea bx,inbuffadd bx,2lop2:mov dl,byte ptr [bx]mov ah,02hint21hinc bxloop lop2 ;循环输出年份正确时结果中的年份lop3:pop axmov dx,0mov cx,ax;保存ax到cx中mov bx,4;判断是否能被4整除div bxcmp dx,0jne notleapmov ax,cxmov bx,100;判断是否能被100整除div bxcmp dx,0jne isleapmov bx,400;判断是否能被400整除div bxcmp dx,0jne notleapisleap:lea dx,yesmov ah,09hint21hjmp s3notleap:lea dx,nomov ah,09hint21hs3:;换行lea dx,newlinemov ah,09hint21h;输出年份正确时结果的剩余部分pop dxpop cxpop bxretjudge endpcode endsend start第三章程序调试在MF2KI软件中调试,运行上面的程序,初始界面:如图4-1图4-1输入年份2008执行程序,回车换行,则显示2008 is leap year;并给出是否继续的提示,输入y,屏幕继续显示提示输入语句;如果输入错误,如abcd 则显示Input illegal !并提示用户继续输入年份,知道输入正确年份为止;输入2010,回车换行,则显示2001 is not leap year;并给出是否继续的提示,输入n,则显示屏幕关闭,程序结束。
闰年的判断一,设计内容判断输入的年份是否为闰年,并给出相应的提示信息。
二,设计目的(1)学习分支语句、调用中断和使用逻辑表达设计汇编程序。
(2)熟悉汇编语言程序的编译、链接过程。
三,设计要求从键盘输入年份,通过计算后,输出该年份是否为闰年的信息。
四,设计原理用DOS 21H中断类型的10号功能调用,从键盘输入的是年份数值的字符串按字节存入缓冲区。
将字符串中的每个字符转换为相对应的十进制数值,利用那年是不是为闰年的表达式,输出该年是否为闰年的信息。
判断是否为闰年通常的计算方法:年数能被4整除,即为闰年;但是,被4整除的年份却不一定就是闰年,如1700年、1900年,就不是闰年。
被100整除也可被400整除的为闰年。
如公元2000年是闰年,而公元3000年、5000年不是。
有两种语言可以编写闰年的程序。
如下:1》判断闰年的汇编语言的表达式为:((AX)MOD 4 EQ 0)AND ((AX)MOD 100 NE 0 )OR ((AX)MOD 400 EQ 0)五,软件流程图本程序的流程图如下图所示:图1 程序流程图六,程序如下:DATA SEGMENTINFOM DB 0DH,0AH,'PLEASE INPUT A YEAR: $'Y DB 0DH,0AH,'THIS IS A LEAP YEAR! $'N DB 0DH,0AH,'THIS IS NOT A LEAP YEAR! $'W DW 0BUF DB 8DB ?DB 8 DUP(?)DATA EndsSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE,ES:DATA START: MOV AX,DATAMOV DS,AXLEA DX,INFOM ;在屏幕上显示提示信息 MOV AH,9 ;调用DOS9号功能INT 21HLEA DX,BUF ;从键盘输入年份字符串MOV AH,10 ;调用DOS9号功能INT 21HMOV CL, [BUF+1] ;取输入年份的实际长度LEA DI,BUF+2 ;DI指向实际的缓冲区起始位置CALL DATACATE ;调用将年份转成ASII字符函数CALL IFYEARS ;调用闰年判断程序JC A1LEA DX,N ;不是闰年,显示提示信息MOV AH,9 ;调用DOS 9号功能,显示不是闰年的提示信息 INT 21HJMP EXIT ;退出A1: LEA DX,Y ;是闰年,显示提示信息MOV AH,9 ;调用DOS 9号功能,显示不是闰年的提示信息 INT 21HEXIT: MOV AH,4CH ;返回DOSINT 21HDATACATE PROC NEAR ;将输入的年份转成ASII字符PUSH CX ;保护CXDEC CX ;CX减一LEA SI,BUF+2 ;SI指向保存转换后数字的空间TT1: INC SI ;读输入年份的实际长度LOOP TT1 ;循环POP CX ;CX出栈MOV DH,30H ;DH=30HMOV BL,10 ;BL=10MOV AX,1 ;AX=1L1: PUSH AX ;保护AXSUB BYTE PTR [SI],DH ;生成ASII字符年份MUL BYTE PTR [SI] ;ASII码按字节向乘ADD W,AX ;W=W+AXPOP AX ;弹出AXMUL BL ;AX=AX*10,生成字符年份DEC SI ;SI=SI-1,字符个数减一LOOP L1 ;循环RETDATACATE ENDPIFYEARS PROC NEAR ;判断是否是闰年PUSH BX ;压栈保护PUSH CXPUSH DXMOV AX,W ;将生成的字符年份进行闰年判断MOV CX,AX ;CX=AXMOV DX,0 ;DX=0MOV BX,4 ;BX=4DIV BX ;对4整除,余数在DX中CMP DX,0 ;判断余数是否为零JNZ LAB1 ;不等于零则跳转到LAB1MOV AX,CX ;AX=CXMOV BX,100 ;BX=100DIV BX ;对100整除,余数在DX中CMP DX,0 ;判断余数是否为零JNZ LAB2 ;不等于零则跳转到LAB2MOV AX,CX ;AX=CXMOV BX,400 ;BX=400DIV BX ;对400整除,余数在DX中CMP DX,0 ;判断余数是否为零JZ LAB2 ;等于零则跳转到LAB2LAB1: CLC ;清进位标志,CF=0JMP LAB3 ;无条件跳转到LAB3LAB2: STC ;置进位标志,CF=1LAB3: POP DX ;出栈POP CXPOP BXRET ;段间返回IFYEARS ENDPCODE ENDSEND START七,调试过程与分析1.调试过程1.建立汇编语言源程序(ASM 文件)(1):调用可执行文件(EXE 文件),进行程序的执行在建立了可执行文件(EXE 文件)后,就可以直接从DOS 下执行程序,如下所示:D:\masm>rui.exe ↙执行后,显示:“Please input a year !”输入“2000” 回车“This is a l eap year!再次运行rui.exe文件,输入“1999”回车“This is not a leap year!”2.实验分析一》从键盘输入年份可以进行闰年的判断,但是不能实现连续判断,必须重新执行程序才能进行判断。
软件0911 潘倩 0902343141闰年判断测试一、 功能定义设计测试功能能够判断1800年至2050年的闰年。
二、 测试流程分析1. 基本描述此测试共有三个条件,通过这三个条件能充分判断年份是否为闰年,条件如下:● T1:y%400==0 ● T2:y%4==0 ● T3:y%100==0 2. 流程图该流程图包含四条路径: ◆ L13:P 1→P3 ◆ L14:P1→P4 ◆ L2:P2输入年份:yy%4==0 AND y%100!=0y%400==0F输出y 是闰年TT 输出y 不是闰年F 结束p1p2p3p4开始三、 逻辑覆盖1. 语句覆盖从流程图来看,可从L2路径直接执行结果,则基本的逻辑判定条件满足T1为真即可。
根据以上分析,设计得到的测试用例如表所示。
表一语句覆盖的测试用例(第一次尝试)ID 输入预期输出通过路径语句覆盖yLC-01 2000 是闰年L2100%对于测试用例LC-01,当y对400求余时,结果为0。
则测试肯定为闰年。
但此测试具有一定的限定性,不能充分体现语句覆盖的准确性。
表二语句覆盖的测试用例(第二次尝试)ID 输入预期输出通过路径语句覆盖yLC-02 1889 不是闰年L13 100%LC-03 1980 是闰年L14 100%LC-04 2000 是闰年L2 100%此次测试,测试过程加多,考虑到了多种情况,但可能还有其它情况没想到,因为不是每一个年份都测试了一遍,所以此种逻辑覆盖还需要加强。
2.判定覆盖判定覆盖要求测试用例的应用程序中每个判定节点取得每种可能的结果至少一次。
从本例来讲,要满足判定覆盖,需执行路径L14、L13.。
表三判定覆盖的测试用例ID 输入预期输出通过路径判定覆盖yLC-05 1947 不是闰年L13 100%LC-06 1800 是闰年L14 100%判定覆盖比语句覆盖增加了一倍的路径,因此具有更强的测试能力。
但判定覆盖并未深入测试符合判定表达式的细节,并未测试到每个简单逻辑判定条件的正确性。
微机研讨报告12211103 李美琪判断闰年的规则是:如果某一年能被4整除但不能被100整除或者该年能被400整除,则该年为闰年。
利用DOS 21H中断类型的10号键盘功能调用,将从键盘接收的表示年份数值的字符串按字节存入缓冲区。
将字符串中的每个字符转换为对应的十进制数值(利用0-9这10个数的ASCll码值比其本身大30H的关系),利用判断某年是否为闰年的表达式,输出该年是否为闰年的信息。
程序设计1.程序设计流程图2.程序DATA SEGMENTYES DB 'It is a leap year!',13,10,'$'NO DB 'It is not a leap year!',13,10,'$'A DW 400B DW 4C DW 100D DW 1000,100,10,1G DW 0X DB 5DB 0DB 5 DUP(?)DATA ENDSSTACK1 SEGMENT STACK 'STACK1'DB 100 DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1MAIN PROC FARBEGIN:MOV AX,DATAMOV DS,AXMOV AX,STACK1MOV SS,AXLEA DX,X ;调用中断类型10号功能键MOV AH,10 ;从键盘输入年份字符串INT 21H ;并将其首地址送DXMOV DI,0MOV SI,0QUSHUJU:SUB AX,AX ;取出所输入的年份MOV AL,X[SI+2]SUB AL,30HCBWMUL D[DI]ADD G,AXINC SIADD DI,2LOOP QUSHUJUSUANFA:MOV DX,0 ; 判断是否是闰年MOV AX,GDIV ACMP DX,0JZ EXITMOV AX,GMOV DX,0DIV BCMP DX,0JNZ NEXTMOV AX,GMOV DX,0DIV CCMP DX,0JNZ EXITJZ NEXTNEXT:LEA DX,NO ;在屏幕上显示不是闰年的提示信息MOV AH,9INT 21HMOV AH,4CHINT 21HEXIT:LEA DX,YES ;在屏幕上显示是闰年的提示信息MOV AH,9INT 21HMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND BEGIN3.运行结果及分析编译无错如下图当输入不是闰年时输出It is not a leap year! 例如,输入为1234当输入时闰年时输出. It is a leap year! 例如,输入为1200.三、心得体会通过这次课程设计使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论与实贱结合起来,从理论得出结论进一步应用于实践,从而提高自己的实际动手能力和独立思考能力。
目录1 基本功能描述 (1)2 设计思路 (1)2.1 设计一 (1)2.1.1 设计一流程图 (1)2.1.2 设计一说明 (2)2.2 设计二 (3)2.2.1 设计二流程图 (3)2.2.2 设计二说明 (4)2.3 设计比较 (5)3 软件设计 (5)4 结论与心得体会 (10)5 参考文献 (11)6 思考题 (11)附录 (13)附录1 调试试验报告 (13)附录2 测试结果 (14)附录3 关键源代码 (14)闰年计算1 基本功能描述本设计是根据闰年的计算方法,利用汇编语言编写的一个简单的判断闰年的程序。
根据判断闰年规则:如果某年能被4整除但不能被100整除或者该年能被400整除,则该年为闰年,否则不是闰年。
在本程序运行后,只要从键盘输入年份,通过计算后,就能输出该年份是否为闰年的信息。
2 设计思路利用DOS 21H中断类型09号键盘功能调用,在屏幕输出提示用户输入年份的提示语。
利用DOS 21H中断类型的10号键盘功能调用,将从键盘接收的表示年份数值的字符串按字节存储缓冲区。
利用0-9这10个数的ASCII码值比其本身大30H的关系,将字符串中的每个字符转换为对应的十进制数值。
利用jb比之小与ja比之大的关系,判断输入字符是否在0-9范围内,对数值进行是否合法的判断。
由于数值之间的十倍关系,利用乘法循环操作,将输入的字符转换为一个数值。
利用判断某年是否为闰年的表达式,输出该年是否为闰年的信息。
利用DOS 21H中断类型02号键,将欲显示的字符送到屏幕显示。
利用DOS 21H中断类型的01号键,将从键盘输入字符的ASCII码送入al,并在屏幕上显示该字符,将该字符与‘n’比较,判断出是否继续执行。
2.1 设计一2.1.1 设计一流程图图1 闰年计算流程图一2.1.2 设计一说明如图1闰年计算流程图所示,程序开始运行以后,首先屏幕输出提示语,提示用户输入一个年份。
用户输入年份后,程序首先对之进行是否合法的判断,若出现0-9字符以外的其他字符,则被判定为非法,需要用户重新输入。
闰年怎么判断的方法闰年怎么判断的方法1、公历年份是4的倍数的,一般都是闰年。
但公历年份是整百数的,必须是400的倍数才是闰年。
2、要判断某一年是不是闰年,一般方法是用4或400去除这一年的年份数,如果除得的商是整数而没有余数,那么这一年是闰年;如果有余数,那么这一年是平年。
怎么使用简单方法判断平年和闰年1、4或400除以年份数:用4或400去除这一年的年份数,除得的商是整数而且没有余数,则这一年是闰年。
如果有余数,则这一年是平年。
2、4的倍数:公历年份不是整百数时,只看年份数的末两位数,是否为4的倍数,如果年份数末两位是4的倍数,则这一年就是闰年。
3、千位与百分位为4的倍数:当公历年份是整百数时,只看年份数的千位与百位这两位数,如果这两位数是4的倍数,这一年就是闰年,反之,就是平年。
4、四年一闰,百年不闰,四百年再闰:这就是通常所说的:四年一闰,百年不闰,四百年再闰。
例如,2000年是闰年,2100年则是平年。
平年闰年怎么算口诀1、年号除以四,没余是闰年。
天数三六六,二月二九天。
年号除以四,有余一二三。
平年三六五,二月二八天。
二零零零年,特殊不好算。
除数是四百,没余是闰年。
2、一般闰年的计算方法分为两种,第一种是普通闰年即年份是4的倍数不是100的倍数,第二种是世纪闰年,即年份是400的倍数。
除此之外,还有判断平年闰年的口诀,记住平年和闰年,那得看看二月份。
平年二月二十八,闰年二月二十九。
3年一闰还是4年一闰1、闰年的来历:闰年是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。
地球公转的周期是365天又5个多小时,而一年按天算,这样每过四年便多出近24个小时,补上时间差的年份,即有闰日的年份为闰年。
2、公历闰年判定遵循的规律为:4年一闰,百年不闰,4百年再闰。
3、公历闰年的简单计算方法(符合以下条件之一的年份即为闰年):第一,能被4整除而不能被100整除(如2100年就不是闰年); 第二,能被400整除。