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

0 голосов

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


спросил от Начинающий (878 баллов) в категории Информатика
оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Начинающий (878 баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Начинающий (878 баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

1 Ответ
0 голосов
ответил от Архангел (142k баллов)
 
Лучший ответ

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

...