Изменение кода |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Изменение кода |
ds2207 |
28.12.2014 19:25
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дима Репутация: 0 |
Условие задачи: По введенной текущей дате (число, месяц и год), текущем дне недели, дате (число, месяц и год) своего рождения определить день недели своего рождения.
Код: Код 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. Переделайте,пожалуйста код,чтобы в нём отсутствовали функции . Сообщение отредактировано: ds2207 - 28.12.2014 23:09 |
Федосеев Павел |
29.12.2014 9:20
Сообщение
#2
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Если тебе не критичен метод расчёта разности дней между датами, то можно применить формулы Юлианской даты. Там идея в следующем. Каждому дню в истории человечества от сотворения мира (от даты с первым упоминанием о человеке - ранее нет ни черепков ни каменных орудий ни кострищ) сопоставляется число. Эти числа удобно складывать и вычитать.
Для отладки я что-то закомментировал - разберёшься. Код 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 |
1.01.2015 20:01
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дима Репутация: 0 |
Спасибо,вы мне очень помогли)
|
Текстовая версия | 29.09.2024 7:39 |