转别人的求解对称日的程序

来源:互联网 发布:nginx init worker 编辑:程序博客网 时间:2024/06/06 00:58
// CalcPalindrome.cpp /********************************************************************created:2011/11/02file base:CalcPalindromefile ext:cppauthor:小Cpurpose:通过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()是要做什么?

原创粉丝点击