View previous topic :: View next topic
|
Author |
Message |
Hames
New User
Joined: 03 Oct 2005 Posts: 49
|
|
|
|
Hi,
This is my friend's Requirement.
He has to find the Date of the last sunday for any given year in COBOL.
Advanced thanks for your views!
*********
THanks,
Hames
********* |
|
Back to top |
|
|
Hames
New User
Joined: 03 Oct 2005 Posts: 49
|
|
|
|
Let me know Whether this is correct!!!
1. First he need to find the day for Oct 31 for the given year.
2. If it falls on Sunday then that is the required answer.
else if it is Monday ==> 30 is Last sunday
else if it is tuesday ==> 29 is Last Sunday
else if it is Wednesday ==> 28 is Last Sunday
else if it is thursday ==> 27 is Last Sunday
else if it is friday ==> 26 is Last Sunday
else ==> 25 is Last Sunday
If there is any other simple logic is there, please let me know |
|
Back to top |
|
|
priyesh.agrawal
Senior Member
Joined: 28 Mar 2005 Posts: 1448 Location: Chicago, IL
|
|
|
|
Hi Hames,
I worte a very simple cobol code for finding out the last sunday of the year.
There can be made more improvement in this code in terms of performance or programming.
Also leap year functioning needs to be accomodated in the code, that I couldn't at this time.
Check & let me know, the results.
Code: |
WORKING-STORAGE SECTION.
01 WS-DATE PIC 9(5).
01 WS-DAY PIC 9(1).
01 WS-F PIC 9(3).
01 K PIC 9(3).
01 L PIC 9(5).99.
01 X PIC 99.
01 SW-DAY PIC 9(1).
88 MON VALUE 1.
88 TUE VALUE 2.
88 WED VALUE 3.
88 THU VALUE 4.
88 FRI VALUE 5.
88 SAT VALUE 6.
88 SUN VALUE 7.
ACCEPT WS-DATE FROM DAY.
ACCEPT WS-DAY FROM DAY-OF-WEEK.
MOVE WS-DAY TO SW-DAY.
MOVE WS-DATE(3:3) TO WS-F.
COMPUTE K= 365 - WS-F.
COMPUTE L=K/7.
MOVE L(7:2) TO X.
IF X=0
EVALUATE SW-DAY
WHEN 7 DISPLAY '31 DEC'
WHEN 1 DISPLAY '30 DEC'
WHEN 2 DISPLAY '29 DEC'
WHEN 3 DISPLAY '28 DEC'
WHEN 4 DISPLAY '27 DEC'
WHEN 5 DISPLAY '26 DEC'
WHEN 6 DISPLAY '25 DEC'
END-EVALUATE.
IF X=14
EVALUATE SW-DAY
WHEN 7 DISPLAY '30 DEC'
WHEN 1 DISPLAY '29 DEC'
WHEN 2 DISPLAY '28 DEC'
WHEN 3 DISPLAY '27 DEC'
WHEN 4 DISPLAY '26 DEC'
WHEN 5 DISPLAY '25 DEC'
WHEN 6 DISPLAY '31 DEC'
END-EVALUATE.
IF X=28
EVALUATE SW-DAY
WHEN 7 DISPLAY '29 DEC'
WHEN 1 DISPLAY '28 DEC'
WHEN 2 DISPLAY '27 DEC'
WHEN 3 DISPLAY '26 DEC'
WHEN 4 DISPLAY '25 DEC'
WHEN 5 DISPLAY '31 DEC'
WHEN 6 DISPLAY '30 DEC'
END-EVALUATE.
IF X=43
EVALUATE SW-DAY
WHEN 7 DISPLAY '28 DEC'
WHEN 1 DISPLAY '27 DEC'
WHEN 2 DISPLAY '26 DEC'
WHEN 3 DISPLAY '25 DEC'
WHEN 4 DISPLAY '31 DEC'
WHEN 5 DISPLAY '30 DEC'
WHEN 6 DISPLAY '29 DEC'
END-EVALUATE.
IF X=57
EVALUATE SW-DAY
WHEN 7 DISPLAY '27 DEC'
WHEN 1 DISPLAY '26 DEC'
WHEN 2 DISPLAY '25 DEC'
WHEN 3 DISPLAY '31 DEC'
WHEN 4 DISPLAY '30 DEC'
WHEN 5 DISPLAY '29 DEC'
WHEN 6 DISPLAY '28 DEC'
END-EVALUATE.
IF X=71
EVALUATE SW-DAY
WHEN 7 DISPLAY '26 DEC'
WHEN 1 DISPLAY '25 DEC'
WHEN 2 DISPLAY '31 DEC'
WHEN 3 DISPLAY '30 DEC'
WHEN 4 DISPLAY '29 DEC'
WHEN 5 DISPLAY '28 DEC'
WHEN 6 DISPLAY '27 DEC'
END-EVALUATE.
IF X=86
EVALUATE SW-DAY
WHEN 7 DISPLAY '25 DEC'
WHEN 1 DISPLAY '31 DEC'
WHEN 2 DISPLAY '30 DEC'
WHEN 3 DISPLAY '29 DEC'
WHEN 4 DISPLAY '28 DEC'
WHEN 5 DISPLAY '27 DEC'
WHEN 6 DISPLAY '26 DEC'
END-EVALUATE. |
Regards,
Priyesh. |
|
Back to top |
|
|
Hames
New User
Joined: 03 Oct 2005 Posts: 49
|
|
|
|
Hi Priyesh,
Thank you!
I checked this code and its working fine.
________
Thanks,
Hames |
|
Back to top |
|
|
mmwife
Super Moderator
Joined: 30 May 2003 Posts: 1592
|
|
|
|
A little late to the party, but....
You can try the code below if you use a COBOLII or better compiler. It?s tested and seems to work OK. It will accept dates between 1601 and 9999 inclusive.
Code: |
WS
05 DISP-DT.
10 DISP-YYYY PIC X(004).
10 DISP-MM PIC X(002).
10 DISP-DD PIC 9(002).
05 DISP-DT-NUM REDEFINES
DISP-DT PIC 9(008).
05 DAYS-FROM-SUN PIC 9(001).
05 WS-IOD PIC 9(010) COMP.
P.D.
MOVE '19001231' TO DISP-DT
COMPUTE WS-IOD =
FUNCTION INTEGER-OF-DATE (DISP-DT-NUM)
DIVIDE WS-IOD BY 7
GIVING WS-IOD
REMAINDER DAYS-FROM-SUN
END-DIVIDE
COMPUTE DISP-DD = DISP-DD - DAYS-FROM-SUN
DISPLAY DISP-MM '/' DISP-DD ' IS THE LAST SUNDAY IN '
DISP-YYYY
GOBACK
.
********************************* TOP OF DATA ***
12/30 IS THE LAST SUNDAY IN 1900
******************************** BOTTOM OF DATA *. |
|
|
Back to top |
|
|
priyesh.agrawal
Senior Member
Joined: 28 Mar 2005 Posts: 1448 Location: Chicago, IL
|
|
|
|
Thats what I was looking for when I said ..for my code...
Quote: |
There can be made more improvement in this code in terms of performance or programming. |
Thanks Jack... That is how, we get something to learn/improve.
Regards,
Priyesh. |
|
Back to top |
|
|
mmwife
Super Moderator
Joined: 30 May 2003 Posts: 1592
|
|
|
|
Hi Priyesh,
Thanx for the kind words, but performance-wise, I think your solution would beat the pants off of mine. |
|
Back to top |
|
|
Hames
New User
Joined: 03 Oct 2005 Posts: 49
|
|
|
|
Hi Jack,
I have tested your code also. Its working fine.
Thanks a lot.
_________________
Regards,
Hames
_________________
"Dream bigger things - Dream is the seed for extraordinary things" |
|
Back to top |
|
|
hncs
New User
Joined: 01 Mar 2006 Posts: 11
|
|
|
|
WITHOUT USING FUNCTIONS YOU CAN CODE LIKE BELOW.
WORKING-STORAGE SECTION.
01 WS-YEAR PIC 9(04) VALUE ZEROES.
01 I PIC 9(04) VALUE ZEROES.
01 J PIC 9(04) VALUE ZEROES.
01 K PIC 9(04) VALUE ZEROES.
PROCEDURE DIVISION.
MOVE WS-YEAR TO K
ADD -1 TO WS-YEAR.
DIVIDE WS-YEAR BY 400 GIVING I REMAINDER WS-YEAR.
DIVIDE WS-YEAR BY 100 GIVING J REMAINDER WS-YEAR.
COMPUTE WS-YEAR = WS-YEAR + (WS-YEAR/4) + 1
COMPUTE WS-YEAR = WS-YEAR + (J*5)
DIVIDE WS-YEAR BY 7 GIVING I REMAINDER WS-YEAR.
SUBTRACT WS-YEAR FROM 6 GIVING WS-YEAR.
SUBTRACT WS-YEAR FROM 31 GIVING WS-YEAR.
DISPLAY "DATE IS : " K " DECEMBER " WS-YEAR.
STOP RUN. |
|
Back to top |
|
|
|