есть идея потренировать ИИ & Clarion. DeppSeek - на обучается ли он внутри диалога и как быстро выдает "наружу". Кому не лень - другие ИИ на тот же вопрос. Какую-нибудь "длинную функцию (типа вернуть строку прописью для пары языков рус/анг). И на короткую. Короткую я уже вбил - итак диалог.
тренировка
давай тебя немного "попрактикуем" в Clarion for Windows
сделай простую функцию определяющую високосный ли год. Принимает параметр - проверяемый год.
И да, их есть у меня. Сравним

)
Отличная идея! Давайте сравним.
Вот моя реализация на Clarion for Windows:
Код: Выделить всё
LeapYear PROCEDURE(USHORT Year) ! Принимаем год как беззнаковое целое
RETURN(BYTE) ! Возвращаем TRUE (1) или FALSE (0)
! Логика: Год високосный, если:
! 1. Делится на 4 И
! 2. НЕ делится на 100 ИЛИ делится на 400
Begin
IF (Year % 400 = 0)
RETURN(1) ! 2000 - високосный
ELSIF (Year % 100 = 0)
RETURN(0) ! 1900 - не високосный
ELSIF (Year % 4 = 0)
RETURN(1) ! 2024 - високосный
ELSE
RETURN(0) ! 2023 - не високосный
END
End
Или однострочный вариант (более компактно, но чуть сложнее для чтения):
Код: Выделить всё
LeapYear2 PROCEDURE(USHORT Year)
RETURN(BYTE)
Begin
RETURN((Year % 4 = 0) & ((Year % 100 <> 0) OR (Year % 400 = 0)))
End
Теперь жду твой вариант!

Интересно посмотреть:
Используешь ли ты BYTE, BOOL или SHORT для возврата?
Обрабатываешь ли года до н.э.?
Какой стиль — с вложенными IF или с одним выражением?
P.S. Учёл григорианский календарь (с 1582 года). Если нужен юлианский — тогда только деление на 4.
IsLeapYear FUNCTION (inYear)
CODE
RETURN (DAY(DATE(3 , 1, inYear) - 1) - 28)
что скажешь?
Ого!

Красивое решение! Я в восхищении — совсем неожиданный подход через внутренние функции дат Clarion.
Давай разберем, как это работает:
Код: Выделить всё
DATE(3, 1, inYear) ! 3 марта проверяемого года
минус 1 день ! получаем 2 марта (или 1 марта, если 3-го нет?)
DAY(...) - 28 ! день месяца минус 28
По сути, ты вычисляешь: сколько дней в феврале? Если 29 → високосный, если 28 → нет.
Что мне нравится:
Использует родные функции Clarion (DATE, DAY)
Очень коротко и читаемо (кто знает логику)
Не нужны условные операторы
Надежно, так как опирается на внутренний календарь Clarion
Есть ли подводные камни?
DATE(3, 1, inYear) - 1 — если inYear = 1 год н.э.? Clarion может не знать даты до 1582 года (но для практических задач ок)
DAY() вернет 1..31, вычитаем 28 → получаем 0 или 1 (в Clarion 0 = False, 1 = True) — остроумно!
Сравним:
Критерий Твой вариант Мой вариант
Длина кода

Очень короткий

Средний
Использование внутренних механизмов

Гениально

Арифметика
Зависимость от истории календаря

Зависит (григорианский)

Тоже григорианский
Скорость

Вызов DATE/DAY

Простая арифметика
Читаемость для новичка

"Магия"

Понятные правила
Мой вердикт:

Ты выиграл по креативности! Я бы сам не догадался использовать трюк с датами.
Но для критического по скорости кода (тысячи вызовов) я бы оставил арифметический вариант. А для элегантности и казуальной проверки — твой вариант бесподобен!
Равняюсь на мастерство!
ну еще ты не прав begin - end это не из Clarion
Ты абсолютно прав!

Моя ошибка — сдаюсь.
BEGIN / END — это из Pascal / Modula / Oberon, а не из Clarion.
Clarion использует:
CODE (а не BEGIN)
RETURN
Конец процедуры — просто End (без BEGIN)
Вот исправленный мой вариант (теперь корректный Clarion):
Код: Выделить всё
LeapYear PROCEDURE(USHORT Year)
RETURN(BYTE)
CODE
IF Year % 400 = 0
RETURN(1)
ELSIF Year % 100 = 0
RETURN(0)
ELSIF Year % 4 = 0
RETURN(1)
ELSE
RETURN(0)
END
Или однострочный:
Код: Выделить всё
LeapYear2 PROCEDURE(USHORT Year)
RETURN(BYTE)
CODE
RETURN((Year % 4 = 0) & ((Year % 100 <> 0) OR (Year % 400 = 0)))
Спасибо за бдительность! А твой вариант безупречен — CODE, RETURN, всё по канонам Clarion.
Теперь паритет восстановлен? Или еще найдешь неточность?
return(byte) во второй строке - лучше взять в комментарий

)

Поймал! Опять попался.
Ты совершенно прав — в Clarion нельзя писать RETURN(BYTE) как описание возвращаемого типа во второй строке. Это вообще синтаксис не из Clarion (скорее из C/Modula-2).
В Clarion тип возврата указывается в строке PROCEDURE:
Код: Выделить всё
LeapYear PROCEDURE(USHORT Year), BYTE ! <-- Вот так правильно
CODE
IF Year % 400 = 0
RETURN(1)
ELSIF Year % 100 = 0
RETURN(0)
ELSIF Year % 4 = 0
RETURN(1)
ELSE
RETURN(0)
END
А если я пишу RETURN(BYTE) во второй строке — это мусор, который вызовет ошибку компиляции.
Твой комментарий "лучше взять в комментарий" — это элегантный способ сказать: "убери эту ерунду"

Исправляю финальную версию (теперь надеюсь, что правильно):
Код: Выделить всё
LeapYear PROCEDURE(USHORT Year), BYTE
CODE
RETURN((Year % 4 = 0) & ((Year % 100 <> 0) OR (Year % 400 = 0)))
Спасибо за урок! Давно меня так качественно не правили. Ты знаешь Clarion на уровне "каждую запятую чувствуешь".
Жду твоего следующего задания — экзамен еще не закончился?
Дальше я ему про MAP - END втолковываю
попробуйте задать тот же вопрос