/** * c/c++ 万年历源码 * @date 2010/06/13 * @author xxingup@gmail.com * @QQ: 953817 */ #include <iostream> #include <time.h> typedef unsigned char uint8; typedef unsigned short uint16; typedef int int32; typedef unsigned int uint32; const char* MonthTxts[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; const char* WeekDayTxts[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; const char* NumbersCN[13] = { "日", "一", "二", "三", "四", "五", "六", "七",//以下为月份咯 "八", "九", "十", "十一", "十二" }; /** * 判断是不是闰年 * @param year 年份 * @return true 是, false 不是 */ bool IsLeapYear(uint32 year); /** * 计算出某月总共有多少天 * @param year 年份 * @param month 月分 * @return 拥有天数 */ uint8 CalcDayOfMonth(uint32 year, uint8 month); /** * 计算出某月的第一天是星期几 * @param year 年份 * @param month 月分 */ uint8 CalcFirstDay(uint32 year, uint8 month); /** * 打印月份详细信息 * @param year 年份 * @param month 月份 */ void PrintCalendar(uint32 year, uint8 month); int main() { uint32 year; uint8 month; char choose = 0; time_t t = time(NULL); tm * now = localtime(&t); year = now->tm_year + 1900; month = now->tm_mon + 1; PrintCalendar(year, month); while(choose != '4') { printf("今天是:%u年%u月%u日/n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday); printf("选项:"); printf("1.上月 "); printf("2.下月 "); printf("3.指定月份 "); printf("4.退出 "); printf("输入选择:"); scanf("%c", &choose); switch(choose) { case '1': --month; if(!month) { --year; month = 12; } break; case '2': ++month; if(month > 12) { ++year; month = 12; } break; case '3': { uint8 tempMonth = 0; do { PrintCalendar(year, month); if(tempMonth > 12 || tempMonth < 0) printf("输入错误,重新输入(年 月):"); else printf("输入年份和月份(年 月): "); scanf("%u%u", &year, &tempMonth); } while(tempMonth > 12 || tempMonth < 0); month = tempMonth; } break; case '4': return 0; } PrintCalendar(year, month); } return 0; } bool IsLeapYear(uint32 year) { if ((year%400==0) || (year%100!=0) && (year%4==0)) return true; return false; } uint8 CalcDayOfMonth(uint32 year, uint8 month) { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return IsLeapYear(year) ? 29 : 28; } return 0;//返回0则表示月份输入不正确 } uint8 CalcFirstDay(uint32 year, uint8 month) { //计算某年的元月1日是星期几 uint8 yCode = ((year - 1) * 365 + year / 4 - year / 100 + year / 400) % 7 + 1; if(IsLeapYear(year)) { if(month < 3) --yCode; } //鹿儿来,五岭山,虎一嘶,鹿儿死 static uint8 mCodes[12] = {6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; uint8 mCode = mCodes[month-1]; //uint8 dCode = 1;//具体到某天的话,就等于几号 return (yCode + mCode + 1) % 7; } void PrintCalendar(uint32 year, uint8 month) { system("cls"); //printf("%s,%u/n", MonthTxts[month-1], year);//mm,yyyy printf("%u年 %s月/n", year, NumbersCN[month]); uint8 i; uint8 mDay = 0; uint8 fwDay = CalcFirstDay(year, month); for(i = 0; i < 55; i++) printf("/x3D"); printf("/n"); for(i = 0; i < 7; i++) //printf("%s/t", WeekDayTxts[i]);//English printf("%s/t", NumbersCN[i]); printf("/n"); for(i = 0; i < fwDay; i++) { printf(" /t"); } for(i = 1; i < 8 - fwDay; i++)//第一周 printf("%u/t", i); mDay = i; printf("/n"); for(int j = 0; j < 5; j++) { for(i = 0; i < 7; i++) { if(mDay > CalcDayOfMonth(year, month)) break; printf("%u/t", mDay++); } printf("/n"); } printf("/n"); } 运行效果: