Помощь - Поиск - Пользователи - Календарь
Полная версия: Изменение кода
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ds2207
Условие задачи: По введенной текущей дате (число, месяц и год), текущем дне недели, дате (число, месяц и год) своего рождения определить день недели своего рождения.

Код:

Код

   type
  tDate = record
    Day, Month, Year, DayOfWeek : Integer;
  end;
  
function Compare(Date1, Date2 : tDate) : Boolean;
begin
  Compare := ( Date1.Year = Date2.Year )
         and (Date1.Month = Date2.Month)
         and (  Date1.Day = Date2.Day  );
end;

procedure DecDay(var Date : tDate);
const
  Days : array [1..12] of Integer =
         (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
  Dec(Date.Day);
  if Date.Day = 0 then
    begin
      Dec(Date.Month);
      if Date.Month = 0 then
        begin
          Dec(Date.Year);
          Date.Month := 12;
        end;
      if Date.Month <> 2 then
        Date.Day := Days[Date.Month]
      else if (Date.Year mod 100 = 0) and (Date.Year mod 400 = 0) then
        Date.Day := 29
      else if Date.Year mod 4 = 0 then
        Date.Day := 29
      else
        Date.Day := 28;
    end;
    
  Dec(Date.DayOfWeek);
  if Date.DayOfWeek = 0 then
    Date.DayOfWeek := 7;
end;

const
  Week : array [1..7] of String[15] = ('понедельник', 'вторник', 'среда',
                               'четверг', 'пятница', 'суббота', 'воскресенье');
var
  Current, Birth : tDate;
  i : Integer;
begin
  Write(' Введите день рождения: '); ReadLn(Birth.Day  );
  Write('Введите месяц рождения: '); ReadLn(Birth.Month);
  Write('  Введите год рождения: '); ReadLn(Birth.Year );
  
  Write('Введите сегодняшнее число: '); ReadLn(Current.Day  );
  Write('    Введите текущий месяц: '); ReadLn(Current.Month);
  Write('      Введите текущий год: '); ReadLn(Current.Year );
  
  for i := 1 to 7 do
    WriteLn(i, ' - ', Week[i]);
  Write('Введите номер сегодняшнего деня недели: '); ReadLn(Current.DayOfWeek);
  
  while Not Compare(Current, Birth) do
    begin
      //WriteLn(Current.Day, '.', Current.Month, '.', Current.Year, ' - ', Week[Current.DayOfWeek]);
      DecDay(Current);
    end;
    
  WriteLn('Ваш день рождения приходится на ', Week[Current.DayOfWeek]);
end.




Переделайте,пожалуйста код,чтобы в нём отсутствовали функции



.
Федосеев Павел
Если тебе не критичен метод расчёта разности дней между датами, то можно применить формулы Юлианской даты. Там идея в следующем. Каждому дню в истории человечества от сотворения мира (от даты с первым упоминанием о человеке - ранее нет ни черепков ни каменных орудий ни кострищ) сопоставляется число. Эти числа удобно складывать и вычитать.
Для отладки я что-то закомментировал - разберёшься.
Код
program q;

type
  tDate = record
    Day, Month, Year, DayOfWeek: dword;
  end;
const
  Week: array [1..7] of string[15] = ('понедельник', 'вторник', 'среда',
    'четверг', 'пятница', 'суббота', 'воскресенье');
var
  Current, Birth: tDate;
  i: integer;
  a, y, m: dword;
  CurrJDN, BirthJDN: dword;
begin
(*
  Write(' Введите день рождения: '); ReadLn(Birth.Day  );
  Write('Введите месяц рождения: '); ReadLn(Birth.Month);
  Write('  Введите год рождения: '); ReadLn(Birth.Year );

  Write('Введите сегодняшнее число: '); ReadLn(Current.Day  );
  Write('    Введите текущий месяц: '); ReadLn(Current.Month);
  Write('      Введите текущий год: '); ReadLn(Current.Year );

  for i := 1 to 7 do
    WriteLn(i, ' - ', Week[i]);
  Write('Введите номер сегодняшнего деня недели: '); ReadLn(Current.DayOfWeek);
*)
  with Birth do
  begin
    Day   := 28;
    Month := 12;
    Year  := 2013;
  end;
  with Current do
  begin
    Day   := 29;
    Month := 12;
    Year  := 2014;
    DayOfWeek := 1;
  end;
  {Вычисление JDN текущей даты}
  with Current do
  begin
    a := (14 - Month) div 12;
    y := Year + 4800 - a;
    m := Month + 12 * a - 3;
    CurrJDN := Day + ((153 * m + 2) div 5) + 365 * y + (y div 4) - (y div 100) + (y div 400) - 32045;
  end;
  {Вычисление JDN даты рождения}
  with Birth do
  begin
    a := (14 - Month) div 12;
    y := Year + 4800 - a;
    m := Month + 12 * a - 3;
    BirthJDN := Day + ((153 * m + 2) div 5) + 365 * y + (y div 4) - (y div 100) + (y div 400) - 32045;
  end;
  Birth.DayOfWeek := (7 + Current.DayOfWeek - (CurrJDN - BirthJDN) mod 7) mod 7;
  if Birth.DayOfWeek = 0 then
    Birth.DayOfWeek := 7;
  WriteLn('Ваш день рождения приходится на ', Week[Birth.DayOfWeek]);
end.
ds2207
Спасибо,вы мне очень помогли)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.