Pascal 帕斯卡语中两个日期之间的差异

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

这个程序应该能找到两个日期之间的差异,但它有一个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                                                  
    //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}