Перевод из календаря ацтеков в наш формат - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Гражданский год ацтеков делился на 18 месяцев по 4 недели и 5 дней в каждой неделе, ещё 5 или 6 дней составляли дополнительную неделю поста. По данному номеру года, месяца и дня в формате 2011.01.01 (вводятся 3 числа с клавиатуры) определите номер месяца, недели месяца и дня ацтеков в формате "3 месяц, 1 неделя, 3 день". Помните, что в високосных годах Григорианского календаря есть 29 февраля, а в календаре ацтеков - 6-ой день поста. Если число приходится на конец года и не попадает ни в один месяц, нужно выводить сообщение типа "3 день поста".

Решение задачи: «Перевод из календаря ацтеков в наш формат»

textual
Листинг программы
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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы