Pascal 帕斯卡语中两个日期之间的差异
这个程序应该能找到两个日期之间的差异,但它有一个bug,我找不到。 它不断返回一个大数字-请帮助Pascal 帕斯卡语中两个日期之间的差异,pascal,Pascal,这个程序应该能找到两个日期之间的差异,但它有一个bug,我找不到。 它不断返回一个大数字-请帮助 Program tp4; Type dt = Record jour : Integer; mois : Integer; annee : Integer; End; Var date : dt ; y,x,i,s : Integer; Begin x := 0; s := 0; For y:=1 To 2 Do
Program tp4;
Type
dt = Record
jour : Integer;
mois : Integer;
annee : Integer;
End;
Var
date : dt ;
y,x,i,s : Integer;
Begin
x := 0;
s := 0;
For y:=1 To 2 Do
//2 dates
Begin
Writeln('Entrez un date : jour mois année ');
Readln( date.jour, date.mois, date.annee);
While ((date.jour<=0) Or (date.jour>31) Or (date.mois>12) Or (date.annee<=0) ) Do
//verfication loop
Begin
Writeln('Entrez une date valide : jour mois année ');
Readln(date.jour ,date.mois ,date.annee);
End;
s := s+date.jour ;
For i:= 1 To date.mois-1 Do
Case i Of
3,5,7,8,10,12,1 : s := s+31;
4,6,9,11 : s := s +30;
2 : If ((date.annee Mod 100)=0) And ((date.annee Mod 400) = 0 ) Then //convert months to days
s := s+29
Else If date.annee Mod 4 = 0 Then
s := s+29
Else s := s+28;
End; //Convert years to days
For i:= 1 To date.annee Do
If (i Mod 100 = 0) And (i Mod 400 = 0) Then s := s+366
Else If (i Mod 4 =0) Then s := s+366
Else s := s+365;
x:=s-x ;
End;
If (x)<=0 Then
Writeln('la difference est :',-x)
Else Writeln('la difference est :',x);
Readln;
End.
**input**
12 03 2019
13 03 2019
**output**
737510
程序tp4;
类型
dt=记录
焦耳:整数;
mois:整数;
安妮:整数;
结束;
变量
日期:dt;
y、 x,i,s:整数;
开始
x:=0;
s:=0;
对于y:=1到2 Do
//2个日期
开始
书面形式(“签署日期:年月日”);
Readln(date.jour,date.mois,date.annee);
当((date.jour31)或(date.mois>12)或(date.annee时,我认为错误在s
和x
(x:=s-x;
等)的某个地方,我进行了重构:
Program tp4;
Type dt = Record
jour : Integer;
mois : Integer;
annee : Integer;
End;
Type
arrayDate = array[1..2] of dt;
Var
y,i,f,s : Integer;
arrDate: arrayDate;
function Leap (Y : Word): Boolean;
Begin
If (Y Mod 4) <> 0 Then Leap := FALSE
Else If (Y Mod 100) <> 0 Then Leap := TRUE
Else Leap := (Y Mod 400) = 0;
End;
function Lenght (date: dt) : Integer;
Begin
Lenght := 0;
Lenght := Lenght + date.jour;
For i := 1 To date.mois Do
Case i Of
3, 5, 7, 8, 10, 12, 1 : Lenght := Lenght + 31;
4, 6, 9, 11 : Lenght := Lenght + 30;
2 : If Leap (date.annee) Then Lenght := Lenght + 29 Else Lenght:= Lenght + 28;
End;
For i := 1 To date.annee Do //Convert years to days
If Leap (i) Then Lenght := Lenght + 366 Else Lenght := Lenght + 365;
End;
Begin
For y := 1 To 2 Do //2 dates
Begin Writeln ('Entrez un date : jour mois année ');
Readln (arrDate[y].jour, arrDate[y].mois, arrDate[y].annee);
While ((arrDate[y].jour <= 0)
Or (arrDate[y].jour > 31)
Or (arrDate[y].mois > 12)
Or (arrDate[y].annee <= 0)) Do //verfication loop
Begin
Writeln ('Entrez une date valide : jour mois année ');
Readln (arrDate[y].jour, arrDate[y].mois, arrDate[y].annee);
End;
End;
f := Lenght(arrDate[1]);
s := Lenght(arrDate[2]);
Writeln ('la difference est :', Abs(s - f)); // absolute |s-f|
Readln;
End.
程序tp4;
类型dt=记录
焦耳:整数;
mois:整数;
安妮:整数;
结束;
类型
arrayDate=dt的数组[1..2];
变量
y、 i,f,s:整数;
arrydate:arrayDate;
函数Leap(Y:Word):布尔型;
开始
如果(Y模4)为0,则Leap:=假
否则,如果(Y Mod 100)0,则Leap:=真
Else Leap:=(Y Mod 400)=0;
结束;
函数长度(日期:dt):整数;
开始
长度:=0;
长度:=长度+日期.jour;
对于i:=1到目前为止。mois Do
案例一
3,5,7,8,10,12,1:长度:=长度+31;
4、6、9、11:长度:=长度+30;
2:如果是Leap(date.annee),则长度:=长度+29,否则长度:=长度+28;
结束;
对于i:=1到日期。annee Do//将年转换为天
如果跳跃(i),则长度:=长度+366,否则长度:=长度+365;
结束;
开始
对于y:=1到2个Do//2个日期
开始书写(日期:年月日);
Readln(arrDate[y].jour,arrDate[y].mois,arrDate[y].annee);
而((截止日期[y].31月)
或(截止日期[y]。mois>12)
或者(arrDate[y]。annee您正在使用For y…
循环来请求输入并计算每个输入的天数。在循环中,s
变量是天数计数器
您所做的错误是,您将s
b设置为零,以用于y…
循环的,而不是在循环的开始处。因此,第二次请求日期时,s
仍然具有第一个日期的值,在此基础上,您开始计算第二个日期的天数
校正当然是将s:=0;
移动到y…
循环的开头
或将s
的第一个赋值从
s := s + date.jour;
到
在一个循环中找出相隔6000年的两个日期之间的差异?和(ab)使用标准函数“长度”的名称?哎哟
试试这个:
//----------------------------------------------------------------------
// Convert a date to its Julian Day Number
//----------------------------------------------------------------------
procedure cj(dd, mm, yyyy: longint; var jdn, dow: longint);
var
cj_y,
cj_c,
cj_x,
cj_y: double;
begin
if dd = 0 then
begin
jdn:= -1
dow:= -1;
end
else
begin
cj_y:= yyyy + (mm - 2.85) / 12;
cj_c:= 0.75 * trunc(cj_y * 0.01);
cj_x:= frac(cj_y);
cj_y:= trunc(cj_y);
jdn:= trunc(
trunc(
trunc(367 * cj_x) + 367 * (cj_y) -
1.75 * cj_y + dd) - cj_c) +
1721115.0;
dow:= jdn mod 7;
end;
end; {cj}
给出的公式在1582-10-15之后的几天内有效,稍加调整即可使日期回到0000-03-01
按照1998年8月我在comp.lang.pascal.borland上发布的链接进行解释
//----------------------------------------------------------------------
// Convert a date to its Julian Day Number
//----------------------------------------------------------------------
procedure cj(dd, mm, yyyy: longint; var jdn, dow: longint);
var
cj_y,
cj_c,
cj_x,
cj_y: double;
begin
if dd = 0 then
begin
jdn:= -1
dow:= -1;
end
else
begin
cj_y:= yyyy + (mm - 2.85) / 12;
cj_c:= 0.75 * trunc(cj_y * 0.01);
cj_x:= frac(cj_y);
cj_y:= trunc(cj_y);
jdn:= trunc(
trunc(
trunc(367 * cj_x) + 367 * (cj_y) -
1.75 * cj_y + dd) - cj_c) +
1721115.0;
dow:= jdn mod 7;
end;
end; {cj}