Last Friday of each month: Difference between revisions

m
→‎{{header|REXX}}: added/changed whitespace and comments, used a template for the output section.
m (→‎{{header|Factor}}: update to Factor 0.98)
m (→‎{{header|REXX}}: added/changed whitespace and comments, used a template for the output section.)
Line 3,227:
 
The documentation for the '''lastDOW''' function   (used in the REXX program below):
 
<pre>
╔════════════════════════════════════════════════════════════════════╗
║ lastDOW: procedure to return the date of the last day─of─week of ║
Line 3,254:
║ then obtained straightforwardly, or via subtraction. ║
╚════════════════════════════════════════════════════════════════════╝
</pre>
<lang rexx>/*REXX program displays the dates of the last Fridays of each month for any given year.*/
parse arg yyyy /*obtain optional argument from the CL.*/
parse arg yyyy
do j=1 for 12 /*traipse through all the year's months*/
say lastDOW('Friday', j, yyyy) /*find last Friday for the Jth month.*/
end /*j*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
lastDOW: procedure; arg dow .,mm .,yy .; parse arg a.1,a.2,a.3 /*DOW = day of week*/
if mm=='' | mm=='*' then mm= left( date('U'), 2) /*use default month*/
if yy=='' | yy=='*' then yy= left( date('S'), 4) /*use default year */
if length(yy)==2 then yy= left( date('S'), 2)yy /*append century. */
/*Note mandatory leading blank in strings below*/
$=" Monday TUesday Wednesday THursday Friday SAturday SUnday"
!=" JAnuary February MARch APril MAY JUNe JULy AUgust September October November December"
upper $ ! /*uppercase strings*/
if dow=='' then call .er "wasn't specified", 1 /*no month given ? */
if arg()>3 then call .er 'arguments specified', 4 /*too many args ? */
 
do j=1 for 3 /*any plural args ?*/
if words( arg(j) ) > 1 then call .er 'is illegal:', j /*check if plural. */
end
m=pos(' 'mm,!) /*maybefind DOW itsin good..list.*/
dw= pos(' 'dow, $) /*find day-of-week*/
if mdw==0 then call .er 'is invalid:' , 1 /*no DOW was found?*/
if mdw\==lastpos(' 'mmdow,!$) then call .er 'is ambigiousambiguous:',2 1 /*check min length.*/
 
dw=posif datatype('mm, 'dow,$M') then do /*findis MM day-of-weekalphabetic?*/
if dw==0 then call .er m= pos('is invalid:'mm,1 !) /*maybe its good...*/
if dw\m==lastpos('0 'dow,$) then call .er 'is ambigiousinvalid:' , 1
if m\==lastpos(' 'mm,!) then call .er 'is ambiguous:', 2
 
if datatype(mm,'M') then mm= wordpos( word( substr(!,m), 1), !)-1 /*isnow, use MMtrue alphabetic?Mon*/
end
do
m=pos(' 'mm,!) /*maybe its good...*/
if m==0 then call .er 'is invalid:',1
if m\==lastpos(' 'mm,!) then call .er 'is ambigious:',2
mm=wordpos( word( substr(!, m), 1), !) - 1 /*now, use true Mon*/
end
 
if \datatype(mm, 'W') then call .er "isn't an integer:", 2 /*MM (mon) ¬integer*/
if \datatype(yy, 'W') then call .er "isn't an integer:", 3 /*YY (yr) ¬integer*/
if mm<1 | mm>12 then call .er "isn't in range 1──►12:", 2 /*MM out─of─range. */
if yy=0 then call .er "can't be 0 (zero):", 3 /*YY can't be zero.*/
if yy<0 then call .er "can't be negative:", 3 /* " " " neg. */
if yy>9999 then call .er "can't be > 9999:", 3 /* " " " huge.*/
 
tdow= wordpos( word( substr($, dw), 1), $) -1 1 /*target DOW, 0──►6*/
/*day# of last dom.*/
_= date('B', right(yy + (mm=12), 4)right(mm // 12 + 1, 2, 0)"01", 'S') - 1
?= _ // 7 /*calc. DOW, 0──►6*/
if ?\==tdow then _= _ - ? - 7 + tdow + 7 * (?>tdow) /*not DOW? Adjust.*/
return date('weekday', _, "B") date(, _, 'B') /*return the answer*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
.er: arg ,_; say; say '***error*** (in LASTDOW)'; say say /*tell error, and */
say word('day-of-week month year excess', arg(2)) arg(1) a._ /*plug in a choice.*/
say; exit 13 /*...··· then exit. */</lang>
'''{{out|output''' |text=&nbsp; when using the following input of: &nbsp; &nbsp; <tt> 2012 </tt> &nbsp; &nbsp; or &nbsp; &nbsp; <tt> 12 </tt> }}
<pre>
Friday 27 Jan 2012