Last Friday of each month: Difference between revisions

m
→‎{{header|REXX}}: removed ''height'' from ''style'', added whitespace, changed comments. -- ~~~~
m (→‎{{header|D}}: less confusing)
m (→‎{{header|REXX}}: removed ''height'' from ''style'', added whitespace, changed comments. -- ~~~~)
Line 715:
=={{header|REXX}}==
This REXX program will find the last day-of-week (for any day) of all the months for any year.
<lang rexx>/*REXX program displays dates of last Fridays of each month for any year*/
<lang rexx>
/*REXX program displays dates of last Fridays of each month for any year*/
 
parse arg yyyy
do j=1 for 12
say lastDOW('Friday',j,yyyy)
end /*j*/
exit /*stick a fork in it, we're /*day# of last domdone.*/
exit
 
/*┌────────────────────────────────────────────────---─────────────────┐
/* ┌─────────────────────────────────────────────────────────────────┐
│ lastDOW: procedure to return the date of the last day-of-week of
of any particular month (of any particular year).
│ The day-of-week must be specified (it can be in any case,
│ (lower-/mixed-/upper-case) as an English name of the spelled day
│ of the week, with a minimum length that causes no ambiguity.
│ I.E.: W for Wednesday, Sa for Saturday, Su for Sunday ...
│ The month can be specified as an integer 1 ──>──► 12
│ 1=January 2=February 3=March ... 12=December
│ or the English name of the month, with a minimum length that
│ causes no ambiguity. I.E.: Jun for June, D for December.
│ If omitted [or an asterisk(*)], the current month is used.
│ The year is specified as an integer or just the last two digits
│ (two digit years are assumed to be in the current century, and
│ there is no windowing for a two-digit year).
│ If omitted [or an asterisk(*)], the current year is used.
│ Years < 100 must be specified with (at least 2) leading zeroes.│
│ Method used: find the "day number" of the 1st of the next month,
│ then subtract 1one (this gives the "day number" of the last day of │
│ the month, bypassing the leapday mess). The last day-of-week is
is then obtained straightforwardly, or via subtraction.
└───────────────────────────────────────────────────---──────────────┘*/
└─────────────────────────────────────────────────────────────────┘ */
 
lastdow: procedure; arg dow .,mm .,yy . /*dowDOW = day of week*/
parse arg a.1,a.2,a.3 /*orig args, errmsg*/
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
if arg()>3 then call .er 'arguments specified',4
 
do j=1 for 3 /*any plural args ?*/
if words(arg(j))>1 then call .er 'is illegal:',j
end
 
dw=pos(' 'dow,$) /*find day-of-week*/
if dw==0 then call .er 'is invalid:',1
if dw\==lastpos(' 'dow,$) then call .er 'is ambigious:',1
 
if datatype(mm,'month') then /*if MM is alpha...*/
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
if \datatype(yy,'W') then call .er "isn't an integer:",3
if mm<1 | mm>12 then call .er "isn't in range 1-->121──►12:",2
if yy=0 then call .er "can't be 0 (zero):",3
if yy<0 then call .er "can't be negative:",3
if yy>9999 then call .er "can't be > 9999:",3
 
tdow=wordpos(word(substr($,dw),1),$)-1 /*target DOW, 0──►6*/
/*─────────────────────────────────────────────────────────────────*/
tdow=wordpos(word(substr($,dw),1),$)-1 /*targetday# of dow,last 0-->6dom.*/
/*day# of last dom.*/
_=date('B',right(yy+(mm=12),4)right(mm//12+1,2,0)"01",'S')-1
?=_//7 /*calc. dowDOW, 0-->60──►6*/
if ?\==tdow then _=_-?-7+tdow+7*(?>tdow) /*not dowDOW? Adjust.*/
return date('weekday',_,"B") date(,_,'B') /*return the answer*/
/*─────────────────────────────────────────────────────────────────*/
 
.er: arg ,_;say; say '***error!*** (in LASTDOW)';say /*tell error, and */
say word('day-of-week month year excess',arg(2)) arg(1) a._
say; exit 13 /*... and then exit. */</lang>
Output'''output''' when anusing inputthe offollowing input: <tt> 2012 </tt> or <tt> 12 </tt> is used:
</lang>
<pre style="height:20ex;overflow:scroll">
Output when an input of <tt> 2012 </tt> or <tt> 12 </tt> is used:
<pre style="height:20ex;overflow:scroll">
Friday 27 Jan 2012
Friday 24 Feb 2012