百科狗-知识改变命运!
--

紧急求解高一电脑编程~~~~

梵高1年前 (2023-12-20)阅读数 11#综合百科
文章标签闰年数字

闰年

闰年: 1.为了弥补人为的年份规定与地球实际绕日公转的时间差,2.而人为把时间差补上了的年份,该年即为闰年.

遵循的规律为: 四年一闰,百年不润,四百年再润.

if((year % 400 == 0)|(year % 4 == 0)&(year % 100 != 0))//闰年的计算方法

详情如下:

闰年(leap year),在公历(格里历)或夏历中有闰日的年份,以及在中国旧历农历中有闰月的年份。地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,于第四年加于2月,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。夏历的平年只有354日,比12个朔望月短0.3671日,为使每月初一与月朔相合,规定每30年中有11年的年底增加1日,这一年的历年有355日,即为闰年。中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。在加有闰月的那一年有13个月,历年长度为384或385日,这一年也称为闰年。

按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年。

也就是我们通常所说的:

四年一闰,百年不闰,四百年再闰。

西方公历的“闰年”

阳历中有闰日的年份叫闰年,相反就是平年,平年为365天,闰年为366天。在公历(格里历)纪年中,平年的二月为28天,闰年的二月为29天。闰年平月2月29日为闰日。

增加闰日的原因

现时的公历以回归年为“年”的计算基础,而一个回归年大约等于365.24220日。因为在平年公历只计算365日,结果四年后便会累积0.24220×4=0.9688日,大约等于一日,所以便逢四年增加一日闰日以抵销这0.9688日。

计算闰年的方法

公历纪年法中,能被4整除的大多是闰年,不能被100整除而能被400整除的年份是闰年,能被3200整除的也不是闰年,如1900年是平年,2000年是闰年,3200年不是闰年。

中国农历的“闰年”

中国旧历农历纪年中,有闰月的一年称为闰年。一般年份为12个月,354或355天,闰年则为13个月,383或384天

编程中公历闰年的简单计算方法:

设年份 year

if (year能被4整除 and 不能被100整除) or year能被400整除

then 该年为闰年

else 该年为平年

具体程序代码:

#主模块:

;月历打印

;主程序设置好入口参数,BX=年份,DL=月份

;调用子程序 display

;By wangrui

;2006-12-8

extrn display:far

Esccode equ 01h

Up equ 048h

Down equ 050h

Left equ 04bh

Right equ 04dh

dseg segment

Year dw 0

Month db 0

temp db 10 dup(0)

count dw ?

ErrMsg db 0dh,0ah,"The input NOT decimal! $"

dseg ends

cseg segment

assume cs:cseg,ds:dseg

start:

mov ax,dseg

mov ds,ax

call GetYearMonth

Ws:

mov bx,Year

mov dl,Month

call far ptr display

again:

mov ah,0

int 16h

cmp ah,Esccode

je Exit

cmp ah,Up

je NextY

cmp ah,Down

je PreY

cmp ah,Left

je PreM

cmp ah,Right

je NextM

jmp again

NextY:

inc Year

jmp Ws

PreY:

dec Year

jmp Ws

NextM:

inc Month

cmp Month,12

jbe skip0

mov Month,1

inc Year

skip0:

jmp Ws

PreM:

dec Month

cmp Month,1

jae skip1

mov Month,12

dec Year

skip1:

jmp Ws

Exit:

mov ah,4ch

int 21h

;**************************************************

GetYearMonth proc near

push ax

push cx

push si

push di

inputagain:

mov Year,0

mov Month,0

mov si,0

repeatY:

mov ah,1

int 21h

cmp al,0dh

je EndY

cmp al,20h

je EndY

cmp al,1bh

je ExitDos0

cmp al,30h

jb Err

cmp al,39h

ja Err

sub al,30h

mov temp[si],al

inc si

jmp repeatY

Err:

mov ah,9

lea dx,ErrMsg

int 21h

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

jmp inputagain

EndY:

mov bx,10

mov di,si

mov si,0

NextYBit:

mov ah,0

mov al,temp[si]

mov count,di

sub count,si

dec count

mov cx,count

jcxz skipY

lopmul: mul bx

loop lopmul

紧急求解高一电脑编程~~~~

skipY: add Year,ax

