Programming just for fun.

``````// Given a palendromic start date 2001/10/02
// calculate the next 10 future date palendromes.

#include "stdafx.h"
#include<conio.h>

#define STRINGLENGTH 19

long jd(int y, int m, int d);
void gd (long JD, int *y, int *m, int *d);
int IsPallendrome (char Date[]);

void main()
{

int Year, Month, Day, count;
long Julian;

Year = 2001;
Month = 10;
Day = 02;

char d[20];
count = 1;
Julian = jd(Year, Month, Day); // Seed the start date with the Julian date
for(;;)
{
gd(Julian,&Year, &Month, &Day);  // convert Julian to Gregorian
sprintf_s(d,"%4d%02d%02d\n", Year, Month, Day); // make date string
if(IsPallendrome(d))		// test for palendromw
{
printf(" %d: %s is a Palendrome\n",count,d); // yay we found one
count += 1;
if (count > 10) break; // found enough?
}
Julian += 1;  // bump julian and look more
}
_getch();
}

//Gregorian to Julian
long jd(int y, int m, int d)
{
y+=8000;
if(m<3) { y--; m+=12; }
return (y*365) +(y/4) -(y/100) +(y/400) -1200820
+(m*153+3)/5-92
+d-1;
}

// Julian to Gregorian
void gd (long JD, int *y, int *m, int *d)
{
int I,J,K,L,N;

L  = JD + 68569;
N  = 4*L/146097;
L  = L-(146097*N+3)/4;
I  = 4000*(L+1)/1461001;
L  = L-1461*I/4+31;
J  = 80*L/2447;
K  = L-2447*J/80;
L  = J/11;
J  = J+2-12*L;
I  = 100*(N-49)+I+L;
*y = I;
*m = J;
*d = K;
}

// is it a palendrome
int IsPallendrome (char Date[])
{
int y = 7;
for (int x = 0; x < 4; ++x, --y)
{
if (Date[x] != Date[y])
return(false);
}
return(true);
}``````
WaltP 2,905

Code Snippets should not use anything in `conio.h`. They should be written so anyone can comple the program.

Remove conio.h and _getch and it should compile for you.

Remove conio.h and _getch and it should compile for you.

If you can remove parts of a program without affecting it's functionality or usefulness, were those parts really needed in the first place? ;)

But no, it won't compile for anyone who's not using Visual Studio. Even then, Visual Studio users would need to have precompiled headers enabled for the project (note that I always disable them). Another compiler-specific part of the code is sprintf_s(), which is part of Microsoft's "safe" strong library. Your code is closely tied to your compiler, but it's also easily made more portable:

``````/* Given a palendromic start date 2001/10/02
calculate the next 10 future date palendromes. */

#include <stdio.h>

#define STRINGLENGTH 19

long jd(int y, int m, int d);
void gd (long JD, int *y, int *m, int *d);
int IsPallendrome (char Date[]);

int main(void)
{
int Year, Month, Day, count;
long Julian;
char d[20];

Year = 2001;
Month = 10;
Day = 02;

count = 1;
Julian = jd(Year, Month, Day); /* Seed the start date with the Julian date */
for(;;)
{
gd(Julian,&Year, &Month, &Day);  /* convert Julian to Gregorian */
sprintf(d,"%4d%02d%02d\n", Year, Month, Day); /* make date string */
if(IsPallendrome(d))        /* test for palendromw */
{
printf(" %d: %s is a Palendrome\n",count,d); /* yay we found one */
count += 1;
if (count > 10) break; /* found enough? */
}
Julian += 1;  /* bump julian and look more */
}

return 0;
}

/* Gregorian to Julian */
long jd(int y, int m, int d)
{
y+=8000;
if(m<3) { y--; m+=12; }
return (y*365) +(y/4) -(y/100) +(y/400) -1200820
+(m*153+3)/5-92
+d-1;
}

/* Julian to Gregorian */
void gd (long JD, int *y, int *m, int *d)
{
int I,J,K,L,N;

L  = JD + 68569;
N  = 4*L/146097;
L  = L-(146097*N+3)/4;
I  = 4000*(L+1)/1461001;
L  = L-1461*I/4+31;
J  = 80*L/2447;
K  = L-2447*J/80;
L  = J/11;
J  = J+2-12*L;
I  = 100*(N-49)+I+L;
*y = I;
*m = J;
*d = K;
}

/* is it a palendrome */
int IsPallendrome (char Date[])
{
int y = 7;
int x;
for (x = 0; x < 4; ++x, --y)
{
if (Date[x] != Date[y])
return(0);
}
return(1);
}
``````

I make your code C90 conformant. See if you can find my changes and figure out why I made them. :) On a side note, due to the obvious fact that you're using Visual Studio, and the less obvious fact that Visual Studio doesn't presently support C99, I'd recommend you look at your project settings to make sure that you're compiling as C and not C++. There are subtle differences between the two languages when it comes to the C subset. You were using a few features of C++ that aren't legal C90, which Visual Studio should have caught if compiling the code as C.

There's a reason I called it programming for fun.

WaltP 2,905

What reason? So anyone who doesn't have your exact compiler and O/S can scream in frustration because they can't try your program? Other people don't think getting punk'd is fun. ;o)

The important parts of the progtam are the conversion functions. If you can't include them in any code for any compiler and use as is, maybe programming for fun is something you will never understand.