|
Вопрос # 2 668/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Помогите мне,еще раз, с решением одной задачки,звучит она так
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задала: Зарина (статус: Посетитель)
Вопрос отправлен: 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™ (статус: Доктор наук), 21 апреля 2009, 21:46 [#1]:
Ничо не понял. Ну неужели лень сразу по-нормальному объяснить, что тебе надо, а? Всё равно, ведь, придётся!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Зарина (статус: Посетитель), 22 апреля 2009, 14:38 [#2]:
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™ (статус: Доктор наук), 22 апреля 2009, 15:52 [#5]:
Да я в курсе!
Это я пример привёл того, что такие функции уже есть.
Там в комментариях к функции EncodeDate() как раз и написано, что если дата некорректная, то EConvertError.
З. Ы. И вообще, постановка вопроса, подобная изначальной, говорит о том, что автор вопроса не понимает самого вопроса. Можно было попросить написать аналог функции TryEncodeDate() или хотя бы объяснить по-человечески. Ты сам-то быстро вкурил, в чём суть проблемы?
Цитата:
min@y,что именно тебе непонятно.
Вообще не понимаю эту фразу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 22 апреля 2009, 16:03 [#6]:
"попросить написать аналог функции TryEncodeDate() ". ага. человек не знает базовых функций, а мы тут высшими материями размышляем.
" постановка вопроса, подобная изначальной, говорит о том, что автор вопроса не понимает самого вопроса." А кто сомневается? Сами преподаватели иногда не совсем понимают, что надо в задаче писать.
"Ты сам-то быстро вкурил, в чём суть проблемы?" я не курю но задача то простая. прочитал и понял, вот только не понял, почему там так хитро структуру объявили - скорее всего остатки с старой методички от АЯП (алгоритмический язык программирования, был когда то такой)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 22 апреля 2009, 21:07 [#7]:
Предлагаю админу создать новый раздел сайта и назвать его "Как нельзя задавать вопросы".
Формат раздела оформить в виде таблицы, где в левой колонке – исходный вопрос, в средней – правильная постановка этого вопроса, сформулированная экспертами и/или самим админом, а в правой колонке – примечание и/или набор ссылок по сабжам. Примерно вот так вот:
Исходный вопрос | Перевод вопроса на русский язык | Ссылка |
Составьте мне программу вырезания гландов через задницу!!! | В какой поликлинике бесплатно лечат геморрой? | Вот тут |
Дайте в зубы шоп дым пашол!!! | Не угостите ли сигареткой? | Вот тут |
Я пимпочку нажала, а оно КАК ПИКНЕТ!!! | Как грамотно составить ПСЖ? | Вот тут |
Братва, СОС, лаба горит!!! Задание вот тут!!! | Дата задана в трех переменных y (год), m(месяц) и d (день). Проверить корректность даты. | Вот тут |
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|