C语言程序设计 万年历查询程序。

C语言程序设计 万年历查询程序。,第1张

第一个功能,可以用批命令的方式来解决。

第二个功能,194011这天假设是星期3,定义一个枚举,

enum date

{

//wensday is 194011

wensday,thursday,,sunday,monday,tuesday,

}

下面就用date来表示周几了,任给一天,计算这天离现在的天数比较容易吧,假设为n,那么今天的date就为 n%7(194011距194011为0天哦)

距今天的天数也很简单吧。

第三个与第四个功能由于本人缺乏生活常识,连农历究竟是怎么回事都不是很清楚,所以暂时帮不了你

#include <stdioh>

void main()

{

int year,month,day,days,sum,i,n=0,a;

char c;

redo: printf("请输入年/月/日(例如:2010/1/1):\n");

scanf("%d/%d/%d",&year,&month,&day);

if(month==1&&(day>=32||day<=0))

{

printf("输入有误!1月只能有31天!\n");

goto redo;

}

if(month==2)

{

if((year%400==0)||(year%4==0&&year%100!=0))

{

if(day>=30||day<=0)

{

printf("输入有误!%d年是闰年,二月只能有29天!\n",year);

goto redo;

}

}

else if(day>=29||day<=0)

{

printf("输入有误!%d年是平年,二月只能有28天!\n",year);

goto redo;

}

}

if(month==3&&(day>=32||day<=0))

{

printf("输入有误!3月只能有31天!\n");

goto redo;

}

if(month==4&&(day>=31||day<=0))

{

printf("输入有误!4月只能有30天!\n");

goto redo;

}

if(month==5&&(day>=32||day<=0))

{

printf("输入有误!5月只能有31天!\n");

goto redo;

}

if(month==6&&(day>=31||day<=0))

{

printf("输入有误!6月只能有30天!\n");

goto redo;

}

if(month==7&&(day>=32||day<=0))

{

printf("输入有误!7月只能有31天!\n");

goto redo;

}

if(month==8&&(day>=32||day<=0))

{

printf("输入有误!8月只能有31天!\n");

goto redo;

}

if(month==9&&(day>=31||day<=0))

{

printf("输入有误!9月只能有30天!\n");

goto redo;

}

if(month==10&&(day>=32||day<=0))

{

printf("输入有误!10月只能有31天!\n");

goto redo;

}

if(month==11&&(day>=31||day<=0))

{

printf("输入有误!11月只能有30天!\n");

goto redo;

}

if(month==12&&(day>=32||day<=0))

{

printf("输入有误!12月只能有31天!\n");

goto redo;

}

if(month>=1&&month<=12)

{

if(year%400==0||(year%4==0&&year%100!=0))

printf("%d年是闰年。\n",year);

else printf("%d年是平年。\n",year);

}

if(year>=1901) goto loop1;

else goto loop2;

loop1: for(i=1901;i<year;i++)

{

if(i%400==0||(i%4==0&&i%100!=0))

n++;

}

days=(year-1901-n)365+n366;

switch(month)

{

case 1:sum=0;break;

case 2:sum=31;break;

case 3:sum=59;break;

case 4:sum=90;break;

case 5:sum=120;break;

case 6:sum=151;break;

case 7:sum=181;break;

case 8:sum=212;break;

case 9:sum=243;break;

case 10:sum=273;break;

case 11:sum=304;break;

case 12:sum=334;break;

default:printf("一年内只能有12个月!请重新输入!\n");goto redo;

}

a=sum+day+days;

if((year%400==0||(year%4==0&&year%100!=0))&&(month>=3))

a++;

if(a%7==1) printf("%d年%d月%d日是星期二。\n",year,month,day);

if(a%7==2) printf("%d年%d月%d日是星期三。\n",year,month,day);

if(a%7==3) printf("%d年%d月%d日是星期四。\n",year,month,day);

if(a%7==4) printf("%d年%d月%d日是星期五。\n",year,month,day);

if(a%7==5) printf("%d年%d月%d日是星期六。\n",year,month,day);

if(a%7==6) printf("%d年%d月%d日是星期天。\n",year,month,day);

if(a%7==0) printf("%d年%d月%d日是星期一。\n",year,month,day);

goto label;

loop2: for(i=1900;i>year;i--)

{

if(i%400==0||(i%4==0&&i%100!=0))

n++;

}

days=(1900-year-n)365+n366;

switch(month)

{

case 1:sum=0;break;

case 2:sum=31;break;

case 3:sum=58;break;

case 4:sum=90;break;

case 5:sum=120;break;

case 6:sum=151;break;

case 7:sum=181;break;

case 8:sum=212;break;

case 9:sum=243;break;

case 10:sum=273;break;

case 11:sum=304;break;

case 12:sum=334;break;

default:printf("一年内只能有12个月!请重新输入!\n");goto redo;

}

if(year%400==0||(year%4==0&&year%100!=0))

a=366-(day+sum)+days;

else a=365-(day+sum)+days;

if((year%400==0||(year%4==0&&year%100!=0))&&(month>=3))

a--;

if(a%7==0) printf("%d年%d月%d日是星期一。\n",year,month,day);

if(a%7==1) printf("%d年%d月%d日是星期天。\n",year,month,day);

if(a%7==2) printf("%d年%d月%d日是星期六。\n",year,month,day);

if(a%7==3) printf("%d年%d月%d日是星期五。\n",year,month,day);

if(a%7==4) printf("%d年%d月%d日是星期四。\n",year,month,day);

if(a%7==5) printf("%d年%d月%d日是星期三。\n",year,month,day);

if(a%7==6) printf("%d年%d月%d日是星期二。\n",year,month,day);

label: printf("Do you want to continueY/N:");

getchar();

c=getchar();

if(c=='Y'||c=='y')

{

n=0;

goto redo;

}

}

