Язык Паскаль!!!Введите с клавиатуры - -две календарные даты(день, месяц) -название дня...

0 голосов
57 просмотров

Язык Паскаль!!!
Введите с клавиатуры -
-две календарные даты(день, месяц)
-название дня недели
Напишите программу определяющая количество дней указанного названия,которые оказались в заданном интервале времени!


Информатика (878 баллов) | 57 просмотров
0

Есть проблема: поскольку год не указан, неизвестно с какого дня недели начинается интервал, следовательно, невозможно определить день недели ни для одной даты из этого интервала. Следует или указать год (это сложнее), или название дня недели для начала интервала.

0

скорее всего день недели для начала интервала.

0

Также надо знать, високосный ли год, если в интервал попадает переход с февраля на март

0

помогите пожалуйста))

0

Либо тогда все же указать год и вставить алгоритм "вечного календаря", можно в упрощенном виде для 20-21 веков....

0

В целом получается уже монстровито...(((

Дан 1 ответ
0 голосов
Правильный ответ

Const
  cdow='ВсПнВтСрЧтПтСб';
  mdays:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
var
  d1,m1,y,d2,m2,a,y1,m,dow,dw,i,days:integer;
  cdw:string;
begin
  Writeln('Введите начало интервала (день месяц год): ');
  Readln(d1,m1,y);
  Writeln('Введите номера дня и месяца конца интервала: ');
  Readln(d2,m2);
  Writeln('Укажите, какой день недели подсчитать (Вс/Пн/Вт/Ср,Чт/Пт/Сб): ');
  Readln(cdw);
  { определить номер дня недели для начальной даты }
  i:=Pos(cdw,cdow);
  if i=0 then Writeln('Неверно указан день недели!')
  else begin
    dw:=(i-1) div 2;
    if m1=m2 then days:=d2-d1+1
    else begin
      days:=days+mdays[m1]-d1+1; { до конца месяца первой даты}
      days:=days+d2; {плюс от начала месяца последней даты}
      for i:=m1+1 to m2-1 do days:=days+mdays[i] { плюс полные месяцы }
    end;
    a:=(14-m1) div 12; y1:=y-a; m:=m1+12*a-2;
    dow:=(7000+(d1+y1+y1 div 4-y1 div 100+y1 div 400+(31*m) div 12)) mod 7;
    if (d1>=28) and (m1=2) then { определить, високосный ли год }
      if ((y mod 4)=0) and ((y mod 100)<>0) or ((y mod 400)=0)
      then days:=days+1;
    { установлено количество дней в интервале }
    i:=days mod 7;
    days:=days div 7;
    if (dw>=dow) and ((dw-dow)< i) then days:= days +1;
    Writeln('Количество '+cdw,': ',days)
  end
end.

Тестовое решение:
Введите начало интервала (день месяц год):
12 5 2015
Введите номера дня и месяца конца интервала:
24 6
Укажите, какой день недели подсчитать (Вс/Пн/Вт/Ср,Чт/Пт/Сб):
Ср
Количество Ср: 7

(142k баллов)