1

My problem states: Write a C function named days() that determines the number of days from the date 1/1/1900 for any date passed as a structure.Pass the address of a Date structure variable to the days() function. Write a program in main() that inputs the month, day, and year from the user, writing the inputs into a Date structure variable, call your days() function and display the result. Use the following date structure:

struct date 
{ 
int month; 
int day; 
int year; 
}; 

In writing this function, use the convention that all years are 360 days and each month consist of 30 days. The function should return the number of days for any date structure passed to it.

This is what i have so far, and it is calculating 0 each time:

struct date
{
     int month;
     int day;
     int year;
};

int main()
{
    int monthMain, dayMain, yearMain;       //declaring the int variables
    int totalDays;
    printf("Enter a Month: ");              //requesting user to input the month
    scanf("%d", &monthMain);                //accepting the user input for month
    printf("Enter a Day: ");                //requesting user to input the day
    scanf("%d", &dayMain);                  //accepting the user input for day
    printf("Enter a Year: ");               //requesting user to input the year
    scanf("%d", &yearMain);                 //accepting the user input for year
    totalDays = days();
    printf("the date you entered = %d days", totalDays);
return 0;
}

int days(struct date *d)
{
    int yearCalc, daysAmount;
    int monthMain, dayMain, yearMain;       //declaring the int variables

    yearCalc = 1900 * 360;
    yearMain = (yearMain * 360) - yearCalc;

    if(monthMain == 1)
    {
        monthMain = 0;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 2)
    {
        monthMain = 30;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 3)
    {
        monthMain = 60;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 4)
    {
        monthMain = 90;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 5)
    {
        monthMain = 120;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 6)
    {
        monthMain = 150;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 7)
    {
        monthMain = 180;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 8)
    {
        monthMain = 210;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 9)
    {
        monthMain = 240;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 10)
    {
        monthMain = 270;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 11)
    {
        monthMain = 300;
        daysAmount = monthMain + dayMain + yearMain;
    }
    if(monthMain == 12)
    {
        monthMain = 360;
        daysAmount = monthMain + dayMain + yearMain;
    }
    return daysAmount;
}

Any help would be great :)

1
  • Since the calculation daysAmount = monthMain + dayMain + yearMain; is the same each time, you could move that after the set of if statements. The jump from 300 to 360 between month 11 and 12 is wrong. There's a simple algorithm given a valid month number for deducing the number number of days in the year prior to that (for these nice simple uniformly-sized months): (month_number - 1) * 30 gives the answer you're after. Have you added any printing statements to see why you're getting 0? Commented Nov 15, 2014 at 23:49

2 Answers 2

3

Your main problem is this call:

totalDays = days();

You need to pass a pointer to a date structure to the function. That means you need a local variable in main():

struct date given;

and you need to initialize it:

given.day = 11;
given.month = 11;
given.year = 1918;

and you need to pass it:

totalDays = days(&given);

and you need to learn how to set the compiler warnings so that you get error messages from your compiler when you don't pre-declare functions with full prototypes and don't call functions accurately.

If your compiler is GCC, use:

gcc -O3 -std=c11 -g -Wall -Wextra -Werror …

as a starting point. You might need -Wstrict-prototypes or -Wold-style-declaration or -Wold-style-definition or -Wmissing-prototypes too; I use most of those as routine to make sure I'm not making silly mistakes.

Additionally, since the calculation daysAmount = monthMain + dayMain + yearMain; is the same each time, you could move that after the set of if statements. The jump from 300 to 360 between month 11 and 12 is wrong. There's a simple algorithm given a valid month number for deducing the number number of days in the year prior to that (for these nice simple uniformly-sized months): (month_number - 1) * 30 gives the answer you're after.

Have you added any printing statements to see why you're getting 0? For example, if you'd added a statement at the start of the function like:

 printf("Date: %.4d-%.2d-%.2d\n", d->year, d->month, d->day);

you'd be printing the date in ISO 8601 format. If this didn't show you the answer you thought you'd entered, you'd know that there's a problem. Printing values to make sure what the computer sees is what you thought the computer should see is a basic debugging technique.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you so much, i don't know why i didn't think to do that calculation that you showed me. Im a terrible programmer, but this class is required for my major. This worked like a charm :)
+1 for %.4d-%.2d-%.2d. It appears a bit better (with neg. years) than %04d-%02d-%02d, which I used to use.
1
struct date
{
     int month;
     int day;
     int year;
}; // unsigned int would serve this purpose better, as negative values are not valid here

int days(struct date *d)
{
    int daysTotal; // Declaring variable to hold total number of days since 1900-01-01

    // Adding days from date::day
    if (d->day > 0 && d->day < 31){ // Only execute if day is valid
        daysTotal = d->day - 1;
    }
    // Adding days from date::month
    if (d->month > 0 && d->month < 13){ // Only execute if month is valid
        daysTotal += 30 * (d->month-1);
    }
    // Adding days from date::year
    if (d->year > 1899){ // Only execute if year is valid
        daysTotal += 360 * (d->year-1900); // subtracting 1900 years
    }

    return daysTotal; // This may still be a negative value, but is accepted here for simplicity
};

int main()
{
    date myDate; // Declaring an object of struct date

    printf("Enter a Month: ");              //requesting user to input the month
    scanf("%d", &myDate.month);             //recieving the user input for month
    printf("Enter a Day: ");                //requesting user to input the day
    scanf("%d", &myDate.day);               //recieving the user input for day
    printf("Enter a Year: ");               //requesting user to input the year
    scanf("%d", &myDate.year);              //recieving the user input for year

    printf("the date you entered = %d days", days(&myDate)); // Passing object pointer to function
return 0;
};

You didn't initially use the structure at all. You didn't make an object of the structure for that purpose. There was a big chunk at the end that I could collapse into an if statement. Other struct members didn't have validation applied. There were unnecessary variables. I made changes to simplify things. Put the days() function before main(), to prevent "function days(struct date *d) not declared in this scope" error.

EDIT: My implementation now returns 0 days for 1900-01-01 and 31 days for 1900-02-02. This is done by subtracting 1 from day and month, to convert it to the index, rather than the amount of passed units, as this is the actual meaning of days and months (not so with years, they begin with year 0 or here, with year 1900).

2 Comments

Do you need to count just the days before the valid month? At the moment, your code will report 31 days for 1900-01-01, rather than just 1 (or, indeed, 0).
Thanks Jon, I changed my implementation now. Needed to convert the day and month values to indexes by subtracting one, so they start with 0, as that's then the number of units passed since the first of them. Not so with years, they start at 0, or 1900 in this example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.