写万年历程序,您需要先了解万年历的特点

下面是万年历的特点(复制粘贴的):

1 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。

由于公元1月1日设为星期六,故3月1日为星期三。 ——注意这个“三”

为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。

2 每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)

所以百年%4=0闰或(年%4=0并且年<>0)闰。

3 每 4年(3个平年+1个闰年)共208周+5天 ——注意这个“5天”

每百年共100(208周+5天)-1天=5217周+5天 ——注意这个“5天”(整百年暂设为平年)

每400年共4(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)

即400年一轮回!(原来万年历400年前是一家)

至于你说的日期和星期对齐,给你一点思路参考:每一行是7天,可以设定每一天占10个字符(同时上面的星期也得占满10个字符),假设本月第一天是星期4,那么在输出1之前需要先输出10×3个字符来占位,当输出星期天的日期之后换行,之后的就简单了

看看没人帮你,我来帮你吧,以下是我新写的,用了我自己原创的算法,完全不同于网上的程序,等于说是专门为你量身定制的。奉上程序:

#include <stdioh>

#include <windowsh>

char NameOfMonth[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};

char WeekDay[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

int IsLeapYear (int year)

{

 if(year%4==0&&year%100!=0||year%400==0)

 {

  return 1;//闰年返回1

 }else

 {

  return 0;//平年返回0

 }

}

int DateCheck(int uYear,int uMonth,int uDay)//合法返回true,非法或超出范围返回false

{

 if (uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)

 {

  return 0;

 }

 if (uMonth==4||uMonth==6||uMonth==9||uMonth==11)

 {

  if (uDay>30)

  {

   return 0;

  }

 }else if (uMonth==2)

 {

  if (IsLeapYear(uYear))

  {

   if (uDay>29)

   {

    return 0;

   }

  }else

  {

   if (uDay>28)

   {

    return 0;

   }

  }

 }

 return 1;

}

int GetDays (int year,int month,int day)

{

 int sum=0;

 if (DateCheck(year,month,day)==0)

 {

  return -1;//日期有误

 }

 if(year>=1901)

 {

  int X=(int)(year/100);//世纪数

  int Y=X-(int)(X/4);//如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去

  if (month<=2&&month>0)

  {

   year--;//把1月、2月视为上一年的13月、14月(纯粹为了计算需要)

   month+=12;

  }

  sum=(int)(36525(year-1900))+(int)(306(month+1))+day-Y-49;//以36525(本来实际太阳年是3652425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)

  //月份以306天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0

 }

 return sum;//返回距离1900年1月1日的总天数(积日)

}

int GetDayOfMonth(int month,int year) 

{

 int tmp_days=GetDays(year,month,1);//本月积日

 int DayOfMonth=0;

 month++;//下个月

 if (month>12)

 {

  month=1;//遇到月份为12月的情况,月份为1,年份加1

  year++;

 }

 DayOfMonth=GetDays(year,month,1);//下个月的积日

 DayOfMonth-=tmp_days;//下月1日的总天数(距离1900年1月1日的积日)减去当前月1日的总天数

 return DayOfMonth;//返回当前月总天数

}

int ShowCalendar(int year,int month,int day)

{

 int i,j,count;

 int jiri=0;//积日

 int dayofweek=0;//星期

 if (DateCheck(year,month,day)==0)

 {

  printf("输入日期有误!\r\n");//日期不合法或超出范围,年历从1901年开始

  return 0;

 }

 printf("\t    %d      %s\r\n",year,NameOfMonth[month-1]);

 printf("--------------------------------------\r\n");

 printf("   Sun  Mon  Tue  Wed  Thu  Fri  Sat\r\n");

 printf("--------------------------------------\r\n");

 jiri=GetDays(year,month,1);//获取距离1900年1月1日的总天数

 dayofweek=(1+jiri)%7;//月首星期,因为1900年1月1日星期一

 count=GetDayOfMonth(month,year);

 for(i=0;i<dayofweek;i++)

 {

  printf("     ");//填充前面空格

 }

 for(i=1,j=dayofweek;i<=count;i++,j++)

 {

  if (i<10)

  {

   printf("    %d",i);

  }else

  {

   printf("   %d",i);

  }

  if((j+1)%7==0)

  {

   if (i!=count)

   {

    printf("\r\n");//满7天,换行

   }

  }

 }

 printf("\r\n--------------------------------------\r\n\r\n");

 return 1;

}

int main()

{

 int year,month,day,nChoise=0;

 int totaldays=0;

 while (1)//主循环

 {

  printf("欢迎使用万年历\r\n");

  printf("$                      菜单                        $\r\n");

  printf("$     1闰年判断              2星期计算           $\r\n");

  printf("$                                                  $\r\n");

  printf("$     3月历查询              4打印整年日历       $\r\n");

  printf("$                                                  $\r\n");

  printf("\r\n");

  printf("输入对应的序号进行相关 *** 作:Choise>");

  scanf("%d",&nChoise);

  switch (nChoise)

  {

  case 1:

   printf("请输入要判断的年份:Year>");

   scanf("%d",&year);

   if (year<1900||year>9999)

   {

    printf("输入年份超出范围!");

    break;

   }

   if (IsLeapYear(year)==1)

   {

    printf("%d年是闰年!\r\n\r\n",year);

   }else

   {

    printf("%d年不是闰年!\r\n\r\n",year);

   }

   break;

  case 2:

   printf("请输入要判断的日期:Year Month Day>");

   scanf("%d %d %d",&year,&month,&day);

   totaldays=GetDays(year,month,day);

   printf("%d年%d月%d日是%s\r\n\r\n",year,month,day,WeekDay[(totaldays+1)%7]);

   break;

  case 3:

   printf("请输入要显示的月份:Year Month>");

   scanf("%d %d",&year,&month);

   ShowCalendar(year,month,1);

   break;

  case 4:

   printf("请输入要判断的年份:Year>");

   scanf("%d",&year);

   for (month=1;month<=12;month++)

   {

    ShowCalendar(year,month,1);

   }

   break;

  default:

   printf("无效的菜单项!\r\n");

   break;

  }

  system("pause");

  system("cls");

 }

 return 0;

}

以上就是关于C语言程序设计 万年历查询程序。全部的内容,包括:C语言程序设计 万年历查询程序。、c语言程序设计 万年历报告书、用c语言编写万年历等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9826404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存