基于C语言的万年历

版权声明:可直接转载,但转载时请标明本文的链接。 https://blog.csdn.net/GeenyH/article/details/50447876

大一刚学几个月C语言后写了两天的课程设计,尽管现在看来写的有些稚气,风格凌乱,但也看得出用心。留住做个回念。


#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include<conio.h>
int judge(int year)  //判断该年是不是闰年 
{
 int a;
 if(year%100==0)
  if(year%400==0)
   a=1;
  else a=0;
 else if(year%4==0)
  a=1;
     else a=0;
 return(a);
} 



int weekday(int year)  //判断该年的11号是星期几  
{
 int a,b,c,d;
 long day;
 year--;
 a=year/400;
 b=(year%400)/100;
 c=(year%100)/4;
 day=365*year+97*a+24*b+c;  //算该年11日距元年11日(星期一)有多少天
 d=day%7;
 d++;                        //算该年11日是周几
 return(d);
}




int monthdays(int year,int i)  //判断一个月多少天    
{ 
 int a,monthday;
 a=judge(year);
 switch(i)
    {
        case  1:monthday=31;break;
        case  2:monthday=28+a;break;
        case  3:monthday=31; break;
        case  4:monthday=30; break;
        case  5:monthday=31;break;
        case  6:monthday=30;break;
  case  7:monthday=31;break;
        case  8:monthday=31;break;
        case  9:monthday=30;break;
        case 10:monthday=31;break;
        case 11:monthday=30;break;
        case 12:monthday=31;break;
    }
    return(monthday);
}
int main()
{  
    int a;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    //SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//绿色背景
    system("color 0A");
    printf("                                                                   \n");
    printf("            ┏━━━━━━━━━━━━━━━━━━━━┓           \n");
    printf("            ┃  欢 迎 来 到 万 年 历 查 询 系 统      ┃           \n");
    printf("            ┗━━━━━━━━━━━━━━━━━━━━┛           \n");  
    printf("                                                                   \n");
    printf("                                                                   \n");
    printf("            ┏━━━━━━━━━━━━━━━━━━━━┓           \n");
    printf("            ┃   查 询 一 年 的 日 历 请 按    1      ┃           \n");
    printf("            ┗━━━━━━━━━━━━━━━━━━━━┛           \n");
    printf("            ┏━━━━━━━━━━━━━━━━━━━━┓           \n");
    printf("            ┃  查 询 某 年 某 月  的 请 按    2      ┃           \n");
    printf("            ┗━━━━━━━━━━━━━━━━━━━━┛           \n");
    printf("            ┏━━━━━━━━━━━━━━━━━━━━┓           \n");
    printf("            ┃ 查 询 某 年 某 月 某日 的 请 按 3      ┃           \n");
    printf("            ┗━━━━━━━━━━━━━━━━━━━━┛           \n");
    printf("\n");
    printf("\n");
    printf("\n");
    do{
        printf("请输入1或2或3.\n");
        scanf("%d",&a);
        if(a!=1 && a!=2 && a!=3)
            printf("输入错误,请重新输入。\n");                   
    }while(a!=1 && a!=2 && a!=3);


    //运行1模式

    if(a==1)
  {
  int year,i,j,k,s,firstday,monthday;
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  //system("color 3");
  system("cls");
  do{
  printf("请输入一个年份:\n");
  scanf("%d",&year);
  if(year<=1)
   printf("您输入的年份不符合条件,请重新输入。\n");
 }while(year<=1);
    system("cls"); 
 s=judge(year);
 if (s==1)
  printf("%d 年为闰年,该年有366天,下面是该年的日期表:\n",year);
 else printf("%d 年为平年,该年有365天,下面是该年的日期表:\n",year);     
 printf("\n");
 firstday=weekday(year);
 for(i=1;i<=12;i++)  //i代表月份
 {
  monthday=monthdays(year,i);
  printf("          %d 月\n",i);
  printf("\n");
  SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
  printf("日  ");
        SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
  printf("一  二  三  四  五  六\n");
  for(j=0;j<firstday%7;j++)
  {
   printf("    ");              //写一个月1号前面没有星期天
  }
  for(k=1;k<=monthday;k++)
  {
   if((k+firstday)%7==1)
   {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
    printf("%-4d",k);
    } 
   else 
    {
         HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
     SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
     printf("%-4d",k);
    }

  SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
   if((k+firstday)%7==0)
    printf("\n");
  }
  firstday=(firstday+monthday)%7;    //下个月份的1号星期几
  printf("\n");
  printf("\n");
 }
 }


      //运行2模式,内容其实和模式1是一样的,这里只是把不是指定的月份对应的月历清空,剩下指定月份年的日历

    if(a==2)
 {

    int year,i,j,p,k,s,firstday,monthday,month,day=0;                    //day=0  的用处是在下面如果给不是写 年月 而是写 年月日 ,会提示错误
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    system("cls");
    do{
        day=0;
        printf("请输入一个月份,如  2014,5  表示2014年5月:\n");
        scanf("%d,%d,%d",&year,&month,&day);
        if(year<=1||month<1||month>13||day!=0)
            printf("您输入的  年月份  不符合格式,请重新输入。\n");
    }while(year<=1||year>9999||month<1||month>13||day!=0);
    system("cls");
    s=judge(year);
    if (s==1)
        printf("%d 年为闰年,该年有366天,下面是%d%d月的日期表:\n",year,month);
    else printf("%d 年为平年,该年有365天,下面是%d%d月的日期表:\n",year,month);
    printf("\n");
    firstday=weekday(year);
    for(i=1;i<13;i++)  //i代表月份
        {
            system("cls");
            monthday=monthdays(year,i);
            printf("          %d 月\n",i);
            printf("\n");
            SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
            printf("日  ");
            SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
            printf("一  二  三  四  五  六\n");
            for(j=0;j<firstday%7;j++)
            {
            printf("    ");              //写一个月1号前面没有星期天
            }
            for(k=1;k<=monthday;k++)
            {
                if((k+firstday)%7==1)
                {
                    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
                    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
                    printf("%-4d",k);
                } 
                 else 
                 {
                    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
                    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
                    printf("%-4d",k);
                }
                SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
                if((k+firstday)%7==0)
                    printf("\n");
            }
            firstday=(firstday+monthday)%7;    //下个月份的1号星期几
            printf("\n");
            printf("\n");
            if(i==month)
            {
                for(p=0;p<firstday%7;p++)
                {
                    printf("    ");              //写一个月1号前面没有星期天
                }
                break;
            }
        }
    printf("\n");
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
    if (s==1)
        printf("%d 年为闰年,该年有366天,以上是   %d%d月   的日期表:\n",year,year,month);
    else printf("%d 年为平年,该年有365天,以上是    %d%d月  的日期表:\n",year,year,month);
    }





   //以下是3模式,内容其实和模式1是一样的,这里只是把不是指定的月份对应的月历清空,剩下指定月份年的日历,并且如果当期满足输入的天时,变为高亮色
 if(a==3)
 {

    int year,i,j,p,k,s,firstday,monthday,month,day=0,whichday;                    //用于检查输入的天数是星期天
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    system("cls");
    do{
        printf("请输入一个 年月日,如  2014,5,30 表示2014年5月30号\n");
        scanf("%d,%d,%d",&year,&month,&day);
        if(year<=1||month<1||month>13||day==0)
            printf("您输入的  年月日  格式不符合要求,请重新输入。\n");
    }while(year<=1||month<1||month>13||day==0);
    system("cls");
    s=judge(year);
    if (s==1)
        printf("%d 年为闰年,该年有366天,下面是%d%d月的日期表:\n",year,month);
    else printf("%d 年为平年,该年有365天,下面是%d%d月的日期表:\n",year,month);
    printf("\n");
    firstday=weekday(year);
    for(i=1;i<13;i++)  //i代表月份
        {
            system("cls");
            monthday=monthdays(year,i);
            printf("          %d 月\n",i);
            printf("\n");
            SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
            printf("日  ");
            SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
            printf("一  二  三  四  五  六\n");
            for(j=0;j<firstday%7;j++)  //用于排版
            {
            printf("    ");              //写一个月1号前面没有星期天
            }
            for(k=1;k<=monthday;k++)
            {

                if((k+firstday)%7==1)
                {
                    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
                    if(k==day)
                    {
                        SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//当k是输入天数时,日期变成高亮
                        printf("%-4d",k);
                        whichday=7;                //记录这一天是星期天

                    }
                    else
                    {
                    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
                    printf("%-4d",k);
                    }
                } 
                 else 
                 {
                    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
                    if(k==day)
                    {
                        SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);          //当k是输入天数时,日期变成高亮
                        printf("%-4d",k);
                        whichday=(k+firstday)%7-1;   //记录这一天是星期几
                    }
                    else
                    {
                    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
                    printf("%-4d",k);
                    }
                }
                SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);     //变成白色
                if((k+firstday)%7==0)
                    printf("\n");
            }
            firstday=(firstday+monthday)%7;    //下个月份的1号星期几
            printf("\n");
            printf("\n");
            if(i==month)
            {
                for(p=0;p<firstday%7;p++)
                {
                    printf("    ");              //写一个月1号前面没有星期天
                }
                break;
            }
        }
    printf("\n");
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
    if (s==1)
        printf("%d 年为闰年,该年有366天,以上是  %d%d%d日  对应的日期表,这一天是星期 %d \n",year,year,month,day,whichday);
    else
        printf("%d 年为平年,该年有365天,以上是   %d%d%d日 对应的日期表,这一天是星期 %d \n",year,year,month,day,whichday);
    }
    return 0;
} 


2014年3月

猜你喜欢

转载自blog.csdn.net/GeenyH/article/details/50447876