1、万年历 A、概要 系统实现万年历的功能,并以交互的方式显示。任意输入某一年,可输出该年的年历;输入某

作者&投稿:学韩 (若有异议请与网页底部的电邮联系)
系统实现万年历的功能,并以交互的方式显示。任意输入某一年,可输出该年的年历;输入某年的某月,系统会以~

#include
#include
int JudgeLeapYear(int);
int MonthDay(int m,int y);
void printHeader(void);
int FirstWeek(int m,int y);
void printMonth(int m);
int main(int argc, char* argv[])
{
int year,month,i,test,week;
printf("Year:");
scanf("%d",&year);
for (month=1; month<=12; month++)
{
test=1;
printMonth(month);
printHeader();
week=FirstWeek(month,year);
if (week < 6)
{
for (i=0; i<=week; i++)
{
putchar('');
test++;
}
}
for (i = 1; i <= MonthDay(month,year); i++,test++)
{
printf("%d",i);
if (test%7==0)
{
putchar('
');
}
}
putchar('
');

system("pause");
}
return 0;
}
int JudgeLeapYear(int y)
{
return (y%4==0&&y%100||y%400==0)?1:0;
}
int FirstWeek(int month,int year)
{
if (month<3)
{
month+=12;
year--;
}
return (1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
}
int MonthDay(int month,int year)
{
int d;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d=31;break;
case 4:
case 6:
case 9:
case 11:d=30;break;
case 2:d=JudgeLeapYear(year)?29:28;break;
}
return d;
}
void printHeader(void)
{
printf("%s%s%s%s%s%s%s
","Sun","Mon","Tue","Wed","Thur","Fri","Sat");
}
void printMonth(int m)
{
switch (m)
{

default:
case 1:puts("===January===");break;
case 2:puts("===February===");break;
case 3:puts("===March===");break;
case 4:puts("===April===");break;
case 5:puts("===May===");break;
case 6:puts("===June===");break;
case 7:puts("===July===");break;
case 8:puts("===August===");break;
case 9:puts("===September===");break;
case 10:puts("===October===");break;
case 11:puts("===November===");break;
case 12:puts("===December===");break;
}
}

实现输入年月日输出星期用蔡勒公式,蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。

蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1

公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意对负数的取模运算!) 其他的没怎么研究过

有完整的代码,你自己拿去看看,看懂了再改改就成了哈:
#include<stdio.h> #include<stdlib.h>#include <time.h> /*定义头文件*/////////////////////////////////////////////////////////////////////////////int runnian(int year)/*定义变量*/{if(year%4==0&&year%100!=0||year%400==0) /*利用函数判断输入年份是闰年还是平年*/return 1;elsereturn 0;}int day1(int year,int month){int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*定义数组确定12个月每个月的天数*/if(runnian(year)) /*如果输入年份是闰年*/a[1]=29;/*二月29天*/return a[month-1];}int day2(int year,int month,int day){int i,sum=0;for(i=1;i<month;i++){sum+=day1(year,i);}sum+=day;return sum;}int counterdays(int year,int month,int day) /*判断今天距特定日期的天数*/{ int year1, days0,days1,month1,days, day1; time_t timep; struct tm *p; time(&timep); p=gmtime(&timep); year1=(1900+p->tm_year) ; month1=(1+p->tm_mon) ; day1=(p->tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/ days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day); /*判断某天是一年中的第几天*/ days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+day2(year1,month1,day1);if(days0>days1) days=days0-days1;elsedays=days1-days0;/*计算出两个日期之间的时间差*/ printf(" \n"); printf("\n 今天距%d年%d月%d日还有%d天\n\n",year,month,day,days); return days; }int week1(int year,int month,int day){int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day);number%=7;return number;}void jieri(int month,int day) /*判断是否公历节日*/{ if(month==1) switch(day) { case 1: printf(",这天是元旦"); } if(month==2) switch(day) { case 14: printf(",这天是情人节"); } if(month==3) switch(day) { case 8: printf(",这天是妇女节"); break; case 12: printf(",这天是植树节"); } if(month==4) switch(day){ case 1: printf(",这天是愚人节"); } if(month==5) switch(day) { case 1: printf(",这天是劳动节"); break; case 4: printf(",这天是青年节"); } if(month==6) switch(day) { case 1: printf(",这天是儿童节"); } if(month==7) switch(day) { case 1: printf(",这天是建党节"); } if(month==8) switch(day){ case 1: printf(",这天是建军节"); } if(month==9) switch(day) { case 10: printf(",这天是教师节"); } if(month==10) switch(day) { case 1: printf(",这天是国庆节"); } }void display3(int year,int month,int day) /*输出日历*/{ week1( year,month,day); jieri(month,day); counterdays(year,month, day); }char *Week2(int number){switch(number)/*分类一周七天*/{case 0:return "Sun";case 1:return "Mon";case 2:return "Tus";case 3:return "Wed";case 4:return "Ths";case 5:return "Fri";case 6:return "Sat";default: return "错误!请您重新输入。";/*不符和上面七种情况的报错提示*/}}void x1(int year,int month,int day){int number=week1(year,month,day);if(runnian(year))printf("闰年");/*年份为闰年则输出"闰年"*/else printf("平年");printf(" %d 年 %d 月 %d 日%10s\n\n",year,month,day,Week2(number));/*按年 月 日输出结果*/}void x2(int year,int month){int max,number,i,j=1;max=day1(year,month);number=week1(year,month,1);printf("%6s%6s%6s%6s%6s%6s%6s\n"," Sun "," Mon "," Tus"," Wed "," Ths "," Fri "," Sat ");/*按照间隔打印日历*/for(i=0;i<number;i++){printf(" ");}while(j<=max){printf("%8d",j);if(i%7==6){printf("\n");}i++;j++;}printf("\n\n");}int x3(int year,int month,int day){if(year<0||month<1||month>12||day<1||day>day1(year,month))/*当输入植出现这些情况时*/return 0;/*返回0*/elsereturn 1;/*返回1*/}int judge(int year,int month2)/*定义一个函数,把月分为四类(28,29,30,31)*/{ if(month2==1||month2==3||month2==5||month2==7||month2==8||month2==10||month2==12) return(1);/*31天的月份,返回值为1*/ else if(month2==2) { if(year%4!=0||year%100==0&&year%400!=0) return(2);/*平年的2月份,返回值为2*/ else return(3);/*闰年的2月份,返回值为3*/ } else return(4);/*30天的月份,返回值为4*/}void yueli(int year,int month){if(runnian(year))printf("闰年");else printf("平年");printf(" %d 年 %d 月\n\n",year,month);x2(year,month);}void rili(int year,int month,int day){printf("\n");x1(year,month,day);}///////////////////////////////////////////////////////////////////////////void main(){int year,month,day,a,b,n,m,k,c,i,j;char ** p; char * week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};char*month2[]={"January","February","March","April","May","June","July","August","September","October","November","December"};while(1){printf("\n\n\n\n");printf(" **********************************************************\n\n");printf(" * * \n");printf(" 欢迎进入万年历查询系统 \n");printf(" * * \n\n");printf(" **********************************************************\n\n\n");printf(" 1 年历 2 月历 3 日历 4 退出\n");printf(" 请输入您的选择<1~4>,按回车键确定: ");scanf("%d",&b);switch(b){case 1:/*选择1时*/printf("\n请输入您要查的年份: ");/*给出输入提示*/scanf("%d",&year);/*输入查询的年份*/ printf("the calendar of the year:%d.",year); printf("\n"); c=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;/*该年的第一天是星期几*/ for(i=0;i<12;i++)/*输出前几个月的日历表*/ { n=judge(year,i+1); p=month2+i; printf("%s\n",*p);/* 输出月份x*/ printf("\n"); for(j=0;j<7;j++) {p=week+j; printf("%6s",*p);} /* 输出星期x*/ printf("\n"); for(k=0;k<c;k++) printf(" ");/*六个空格*/ for(m=1;m<32;m++){ printf("%6d",m); if((c+m)%7==0) printf("\n");/*输出七个字符(空格和数字)换行*/ if(n==1&&m==31) break; else if(n==2&&m==28) break; else if(n==3&&m==29) break; else if(n==4&&m==30) break;} c=(c+m)%7;/*计算出下个月的第一天是星期几*/ printf("\n"); printf("============================================"); printf("\n");}break;case 2:/*选择二时*/printf("\n请输入您要查的年和月,年月之间用空格隔开: ");/*给出输入提示*/scanf("%d%d",&year,&month);/*输入需要查询的年 月*/a=x3(year,month,1);if(a==0){printf("错误!请您重新输入。\n");break;}yueli(year,month);break;case 3:/*选择3时*/printf("\n请输入您要查的年月日,年月日之间用空格隔开: ");/*给出输入提示*/scanf("%d%d%d",&year,&month,&day);/*输入年 月 日*/ display3(year,month,day);a=x3(year,month,day);if(a==0){printf("错误!请您重新输入。\n");/*输入植异常时报错*/break;}rili(year,month,day); break;case 4:exit(0);default:printf("错误!请您重新输入。\n\n");}}}

1


平川区13911311882: 1、万年历 A、概要 系统实现万年历的功能,并以交互的方式显示.任意输入某一年,可输出该年的年历;输入某 -
播丁地塞: 你好!1 如果对你有帮助,望采纳.

平川区13911311882: 用C语言编写一万年历系统 -
播丁地塞: #include<stdio.h>#include <time.h> int*daysandweek(int*y,int*week); bool runnian(int*); void main() { struct tm *local; time_t t; t=time(0); local=localtime(&t); printf("日历---冰之龙制作\n"); int year,*y;int *week,p=1; week=&p; int monthday[]={31,...

平川区13911311882: 用C或C++实现一个万年历程序主要功能屏幕上显示任意年月的月历按每行两个月的格式输出当年或指定的任意 -
播丁地塞: #include void print_jige(int a[4]) { if(a[0]>=60&&a[1]>=60&&a[2]>=60&&a[3]>=60) { printf("平均成绩是:\t%lf\n",(a[0]+a[1]+a[2]+a[3])*1./4); } } int main() { int a[20]; int i; int j=0; int a1[4]; int a2[4]; int a3[4]; int a4[4]; int a5[4]; printf("请输入第%...

平川区13911311882: c语言编写万年历 -
播丁地塞: #include"stdio.h" #include"stdlib.h" #include"windows.h" void welcome(); void getday(int year,int month); void shuru(); void end(); long year; long month; void welcome() {printf("【万年历程序加载中");for(int i=0;i<30;i++){printf("★"...

平川区13911311882: 如何用C语言编写一个万年历系统? -
播丁地塞: //C语言,编译环境:Microsoft Visual C++ 6.0 #include <stdio.h> #include <process.h> int day_s(); int year_s(); int week_s(); void output_month(); void menu(); void output_year(); int year,month; int main() { printf("请输入年月以打印该月日历!\n...

平川区13911311882: 、电子万年历:用C语言设计一个年历系统,功能要求: (1)输入任一年将显示出该年的所有月份日期,对应的 -
播丁地塞: /* 1、闰年的算法: 如果某年能被4整除但不能被100整除, 或者能被400整除, 则该年是闰年. 用表达式表示就是 (year %4 == 0 && year%100 != 0) || (year%400 == 0)2、计算某一天是星期几: 已知1900年的1月1号为星期一, 然后就可以用某...

平川区13911311882: java程序字符界面实现万年历 -
播丁地塞: import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Scanner; public class Game { public void theCalendar(String str) throws ParseException ...

平川区13911311882: 编程实现万年历的显示
播丁地塞:/*万年历全集:程序可以实现如下三种功能: 求某个日期对应的星期 求某年某月有的天数 输出某年的日历 */ /*2008-11-14 飞鱼晨晨*/ #i nclude #i nclude struct mon { int maxdata; int data; }; void SeekWeekDay(void); //求某个日期对应的星期函...

平川区13911311882: C程序语言课程设计 万年历 -
播丁地塞: #include#include#include main() { void current(void); void _search(void); printf("[1]Today\n[2]One day\nChoice:"); switch(getch()) { case '1':system("cls");current();break; case '2':system("cls");_search();break; } getch(); } void current(void) { ...

平川区13911311882: 用C或C++编程实现一个简单、实用的万年历程序 -
播丁地塞: 自己用VC弄下排版.#include #include char*month_str[]={"January","February","March","April","May","June","July","August","September","October","November","December"}; char*week[]={"Sunday","Monday...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网