Предмет: Информатика, автор: Nicolleta

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


Аноним: Есть проблема: поскольку год не указан, неизвестно с какого дня недели начинается интервал, следовательно, невозможно определить день недели ни для одной даты из этого интервала. Следует или указать год (это сложнее), или название дня недели для начала интервала.
Nicolleta: скорее всего день недели для начала интервала.
Аноним: Также надо знать, високосный ли год, если в интервал попадает переход с февраля на март
Nicolleta: помогите пожалуйста))
Аноним: Либо тогда все же указать год и вставить алгоритм "вечного календаря", можно в упрощенном виде для 20-21 веков....
Аноним: В целом получается уже монстровито...(((

Ответы

Автор ответа: Аноним
2
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

Похожие вопросы
Предмет: Українська мова, автор: МіхаВедмідь
Предмет: Алгебра, автор: nikitakolbich4
Предмет: Математика, автор: pterod2014