I am trying to write a program in C with a main function and five other functions: input, output, calculate day of year for a calendar date, calculate calendar date from day of year and year, and determine if its a leap year function. I have a problem with calendar date from day of year and year function. I get the day of year and the year in the out put but I can't get the day and the month right.

This is the input:

5  4  1987
2  22 2004
8  9  2000
2  29 1900
3  2  2001
1  8  1999
9  31 2001
9  30 201
12 31 2004
22  9 2000
2  29 2000

and this should be the output:

Day of Year     Calendar Date
    124          05/04/1987
     53          02/22/2004
    222          08/09/2000
     61          03/02/2001
      8          01/08/1999
    366          12/31/2004
     60          02/29/2000

but i get this as an output:

Day of Year     Calendar Date
   124           2/ 2/1987
    53           2/ 2/2004
   222           2/ 2/2000
    61           2/ 2/2001
     8           2/ 2/1999
   366           2/ 2/2004
Press any key to continue . . .

This is the C code I have for the program. The function I have problem with is calculateCalendarDate

#include <stdio.h>
#include <stdlib.h>
#define MONTHS 13
#define MAX_ELEMS 100

int main (void)
{
// Function Declarations
   int getCalendarDates ( int daysOfMonth [], int daysArray [], int yearsArray [] );
   void writeResults ( int daysArray [], int yearsArray [], int daysOfMonth [], int numElems );
   int convertDateToDayOfYear ( int daysOfMonth [], int month, int day, int year );
   void calculateCalendarDate ( int daysOfMonth [], int dayOfYear, int year, int *month, int *day );
   int determineLeapYear ( int year );


// Local Definitions
   int daysOfMonth [MONTHS] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   int daysArray [MAX_ELEMS];
   int yearsArray [MAX_ELEMS];
   FILE *fpInput; /* input textfile variable */
   FILE *fpOutput; /* output textfile variable */
   int numElems; /* number of elements read into array */
   int i;

   int dayOfYear;


// Statements
   numElems = getCalendarDates ( daysOfMonth, daysArray, yearsArray );    

   writeResults ( daysArray, yearsArray, daysOfMonth, numElems );

   system("pause");
   return 0;
}



int getCalendarDates ( int daysOfMonth [], int daysArray [], int yearsArray [] )
{
//  Local Declarations 
    int day;
    int month;
    int year;
    int dayOfYear;
    int i = 0;
    FILE*fpInput;

//  Statements 
    if (!(fpInput = fopen ("Prog1-TestIn1.txt", "r")))

       printf("Error opening file\n"), exit (100); 

    while (fscanf(fpInput, "%d %d %d", &month, &day, &year) != EOF && i < MAX_ELEMS )
       {
        dayOfYear = convertDateToDayOfYear ( daysOfMonth, month, day, year );
        if(dayOfYear != -1)
        {
                   // store in arrays        
                   yearsArray[i] = year;   
                   daysArray [i] = dayOfYear;
                   i++;      
        }
        }


    return i;
}   // getData 

void writeResults ( int daysArray [], int yearsArray [], int daysOfMonth [], int numElems )
{
    int i;
    int dayOfYear;
    int month;
    int day;
    int year;

    printf("Day of Year\tCalendar Date\n");
    for (i=0; i < numElems; i++)
    {
    printf("%6d\t\t", daysArray [i]);
    calculateCalendarDate ( daysOfMonth, dayOfYear, year, &month, &day );

    printf("%2d/%2d/%4d\n", month, day, yearsArray [i]); 
    }
}


int convertDateToDayOfYear ( int daysOfMonth [], int month, int day, int year )
{
    int i;
    int sum;
    int dayOfYear;

   if( month >= 1 && month <= 12 && day >= 1 && day <= daysOfMonth [month] && year > 1000 && year < 9999 )
       if( determineLeapYear ( year ) == 1 && month > 2 || day > 28 )
            for( i=0, sum=0; i < month; i++ )
                {
                   sum += daysOfMonth [i];
                   dayOfYear = sum + day + 1;
                }
       else
            for( i=0, sum=0; i < month; i++ )
                {
                   sum += daysOfMonth [i];
                   dayOfYear = sum + day;
                }
   else
       return -1;

   return dayOfYear;
}


void calculateCalendarDate ( int daysOfMonth [], int dayOfYear, int year, int *month, int *day )
{
int daysinmonth;
int i;  
int sum;
int daysin;

                for (i = 1; i < 13; i++) 
                {
                        if (dayOfYear <= (daysinmonth = daysOfMonth[i - 1] + (i == 2 && determineLeapYear(year))))
                                break;
                        dayOfYear -= daysinmonth;
                }
                *month = i;
                *day = dayOfYear;
             return ;
            }




int determineLeapYear ( int year )
{
    if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )
        return 1; /* a leap yaer */
    else
        return 0; /* not a leap year */
}

Thank you!

Edited 3 Years Ago by Reverend Jim: Fixed formatting

Dude Where are your code tags

I am reading your getCalendar date function to print the date in the proper manner, but just a quick question, cant you read the file line by line and into a char array and then use strtok with space as the separator ? From what I read in the problem statement and the way the input is given to you I am pretty sure it will work ...

Edited 6 Years Ago by abhimanipal: n/a

you are not storing the month and day information in the form of an array as you have done for daysArray in the function getCalendarDates ., i.e., there are no arrays for month and days but you have array for years yearsArray .

This question has already been answered. Start a new discussion instead.