Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 668

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Помогите мне,еще раз, с решением одной задачки,звучит она так

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1.  


Зарина Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Зарина (статус: Посетитель)
Вопрос отправлен: 21 апреля 2009, 21:23
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Зарина!
Я надеюсь, что Ваш преподаватель в курсе, что кириллицу использовать в определении имен можно только начиная с 2006 (ой, или 2005) делфи. А в младших версиях - нет.
Поэтому, я чуточку модифицирую условие, смысл от этого и решение не поменяется, только форма записи. Звучать оно теперь будет так. Дата задана в трех переменных y (год), m(месяц) и d (день). Проверить корректность даты.
Что же от нас хотят. А хотят простого. Например, понятно, что 30 февраля не существует. итак, набросок кода

//ввод y, m, d
//.....
if (m>12) or (m < 1) then //вообще то эта проверка не нужна, так как тип для месяца уже ограничен. Но ...
//возвратить ошибку.
//расчет, високосный ли год.
if (y mod 4) = 0 and (y mod 400 <> 0) then  maxf := 28 else maxf := 29;
if (m = 2) and (d > maxf) then 
//возвратить ошибку
else if ((m = 4) or (m = 6) or (m = 9) or (m = 11)) and (d > 30) then
//возвратить ошибку
else if d > 31 then
//возвратить ошибку
else
//все проверки пройдены, возвратить ок.
Да, да, все года, которые делятся нацело на 4 - високосные, но если он оканчивается двумя нулями и не делиться нацело на 400 - то нет. То есть год 1900 не является високосным. А 2000 - является.
Этот код конечно можно переписать красивее, но при подобной форме постановки задачи он в самый раз. Ещё раз напоминаю - это не готовый код, а набросок, который надо дополнить реальным кодом. Например на месте "возвратить ошибку", может быть такой код
begin
  ShowMessage('Слишком много дней в феврале!');
  exit;
end

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 апреля 2009, 09:22
Оценка за ответ: 5

Комментарий к оценке: Уважаемый Вадим К,спасибо большое за такое хорошее обьяснение,мне все понятно,попробую реализовать в Delphi

Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 22 апреля 2009, 21:07; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 21 апреля 2009, 21:46 [#1]:

Ничо не понял. Ну неужели лень сразу по-нормальному объяснить, что тебе надо, а? Всё равно, ведь, придётся!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Зарина

Зарина (статус: Посетитель), 22 апреля 2009, 14:38 [#2]:

min@y,что именно тебе непонятно.
min@y™

min@y™ (статус: Доктор наук), 22 апреля 2009, 15:09 [#3]:

Ну что, нельзя было написать просто: "сделать функцию, входные данные - день, месяц, год; выходные данные - корректность даты (true | false)"? Я после ответа Вадика только сообразил, чего нужно.

Смотрю в модуль SysUtils.pas и вижу эту функцию.
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
  I: Integer;
  DayTable: PDayTable;
begin
  Result := False;
  DayTable := @MonthDays[IsLeapYear(Year)];
  if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
    (Day >= 1) and (Day <= DayTable^[Month]) then
  begin
    for I := 1 to Month - 1 do Inc(Day, DayTable^[I]);
    I := Year - 1;
    Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
    Result := True;
  end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 апреля 2009, 15:29 [#4]:

Вообще то в вузах обычно не приветствуется выдавать готовую функцию. Вся фишка в том, что бы научиться писать. А вот на работе обычно нужно помнить, что бы экономить время.
К тому же, что бы переделать приведённую выше функцию, взятую с sysutils.pas, надо знать указатели, а при программировании на паскале/делфи о них обычно умалчивают.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 апреля 2009, 15:52 [#5]:

Да я в курсе!
Это я пример привёл того, что такие функции уже есть.
Там в комментариях к функции EncodeDate() как раз и написано, что если дата некорректная, то EConvertError.

З. Ы. И вообще, постановка вопроса, подобная изначальной, говорит о том, что автор вопроса не понимает самого вопроса. Можно было попросить написать аналог функции TryEncodeDate() или хотя бы объяснить по-человечески. Ты сам-то быстро вкурил, в чём суть проблемы?

Цитата:


min@y,что именно тебе непонятно.


Вообще не понимаю эту фразу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 апреля 2009, 16:03 [#6]:

"попросить написать аналог функции TryEncodeDate() ". ага. человек не знает базовых функций, а мы тут высшими материями размышляем.
" постановка вопроса, подобная изначальной, говорит о том, что автор вопроса не понимает самого вопроса." А кто сомневается? Сами преподаватели иногда не совсем понимают, что надо в задаче писать.
"Ты сам-то быстро вкурил, в чём суть проблемы?" я не курю:) но задача то простая. прочитал и понял, вот только не понял, почему там так хитро структуру объявили - скорее всего остатки с старой методички от АЯП (алгоритмический язык программирования, был когда то такой)
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 апреля 2009, 21:07 [#7]:

Предлагаю админу создать новый раздел сайта и назвать его "Как нельзя задавать вопросы".
Формат раздела оформить в виде таблицы, где в левой колонке – исходный вопрос, в средней – правильная постановка этого вопроса, сформулированная экспертами и/или самим админом, а в правой колонке – примечание и/или набор ссылок по сабжам. Примерно вот так вот:






Исходный вопросПеревод вопроса на русский языкСсылка
Составьте мне программу вырезания гландов через задницу!!!В какой поликлинике бесплатно лечат геморрой?Вот тут
Дайте в зубы шоп дым пашол!!!Не угостите ли сигареткой?Вот тут
Я пимпочку нажала, а оно КАК ПИКНЕТ!!!Как грамотно составить ПСЖ?Вот тут
Братва, СОС, лаба горит!!! Задание вот тут!!!Дата задана в трех переменных y (год), m(месяц) и d (день). Проверить корректность даты.Вот тут
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.04 сек.