|
- #include<stdio.h>
- #include <time.h>
- #include<stdlib.h>
- #include"string.h"
- #include"math.h"
- char S[1000]={" "};//记事本存放
- /**********************************************************************************
- * 函数声明
- ***********************************************************************************/
- 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);
- /*******************************************************************************
- * 函数名:闰年判断
- * 入口参数:year
- * 返回参数:闰年返回1 否则返回0
- ********************************************************************************/
- int Leap_year(int year)/*定义变量*/
- {
- if(year%4==0&&year%100!=0||year%400==0) /*利用函数判断输入年份是闰年还是平年*/
- return 1;
- else
- return 0;
- }
- /**********************************************************************************
- * 函数名:月份天数确定
- * 入口参数:year,month
- * 返回参数:今年该月的天数
- * 调用函数: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};/*定义数组确定12个月每个月的天数*/
- if(Leap_year(year)) /*如果输入年份是闰年*/
- a[1]=29;/*二月29天*/
- return a[month-1];
- }
- /*************************************************************************************
- * 函数名:天数查询->查询该天是今年的第几天
- * 入口参数:year,month,day
- * 返回参数:该天是今年的第几天
- * 调用函数: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;
- }
- /****************************************************************************************
- * 函数名:天数查询->查询该天是本周的第几天
- * 入口参数:year,month,day
- * 返回参数:返回该天是本周的第几天
- * 调用函数: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;
- }
- /***********************************************************************************
- * 函数名:星期查询
- * 入口参数:number
- * 返回参数:星期
- **********************************************************************************/
- 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 "错误!请您重新输入。";/*不符和上面七种情况的报错提示*/
- }
- }
- /*****************************************************************************
- * 函数名:菜单1年历查询->输出年,月,日,星期,节日,农历
- * 入口参数:year month day
- * 调用函数: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));/*按年 月 日输出结果*/
- Lunar_Calendar( year , month,day);//输出当前日期的农历
- }
- /*******************************************************************************************
- * 函数名:菜单2月历查询->生成日历格式
- * 入口参数:year,month
- * 调用函数: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);//计算该月总天数
- 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)//该月的天数
- {
- printf("%8d",j);
- if(i%7==6)
- {
- printf("\n");
- }
- i++;
- j++;
- }
- printf("\n\n");
- }
- /*****************************************************************************
- * 函数名:菜单3日历查询->输入参数检查
- * 入口参数:year,month,day
- * 返回参数 当输入无效时返回0 否则返回1
- *****************************************************************************/
- int Menu3(int year,int month,int day)
- {
- if(year<0||month<1||month>12||day<1||day>Month_Day(year,month))/*当输入值出现这些情况时*/
- return 0;/*返回0*/
- else
- return 1;/*返回1*/
- }
- /*********************************************************************************
- * 函数名:年历查询
- * 入口参数:year
- * 调用函数:int Leap_year(int year)
- *********************************************************************************/
- void Year(int year)
- {
- int i;
- printf("\n");
- for(i=1;i<=12;i++)
- {
- Month_Display(year,i);
- }
- }
- /*************************************************************************************
- * 函数名:月历查询
- * 入口参数:year,month
- * 调用函数: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);
- }
- /*********************************************************************************************
- * 函数名:节日查询
- * 入口参数: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 "情人节";break;}
- else
- return "";
- case 3:
- {
- switch(day)
- { case 5: return "学雷锋日";break;
- case 8: return "妇女节";break;
- case 12: return "植树节";break;
- case 15:return "消费者权益日"; break;
- default:
- return "";
- }
- break;
- }
- case 4:
- {
- switch(day)
- {
- case 1: return "愚人节";break;
- default:
- return "";
- }
- break;
- }
- case 5:
- {
- switch(day)
- {
- case 1:return "劳动节";break;
- case 4:return "青年节";break;
- default:
- return "";
- }
- break;
- }
- case 6:
- {
- switch(day)
- {
- case 1: return "儿童节";break;
- default:
- return "";
- }
- break;
- }
- case 7:
- {
- switch(day)
- {
- case 1:return "建党节";break;
- default:
- return "";
- }
- break;
- }
- case 8:
- {
- switch(1)
- {
- case 1: return "建军节";break;
- default:
- return "";
- }
- break;
- }
- case 9:
- {
- switch(day)
- {
- case 10:return "教师节";break;
- case 18:return "九一八纪念日";break;
- default:
- return "";
- }
- }
- case 10:
-
- switch(day)
- {
- case 1: return "国庆节";break;
- default:
- return "";
- }
- break;
-
- case 11:
-
- switch(day)
- {
- case 1: return "万圣节";break;
- case 11: return "光棍节";break;
- default:
- return "";
- }
- break;
-
- case 12:
-
- switch(day)
- {
- case 24: return "平安夜";break;
- case 25: return "圣诞节";break;
- default:
- return "";
- }
- break;
- default:
- return "错误!请您重新输入。";
- }
- }
- /*************************************************************************************
- * 函数名:农历查询
- * 入口参数:year,month,day
- * 调用函数:
- *************************************************************************************/
- void Lunar_Calendar(int year ,int month,int day)
- {
- /*天干名称*/
- const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
- /*地支名称*/
- const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午",
- "未","申","酉","戌","亥"};
- /*属相名称*/
- const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇",
- "马","羊","猴","鸡","狗","猪"};
- /*农历日期名*/
- const char *cDayName[] = {"*","初一","初二","初三","初四","初五",
- "初六","初七","初八","初九","初十",
- "十一","十二","十三","十四","十五",
- "十六","十七","十八","十九","二十",
- "廿一","廿二","廿三","廿四","廿五",
- "廿六","廿七","廿八","廿九","三十"};
- /*农历月份名*/
- const char *cMonName[] = {"*","正","二","三","四","五","六",
- "七","八","九","十","十一","腊"};
- /*公历每月前面的天数*/
- const int wMonthAd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
- /***************************************************************
- *农历数据计算方式:用十进制保存
- *例如:1、农历每个月的大小;2、今年是否有闰月,闰几月以及闰月的大小。
- 用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大
- 小,大月记为1,小月记为0,这样就用掉12位(无闰月)或13位(有闰月),再
- 用高4位来表示闰月的月份,没有闰月记为0。比如说,2000年的信息数据是是0xC96
- 化为十进制就是3222,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小;
- 数字和4095的关系好像是 如果小于会扣掉一个月(应该就是这一年没有闰月)这里注意一下4095的12位全是1
- 数字和65536的关系好像是 LunarData[m]/65536+1保存闰月是几月(好像闰月数量挺多啊)
- ****************************************************************/
- /*农历数据*/
- 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日的天数:1921-2-8(正月初一)—*/
- /*1921年 鸡年 辛酉年*/
- nTheDate = (wCurYear-1921) * 365 + (wCurYear-1921) / 4 + wCurDay + wMonthAd[wCurMonth-1]-38;
- if((!(wCurYear % 4)) && (wCurMonth > 2)) //如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加1
- nTheDate = nTheDate + 1;
- /*–计算农历天干、地支、月、日—*/
- 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; //取出农历数据前12位的二进制数据
- if (nTheDate <= (29 + nBit))//若为1则是大月 天数有30天
- {
- nIsEnd = 1; //大月
- break;
- }
- nTheDate = nTheDate-29-nBit;//天数
- n = n-1;
- }
- if(nIsEnd)
- break;
- m = m + 1;
- }
- wCurYear =1921 + m;
- wCurMonth =k-n + 1; //农历月份
- wCurDay = nTheDate; //农历天数
- if (k == 12) //存在闰月
- {
- if (wCurMonth == wNongliData[m] / 65536 + 1)//保存闰月是几月
- wCurMonth =1-wCurMonth;
- else if (wCurMonth > wNongliData[m] / 65536 + 1)
- wCurMonth = wCurMonth-1;
- }
- /*–生成农历天干、地支、属相 ==> wNongli–*/
- /************************************************************************
- * 计算公式: 天干:(农历年份-3)Mod 10
- * 地支:(农历年份-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]);//地支
- /*–生成农历月、日 ==> wNongliDay–*/
- if (wCurMonth < 1) //闰月
- {
- printf("闰");
- printf("%s",cMonName[-1 * wCurMonth]);//农历月份确定
- printf("月");
- printf("%s",cDayName[wCurDay]);//农历日期确定
- 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)));
- }
- }
- /**********************************************************************
- * 函数名:日历显示
- * 入口参数:year,month,day
- * 调用函数:void Menu1(int year,int month,int day)
- **********************************************************************/
- void Day_Display(int year,int month,int day)
- {
- printf("\n");
- Menu1(year,month,day);
- }
- /***************************************************************************************
- * 函数名:获取当前系统时间
- * 调用函数:localtime();
- * 输出:当前系统时间,星期,农历,假日
- ***************************************************************************************/
- 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));
- }
- /****************************************************************************************************
- * 函数名:定时关机/重启工具
- * 作者:祝浩
- *****************************************************************************************************/
- void Shutdown(void )
- {
- int num,num_end;
- int seconds, minutes;
- char string_seconds[5];
- char close[] = "shutdown -s -t 0"; //关机
- char result[] = "shutdown -r -t 0";//重启
- printf("请输入命令 1:关机 2:重启 3:取消计划 4:退出\n");
- scanf("%d",&num);
- while( num !=1 && num !=2&& num!=3 && num!=4 )
- {
- printf("输入序号错误,请重新输入:");
- scanf("%d",&num);
- }
- if ( num == 1 )//定时关机
- {
- printf("\n请输入关机时间(0~600分):");
-
- scanf("%d",&minutes);
- printf("\n");
-
- while ( minutes < 0 || minutes > 600 )
- {
- printf("输入时间错误,请重新输入:");
- scanf("%d",&minutes);
- printf("\n");
-
- }
-
- seconds = minutes * 60; //将输入的分钟转化为秒
- itoa(seconds, string_seconds, 10); //将int型转换成string型 10 代表的十进制
- system(strcat(close,string_seconds));//stract函数拼接字符串
-
- printf("执行成功! %d分钟后,电脑将自动关闭...\n\n",minutes);
- printf("请及时保存相关的操作!关机计时中...\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; //将输入的分钟转化为秒
- itoa(seconds, string_seconds, 10); //将int型转换成string型 10 代表的十进制
- system(strcat(result,string_seconds));//stract函数拼接字符串
-
- printf("执行成功! %d分钟后,电脑将自动重启...\n\n",minutes);
- printf("请及时保存相关的操作!重启计时中...\n\n");
-
- }
- else if(num==3)
- {
- system("shutdown /a");//取消关机/重启计划
- printf("取消成功,欢迎下次使用!\n");
- }
- else if(num==4)
- {
- exit(0);
- }
- }
- /****************************************************************************************************
- * 函数名:系统垃圾清理工具
- * 调用函数:windows系统函数
- ****************************************************************************************************/
- void Rubbish()
- {
- printf(" 正在清除系统垃圾文件,请稍等...... \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("系统垃圾清理完成!欢迎下次使用\n");
- }
- /**********************************************************************************************
- * 函数名:主函数
- * 时间: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(" * 欢迎进入万年历查询系统 * \n");
- printf(" * * * \n");
- printf(" **********************************************************\n\n");
- while(1)
- {
- RTC();
- printf("\n\n请按任意键进入查询系统...........");
- getch();
- printf("\n\n");
- printf(" 1 年历 2 月历 3 日历 4 农历查询 \n");
- printf(" 5 记事本 6:定时关机工具 7:系统垃圾清理 8:退出 \n");
- printf(" 请输入您的选择<1~8>,按回车键确定: ");
- scanf("%d",&b);
- /****************************************************************************************************************
- * 菜单选项
- ****************************************************************************************************************/
- switch(b)
- {
- case 1:/*选择1时*/
- printf("\n请输入您要查的年份: ");/*给出输入提示*/
- scanf("%d",&year);/*输入查询的年份*/
- a=Menu3(year,1,1);//输入参数检查
- 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);//保存并关闭文本
- printf("添加成功");
- printf("是否退出记事本功能? 0:否 1:是\n");
- scanf("%d",&Event2);
- if(Event2==1)
- {
- printf("退出记事本\n");
- exit(0);
- }
- }
- else if(Event1==0){printf("退出系统\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);//关闭文件
- 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");
- }
- }
- }
复制代码
|
|