Last active
June 1, 2017 00:29
-
-
Save chainq/12761a20d88f995d754b71d6a3127362 to your computer and use it in GitHub Desktop.
Example about Sets, Enums and Arrays in Pascal (requires Free Pascal 2.4 or newer)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{$MODE OBJFPC} | |
program MonthsAndSeasons; | |
uses | |
sysutils, dateutils; | |
function hasArguments: boolean; | |
const | |
yesNo: array[boolean] of string = ( 'No', 'Yes' ); | |
begin | |
result:=ParamCount > 0; | |
writeln('Arguments: ',yesNo[result]); | |
end; | |
type | |
Months = ( January = 1, February, March, April, May, June, | |
July, August, September, October, November, December ); | |
Seasons = ( Winter, Spring, Summer, Autumn ); | |
MonthsOfSeason = set of Months; | |
const | |
{ Enums with explicit value setting cannot be used as index value | |
in the array declaration, so use low/high approach here } | |
MonthStrings: array[low(Months)..high(Months)] of string = | |
( 'January', 'February', 'March', 'April', 'May', 'June', | |
'July', 'August', 'September', 'October', 'November', 'December' ); | |
SeasonStrings: array[Seasons] of string = | |
( 'Winter', 'Spring', 'Summer', 'Autumn' ); | |
const | |
WinterMonths = [ December, January, February ]; | |
SpringMonths = [ March, April, May ]; | |
SummerMonths = [ June, July, August ]; | |
AutumnMonths = [ September, October, November ]; | |
const | |
SeasonData: array[Seasons] of MonthsOfSeason = | |
( WinterMonths, SpringMonths, SummerMonths, AutumnMonths ); | |
HalfsOfYear: array[boolean] of MonthsOfSeason = | |
( [January..June], [July..December] ); | |
procedure printOutMonthAndSeason(currentMonth: Months); | |
const | |
FirstSecond: array[boolean] of string = ( 'first', 'second' ); | |
var | |
currentSeason: MonthsOfSeason; | |
s: Seasons; | |
begin | |
s:=low(Seasons); | |
for currentSeason in SeasonData do | |
begin | |
if currentMonth in currentSeason then | |
writeln(MonthStrings[currentMonth],' is during the ',SeasonStrings[s], | |
' in the ',FirstSecond[currentMonth in HalfsOfYear[true]],' half of the year'); | |
Inc(s); | |
end; | |
end; | |
function getMonthFromDate: Months; | |
begin | |
result:=Months(MonthOf(Date)); | |
end; | |
function getMonth: Months; | |
var | |
code: Integer; | |
begin | |
if hasArguments then | |
begin | |
{ Because result is of "Months" type which is an enum, | |
thanks to RTTI this will accept also months names as | |
parameters coming from the command line, and convert | |
them to the right enum value... } | |
Val(ParamStr(1), result, code); | |
if code > 0 then | |
begin | |
writeln('That''s not a month.'); | |
result:=getMonthFromDate; | |
end; | |
end | |
else | |
result:=getMonthFromDate; | |
end; | |
begin | |
printOutMonthAndSeason(getMonth); | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment