標題:
C語言編寫萬年歷程序源代碼
[打印本頁]
作者:
51hei社區(qū)
時間:
2016-1-16 05:04
標題:
C語言編寫萬年歷程序源代碼
#include<stdio.h>
#include <time.h>
#include<stdlib.h>
#include"string.h"
#include"math.h"
char S[1000]={" "};//記事本存放
/**********************************************************************************
* 函數(shù)聲明
***********************************************************************************/
int Leap_year(int year);
int Month_Day(int year,int month);
int Year_Day(int year,int month,int day);
int Week_Day1(int year,int month,int day);
char *Week_Day2(int number);
void Menu1(int year,int month,int day);
void Menu2(int year,int month);
int Menu3(int year,int month,int day);
void Month_Display(int year,int month);
void Lunar_Calendar(int year ,int month,int day);
char *Festival(int month,int day);
//char *Solar_terms(char Month,char Day);
void Day_Display(int year,int month,int day);
void Shutdown(void );
void RTC(void);
void Rubbish(void);
/*******************************************************************************
* 函數(shù)名:閏年判斷
* 入口參數(shù):year
* 返回參數(shù):閏年返回1 否則返回0
********************************************************************************/
int Leap_year(int year)/*定義變量*/
{
if(year%4==0&&year%100!=0||year%400==0) /*利用函數(shù)判斷輸入年份是閏年還是平年*/
return 1;
else
return 0;
}
/**********************************************************************************
* 函數(shù)名:月份天數(shù)確定
* 入口參數(shù):year,month
* 返回參數(shù):今年該月的天數(shù)
* 調(diào)用函數(shù):int Leap_year(int year)
**********************************************************************************/
int Month_Day(int year,int month)
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*定義數(shù)組確定12個月每個月的天數(shù)*/
if(Leap_year(year)) /*如果輸入年份是閏年*/
a[1]=29;/*二月29天*/
return a[month-1];
}
/*************************************************************************************
* 函數(shù)名:天數(shù)查詢->查詢該天是今年的第幾天
* 入口參數(shù):year,month,day
* 返回參數(shù):該天是今年的第幾天
* 調(diào)用函數(shù):day1(int year,int month)
**************************************************************************************/
int Year_Day(int year,int month,int day)
{
int i,sum=0;
for(i=1;i<month;i++)
{
sum+=Month_Day(year,i);
}
sum+=day;
return sum;
}
/****************************************************************************************
* 函數(shù)名:天數(shù)查詢->查詢該天是本周的第幾天
* 入口參數(shù):year,month,day
* 返回參數(shù):返回該天是本周的第幾天
* 調(diào)用函數(shù):day2(int year,int month,int day)
****************************************************************************************/
int Week_Day1(int year,int month,int day)
{
int number=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;//基姆拉爾森計算公式
//number%=7;
return number+1;
}
/***********************************************************************************
* 函數(shù)名:星期查詢
* 入口參數(shù):number
* 返回參數(shù):星期
**********************************************************************************/
char *Week_Day2(int number)
{
switch(number)/*分類一周七天*/
{
case 0:
return "星期日";
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
default:
return "錯誤!請您重新輸入。";/*不符和上面七種情況的報錯提示*/
}
}
/*****************************************************************************
* 函數(shù)名:菜單1年歷查詢->輸出年,月,日,星期,節(jié)日,農(nóng)歷
* 入口參數(shù):year month day
* 調(diào)用函數(shù):int week1(int year,int month,int day)
* int runnian(int year)
* char *Week2(int number)
*****************************************************************************/
void Menu1(int year,int month,int day)
{
int number=Week_Day1(year,month,day);
if(Leap_year(year))printf("閏年");/*年份為閏年則輸出“閏年“*/
else printf("平年");
printf(" %d 年 %d 月 %d 日%10s %s",year,month,day,Week_Day2(number), Festival(month,day));/*按年 月 日輸出結(jié)果*/
Lunar_Calendar( year , month,day);//輸出當前日期的農(nóng)歷
}
/*******************************************************************************************
* 函數(shù)名:菜單2月歷查詢->生成日歷格式
* 入口參數(shù):year,month
* 調(diào)用函數(shù):int day1(int year,int month)
* int week1(int year,int month,int day)
*******************************************************************************************/
void Menu2(int year,int month)
{
int max,number,i,j=1;
max=Month_Day(year,month);//計算該月總天數(shù)
number=Week_Day1(year,month,1);
printf("%2s%2s%2s%2s%2s%2s%2s\n"," 星期日 "," 星期一 "," 星期二"," 星期三 "," 星期四 "," 星期五 "," 星期六 ");/*按照間隔打印日歷*/
for(i=0;i<number;i++)
{
printf(" ");
}
while(j<=max)//該月的天數(shù)
{
printf("%8d",j);
if(i%7==6)
{
printf("\n");
}
i++;
j++;
}
printf("\n\n");
}
/*****************************************************************************
* 函數(shù)名:菜單3日歷查詢->輸入?yún)?shù)檢查
* 入口參數(shù):year,month,day
* 返回參數(shù) 當輸入無效時返回0 否則返回1
*****************************************************************************/
int Menu3(int year,int month,int day)
{
if(year<0||month<1||month>12||day<1||day>Month_Day(year,month))/*當輸入值出現(xiàn)這些情況時*/
return 0;/*返回0*/
else
return 1;/*返回1*/
}
/*********************************************************************************
* 函數(shù)名:年歷查詢
* 入口參數(shù):year
* 調(diào)用函數(shù):int Leap_year(int year)
*********************************************************************************/
void Year(int year)
{
int i;
printf("\n");
for(i=1;i<=12;i++)
{
Month_Display(year,i);
}
}
/*************************************************************************************
* 函數(shù)名:月歷查詢
* 入口參數(shù):year,month
* 調(diào)用函數(shù):int Leap_year(int year)
* void x2(int year,int month)
* 輸出:年月并輸出日歷格式
*************************************************************************************/
void Month_Display(int year,int month)
{
if(Leap_year(year))
printf("閏年");
else printf("平年");
printf(" %d 年 %d 月\n\n",year,month);
Menu2(year,month);
}
/*********************************************************************************************
* 函數(shù)名:節(jié)日查詢
* 入口參數(shù):month,day
*********************************************************************************************/
char *Festival(int month,int day)
{
switch(month)
{
case 1: if(day==1)
{ return "元旦";break;}
else
return "";
case 2: if(day==14)
{ return "情人節(jié)";break;}
else
return "";
case 3:
{
switch(day)
{ case 5: return "學雷鋒日";break;
case 8: return "婦女節(jié)";break;
case 12: return "植樹節(jié)";break;
case 15:return "消費者權(quán)益日"; break;
default:
return "";
}
break;
}
case 4:
{
switch(day)
{
case 1: return "愚人節(jié)";break;
default:
return "";
}
break;
}
case 5:
{
switch(day)
{
case 1:return "勞動節(jié)";break;
case 4:return "青年節(jié)";break;
default:
return "";
}
break;
}
case 6:
{
switch(day)
{
case 1: return "兒童節(jié)";break;
default:
return "";
}
break;
}
case 7:
{
switch(day)
{
case 1:return "建黨節(jié)";break;
default:
return "";
}
break;
}
case 8:
{
switch(1)
{
case 1: return "建軍節(jié)";break;
default:
return "";
}
break;
}
case 9:
{
switch(day)
{
case 10:return "教師節(jié)";break;
case 18:return "九一八紀念日";break;
default:
return "";
}
}
case 10:
switch(day)
{
case 1: return "國慶節(jié)";break;
default:
return "";
}
break;
case 11:
switch(day)
{
case 1: return "萬圣節(jié)";break;
case 11: return "光棍節(jié)";break;
default:
return "";
}
break;
case 12:
switch(day)
{
case 24: return "平安夜";break;
case 25: return "圣誕節(jié)";break;
default:
return "";
}
break;
default:
return "錯誤!請您重新輸入。";
}
}
/*************************************************************************************
* 函數(shù)名:農(nóng)歷查詢
* 入口參數(shù):year,month,day
* 調(diào)用函數(shù):
*************************************************************************************/
void Lunar_Calendar(int year ,int month,int day)
{
/*天干名稱*/
const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
/*地支名稱*/
const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午",
"未","申","酉","戌","亥"};
/*屬相名稱*/
const char *cShuXiang[] = {"鼠","牛","虎","兔","龍","蛇",
"馬","羊","猴","雞","狗","豬"};
/*農(nóng)歷日期名*/
const char *cDayName[] = {"*","初一","初二","初三","初四","初五",
"初六","初七","初八","初九","初十",
"十一","十二","十三","十四","十五",
"十六","十七","十八","十九","二十",
"廿一","廿二","廿三","廿四","廿五",
"廿六","廿七","廿八","廿九","三十"};
/*農(nóng)歷月份名*/
const char *cMonName[] = {"*","正","二","三","四","五","六",
"七","八","九","十","十一","臘"};
/*公歷每月前面的天數(shù)*/
const int wMonthAd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
/***************************************************************
*農(nóng)歷數(shù)據(jù)計算方式:用十進制保存
*例如:1、農(nóng)歷每個月的大小;2、今年是否有閏月,閏幾月以及閏月的大小。
用一個整數(shù)來保存這些信息就足夠了。具體的方法是:用一位來表示一個月的大
小,大月記為1,小月記為0,這樣就用掉12位(無閏月)或13位(有閏月),再
用高4位來表示閏月的月份,沒有閏月記為0。比如說,2000年的信息數(shù)據(jù)是是0xC96
化為十進制就是3222,化成二進制就是110010010110B,表示的含義是指1、2、5、8、10、11月大,其余月。
數(shù)字和4095的關(guān)系好像是 如果小于會扣掉一個月(應該就是這一年沒有閏月)這里注意一下4095的12位全是1
數(shù)字和65536的關(guān)系好像是 LunarData[m]/65536+1保存閏月是幾月(好像閏月數(shù)量挺多。
****************************************************************/
/*農(nóng)歷數(shù)據(jù)*/
const int wNongliData[100] =
{2635,333387,1701,1748,267701,694,2391,133423,1175,396438
,3402,3749,331177,1453,694,201326,2350,465197,3221,3402
,400202,2901,1386,267611,605,2349,137515,2709,464533,1738
,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762
,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413
,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395
,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031
,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222
,268949,3402,3493,133973,1386,464219,605,2349,334123,2709
,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
static int wCurYear,wCurMonth,wCurDay;
static int nTheDate,nIsEnd,m,k,n,i,nBit;
char szNongli[30], szNongliDay[10],szShuXiang[10];
/*—取當前公歷年、月、日—*/
wCurYear = year;
wCurMonth = month;
wCurDay = day;
/*—計算到初始時間1921年2月8日的天數(shù):1921-2-8(正月初一)—*/
/*1921年 雞年 辛酉年*/
nTheDate = (wCurYear-1921) * 365 + (wCurYear-1921) / 4 + wCurDay + wMonthAd[wCurMonth-1]-38;
if((!(wCurYear % 4)) && (wCurMonth > 2)) //如今年陽歷是閏年(2月有29天),而且當前月份大于2月,經(jīng)歷的總天數(shù)加1
nTheDate = nTheDate + 1;
/*–計算農(nóng)歷天干、地支、月、日—*/
nIsEnd = 0;
m = 0;
while(nIsEnd != 1)
{
if(wNongliData[m] < 4095) //4095:111111111111 判斷是否有閏月 小于則沒有閏月 扣掉一個月
k = 11;
else
k = 12;
n = k;
while(n>=0)
{
//獲取wNongliData(m)的第n個二進制位的值
nBit = wNongliData[m];
for(i=1;i<n+1;i++) //大小月確定
nBit = nBit/2;
nBit = nBit % 2; //取出農(nóng)歷數(shù)據(jù)前12位的二進制數(shù)據(jù)
if (nTheDate <= (29 + nBit))//若為1則是大月 天數(shù)有30天
{
nIsEnd = 1; //大月
break;
}
nTheDate = nTheDate-29-nBit;//天數(shù)
n = n-1;
}
if(nIsEnd)
break;
m = m + 1;
}
wCurYear =1921 + m;
wCurMonth =k-n + 1; //農(nóng)歷月份
wCurDay = nTheDate; //農(nóng)歷天數(shù)
if (k == 12) //存在閏月
{
if (wCurMonth == wNongliData[m] / 65536 + 1)//保存閏月是幾月
wCurMonth =1-wCurMonth;
else if (wCurMonth > wNongliData[m] / 65536 + 1)
wCurMonth = wCurMonth-1;
}
/*–生成農(nóng)歷天干、地支、屬相 ==> wNongli–*/
/************************************************************************
* 計算公式: 天干:(農(nóng)歷年份-3)Mod 10
* 地支:(農(nóng)歷年份-3)Mod 12
* 生肖:(Year-3) Mod 12
************************************************************************/
printf(" %s年 ",cShuXiang[(wCurYear - 4) % 12]);//屬相
printf("%s",cTianGan[(wCurYear - 4) % 10]);//天干
printf("%s年 ",cDiZhi[(wCurYear - 4) % 12]);//地支
/*–生成農(nóng)歷月、日 ==> wNongliDay–*/
if (wCurMonth < 1) //閏月
{
printf("閏");
printf("%s",cMonName[-1 * wCurMonth]);//農(nóng)歷月份確定
printf("月");
printf("%s",cDayName[wCurDay]);//農(nóng)歷日期確定
printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));//星期的確定
}
else
{
printf("%s",cMonName[wCurMonth]);
printf("月 ");
printf("%s",cDayName[wCurDay]);
printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));
}
}
/**********************************************************************
* 函數(shù)名:日歷顯示
* 入口參數(shù):year,month,day
* 調(diào)用函數(shù):void Menu1(int year,int month,int day)
**********************************************************************/
void Day_Display(int year,int month,int day)
{
printf("\n");
Menu1(year,month,day);
}
/***************************************************************************************
* 函數(shù)名:獲取當前系統(tǒng)時間
* 調(diào)用函數(shù):localtime();
* 輸出:當前系統(tǒng)時間,星期,農(nóng)歷,假日
***************************************************************************************/
void RTC()
{
int Year,Month,Day,hour,min,sec,F;
struct tm * tmptr;
time_t secnow;
time(&secnow);
tmptr = localtime(&secnow);
Year=tmptr->tm_year+1900;
Month=tmptr->tm_mon+1;
Day=tmptr->tm_mday;
F=tmptr->tm_wday;
hour = tmptr->tm_hour;
min = tmptr->tm_min;
printf(" 當前時間:%d年%d月%d日 %02d:%02d ",Year,Month,Day,hour,min);
// printf(" %s", Week_Day2(F));
Lunar_Calendar(Year,Month,Day);
printf(" %s", Festival(Month,Day));
}
/****************************************************************************************************
* 函數(shù)名:定時關(guān)機/重啟工具
* 作者:祝浩
*****************************************************************************************************/
void Shutdown(void )
{
int num,num_end;
int seconds, minutes;
char string_seconds[5];
char close[] = "shutdown -s -t 0"; //關(guān)機
char result[] = "shutdown -r -t 0";//重啟
printf("請輸入命令 1:關(guān)機 2:重啟 3:取消計劃 4:退出\n");
scanf("%d",&num);
while( num !=1 && num !=2&& num!=3 && num!=4 )
{
printf("輸入序號錯誤,請重新輸入:");
scanf("%d",&num);
}
if ( num == 1 )//定時關(guān)機
{
printf("\n請輸入關(guān)機時間(0~600分):");
scanf("%d",&minutes);
printf("\n");
while ( minutes < 0 || minutes > 600 )
{
printf("輸入時間錯誤,請重新輸入:");
scanf("%d",&minutes);
printf("\n");
}
seconds = minutes * 60; //將輸入的分鐘轉(zhuǎn)化為秒
itoa(seconds, string_seconds, 10); //將int型轉(zhuǎn)換成string型 10 代表的十進制
system(strcat(close,string_seconds));//stract函數(shù)拼接字符串
printf("執(zhí)行成功! %d分鐘后,電腦將自動關(guān)閉...\n\n",minutes);
printf("請及時保存相關(guān)的操作!關(guān)機計時中...\n\n");
}
else if( num == 2 )//定時重啟
{
printf("請輸入重啟時間(0~600分):");
scanf("%d",&minutes);
printf("\n");
while ( minutes < 0 || minutes > 600 )
{
printf("輸入時間錯誤,請重新輸入:");
scanf("%d",&minutes);
printf("\n");
}
seconds = minutes * 60; //將輸入的分鐘轉(zhuǎn)化為秒
itoa(seconds, string_seconds, 10); //將int型轉(zhuǎn)換成string型 10 代表的十進制
system(strcat(result,string_seconds));//stract函數(shù)拼接字符串
printf("執(zhí)行成功! %d分鐘后,電腦將自動重啟...\n\n",minutes);
printf("請及時保存相關(guān)的操作!重啟計時中...\n\n");
}
else if(num==3)
{
system("shutdown /a");//取消關(guān)機/重啟計劃
printf("取消成功,歡迎下次使用!\n");
}
else if(num==4)
{
exit(0);
}
}
/****************************************************************************************************
* 函數(shù)名:系統(tǒng)垃圾清理工具
* 調(diào)用函數(shù):windows系統(tǒng)函數(shù)
****************************************************************************************************/
void Rubbish()
{
printf(" 正在清除系統(tǒng)垃圾文件,請稍等...... \n");
system("del /f /s /q %systemdrive%\\*.tmp");
system("del /f /s /q %systemdrive%\\*._mp");
system("del /f /s /q %systemdrive%\\*.log");
system("del /f /s /q %systemdrive%\\*.gid");
system("del /f /s /q %systemdrive%\\*.chk");
system("del /f /s /q %systemdrive%\\*.old");
system("del /f /s /q %windir%\\*.bak");
system("del /f /s /q %windir%\\prefetch\\*.*");
system("rd /s /q %windir%\\temp");
system("md %windir%\\temp");
system("del /f /s /q \"%appdata%\\Microsoft\\Windows\\cookies\\*.*\"");
system("del /f /s /q \"%userprofile%\\Local Settings\\Temporary Internet Files\\*.*\"");
system("del /f /s /q \"%userprofile%\\Local Settings\\Temp\\*.*\"");
system("rd /s /q \"%userprofile%\\Local Settings\\Temp\"");
system("md \"%userprofile%\\Local Settings\\Temp\"");
system("del /f /s /q \"%appdata%\\Microsoft\\Windows\\Recent\\*.*\"");
system("pause");
printf("系統(tǒng)垃圾清理完成!歡迎下次使用\n");
}
/**********************************************************************************************
* 函數(shù)名:主函數(shù)
* 時間:2012/12/17
* 作者:祝浩
**********************************************************************************************/
void main()
{
int year,month,day,a,b,i;
int Event,Event1,Event2;
char name[20];
FILE *fp;
printf(" * * \n");
printf(" * * * * \n");
printf(" * * * * \n");
printf(" * * * * \n\n\n\n");
printf(" * * \n");
printf(" * * \n");
printf(" * * \n");
printf(" * \n");
printf(" **********************************************************\n");
printf(" * * * \n");
printf(" * 歡迎進入萬年歷查詢系統(tǒng) * \n");
printf(" * * * \n");
printf(" **********************************************************\n\n");
while(1)
{
RTC();
printf("\n\n請按任意鍵進入查詢系統(tǒng)...........");
getch();
printf("\n\n");
printf(" 1 年歷 2 月歷 3 日歷 4 農(nóng)歷查詢 \n");
printf(" 5 記事本 6:定時關(guān)機工具 7:系統(tǒng)垃圾清理 8:退出 \n");
printf(" 請輸入您的選擇<1~8>,按回車鍵確定: ");
scanf("%d",&b);
/****************************************************************************************************************
* 菜單選項
****************************************************************************************************************/
switch(b)
{
case 1:/*選擇1時*/
printf("\n請輸入您要查的年份: ");/*給出輸入提示*/
scanf("%d",&year);/*輸入查詢的年份*/
a=Menu3(year,1,1);//輸入?yún)?shù)檢查
if(a==0)
{
printf("錯誤!請您重新輸入。\n");/*輸入值異常時報錯*/
break;
}
Year( year);
/*for(i=1;i<=12;i++)
{
Month_Display(year,i);
}*/
break;
case 2:/*選擇二時*/
printf("\n請輸入您要查的年和月,年月之間用空格隔開: ");/*給出輸入提示*/
scanf("%d%d",&year,&month);/*輸入需要查詢的年 月*/
a=Menu3(year,month,1);
if(a==0)
{
printf("錯誤!請您重新輸入。\n");
break;
}
Month_Display(year,month);
break;
case 3:/*選擇3時*/
printf("\n請輸入您要查的年月日,年月日之間用空格隔開: ");/*給出輸入提示*/
scanf("%d%d%d",&year,&month,&day);/*輸入年 月 日*/
a=Menu3(year,month,day);
if(a==0)
{
printf("錯誤!請您重新輸入!\n");/*輸入值異常時報錯*/
break;
}
Day_Display(year,month,day);
break;
case 4: /*選擇4時*/
printf("請輸入您需要查詢的日期,年月日中間用空格隔開");
scanf("%d%d%d",&year,&month,&day);
if(month>12||day>31)
{
printf("錯誤!請您重新輸入\n");
break;
}
Lunar_Calendar(year,month,day);
break;
case 5: /*選擇5時*/
while(1)
{
printf("歡迎使用記事本,請輸入日期,年月日中間用空格隔開\n");
scanf("%d%d%d",&year,&month,&day);
//if(month<12&&day<31)
// {
sprintf(name,"%d%d%d",year,month,day);
strcat(name,".txt");//文件已存放時間命名
if((fp=fopen(name,"rt"))==NULL||sizeof(S)==0)
{
printf("not !");
printf("是否需要添加記事?0:否 1:是\n");
scanf("%d",&Event1);
if(Event1==1)
{
printf("請輸入事件\n");
scanf("%s",&S);//將輸入的記事存放的臨時變量中
if((fp=fopen(name,"w"))==NULL)
{
printf("not !");
}
fputs(S,fp);//將臨時變量寫入到文本中存放
fclose(fp);//保存并關(guān)閉文本
printf("添加成功");
printf("是否退出記事本功能? 0:否 1:是\n");
scanf("%d",&Event2);
if(Event2==1)
{
printf("退出記事本\n");
exit(0);
}
}
else if(Event1==0){printf("退出系統(tǒng)\n"); exit(0);}
else printf("輸入錯誤\n");
}
/*******************************有記事,是否刪除************************************/
else
{
if((fp=fopen(name,"r"))==NULL)
{ printf("not !");}
fputs(fp,name);//讀文件
fgets(S,1000,fp);//將從文件中讀到的信息放到字符串臨時變量S中
fclose(fp);//關(guān)閉文件
printf("%d-%d-%d:%s\n",year,month,day,S);
if(sizeof(S)!=0)
{
printf("有記事,是否需要刪除?0:否(退出記事本),1:是");
scanf("%d",&Event);
if(Event==1)
{
memset(S, 0, sizeof(S));
if((fp=fopen(name,"w"))==NULL)
{ printf("not !");}
fputs(S,fp);//將輸入事件寫入文本
fclose(fp);
if(remove)
{
//printf("刪除失敗!退出記事本\n");
}
else
//printf("刪除成功!退出記事本");
exit(0);
}
else
{
printf("退出記事本\n");
exit(0);
}
}
}
}
case 6: Shutdown();break;
case 7:Rubbish();break;
case 8: exit(0);break;//退出
default:
printf("錯誤!請您重新輸入!\n\n");
}
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1