CHALLENGE: Timezone calculator.
Seb,
Since you're already the winner of the challenge, adding the logic to validate all the input fields would be a separate exercise to make the program bulletproof. Go ahead if you're really up to it.
*****
Since you're already the winner of the challenge, adding the logic to validate all the input fields would be a separate exercise to make the program bulletproof. Go ahead if you're really up to it.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Sure, go ahead and submit your entry.Guest wrote:Is this competition still going> It says so in the latest issue of QB and I qould like to submit an entry.
We already have announced a winner, but we could use a good second place solution.
Kindly register and sign in before submitting your entry, so we know who the solution belongs to.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
New version + validation (part 1), the other part I'll write later this day:
grtz
Seb
Code: Select all
'(C) 2005, by Sebastian McClouth
DECLARE FUNCTION GA$ (Value AS STRING)
DECLARE FUNCTION Milit$ (Value AS STRING)
DECLARE FUNCTION CC$ (Value AS INTEGER)
CLS
LOCATE , 20: PRINT "Universal TimeZone Calculator"
LOCATE , 20: PRINT "-----------------------------"
LOCATE , 32: PRINT "TIMEZONES:"
LOCATE , 30: PRINT "GMT 0: LONDON"
LOCATE , 1: PRINT "GMT -1: REYKJAVIK"; : LOCATE , 48: PRINT "GMT +1: BERLIN"
LOCATE , 1: PRINT "GMT -2: GREENLAND"; : LOCATE , 48: PRINT "GMT +2: CAIRO"
LOCATE , 1: PRINT "GMT -3: RIO DE JANEIRO, BRAZIL"; : LOCATE , 48: PRINT "GMT +3: MOSCOW"
LOCATE , 1: PRINT "GMT -4: SANTIAGO DE CHILE"; : LOCATE , 48: PRINT "GMT +4: STALINGRAD"
LOCATE , 1: PRINT "GMT -5: NEW YORK"; : LOCATE , 48: PRINT "GMT +5: KARACHI"
LOCATE , 1: PRINT "GMT -6: CHICAGO"; : LOCATE , 48: PRINT "GMT +6: OMSK, RUSSIA"
LOCATE , 1: PRINT "GMT -7: DENVER"; : LOCATE , 48: PRINT "GMT +7: BANGKOK"
LOCATE , 1: PRINT "GMT -8: SEATTLE"; : LOCATE , 48: PRINT "GMT +8: HONG KONG, AND CHINA"
LOCATE , 1: PRINT "GMT -9: ALASKA"; : LOCATE , 48: PRINT "GMT +9: TOKYO"
LOCATE , 1: PRINT "GMT-10: HONOLULU"; : LOCATE , 48: PRINT "GMT+10: SYDNEY"
LOCATE , 1: PRINT "GMT-11: MIDWAY ISLANDS"; : LOCATE , 48: PRINT "GMT+11: SOLOMON ISLANDS"
LOCATE , 48: PRINT "GMT+12: NEW ZEALAND"
PRINT
PRINT STRING$(80, "-")
PRINT "If giving e.g. GMT+1, etc, give as input 1, etc."
PRINT
1 PRINT "Enter FROM timezone: "; : INPUT "", FTz%
IF FTz% <= -12 or FTz% > 12 THEN
PRINT "The chosen timezone is invalid."
GOTO 1
END IF
2 PRINT "Enter GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))) + " respective time as e.g. 04:00: "; : INPUT "", LocalTime$
IF VAL(LEFT$(LocalTime$, 2)) < 00 OR VAL(LEFT$(LocalTime$, 2)) > 23 OR VAL(RIGHT$(LocalTime$, 2)) < 00 OR VAL(RIGHT$(LocalTIme$, 2)) > 59 THEN
PRINT "The chosen time is invalid."
GOTO 2
END IF
3 PRINT : PRINT "Enter TO timezone: "; : INPUT "", TTz%
IF TTz% <= -12 or TTz% > 12 THEN
PRINT "The chosen timezone is invalid."
GOTO 3
END IF
'Adjust LocalTime$ from FTz% to TTz%
'------------------------------------
DateAdjust = 0 'Standard. If not changed not adjust.
HourLocalTime% = VAL(LEFT$(LocalTime$, 2)) 'Get the hours of LocalTime$
'PRINT "Hour(s): "; HourLocalTime%
Tz2Pass% = -FTz% + TTz% 'Calculate the timezones of passing
'PRINT "Timezone(s): "; Tz2Pass%
HourGMTTime% = HourLocalTime% - FTz% 'Bring HourLocalTime% to HourGMTTime%
IF HourGMTTime% < 0 THEN 'If HourGMTTime% < 0 then
HourGMTTime% = 24 + HourGMTTime% 'HourGMTTime% = 24 + HourGMTTime%
ELSEIF HourGMTTime% > 23 THEN 'Elseif HourGMTTime% > 24 then
HourGMTTime% = HourGMTTime% - 24 'HourGMTTime = HourGMTTime + 24
END IF
'PRINT "GMT: "; HourGMTTime% 'We have GMT time...
Temp2Time% = HourGMTTime% + TTz% 'Bringing HourGMTTime to 2Time%
'PRINT "Temp2Time%: "; Temp2Time%
IF Temp2Time% < 0 THEN 'If Temp2Time% < 0 then
Temp2Time% = 24 + Temp2Time% 'Temp2Time% = 24 - Temp2Time%
ELSEIF Temp2Time% > 23 THEN 'Elseif Temp2Time% > 23 then
Temp2Time% = Temp2Time% - 24 'Temp2Time% = Temp2Time% - 24
END IF
'PRINT "2Time%: "; Temp2Time%
TTime$ = LTRIM$(RTRIM$(STR$(Temp2Time%)))
IF LEN(TTime$) < 2 THEN
TTime$ = "0" + TTime$
END IF
TTime$ = TTime$ + RIGHT$(LocalTime$, 3)
'Date adjust routine
'-------------------
'BTW: don't change the above DateAdjust = 0... if you do... trouble...
DateAdjustTempTime% = HourLocalTime% + Tz2Pass%
IF DateAdjustTempTime% < 0 THEN
DateAdjust = -1
ELSEIF DateAdjustTempTime% > 23 THEN
DateAdjust = 1
END IF
PRINT
LOCATE , 1: PRINT "TIMEZONES:";
LOCATE , 20: PRINT "COUNTRY/CITY:";
LOCATE , 46: PRINT "LOCAL TIME:";
LOCATE , 60: PRINT "APROX. DATE ADJUST:"
PRINT STRING$(80, "-")
LOCATE , 1: PRINT "FROM: ";
LOCATE , 8: PRINT "GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%))));
LOCATE , 20: PRINT CC$(FTz%);
LOCATE , 46: PRINT LocalTime$
LOCATE , 1: PRINT "TO:";
LOCATE , 8: PRINT "GMT" + GA$(LTRIM$(RTRIM$(STR$(TTz%))));
LOCATE , 20: PRINT CC$(TTz%);
LOCATE , 46: PRINT LTRIM$(RTRIM$(TTime$));
IF LTRIM$(RTRIM$(STR$(DateAdjust))) = "1" THEN
LOCATE , 60: PRINT "+1"
ELSE
LOCATE , 60: PRINT LTRIM$(RTRIM$(STR$(DateAdjust)))
END IF
FUNCTION CC$ (Value AS INTEGER)
IF Value = 12 THEN CC$ = "New Zealand"
IF Value = 11 THEN CC$ = "Solomon Islands"
IF Value = 10 THEN CC$ = "Sydney"
IF Value = 9 THEN CC$ = "Tokyo"
IF Value = 8 THEN CC$ = "Hong Kong, and China"
IF Value = 7 THEN CC$ = "Bangkok"
IF Value = 6 THEN CC$ = "Omsk, Russia"
IF Value = 5 THEN CC$ = "Karachi"
IF Value = 4 THEN CC$ = "Stalingrad"
IF Value = 3 THEN CC$ = "Moscow"
IF Value = 2 THEN CC$ = "Cairo"
IF Value = 1 THEN CC$ = "Berlin"
IF Value = 0 THEN CC$ = "London"
IF Value = -1 THEN CC$ = "Reykjavik"
IF Value = -2 THEN CC$ = "Greenland"
IF Value = -3 THEN CC$ = "Rio de Janeiro, Brazil"
IF Value = -4 THEN CC$ = "Santiago de Chile"
IF Value = -5 THEN CC$ = "New York"
IF Value = -6 THEN CC$ = "Chicago"
IF Value = -7 THEN CC$ = "Denver"
IF Value = -8 THEN CC$ = "Seattle"
IF Value = -9 THEN CC$ = "Alaska"
IF Value = -10 THEN CC$ = "Honolulu"
IF Value = -11 THEN CC$ = "Midway Island"
END FUNCTION
FUNCTION GA$ (Value AS STRING)
IF VAL(Value) > 0 THEN
GA$ = "+" + Value
ELSEIF Value = "0" THEN
GA$ = " " + Value
ELSE
GA$ = Value
END IF
END FUNCTION
FUNCTION Milit$ (Value AS STRING)
IF LEN(Value) < 5 THEN
Milit$ = "0" + Value
END IF
END FUNCTION
Seb
Seb,
An improved version from you will certainly be welcome. However, any new version from you will not compete for second place, since you already have the first place position.
BTW, I won't start testing your new version(s) until you let me know which is the definitive final version.
*****
An improved version from you will certainly be welcome. However, any new version from you will not compete for second place, since you already have the first place position.
BTW, I won't start testing your new version(s) until you let me know which is the definitive final version.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
So here it is, a bit longer then expected, I kinda forgot to upload it. Anywayz.
Grtz
Seb[/code]
Grtz
Seb
Code: Select all
DEFINT A-Z
DECLARE FUNCTION NumStrict (Value AS STRING)
DECLARE FUNCTION TRIM$ (Value AS STRING)
DECLARE FUNCTION TZN$ (Value AS INTEGER)
DECLARE FUNCTION ValLeft (Value1 AS STRING, Value2 AS INTEGER)
DECLARE FUNCTION ValRight (Value1 AS STRING, Value2 AS INTEGER)
'UTC calculator - written by Moneo, adjusted by Seb McClouth
CLS
LOCATE , 20: PRINT "Universal TimeZone Calculator"
LOCATE , 20: PRINT "-----------------------------"
LOCATE , 32: PRINT "TIMEZONES:"
LOCATE , 30: PRINT "GMT 0: LONDON"
LOCATE , 1: PRINT "GMT -1: REYKJAVIK"; : LOCATE , 48: PRINT "GMT +1: BERLIN"
LOCATE , 1: PRINT "GMT -2: GREENLAND"; : LOCATE , 48: PRINT "GMT +2: CAIRO"
LOCATE , 1: PRINT "GMT -3: RIO DE JANEIRO, BRAZIL"; : LOCATE , 48: PRINT "GMT +3: MOSCOW"
LOCATE , 1: PRINT "GMT -4: SANTIAGO DE CHILE"; : LOCATE , 48: PRINT "GMT +4: STALINGRAD"
LOCATE , 1: PRINT "GMT -5: NEW YORK"; : LOCATE , 48: PRINT "GMT +5: KARACHI"
LOCATE , 1: PRINT "GMT -6: CHICAGO"; : LOCATE , 48: PRINT "GMT +6: OMSK, RUSSIA"
LOCATE , 1: PRINT "GMT -7: DENVER"; : LOCATE , 48: PRINT "GMT +7: BANGKOK"
LOCATE , 1: PRINT "GMT -8: SEATTLE"; : LOCATE , 48: PRINT "GMT +8: HONG KONG, AND CHINA"
LOCATE , 1: PRINT "GMT -9: ALASKA"; : LOCATE , 48: PRINT "GMT +9: TOKYO"
LOCATE , 1: PRINT "GMT-10: HONOLULU"; : LOCATE , 48: PRINT "GMT+10: SYDNEY"
LOCATE , 1: PRINT "GMT-11: MIDWAY ISLANDS"; : LOCATE , 48: PRINT "GMT+11: SOLOMON ISLANDS"
LOCATE , 48: PRINT "GMT+12: NEW ZEALAND"
PRINT
PRINT STRING$(80, "-")
GetFrom:
PRINT "Enter FROM timezone as GMT0, GMT+nn, or GMT-nn: ";
GOSUB GetGMT
IF GMTerr = 1 THEN PRINT "Invalid timezone": GOTO GetFrom
FTz% = GMTzone
FromName$ = ZoneName$
FromGMT$ = GMT$
GetTime:
PRINT "Enter militairy time (hh:mm) e.g. 04:00 for " + FromGMT$ + " : ";
INPUT "", LocalTime$
LocalTime$ = TRIM$(LocalTime$)
IF MID$(LocalTime$, 3, 1) <> ":" OR LEN(LocalTime$) <> 5 THEN PRINT "Invalid time": GOTO GetTime
TLocalTime$ = LEFT$(LocalTime$, 2) + RIGHT$(LocalTime$, 2)
IF NOT NumStrict(TLocalTime$) THEN PRINT "Invalid time": GOTO GetTime
HourLocalTime% = ValLeft(LocalTime$, 2)
MinLocalTime% = ValRight(LocalTime$, 2)
IF HourLocalTime% > 23 OR MinLocalTime% > 59 THEN PRINT "Invalid time": GOTO GetTime
GetTo:
PRINT "Enter TO timezone as GMT0, GMT+nn, or GMT-nn: ";
GOSUB GetGMT
IF GMTerr = 1 THEN PRINT "Invalid timezone": GOTO GetTo
TTz% = GMTzone
ToName$ = ZoneName$
ToGMT$ = GMT$
IF TTz% = FTz% THEN PRINT "FROM and TO timezone must be diffrent": GOTO GetTo
'***** MAIN PROCESS ******
IF FTz% < 0 THEN FromSign$ = "-" ELSE FromSign$ = "+"
IF TTz% < 0 THEN ToSign$ = "-" ELSE ToSign$ = "+"
From.To.Sign$ = FromSign$ + ToSign$
aFTz% = ABS(FTz%)
aTTz% = ABS(TTz%)
Day$ = "0"
SELECT CASE From.To.Sign$
CASE "-+"
DifHours = aFTz% + aTTz%
CASE "--"
IF aFTz% < aTTz% THEN
DifHours = -(aTTz% - aFTz%)
ELSE
'from is greater
DifHours = aFTz% - aTTz%
END IF
CASE "++"
IF aFTz% < aTTz% THEN
DifHours = aTTz% - aFTz%
ELSE
DifHours = -(aFTz% - aTTz%)
END IF
CASE "+-"
DifHours = -(aFTz% - aTTz%)
CASE ELSE
PRINT "SYSERR: Invalid +-"
END SELECT
ToHour = HourLocalTime + DifHours
IF ToHour < 0 THEN ToHour = ToHour + 24: Day$ = "-1": GOTO GotHour
IF ToHour > 24 THEN ToHour = ToHour - 24: Day$ = "+1": GOTO GotHour
'In future release: include date-routines
GotHour:
PRINT
LOCATE , 1: PRINT "TIMEZONES:";
LOCATE , 20: PRINT "COUNTRY/CITY:";
LOCATE , 46: PRINT "LOCAL TIME:";
LOCATE , 60: PRINT "APROX. DATE ADJUST:"
PRINT STRING$(80, "-")
LOCATE , 1: PRINT "FROM: ";
LOCATE , 8: PRINT FromGMT$;
LOCATE , 20: PRINT FromName$;
LOCATE , 46: PRINT LocalTime$
LOCATE , 1: PRINT "TO: ";
LOCATE , 8: PRINT ToGMT$;
LOCATE , 20: PRINT ToName$;
LOCATE , 46: PRINT RIGHT$("00" + LTRIM$(STR$(ToHour)), 2); ":"; RIGHT$("00" + LTRIM$(STR$(MinLocalTime%)), 2);
LOCATE , 60: PRINT Day$
SYSTEM
GetGMT:
GMTerr = 0 'Assume no error
INPUT "", GMT$
GMT$ = UCASE$(TRIM$(GMT$))
LGMT = LEN(GMT$)
IF LEFT$(GMT$, 3) <> "GMT" OR LGMT < 4 OR LGMT > 6 THEN GMTerr = 1: RETURN
p4$ = MID$(GMT$, 4, 1)
IF LGMT = 4 AND p4$ = "0" THEN GMTzone = 0: GOTO findName
IF p4$ <> "+" AND p4$ <> "-" THEN GMTerr = 1: RETURN
IF LGMT < 5 THEN GMTerr = 1: RETURN
z$ = MID$(GMT$, 5)
IF NOT NumStrict(z$) THEN GMTerr = 1: RETURN
IF p4$ = "-" THEN zmax = 11 ELSE zmax = 12
GMTzone = VAL(z$)
IF GMTzone < 1 OR GMTzone > zmax THEN GMTerr = 1: RETURN
IF p4$ = "-" THEN GMTzone = -GMTzone
findName:
ZoneName$ = TZN$(GMTzone)
RETURN
END
FUNCTION NumStrict (Value AS STRING)
'*
'*** (NUMSTRICT) - CHECK FOR STRICTLY NUMERIC ONLY (NO NULL NO DECIMAL)
'*
NumStrict = 0 'Init to False
IF Value = "" THEN EXIT FUNCTION
FOR x = 1 TO LEN(Value)
a = ASC(MID$(Value, x, 1))
IF a < 48 OR a > 57 THEN EXIT FUNCTION
NEXT x
NumStrict = -1 'True
END FUNCTION
FUNCTION TRIM$ (Value AS STRING)
TRIM$ = LTRIM$(RTRIM$(Value))
END FUNCTION
FUNCTION TZN$ (Value AS INTEGER)
IF Value = 12 THEN CC$ = "New Zealand"
IF Value = 11 THEN CC$ = "Solomon Islands"
IF Value = 10 THEN CC$ = "Sydney"
IF Value = 9 THEN CC$ = "Tokyo"
IF Value = 8 THEN CC$ = "Hong Kong, and China"
IF Value = 7 THEN CC$ = "Bangkok"
IF Value = 6 THEN CC$ = "Omsk, Russia"
IF Value = 5 THEN CC$ = "Karachi"
IF Value = 4 THEN CC$ = "Stalingrad"
IF Value = 3 THEN CC$ = "Moscow"
IF Value = 2 THEN CC$ = "Cairo"
IF Value = 1 THEN CC$ = "Berlin"
IF Value = 0 THEN CC$ = "London"
IF Value = -1 THEN CC$ = "Reykjavik"
IF Value = -2 THEN CC$ = "Greenland"
IF Value = -3 THEN CC$ = "Rio de Janeiro, Brazil"
IF Value = -4 THEN CC$ = "Santiago de Chile"
IF Value = -5 THEN CC$ = "New York"
IF Value = -6 THEN CC$ = "Chicago"
IF Value = -7 THEN CC$ = "Denver"
IF Value = -8 THEN CC$ = "Seattle"
IF Value = -9 THEN CC$ = "Alaska"
IF Value = -10 THEN CC$ = "Honolulu"
IF Value = -11 THEN CC$ = "Midway Island"
TZN$ = CC$
END FUNCTION
FUNCTION ValLeft (Value1 AS STRING, Value2 AS INTEGER)
ValLeft = VAL(LEFT$(Value1, Value2))
END FUNCTION
FUNCTION ValRight (Value1 AS STRING, Value2 AS INTEGER)
ValRight = VAL(RIGHT$(Value1, Value2))
END FUNCTION
Seb,
You used my code on the following line, but you modified the original > 23
to > 24. This does not work. I put the > 23 back and it now works.
A minor point, you misspelled "military time" as "militairy time".
I ran a few tests, and it seems to work the same as my original logic which you mostly incorporated. Unless you made some other typographical errors, since you changed many of my variable names, then "our" new version should work fine.
Nice work.
*****
You used my code on the following line, but you modified the original > 23
to > 24. This does not work. I put the > 23 back and it now works.
Code: Select all
IF ToHour > 24 THEN ToHour = ToHour - 24: Day$ = "+1": GOTO GotHour
I ran a few tests, and it seems to work the same as my original logic which you mostly incorporated. Unless you made some other typographical errors, since you changed many of my variable names, then "our" new version should work fine.
Nice work.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.