// CalcPalindrome.cpp
/********************************************************************
created: 2011/11/02
file base: CalcPalindrome
file ext: cpp
author: 小C
purpose: 通过4位数反转求得8位对称数,
再进行日期的正确性验证,
最后打印存在的对称数.
*********************************************************************/
#include <stdio.h>
#define MIN_YEAR 1000
#define MAX_YEAR 9999
#define LEAPYEAR(x) ( (x%4==0&&x%100!=0||x%400==0)?1:0 )
typedef enum {
USERFALSE = 0,
USERTRUE = 1
} USERBOOL;
// 计算[nMinYear,nMaxYear]闭区间内的对称日
void CalcPalindromeDates(int nMinYear, int nMaxYear);
// 判断日期是否存在
USERBOOL CheckDate(char szDate[]);
// 打印日期
void PrintDate(int nMinYear, int nMaxYear, int nNum, char szDate[]);
int main(void)
{
int nMinYear = 0;
int nMaxYear = 0;
printf("四位数对称日计算器,退出程序直接点右上角关闭按钮\n");
while(1)
{
fflush(stdin);
printf("请输入年份区间(1000-9999),如:2001-2022\n");
if (2 == scanf("%d-%d", &nMinYear, &nMaxYear))
{
if (nMinYear < MIN_YEAR || nMaxYear < MIN_YEAR)
{
printf("亲~输入的年份需要在四位数以内哦~\n");
}
else if (nMaxYear > MAX_YEAR || nMinYear > MAX_YEAR)
{
printf("亲~输入的年份需要在四位数以内哦~\n");
}
else if (nMinYear > nMaxYear)
{
printf("亲~你的最小值和最大值范围错了哦~\n");
}
else
{
CalcPalindromeDates(nMinYear, nMaxYear);
printf("\n");
continue;
}
}
else
{
printf("亲~你的格式错了哦~\n");
}
}
getchar();
getchar();
return 0;
}
void CalcPalindromeDates(int nMinYear, int nMaxYear)
{
int i = 0;
int nYear = 0;
int nNum = 0;
char szDate[9];
char chTemp;
for (nYear = nMinYear; nYear <= nMaxYear; nYear++)
{
for (i = 0; i < 4; i++)
{
switch(i)
{
case 0: chTemp = (nYear/1000+'0'); break;
case 1: chTemp = ((nYear%1000)/100+'0'); break;
case 2: chTemp = ((nYear%100)/10+'0');break;
case 3: chTemp = (nYear%10+'0'); break;
}
szDate[i] = szDate[7-i] = chTemp;
}
szDate[8] = '\0';
if (USERTRUE == CheckDate(szDate))
{
nNum++;
PrintDate(nMinYear, nMaxYear, nNum, szDate);
}
}
return ;
}
USERBOOL CheckDate(char szDate[])
{
int nYear = 0;
int nMonth = 0;
int nDay = 0;
int i = 0;
// 此处偷懒
nYear += (szDate[0]-'0')*1000;
nYear += (szDate[1]-'0')*100;
nYear += (szDate[2]-'0')*10;
nYear += (szDate[3]-'0');
nMonth += (szDate[4]-'0')*10;
nMonth += (szDate[5]-'0');
nDay += (szDate[6]-'0')*10;
nDay += (szDate[7]-'0');
if (nMonth > 12 || nMonth < 1)
{
return USERFALSE;
}
// 1,3,5,7,8,10,12月
if (nDay < 1 || nDay > 31)
{
return USERFALSE;
}
// 2月
else if (nMonth == 2 && nDay > (28+LEAPYEAR(nYear)))
{
return USERFALSE;
}
// 4,6,9,11月
switch (nMonth)
{
case 4: if (nDay > 30) return USERFALSE; break;
case 6: if (nDay > 30) return USERFALSE; break;
case 9: if (nDay > 30) return USERFALSE; break;
case 11:if (nDay > 30) return USERFALSE; break;
default: break;
}
return USERTRUE;
}
void PrintDate(int nMinYear, int nMaxYear, int nNum, char szDate[])
{
int i = 0;
for (i = 0; szDate[i] != '\0'; i++)
{
putchar(szDate[i]);
switch (i)
{
case 3:
printf("年");
break;
case 5:
printf("月");
break;
case 7:
printf("日");
break;
default:
break;
}
}
printf("是%d-%d的第%d个对称日\n", nMinYear, nMaxYear, nNum);
}
看别人的程序就是写的整齐,写的健壮。欣赏一下,保存到blog。
PS:两个getchar()是要做什么?