inc si

cmp si,di

jne NextYBit

;----------------------------------The year is put into [Year]

push dx

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

jmp skiplap

ExitDos0:

jmp ExitDos

skiplap:

mov si,0

repeatM:

mov ah,1

int 21h

cmp al,0dh

je EndMon

cmp al,20h

je EndMon

cmp al,1bh

je ExitDos

cmp al,30h

jb Err

cmp al,39h

ja Err

sub al,30h

mov temp[si],al

inc si

jmp repeatM

EndMon:

mov di,si

mov si,0

mov bl,10

NextMBit:

mov al,temp[si]

mov count,di

sub count,si

dec count

mov cx,count

jcxz skipM

lpmul: mul bl

loop lpmul

skipM: add Month,al

inc si

cmp si,di

jne NextMBit

;-------------------------The Month is put into [Month]

push dx

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop di

pop si

pop cx

pop ax

ret

ExitDos:

mov ah,4ch

int 21h

GetYearMonth endp

cseg ends

end start

#打印模块:

;***********************************

;入口参数:bx = Year dl=Month

;***********************************

public display

data segment

Year dw ?

Month db ?

leap db ?

weekstr db " MON TUR WEN THU FRI SAT SUN",’$’

fillblank db " $"

fillblank4 db " $"

fillblank3 db " $"

c db ?

y db ?

firstday db ?

temp db ?

MonthSize db ?

data ends

cseg segment

assume cs:cseg,ds:data

display proc far

push ds

mov ax,data

mov ds,ax

mov Year,bx

mov Month,dl

mov dx,0

xor bh,bh

mov ah,2

int 10h

mov ah,6

mov al,0

mov bh,01110000b

mov ch,0

mov cl,0

mov dh,24

mov dl,79

int 10h

mov ah,6

mov al,0

mov bh,01110100b

mov ch,0

mov cl,25

mov dh,24

mov dl,79

int 10h

call far ptr dispYM

lea dx,weekstr

mov ah,9

int 21h

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

call GetMonthSize ;把当前月份的天数放到MonthSize

cmp Month,2

ja skip

add Month,12

dec Year

skip:

mov bl,100

mov ax,Year

div bl

mov c,al

mov y,ah

mov cl,2

mov bl,c

shr bl,cl ;int(c/4)

shl c,1 ;2*c

sub bl,c

add bl,y

shr y,cl ;int(y/4)

add bl,y ;int(c/4)-2*c+y+int(y/4)--->bl

inc Month

xor ah,ah

mov al,Month

mov dx,13

mul dx

mov cx,5

div cx

xchg ax,bx

cbw

xchg ax,bx

add bx,ax ;int(c/4)-2*c+y+int(y/4)+int(13*(m+1)/5)

mov ax,bx

mov cl,7

idiv cl

cmp ah,0

jG skipAdd

add ah,7

skipAdd:

mov bl,ah

mov firstday,bl

;--------------------------------计算出当前月份的第一天是星期几

mov cl,bl

mov ch,0

dec cl

jcxz skipF

FillB: mov ah,9

lea dx,fillblank

int 21h

loop FillB

skipF:

mov cl,1

disLop: call dispWeek ;日期已经放入cl

inc cl

inc bl

cmp bl,8

jb skipModle

mov bl,1

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

skipModle:

cmp cl,MonthSize

jbe dislop

mov ah,2

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop ds

ret

display endp

;******************************************************************

GetMonthSize proc near

push ax

push dx

mov leap,0

mov ax,Year

mov ch,00000011b

and ch,al

mov bl,100

div bl

mov cl,ah

cmp ch,0

jne skipNLeap

cmp cl,0

jne skipLeap

mov ax,Year

mov bx,400

mov dx,0

div bx

cmp dl,0

je skipLeap

skipNLeap:

jmp gmsize

skipLeap:

inc leap

gmsize:

mov al,Month

cmp al,2

je return2

cmp al,8

jb skipInc

inc al

skipInc:

test al,1

jz returnEven

mov MonthSize,31

jmp return

returnEven:

mov MonthSize,30

jmp return

return2:

mov MonthSize,28

cmp leap,0

je return

inc MonthSize

return:

pop dx

pop bx

ret

GetMonthSize endp

;*****************************************************************

