Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2007, 17:31   #1
Omedus
Пользователь
 
Аватар для Omedus
 
Регистрация: 01.11.2007
Сообщений: 27
Вопрос Нахождение количества понедельников в XX веке

Доброго времени суток. Подскажите пожалуйста идею решения задачки:
Цитата:
Определить количество понедельников в XX веке, приходящихся на 13 число. Исходные данные 31 декабря 1996 года (это високосный год) - вторник.
Генерация случайных чисел — слишком важное дело, чтобы оставлять её на волю случая.
Scientia potentia est
Omedus вне форума Ответить с цитированием
Старый 25.11.2007, 11:27   #2
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Можно увеличивать и уменьшать года, при этом надо сделать цикл, просматривающий каждый год на предмет- сколько понедельников в нем.
Но думаю способ лучше- вначале подкорретировать данные вам данные.
Т.е в общем случае вводится год-месяц-цисло и какой день недели. Вы находите ближайший понедельник и запускаете цикл, который будет прибавлять по 7 дней, пока число-месяц-год не вылезит за 20 век.
bill вне форума Ответить с цитированием
Старый 25.11.2007, 12:43   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Сколько всего понедельников в ХХ веке подсчитать легко. Если 31.12.1996 г. - вторник, с начала века прошло 365*96+96/4=35064 дня. 35064:7 дает остаток 1, значит 01.01.1901 г. - понедельник. Всего дней в ХХ веке = 365*100+96/4=36525. Понедельников=36525 div 7 =5217.
Главная проблема какие из них попадают на 13 число, поскольку это связано с дурацким календарем.
puporev вне форума Ответить с цитированием
Старый 28.11.2007, 21:54   #4
Omedus
Пользователь
 
Аватар для Omedus
 
Регистрация: 01.11.2007
Сообщений: 27
Сообщение

Я написал программу, но в ней работает лишь половина кода. Программа считает количество понедельников, выпадающих на 13е число с 1997 по 1999 (эти года я взял т.к. в условии сказано о 31.12.1996 - вторник). Таких понедельников всего 6 (правильно - проверял). Но когда я начинаю прокручивать счётчик от 1996 до 1900 в обратном порядке моя программа ничего не считает Подскажите пожалуйста ошибку во втором счётчике.
Вот мой код:
Код:
uses crt;
var
d,v,i,k,m,y,j:integer; {d - номер дня недели, v - колличество дней в феврале,
i,j - счётчики годов и дней в месяце,
k - количество дней в текущем (т.е. в том, который сейчас проверяется) месяце,
m - номер месяца, y - искомое количество понедельников, выпадающих на 13е число}
begin
y:=0;
d:=3;
for i:=1997 to 1999 do
  begin
  if (i mod 4)=0 then v:=29
  else v:=28;
  for m:=1 to 12 do
    begin
    if m=1 then k:=31;
    if m=2 then k:=v;
    if m=3 then k:=31;
    if m=4 then k:=30;
    if m=5 then k:=31;
    if m=6 then k:=30;
    if m=7 then k:=31;
    if m=8 then k:=31;
    if m=9 then k:=30;
    if m=10 then k:=31;
    if m=11 then k:=30;
    if m=12 then k:=31;
    for j:=1 to k do
      begin
      if (d=1) and (j=13) then y:=y+1;
      d:=d+1;
      if d=8 then d:=1;
      end;
    end;
  end;
d:=2;
for i:=1996 to 1900 do
  begin
  if (i mod 4)=0 then v:=29
  else v:=28;
  for m:=12 to 1 do
    begin
    if m=1 then k:=31;
    if m=2 then k:=v;
    if m=3 then k:=31;
    if m=4 then k:=30;
    if m=5 then k:=31;
    if m=6 then k:=30;
    if m=7 then k:=31;
    if m=8 then k:=31;
    if m=9 then k:=30;
    if m=10 then k:=31;
    if m=11 then k:=30;
    if m=12 then k:=31;
    for j:=k to 1 do
      begin
      if (d=1) and (j=13) then y:=y+1;
      d:=d-1;
      if d=0 then d:=7;
      end;
    end;
  end;
write(y);
end.
Генерация случайных чисел — слишком важное дело, чтобы оставлять её на волю случая.
Scientia potentia est

Последний раз редактировалось Omedus; 28.11.2007 в 21:56. Причина: Опечатка
Omedus вне форума Ответить с цитированием
Старый 28.11.2007, 22:04   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
for i:=1996 to 1900 do
Это неправильно, нужно for i:=1996 downto 1901 do ...
Век начинается 01.01.1901 года. Я же это писал в своем первом посте.
Или for i:=1901 to 1996 do
Заканчивается век 31.12.2000 года . Поправь все, должно работать.
puporev вне форума Ответить с цитированием
Старый 28.11.2007, 22:17   #6
Omedus
Пользователь
 
Аватар для Omedus
 
Регистрация: 01.11.2007
Сообщений: 27
Хорошо

Цитата:
Сообщение от puporev Посмотреть сообщение
Это неправильно, нужно for i:=1996 downto 1901 do ...
Век начинается 01.01.1901 года. Я же это писал в своем первом посте.
Или for i:=1901 to 1996 do
Заканчивается век 31.12.2000 года . Поправь все, должно работать.
Тьфу Я не заметил) Большое спасибо =) Всё работает)
Генерация случайных чисел — слишком важное дело, чтобы оставлять её на волю случая.
Scientia potentia est
Omedus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Литература в помощь при работе с базами данных Speeker БД в Delphi 15 10.07.2014 09:39
Подсчитать количества знака в числе valerij Microsoft Office Excel 5 17.08.2008 16:52
непрерывная смена большого количества фотографий brenfire Помощь студентам 5 08.08.2008 11:23
Подсчет количества и частоты Ensoph Помощь студентам 6 08.05.2008 10:16
Подсчет количества заданных символов в строке Mihailo Помощь студентам 3 23.12.2007 11:58