1. ## day of week

Can anyone help me with this program. I don't even know where to start with this one. I really want to learn this so I'm not looking for complete code, just some guidance to help this rookie through it.

I need to write a program that prompts the user for three integers representing the day, month, and year of a given date (e.g. 5 24 1994), and that displays the day of the week for the given date (e.g. 5/24/1994 is a Tuesday).

An algorithm, called Zeller’s algorithm, for determining the day of the week on which a given date falls goes by the following pseudo-code.

a) First, adjust the month and year:

move the month 2 places down; that is; if the month entered is not January or February, subtract 2 from it to get the adjusted month, and make the adjusted year the same as the given year;

if the month is January or February, the adjusted month is month 11 or 12 of the previous year, which is the adjusted year.

b) Second, compute a month correction M, which is (26 times the adjusted month) minus 2, divided by 10 (integer division).

c) Third, compute the century C (actually century minus 1) and year Y within the century for the adjusted year (so, for example, if the adjusted year is 1993, C will be 19 and Y will be 93).

d) Fourth, compute a year correction Z which is Y + (Y divided by 4) + (C divided by 4) + (5 times C).

Again, all division are integer divisions.

e) Finally, compute a code D for the day of the week for the given date. D is the remainder after division by 7 of the sum of the day, month correction M and year correction Z. Now, if D is 0, 1, 2, …6 then, the day of the week is Sunday, Monday, Tuesday, …, Saturday respectively.

2. You've been given the pseudocode, what more do you want? Which part are you having trouble with? Post an attempt.

3. I don't know if you can consider this an attempt, but like I said, I don't know how to get this going.

Code:
```#include <stdio.h>
#include <stdlib.h>

int main()
{
int day,month,year;
int a,M;
char more [2];

do

{
printf ("Enter the date: (mmddyyyy)");
scanf ("%d","%d","%d",&day,&month,&year);

a = (14 - month) /12;
M = (26 * 10)-2) /10;```

4. You need to look up how to use scanf, for a start.
Code:
`a = (14 - month) / 12;`
What is that supposed to correspond to?

a) First, adjust the month and year:

move the month 2 places down; that is; if the month entered is not January or February, subtract 2 from it to get the adjusted month, and make the adjusted year the same as the given year;

if the month is January or February, the adjusted month is month 11 or 12 of the previous year, which is the adjusted year.
I would take that to mean:
Code:
```/* Adjust the month and year */
if (month > 2) /* If the month is March through December */
month-=2;
else /* January or February */
{
month = 10 + month; /* month becomes 11 or 12 */
year--; /* year needs to go back one */
}```
The rest of the algorithm is easy to translate into code also.

5. another easy way is to use the functions in time.h -- struct tm has a day-of-week member. But that might be cheating

6. It almost certainly is cheating. The OP was given an algorithm for it.

I've tested it and wrote the corresponding code, it appears to work for some random values I tried.

7. Thanks for the advice AD but if I don't think this through, I never learn C. Also, I think this assignment is looking for me to understand pointers (which is totally confusing to me) and probably most people when your first learning C. Unless your a genius. Anyways, I worked on this problem some more. I'm trying to figure the century (C) and year (Y) in step (c) and I'm wondering if I'm on the right track with the code I've added. If I am, can someone explain to me how I can figure the year using this pointer?

Code:
```#include <stdio.h>
#include <stdlib.h>

int main()
{
int day,month,year;
int M,C
int *pYear;
char more [2];

do

{
printf ("Enter the date: (mmddyyyy)");
scanf ("%d","%d","%d",&day,&month,&year);

pYear=(int*)malloc(year*sizeof(int));

if (month > 2)
month-=2;

else

{
month = 10 + month;
year--;
)

M = (26*10)-2)/10;
C =

printf ("Continue? (y/n):");
scanf ("%s",&more);

}

while (more [0] != 'n');
return 0;

}```

8. Your scanf is still very wrong. You can only have one format string, but you are passing three.
Code:
`M = (26 * 10) - 2) / 10;`
This code makes no sense. For a start you have unmatched parentheses. Secondly, it doesn't use any other variables, so just evaluates to a constant.

From the algorithm:
b) Second, compute a month correction M, which is (26 times the adjusted month) minus 2, divided by 10 (integer division).
Pay particular attention to the bit in bold.

By the way, you don't need to use any pointers, and I can't imagine any point to using one here, what did you have in mind?

9. OK...I'll take a look at the adjusted month. I thought I may have to use a pointer to figure the year.

10. Oh...I would replace 10 with month...right? Plus, add the other paren.

Code:
`M = (26 * month) - 2)) / 10;`

11. Ah huh, except your parentheses are now even more unbalanced.

12. Is this it...

Code:
`M = ((26 * month) - 2) / 10;`

13. Bingo. Does it all compile?

What about the next step, working out the year and the century?

14. Do I use an array for my scanf with a for loop?

15. A for loop is not necessary. Look at the documentation to scanf. How do you want them to input the values?

Also, you have:
Code:
```printf ("Enter the date: (mmddyyyy)");
scanf ("%d","%d","%d",&day,&month,&year);```
Apart from the scanf line being broken, as mentioned above, you have the parameters in day/month/year order, but you are asking for the format to be mmddyyy. (month day year).

Consider prompting the user to enter the values in "mm dd yyyy" format (space delimited), then see how you might apply that to scanf.