dispWeek proc near

push cx

push bx

push ax

push dx

cmp cl,10

jae DoubleDig

lea dx,fillblank4

mov ah,9

int 21h

mov dl,cl

add dl,30h

mov ah,2

int 21h

jmp back

DoubleDig:

mov ch,10

mov ah,0

mov al,cl

div ch

mov cx,ax

mov ah,9

lea dx,fillblank3

int 21h

mov dl,cl

add dl,30h

mov ah,2

int 21h

mov dl,ch

add dl,30h

int 21h

back:

pop dx

pop ax

pop bx

pop cx

ret

dispWeek endp

;*********************************************************

dispYM proc far

push bx

push dx

mov ax,year

mov dh,10

xor si,si

next: div dh

mov cl,ah

mov ch,0

inc si

push cx

mov ah,0

cmp ax,0

jne next

mov cx,si

repeat: pop dx

mov ah,2

add dl,30h

int 21h

loop repeat

mov dl,0dh

mov ah,2

int 21h

mov dl,0ah

mov ah,2

int 21h

mov al,Month

mov ah,0

mov bl,10

div bl

mov cx,ax

mov dl,cl

mov ah,2

add dl,30h

int 21h

mov dl,ch

add dl,30h

int 21h

mov dl,0dh

mov ah,2

int 21h

mov dl,0ah

mov ah,2

int 21h

pop dx

pop bx

ret

dispYM endp

;****************************************************

cseg ends

end

写一个汇编程序 急急急

data segment ;定义数据段

a db 123

b db 62

c db 5

s db ?

data ends

code segment ;定义程序段

assume cs:code,ds:data

lize: mov ax,data

mov ds,ax ;ds指向数据段

mov al,a ;把a的值给al

sub al,b ;a的值减去b

mov s,al ;结果暂存入s

mov al,a ;把a赋给al

add al,b ;把a加上b

xor ah,ah ;ah清0

cbw ;除前对被除数进行字扩展

div s :al 把(a+b)除以(a-b)

mul c :ax ;除的结果乘上c

mov s,al ;最终的结果存入s

mov ah,4h

int 21h ;返回dos

code ends

end lize;结束

这里解答你问的问题:

1. 一段代码

XOR AH,AH

SUB AL,30H

XCHG AX,BX

MUL SI

ADD BX,AX

JMP SHORT L0

这段代码是INPUTNUM子程序中的一段,INPUT子程序实现的功能是输入一个数字,这个数字可以是1位数,也可以是2位数,如果算作十进制无符号数,其范围是0~65535。然而,我们每次按下键盘,输入一个数字只是这个数字对应的字符,这就是'1'和1之间的区别,前者的值是31H(ASCII码),后者的值是1。所以这里要有一个字符到数字的转换,就是SUB AL,30H。后面四行代码,要实现的是,输入一个数字字符之后,前面输入的数字要进十位,再把当前这个数字相加。例如,你连续输入'1'和'2',其运行情况是:输入'1'后,'1'转换为1后,将BX中的值乘以10,再加上这个1,因为BX初值为0,所以乘以10还是0,加上1后,结果为1;输入'2'后,'2'转换为2,将BX中的值乘以10(得到10),再加上这个2,结果就为12。

JMP SHORT L0,是进行循环输入,这样就可以输入多个十进制位的数字,得到多位数。

那么何时结束输入呢,因为程序中加入了比较输入字符是否在'0'~'9'范围,如果不是则跳出循环。所以,按照一般的输入习惯,当我们想要结束输入一个数字,可以通过按下回车或者空格,刚好回车和空格都不在这个范围,这样就可以结束输入一个数字。

当然,你也可以通过输入一个字母或者其他例如'$'、'%'之类的字符结束一个数字的输入。

2. 比较

你说的比较应该是REPNE SCASW吧。SCASW指令是将AX与ES:DI指向的字单元比较,并且实现DI自动增加以使得ES:DI指向下一个字单元。加上前缀REPNE,是为了实现如果比较结果不相等则继续循环比较,或者当CX自减不为为0时继续循环比较。因为有后者条件,可以保证这个不是死循环。所以在这行代码结束后,加入一个JNE L5,来查看最后一次比较结果,如果最后一次比较结果是相等,则表示找到了改数字;若连最后一次比较结果都不想等,那么表示前面的所有的比较结果都不等(因为REPNE SCASW是比较结果不相等则继续循环比较),那么就是没有找到改数字。当然在JNE L5之前加入了几行代码来实现输出回车换行,当然这段代码不影响标志寄存器的相应位。

