Перевод из календаря ацтеков в наш формат - Pascal ABC
Формулировка задачи:
Решение задачи: «Перевод из календаря ацтеков в наш формат»
const kd:array[1..11] of byte=(31,28,31,30,31,30,31,31,30,31,30);
var g,m,d,i,k,ma,na,da:integer;
vis:boolean;
begin
repeat
write('Введите год g>0 g= ');
readln(g);
until g>0;
//високосный ли год
vis:=((g mod 100<>0)and(g mod 4=0))or(g mod 400=0);
repeat
write('Введите месяц от 1 до 12 m=');
readln(m);
until m in [1..12];
repeat
k:=0;
write('Введите день от 1 до 28..31 в зависимости от месяца и високосерсти года в=');
readln(d);
if(d<1)or(d>31) then k:=1;
if(m in [4,6,9,11]) and(d>30)then k:=1;
if(m=2) and vis and(d>29) then k:=1;
if(m=2) and not vis and(d>28) then k:=1;
until k=0;
//определим номер дня в году
if m=1 then k:=d //если январь
else //другие месяцы
begin
k:=d;
for i:=1 to m-1 do
k:=k+kd[i];
end;
if vis and(m>2)then k:=k+1;//в високосном году +1 день после февраля
writeln('День с начала года=',k);
if k>360 then write(k mod 360,' день поста')
else
begin
dec(k);
ma:=k div 18+1;
na:=(k-18*(ma-1))div 5+1;
da:=k mod 5+1;
write(ma,' месяц ',na,' неделя ',da,' день');
end;
end.
Объяснение кода листинга программы
const kd: array[1..11] of byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30); var g, m, d, i, k, ma, na, da: integer; vis: boolean; begin repeat write('Введите год g>0 g= '); readln(g); until g > 0; vis := ((g mod 100 <> 0) and (g mod 4 = 0)) or (g mod 400 = 0); repeat write('Введите месяц от 1 до 12 m='); readln(m); until m in [1..12]; repeat k := 0; write('Введите день от 1 до 28..31 в зависимости от месяца и високосерсти года в='); readln(d); if (d < 1) or (d > 31) then k := 1; if (m in [4, 6, 9, 11]) and (d > 30) then k := 1; if (m = 2) and vis and (d > 29) then k := 1; if (m = 2) and not vis and (d > 28) then k := 1; until k = 0; //определим номер дня в году if m = 1 then k := d — 1; //если январь else — //другие месяцы begin k := d; for i := 1 to m — 1 do k := k + kd[i]; end; if vis and (m > 2) then k := k + 1; //в високосном году +1 день после февраля writeln('День с начала года=', k); if k > 360 then write(k mod 360, ' день поста') else begin dec(k); ma := k div 18 + 1; na := (k — 18 * (ma — 1)) div 5 + 1; da := k mod 5 + 1; write(ma, ' месяц ', na, ' неделя ', da, ' день'); end; end.