RosettaCodeData/Task/Calendar/FreeBASIC/calendar.basic

126 lines
3.3 KiB
Plaintext

' version 17-02-2016
' compile with: fbc -s console
' TRUE/FALSE are built-in constants since FreeBASIC 1.04
' For older versions they have to be defined.
#Ifndef TRUE
#Define FALSE 0
#Define TRUE Not FALSE
#EndIf
Function WD(m As Integer, d As Integer, y As Integer) As Integer
' Zellerish
' 0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday
' 4 = Thursday, 5 = Friday, 6 = Saturday
If m < 3 Then ' if m = 1 or m = 2 then
m += 12
y -= 1
End If
Return (y + (y \ 4) - (y \ 100) + (y \ 400) + d + ((153 * m + 8) \ 5)) Mod 7
End Function
Function LEAPYEAR(y As Integer) As Integer
If (y Mod 4) <> 0 Then Return FALSE
If (y Mod 100) = 0 AndAlso (y Mod 400) <> 0 Then Return FALSE
Return TRUE
End Function
' ------=< main >=------
Dim As String wdn = "Mo Tu We Th Fr Sa Su" ' weekday names
Dim As String mo(1 To 12) => {"January", "February", "March", "April", _
"May", "June", "July", "August", "September", _
"October", "November", "December"}
Dim As String tmp1, tmp2, d(1 To 12)
Dim As UInteger ml(1 To 12) => {31,28,31,30,31,30,31,31,30,31,30,31}
Dim As UInteger i, i1, j, k, y = 1969
Dim As UInteger m_row = 6
Do
While InKey <> "" : Wend ' clear keyboard buffer
Print : Print " For wich year do want a calendar"
Print " Year must be greater then 1752"
Input " Input year (enter = 1969)";tmp1
If tmp1 = "" Then Exit Do
i = Val(tmp1)
If i < 1752 Then
Print
Print " Can only make a calendar for a year after 1752"
Beep : Sleep 5000, 1 : Print
Else
y = i : Exit Do
End If
Loop
Cls
Do
While InKey <> "" : Wend ' clear keyboard buffer
Print : Print " Make device choice"
Print " 132 characters Line printer, 6x2 months (Enter or 1)"
Print " 80x43 display, 3x4 months (2)"
Do
tmp1 = InKey
If tmp1 = Chr(13) Or tmp1 = "1" Then Exit Do, Do
If tmp1 = "2" Then
m_row = 3
Exit Do, Do
End If
Loop Until tmp1 <> ""
Print : Print " Enter, 1 or 2 only"
Beep : Sleep 5000, 1 : Print
Loop
Cls
Dim As UInteger char_line = m_row * 22 - 1
If LEAPYEAR(y) = TRUE Then ml(2) = 29
tmp1 = ""
For i = 1 To 31
tmp1 = tmp1 + Right((" " + Str(i)), 3)
Next
For i = 1 To 12
tmp2 = ""
j = WD(i,1, y)
If j = 0 Then j = 7
j = j - 1
tmp2 = Space(j * 3) + Left(tmp1, ml(i) * 3) + Space(21)
d(i) = tmp2
Next
Print
tmp1 = Str(y)
Print Space((char_line + (char_line And 1) - Len(tmp1)) \ 2); tmp1
Print
tmp2 = " " ' make the weekday names line
For i = 1 To m_row
tmp2 = tmp2 + wdn
If i < m_row Then tmp2 = tmp2 + " "
Next
For i = 1 To 12 Step m_row
tmp1 = ""
For j = i To i + m_row -2 ' make the month names line
tmp1 = tmp1 + Left(Space((22 - Len(mo(j))) \ 2) + mo(j) + Space(21), 22)
Next
tmp1 = tmp1 + Space((22 - Len(mo(i + m_row -1))) \ 2) + mo(i + m_row -1)
Print tmp1
Print tmp2
For j = 1 To 85 Step 21
For k = i To i + m_row -2
Print Mid(d(k), j ,21); " ";
Next
Print Mid(d(i + m_row -1), j ,21)
Next
Print
Next
' empty keyboard buffer
While InKey <> "" : Wend
'Print : Print "hit any key to end program
Sleep
End