Полностью рабочий консольный календарь на yabasic. Программа сама определяет текущий год и месяц из системы, рисует сетку на 12 месяцев и выделяет важные дни прямо в терминале.
Что умеет программа:
Управление: просто запустите скрипт, календарь на текущий год отрисуется автоматически. (Для выхода — Enter).
Листинг кода:
Что умеет программа:
- Берет системную дату: год и день автоматически подтягиваются из date$.
- Цветовое кодирование: названия месяцев — голубые, заголовок года — желтый.
- Выходные: суббота и воскресенье (числа) выделены красным цветом.
- Эффект «живого» календаря: сегодняшнее число автоматически подсвечивается черным текстом на желтом фоне.
Управление: просто запустите скрипт, календарь на текущий год отрисуется автоматически. (Для выхода — Enter).
Листинг кода:
Код: Выделить всё
clear screen
sub center$(s$, width)
local fill1
fill1 = floor((width - len(s$)) / 2)
// Используем быструю встроенную функцию string$ для пробелов
return string$(fill1, " ") + s$ + string$(width - fill1 - len(s$), " ")
end sub
sub makeMonth(name, skip, days, cal$(), j)
local cal, curday, line$, i, day$
curday = 1 - skip
cal$(j, 1) = center$(left$(months$(name), 3), 20)
cal$(j, 2) = "MO TU WE TH FR SA SU"
for cal = 3 to 8
line$ = ""
for i = 1 to 7
day$ = " "
if curday >= 1 and curday <= days then
if curday < 10 then
day$ = " " + str$(curday)
else
day$ = str$(curday)
end if
end if
line$ = line$ + day$
if i < 7 then
line$ = line$ + " "
end if
curday = curday + 1
next
cal$(j, cal) = line$
next
end sub
// Вывод недели с выделением выходных (красный) и сегодняшнего дня (желтый фон)
sub print_week(week$, is_cur_month, cur_d)
local i, day_str$, space_str$, txt_col$
for i = 1 to 7
day_str$ = mid$(week$, (i-1)*3 + 1, 2)
// Определяем цвет: выходные красные, будни белые
if i = 6 or i = 7 then
txt_col$ = "red"
else
txt_col$ = "white"
end if
// Если это сегодняшний день - инвертируем цвета (желтый фон)
if is_cur_month and val(day_str$) = cur_d and val(day_str$) <> 0 then
print color("black", "yellow") day_str$;
else
print color(txt_col$, "black") day_str$;
end if
// Печатаем пробел между днями (он всегда черный)
if i < 7 then
space_str$ = mid$(week$, (i-1)*3 + 3, 1)
print color("white", "black") space_str$;
end if
next i
end sub
dim months$(12)
n = token("JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER", months$(), ",")
dim daysPerMonth(12)
for n = 1 to 12
read daysPerMonth(n)
next
data 31,28,31,30,31,30,31,31,30,31,30,31
sub print_cal(year, cur_m, cur_d)
local q, l, m, i, startday, dpm, calendar$(12, 8)
startday = mod((year-1)*365 + floor((year-1)/4) - floor((year-1)/100) + floor((year-1)/400), 7)
if (mod(year, 4) = 0 and mod(year, 100) <> 0) or mod(year, 400) = 0 then
daysPerMonth(2) = 29
end if
for i = 1 to 12
dpm = daysPerMonth(i)
makeMonth(i, startday, dpm, calendar$(), i)
startday = mod(startday + dpm, 7)
next
// Заголовок года (Желтый)
print color("yellow", "black") center$("--- " + str$(year) + " ---", 89)
print
for q = 0 to 2
// Названия месяцев (Голубой)
for m = 1 to 4
print color("cyan", "black") calendar$(q * 4 + m, 1);
if m < 4 then
print color("white", "black") " | ";
end if
next
print
// Дни недели (Белый)
for m = 1 to 4
print color("white", "black") calendar$(q * 4 + m, 2);
if m < 4 then
print color("white", "black") " | ";
end if
next
print
// Недели
for l = 3 to 8
for m = 1 to 4
print_week(calendar$(q * 4 + m, l), (q * 4 + m = cur_m), cur_d)
if m < 4 then
print color("white", "black") " | ";
end if
next
print
next
if q < 2 then
print
end if
next
end sub
// Получаем текущую дату из системы
dim d$(6)
n = split(date$, d$(), "-")
current_year = val(d$(4))
current_month = val(d$(2))
current_day = val(d$(3))
print_cal(current_year, current_month, current_day)