鱼C论坛

 找回密码
 立即注册
查看: 2657|回复: 3

编写万年日历

[复制链接]
发表于 2014-3-11 23:19:42 | 显示全部楼层 |阅读模式
1鱼币
如何编写一个万年日历,其功能是输入年份 就输出每个月,知道每一天是星期几,就是和日历上的一样

最佳答案

查看完整内容

是要这样的效果吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-3-11 23:19:43 | 显示全部楼层
本帖最后由 machimilk 于 2014-3-12 02:51 编辑

33.png
是要这样的效果吗




  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;

  5. HANDLE hHandle=GetStdHandle(STD_OUTPUT_HANDLE);
  6. int DaysPerMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  7.         void SetYear();
  8.         bool IsLeap(int year);//判断是否闰年
  9.         int GetDays(int year,int month,int day);//从1年1月1号开始算的天数
  10.         void Print(int year,int month);
  11. bool IsLeap(int year)
  12. {
  13.         if((year%4==0&&year%100!=0)||(year%400==0))
  14.                 return true;
  15.         else
  16.             return false;
  17. }
  18. int GetDays(int year,int month,int day)
  19. {
  20.         int yearDays, monthDays=0,sum;
  21.         int total=0;
  22.         for(int i=1;i<year;i++)
  23.                 if(IsLeap(i))      
  24.                         total++;      
  25.         yearDays=total+(year-1)*365;
  26.         if(IsLeap(year))  DaysPerMonth[2]=29;
  27.         for(int j=1;j<month;j++)
  28.         monthDays+=DaysPerMonth[j];
  29.         sum=yearDays+monthDays+day;
  30.         return sum;
  31. }
  32. void SetYear()
  33. {
  34.         int year,month,day;
  35.         printf("欢迎使用万年历,请输入年份(1-9999):\n");
  36.     scanf("%d",&year);
  37.         while (year<=1||year>9999)
  38.         {
  39.                 printf("请输入年份正确的年份(1-9999)\n");
  40.                 scanf("%d",&year);
  41.         }
  42.        
  43.             month=1;day=1;
  44.             for(int i=1;i<=12;i++)
  45.             Print(year,i);
  46.        
  47. }   
  48. void Print(int year,int month)
  49. {  
  50.        
  51.         int week,day=1;
  52.         SetConsoleTextAttribute(hHandle,10);
  53.         printf("                公元%d年%d月\n\n",year,month);
  54.         SetConsoleTextAttribute(hHandle,15);
  55.         printf("    日    一    二    三    四    五    六\n");
  56.         week=GetDays(year, month,day)%7;
  57.         switch(week)
  58.         {

  59.              case 0:SetConsoleTextAttribute(hHandle,12);printf("%6d",1); break;
  60.                  case 1:SetConsoleTextAttribute(hHandle,11);printf("%12d",1); break;
  61.                  case 2:SetConsoleTextAttribute(hHandle,11);printf("%18d",1); break;
  62.                  case 3:SetConsoleTextAttribute(hHandle,11);printf("%24d",1); break;
  63.                  case 4:SetConsoleTextAttribute(hHandle,11);printf("%30d",1); break;
  64.                  case 5:SetConsoleTextAttribute(hHandle,11);printf("%36d",1); break;
  65.                  case 6:SetConsoleTextAttribute(hHandle,11);printf("%42d",1); break;
  66.         }
  67.         for(int i=2;i<=DaysPerMonth[month];i++)
  68.         {
  69.                 week=(++week)%7;
  70.                 if(!week)
  71.                 {
  72.                         SetConsoleTextAttribute(hHandle,12);
  73.                         printf("\n%6d",i);
  74.                 }
  75.                 else
  76.                 {
  77.                         SetConsoleTextAttribute(hHandle,11);
  78.                      printf("%6d",i);
  79.                 }
  80.     }
  81.            printf("\n\n");
  82. }
  83. int main()
  84. {
  85.         SetConsoleTextAttribute(hHandle,15);
  86.         SetYear();
  87.         SetConsoleTextAttribute(hHandle,15);
  88.         system("pause");
  89.         return 0;
  90. }

  91. [/size]
  92. [size=2]
复制代码





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-3-12 09:02:53 | 显示全部楼层
本人刚学C的时候写的,风格很差,也没啥注释,当时没有规范意识,功能是OK的,大家可以看看
#include <stdio.h>
void main()
{
   extern void calendar(int,int);
   int year,month;
   scanf("%d,%d",&year,&month);       //输入年-月,格式如:2000,1
   printf(" 一 二 三 四 五 六 日\n");
   calendar(year,month);
}
void calendar(int year,int month)
{
   int days=0,day=0;
   int xq=1;         //记录星期
   int x,i=0;         //x是记录当前输入月份天数
   long all=0;         //all
   int date=1;
   if(year>=2007)
   {
  x=year-2007;
L:
  if(i<x)
  {
if((2007+i)%4==0&&(2007+i)%100!=0||(2007+i)%400==0)
{
   all+=366;
   i++;
}
else
{
   all+=365;
   i++;
}
goto L;
  }
   }
   if(year<2007)
   {
x=2007-year;
M:
if(i<x)
{
    if((2007-i)%4==0&&(2007-i)%100!=0||(2007-i)%400==0)
    {
  all-=366;
  i++;
    }
    else
    {
  all-=365;
  i++;
    }
    goto M;
}
   }
   if(year%4==0&&year%100!=0||year%400==0)
days=366;
   else
days=365;
   for(i=1;i<=month;i++)
   {
switch(i)
{
    case 1:day+=31;x=31;break;
    case 2:
    if(365==days)
{
  day+=28;
  x=28;
}
    else
{
  day+=29;
  x=29;
}
    break;
    case 3:day+=31;x=31;break;
    case 4:day+=30;x=30;break;
    case 5:day+=31;x=31;break;
    case 6:day+=30;x=30;break;
    case 7:day+=31;x=31;break;
    case 8:day+=31;x=31;break;
    case 9:day+=30;x=30;break;
    case 10:day+=31;x=31;break;
    case 11:day+=30;x=30;break;
    case 12:day+=31;x=31;break;
}
   }
   all+=day-x;
   while(all<0)
   {
   if(year%4==0&&year%100!=0||year%400==0)
   {
   all+=366;
   year--;
   if(all>0)
   {
   all--;
   goto LOOP;
   }
}
   else
   {
   all+=365;
   if(all>0)
   {
   all--;
   goto LOOP;
   }
   }
   }
LOOP:
   while(all)
   {
all--;
xq++;
if(xq>7)
    xq=1;
   }
   while(x)
   {
if(1==date)
{
if(xq==2)
printf("   ");
if(xq==3)
printf("      ");
if(xq==4)
printf("         ");
if(xq==5)
printf("            ");
if(xq==6)
printf("               ");
if(xq==7)
printf("                  ");
}

if(1==xq)
{  
    for(i=1;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(2==xq)
{
    for(i=2;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  if(xq>7)
         break;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(3==xq)
{
    for(i=3;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(4==xq)
{
    for(i=4;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(5==xq)
{
    for(i=5;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(6==xq)
{
    for(i=6;i<=7;i++)
    {
  printf("%3d",date);
  xq++;
  date++;
  x--;
  if(0==x)
goto A;
    }
    printf("\n");
xq=1;
}
if(7==xq)
{
    printf("%3d\n",date);
xq=1;
    date++;
    x--;
    if(0==x)
  goto A;
}
   }
A:
   printf("\n********************");
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-12 21:07:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 02:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表