Хотите получать гороскоп прямо на экране старого-доброго DOS-терминала, не отвлекаясь на браузер и мобильные приложения? Достаточно 20 строк кода на Turbo Pascal, чтобы программа сама определяла знак зодиака по введённой дате рождения и выдавала краткое, но «глубокое» предсказание на день. Ниже, пошаговый мастер-класс с готовым кодом, пояснениями и лайфхаками для ленивых разработчиков.
Что умеет наша «астро-прога»?
- Определяет 12 классических знаков зодиака по дате рождения.
- Генерирует короткое предсказание, выбирая случайную фразу из заранее заданного массива.
- Работает без сети и запускается даже на старом Pentium-100.
- Компилируется в EXE-файл ~15 КБ — можно носить на дискете!
Алгоритм «на лень» за 3 шага
Готовим константы знаков
Каждому знаку соответствует диапазон дат. Массив Zodiacs хранит названия и границы:
type TZodiac = record Name : string[11]; StartMonth, StartDay, EndMonth, EndDay : byte; end; const Zodiac : array[1..12] of TZodiac = ((Name: 'Овен'; StartMonth: 3; StartDay: 21; EndMonth: 4; EndDay: 19), (Name: 'Телец'; StartMonth: 4; StartDay: 20; EndMonth: 5; EndDay: 20), ... (Name: 'Рыбы'; StartMonth: 2; StartDay: 19; EndMonth: 3; EndDay: 20));
Определяем знак по дате
Функция GetZodiacSign сравнивает введённую дату с границами диапазонов:
function GetZodiacSign(M, D: byte): string; var i: byte; begin for i := 1 to 12 do if ((M = Zodiac[i].StartMonth) and (D >= Zodiac[i].StartDay)) or ((M = Zodiac[i].EndMonth) and (D <= Zodiac[i].EndDay)) then begin GetZodiacSign := Zodiac[i].Name; Exit; end; GetZodiacSign := 'Неизвестно'; end;
Генерируем «точное» предсказание
Массив Predictions содержит 20 фраз, которые придают дню «космический» смысл:
const Predictions : array[1..20] of string =
('Сегодня Луна в трине к Венере: смело беритесь за новое!',
'День обещает приятные финансовые сюрпризы.',
... 'Избегайте споров с близкими, звёзды на вашей стороне, если будете дипломатичны.');
Выбираем случайную строку:
Randomize; Prediction := Predictions[Random(20) + 1];
Полный листинг «на лень» (копируйте и запускайте)
program AstroOnLazy;
uses Crt;
type TZodiac = record
Name : string[11];
StartMonth, StartDay, EndMonth, EndDay : byte;
end;
const
Zodiac : array[1..12] of TZodiac =
((Name: 'Овен'; StartMonth: 3; StartDay: 21; EndMonth: 4; EndDay: 19),
(Name: 'Телец'; StartMonth: 4; StartDay: 20; EndMonth: 5; EndDay: 20),
(Name: 'Близнецы'; StartMonth: 5; StartDay: 21; EndMonth: 6; EndDay: 20),
(Name: 'Рак'; StartMonth: 6; StartDay: 21; EndMonth: 7; EndDay: 22),
(Name: 'Лев'; StartMonth: 7; StartDay: 23; EndMonth: 8; EndDay: 22),
(Name: 'Дева'; StartMonth: 8; StartDay: 23; EndMonth: 9; EndDay: 22),
(Name: 'Весы'; StartMonth: 9; StartDay: 23; EndMonth: 10; EndDay: 22),
(Name: 'Скорпион'; StartMonth: 10; StartDay: 23; EndMonth: 11; EndDay: 21),
(Name: 'Стрелец'; StartMonth: 11; StartDay: 22; EndMonth: 12; EndDay: 21),
(Name: 'Козерог'; StartMonth: 12; StartDay: 22; EndMonth: 1; EndDay: 19),
(Name: 'Водолей'; StartMonth: 1; StartDay: 20; EndMonth: 2; EndDay: 18),
(Name: 'Рыбы'; StartMonth: 2; StartDay: 19; EndMonth: 3; EndDay: 20));
Predictions : array[1..20] of string =
('Сегодня звёзды советуют не откладывать важные дела.',
'День благоприятен для новых знакомств.',
... 'Неблагоприятный период для крупных трат — ожидайте лучшего момента.');
var
Day, Month: byte;
Sign: string;
Prediction: string;
function GetZodiacSign(M, D: byte): string;
var i: byte;
begin
for i := 1 to 12 do
if ((M = Zodiac[i].StartMonth) and (D >= Zodiac[i].StartDay)) or
((M = Zodiac[i].EndMonth) and (D <= Zodiac[i].EndDay)) then
begin
GetZodiacSign := Zodiac[i].Name;
Exit;
end;
GetZodiacSign := 'Неизвестно';
end;
begin
ClrScr;
Writeln('=== Астро-прога «на лень» ===');
Write('Введите день рождения (DD): '); Readln(Day);
Write('Введите месяц рождения (MM): '); Readln(Month);
Sign := GetZodiacSign(Month, Day);
Randomize;
Prediction := Predictions[Random(20) + 1];
Writeln;
Writeln('Ваш знак: ', Sign);
Writeln('Предсказание на сегодня: ', Prediction);
Writeln;
Writeln('Нажмите Enter для выхода.');
Readln;
end.
Как компилировать и запускать
- Установите Turbo Pascal 7.0 или Free Pascal IDE;
- Создайте файл
astro.pas, вставьте код выше. - Нажмите Ctrl+F9 — получите
astro.exe. - Запустите
astro.exeв DOSBox или на реальном железе.
Лайфхаки для ленивых
- Добавьте цвет: команды
TextColor(Yellow);иTextBackground(Blue);сделают вывод праздничным. - Храните предсказания в отдельном файле: при старте программа читает
predict.txtи загружает 100 фраз без перекомпиляции. - Сделайте горячие клавиши: клавиша F1 — повторить предсказание, Esc — выход.
Что дальше?
Расширьте функционал: добавьте совместимость знаков, считывайте дату рождения партнёра и выводите «любовный рейтинг». Или интегрируйте лунный календарь — тогда «ленивое» приложение станет полезным планировщиком дел. Главное — не бойтесь экспериментировать: даже в старом Turbo Pascal звёзды говорят на вашем языке!