3. 二进制转换十进制

这里我要强调的一点是,我们通过比较得到数字所在数组中的索引位置,是个多位数。只要这个数组足够长,例如长度可以是65535。那么这个索引位置的预计范围是0~65535。而我们要输出这个索引位置,就要想方设法将这个数65535转换为字符串'65535'来输出。而字符串'65535'是由字符'6','5','5','3','5'组成,这五个字符对应65535的每个位上的数字。所以,你要输出一个数,就要把这个数,分解出一个个数位,然后按顺序输出。我说的二进制转换为十进制,就是要实现将二进制数(以为数字在计算机中是以二进制保存的),分解出一个个的十进制位,并存储。我采用的方法是除10,余数入栈的方法。例如,65535,循环除以10,相继得到余数5,3,5,5,6,这个顺序刚好跟数字的排列顺序相反,输出的时候要倒过来输出,所以就用到栈机制的后进先出的特点,将5,3,5,5,6依次入栈,然后再依次取出,转换为对应字符(ADD DL,30H)再输出,即输出我们想要的结果了。

;现从键盘输入数据个数,再输入一组数字。输入要查找的数字,,查找。最后,输出所要查找的数字的位置。若找不到,则提示。

;------FORMAT-------

;INPUT:

;第一行:数据个数

;第二行:若干数据,中间用空格分隔

;第三行:要查找的数据

;OUTPUT:

;第四行:数据位置/未找到信息

DATAS SEGMENT

COUNT DW ? ;数字个数

NUMS DW 100 DUP(?) ;最多可接收100个数字

CHECK DW ?

MESS DB 'NOT FOUND','$'

DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

;功能:输入一个数字

;传入参数:无

;返回值:BX,输入的数字

INPUTNUM PROC NEAR

MOV SI,10

XOR BX,BX

;输入数字个数

L0:

MOV AH,7

INT 21H

CMP AL,'0'

JB L1

CMP AL,'9'

JA L1

MOV AH,2

MOV DL,AL

INT 21H

XOR AH,AH

SUB AL,30H

XCHG AX,BX

MUL SI

ADD BX,AX

JMP SHORT L0

L1:

RET

INPUTNUM ENDP

MAIN PROC FAR

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

;输入数字个数,并保存

CALL INPUTNUM

MOV COUNT,BX

;输出回车换行

MOV AH,2

MOV DL,0DH

INT 21H

MOV DL,0AH

INT 21H

;输入若干数字,并存入数组

LEA DI,NUMS

CLD

MOV CX,COUNT ;数字个数

L2:

CALL INPUTNUM

MOV AX,BX

STOSW ;存储数字

MOV AH,2

MOV DL,' '

INT 21H

LOOP L2

;输出回车换行

MOV AH,2

MOV DL,0DH

INT 21H

MOV DL,0AH

INT 21H

;输入查找数字,并保存

CALL INPUTNUM

MOV CHECK,BX

;依次比较,得到相应位置

MOV AX,CHECK

LEA DI,NUMS

CLD

MOV CX,COUNT

REPNE SCASW ;比较

;输出回车换行

MOV AH,2

MOV DL,0DH

INT 21H

MOV DL,0AH

INT 21H

JNE L5

SHR DI,1 ;除以2,因为数据是字单元

DEC DI ;减1,因为DI是自增的

;二进制结果转换为十进制,并存储入栈

MOV BX,10 ;进制位

XOR CX,CX ;十进制数位数

MOV AX,DI

L3:

XOR DX,DX

DIV BX

PUSH DX

INC CX ;位数自增,至少为1

CMP AX,0

JNE L3

;输出数字所在位置

MOV AH,2

L4:

POP DX

ADD DL,30H ;数字转换为字符

INT 21H

LOOP L4

JMP SHORT L6

L5:

;输出未找到信息

MOV AH,9

LEA DX,MESS

INT 21H

L6:

MOV AH,4CH

INT 21H

MAIN ENDP

CODES ENDS

END START

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)