QQ网名大全

c语言设计万年历

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

#include <stdio.h>
#include <windows.h>
char *nameofmonth[12]={"january","february","march","april","may","june","july","august","september","october","november","december"};
char *weekday[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
int **leapyear (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 (**leapyear(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)(365.25*(year-1900))+(int)(30.6*(month+1))+day-y-49;//以365.25(本来实际太阳年是365.2425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)
  //月份以30.6天的平均值计算。最后减去的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,ncho**e=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("输入对应的序号进行相关操作:cho**e>");
  scanf("%d",&ncho**e);
  switch (ncho**e)
  {
  case 1:
   printf("请输入要判断的年份:year>");
   scanf("%d",&year);
   if (year<1900||year>9999)
   {
    printf("输入年份超出范围!");
    break;
   }
   if (**leapyear(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;
}
佚名
2024-06-04 22:10:42
最佳回答
类似问题(10)
  • 佚名
    2024-06-04 10:49:53

    c语言编写万年历~~速度

    /*c语言编程万年历要求输入年月,判断是否闰年;输入年月日,判断星期几;输入年份,打出12个月的月历;输入年份,月份,打印出本月日历;要求用多个函数实现。*/#...

  • 佚名
    2024-06-04 11:36:58

    c语言 万年历的程序设计

    #include <windows.h> #include <winnt.h> #include<iostream>#include<i...

  • 佚名
    2024-06-04 20:03:26

    万年历查询程序c语言代码

    刚好有现成的,是之前写的,原创的代码和算法。部分细节自行修改吧。下载:olaf

  • 佚名
    2024-06-04 08:00:00

    【加急】用c语言做万年历

    分数太少了吧,呵呵除了农历,都比较好做功能,用一个printf打印功能目录,switch调用子函数来完成,要是多次,加一个大循环即可日历显示,这个比较简单,就是...

  • 佚名
    2024-06-04 08:00:00

    用c语言编写万年历

    写万年历程序,您需要先了解万年历的特点下面是万年历的特点(复制粘贴的):1. 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2...

  • 佚名
    2024-06-04 08:00:00

    c#窗体应用设计一个简易的万年历程序

    有现成的控件还自己做干嘛

  • 佚名
    2024-06-04 08:00:00

    用c语言编写万年历。

    #include "stdio.h"void main(){ long days; int j,i,s,mdays,flag,yy,y; printf("...

  • 佚名
    2024-06-04 08:00:00

    【难】用c语言打印一个万年历

    #include <iostream.h>#include <time.h>#include <stdio.h>#include <st...

  • 佚名
    2024-06-04 08:00:00

    c语言万年历问题

    你在第一个for循环里加一个prnt("\n");不就好了、、、我不知道你的month数组里是怎么存的~你得算好每个月第一天是星期几,然后填好空格、建议你的输入...

  • 佚名
    2024-06-04 08:00:00

    急!!!用c语言编写万年历!!!!!!!!!

    #include <stdio.h>#include <string.h>#include <ctype.h>long year;int mo...