Дан массив записей, содержащий различные даты. Каждая дата представлена записью трёх полей: число,месяц,год. Определить самую раннюю дату и все даты месяца декабрь — Pascal(Паскаль)

uses crt;
type date=record//тип запись даты
          gd:1000..2010;
          ms:1..12;
          dn:1..31;
          end;
var m:array[1..100] of date;//массив записей
    n,i,j,im,k:byte;
begin
clrscr;
write('Размер массива n=');
readln(n);
writeln('Введите ',n,' дат:');
for i:=1 to n do
 begin
  repeat
  write(' Год (1000-2010):');readln(m[i].gd);//можно изменить диапазон
  until (m[i].gd>=1000)and(m[i].gd<=2010);//проверяем
  repeat
  write('  Месяц (1-12): ');readln(m[i].ms);
  until m[i].ms in [1..12];
  repeat
  k:=0;
  write('  День: ');readln(m[i].dn);
  if ((m[i].ms in [1,3,5,7,8,10,12])and not(m[i].dn in [1..31]))//длинные месяцы
  or ((m[i].ms in [4,6,9,11])and not(m[i].dn in [1..30]))//короткие месяцы
  or ((m[i].ms=2)and(m[i].gd mod 4=0)and not(m[i].dn in [1..29]))//високосный - февраль
  or ((m[i].ms=2)and(m[i].gd mod 4<>0)and not(m[i].dn in [1..28]))then k:=1;//невисокосный февраль
  until k=0;
 end;
clrscr;
im:=1;
for i:=1 to n do
if (m[i].gd<m[im].gd)or((m[i].gd=m[im].gd)and(m[i].ms<m[im].ms))// если год меньше, или годы равны, но месяц меньше
or((m[i].gd=m[im].gd)and(m[i].ms=m[im].ms)and(m[i].dn<m[im].dn)) then im:=i;//если равны год и месяц, то по дням
write('Самая ранняя дата: ');
if m[im].dn<10 then write('0',m[im].dn,'.')else write(m[im].dn,'.');//вывод с нолями, если день или месяц меньше 10
if m[im].ms<10 then write('0',m[im].ms,'.')else write(m[im].ms,'.');
write(m[im].gd);
writeln;
writeln;
k:=0;
writeln('Даты месяца декабрь:');
writeln;
for i:=1 to n do
if m[i].ms=12 then//если поле месяц = 12
 begin
  k:=1;
  if m[i].dn<10 then write('0',m[im].dn,'.')else write(m[i].dn,'.');
  if m[i].ms<10 then write('0',m[im].ms,'.')else write(m[i].ms,'.');
  write(m[i].gd);
  writeln;
 end;
if k=0 then write('Дат декабря нет!');
readln
end.

Leave a Comment

+ 27 = 30