c++万年历实验报告

         实验6   基于命令行窗口的日历查询程序

                      (综合性实验)

1.引言.

1.1实验目的:

(1) 了解程序开发环境调试工具的使用;

(2) 掌握小型系统的开发过程,学会用 C++语言解决问题。

1.2实验题目:

设计一个实用日历查询系统“万年历”,使其类似于家里的日历。方便人们查看日历信息

此项目可用:控制语句、函数、数组、循环等基本的知识点综合应用实现

它的主要功能为:根据用户输入的参数,显示相应的信息。

例如:输入年月日的具体日期,系统会输出该天是星期几;

如果输入的数据是年月,则会输出该年该月的日历信息。

1.3实验内容:

学习开发命令行窗口的日历查询程序。实验涉及的内容包含《程序语言基础(C 语言)》的大部分知识点,主要包括:三种基本的控制结构、函数和函数调用。还有一些必要的知识点,开发环境采用微软公司的 Visual Studio 6.0。

1.4 程序要求

(1)程序中必要的地方有注释

(2)对输入错误等情况要给出提示信息,要求重新输入

(3)对程序进行充分测试,包含可能的各种情况

(4)采用多文件结构组织方式来实现该项目程序

1.5 基本功能(必做)

1) 实现可以“判断指定的年份是否为闰年以及每年的天数”的函数;

2) 实现可以“判断指定的年份每一个月的天数”的函数;

3) 实现可以“显示指定某一年的日历” 的函数;

4) 实现可以“显示指定某年某一月的日历” 的函数;

5) 实现可以“显示某一天是星期几”的函数;

注意:书写和实现函数时,请在前面按如下格式添加类似注释信息:

/*

   函数名称:main

   功能描述:主程序

   创建人 :张三丰

   修改记录:20##-12-24 第 1.0 版*/

1.6增强功能(选做)

1)可以实现日程计划

2)  预约提醒显示

3)公历与农历的转换

4)农历节气信息的查询显示等等

2.设计思想:

设计本万年历时我做了三个查询功能:查询某一年或某一月的万年历,查询某一天是星期几.使用多文件结构来实现,把年,月,日分作不同的函数在储存在不同的文件里.通过在main函数的中调用来实现.

3.算法分析说明

(1)计算某一天是星期几的算法:d=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7

结果为0,1,2….6,分别表示星期日至六.

(2)判断某一年是否为闰年:if(year%4==0&&year%100!=0||year%400==0)

4.要用到的函数和语句

主函数在功能的选择时用到了switch()语句;

实现程序的继续或退出功能时用到了do{ .. } while()循环语句

判断用if()语句;

万年历的输出用到for()循环;

5.流程图

系统流程图:

6.设计分析

7.功能过程的推导

功能1:

设计思路:

要想输出一年的日历,首先得解决输出一个月日历的问题,然后用循环输出十二个月份的。首先提示由键盘输入要显示的年份,得到年份后开始进入循环,定义月份变量month,并赋初值为1(从一月份开始),第一步,进入monthdays(int year,int month)函数判断月份的天数,然后根据进入void printmonth(int year,int month)函数根据年月计算出该月一号是星期几并输出月份和每周的表头,由循环空出一号前面空的部分,再由另一个循环,加上前面该月天数的判断,就能输出该月的日历,此时一个月的日历输出完毕,进入第二次循环,输出下一个月的日历,知道十二个月份的日历全部输出,循环结束,第一个功能实现。

功能2:

设计思路:

    第二个功能是第一个功能的一部分,只需要输出一个月的日历,这是月份不是由1开始,而是由键盘输入的,日历输出方法与第一个功能中的方法相似。

流程图:

 

功能3:

判断这一天是星期几,由蔡勒公式计算,得到的余数是从0到6,0对应星期日,其他的正好对应;

8.测试结果

1.开始界面:

2.测试1:

3.测试3:

9.完整的源代码

//head.h头文件//

#ifndef HEAD_H

#define HEAD_H

extern  int yeardays(int year);

extern  int monthdays(int year,int month);      

extern  void printyear();

extern  void printmonth(int year,int month);

extern  void findday();

#endif

//main函数//

#include<iostream>

using namespace std;

#include "head.h"

int main ( int argc, char *argv[])

{

      

       cout<<"****************************************************************************"<<endl;

       cout<<"******************************欢迎使用万年历!******************************"<<endl;

       cout<<"****************************************************************************"<<endl;

       int flag=1;

       do{

       cout<<"HALLO! 请选择:"<<endl;

       cout<<"--------------------------1.显示某一年的万年历------------------------------"<<endl;

       cout<<"--------------------------2.显示某一月的万年历------------------------------"<<endl;

       cout<<"--------------------------3.查询某一天星期几--------------------------------"<<endl;

       cout<<"--------------------------0.退出--------------------------------------------"<<endl;

       int choice;

       cin>>choice;

       if(choice!=0)

       {

       hh:switch(choice)          //选择

       {

       case 1:printyear();break;    //调用打印年份函数.

       case 2:

              {  int year,month;

              cout<<"请输入年和月,如:2013 1"<<endl;

              cin>>year>>month;

              printmonth(year,month);           //调用打印月份函数

              break;

      

              }

       case 3:findday();break;

       default:cout<<"输入错误,请重新输入:"<<endl;

              cin>>choice;goto hh;

          }

          }

       else

       {cout<<endl<<"感谢使用,再见!"<<endl<<endl;

       flag=0;                                                 //退出

       }

       }while(flag);

       return 0;

}

//file1.cpp//-----------“判断指定的年份是否为闰年以及每年的天数”的函数;

#include "head.h"

int yeardays(int year) 

{

       int yeardays=0;

       if(year%4==0&&year%100!=0||year%400==0)//判断是否为闰年.

       yeardays+=366;

       else

       yeardays+=365;

       return yeardays;

}

//file2.cpp//---------“判断指定的年份每一个月的天数”的函数;

#include "head.h"

int monthdays(int year,int month)

{

int days_mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//用数组表示每个月的天数.

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

{days_mon[2]=29;}

return days_mon[month];

}

//file3.cpp//----------“显示指定某一年的日历” 的函数;

#include<iostream>

using namespace std;

#include "head.h"

void printyear()

{

int year;int i;

cout<<endl;

cout<<"请输入年份:"<<endl;

cin>>year;

for(i=1;i<13;i++)

{

printmonth(year,i);

       }

}

//file4.cpp//----------“显示指定某年某一月的日历” 的函数;

#include<iostream>

using namespace std;

#include "head.h"

void printmonth(int year,int month)

{

       int i,d,days=1;

    char *dayss[]={"SUN","MON","TUE","WEN","THU","FRI","SAT"};  //用数组元素代表星期几

  

       cout<<endl;

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

       days+=monthdays(year,i);     //计算总天数

    d=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;//用d=0.1.2…..6来表示星期一至日.

       cout<<year<<"年"<<month<<"月"<<endl;   //输出月历部分.

       for(int j=0;j<7;j++)

       cout<<dayss[j]<<" ";

       cout<<endl;

   

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

   cout<<"    ";

   for(int k=1;k<=monthdays(year,month);k++)

   {

   if(k<10)

   cout<<k<<"   ";

   else cout<<k<<"  ";

   if((k+d)%7==0)

       cout<<endl;

   }

   cout<<endl;

}

//file5.cpp//----------“显示某一天是星期几”的函数;

#include<iostream>

using namespace std;

#include "head.h"

void findday()

{

char *dayss[]={"日","一","二","三","四","五","六"};

int year,month,day,days,z=0;

cout<<"请输入年月日(如:2013 1 1)"<<endl;

cin>>year>>month>>day;

days=day;

for(int i=0;i<month;i++)

       days+=monthdays(year,i);

z=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;

cout<<year<<"年"<<month<<"月"<<day<<"日"<<"是星期"<<dayss[z]<<endl;

}

10.结束语

用了很长一段时间来收集资料,分析,设计,终于编写出了本万年历。虽然由于时间原因还未来得及完善和丰富他的功能,但在设计过程中不仅让我复习了以前的知识,还学会了很多新的东西。

11.参考文献.

百度文库.

 

第二篇:C语言课程设计实验报告(万年历)

C语言课程设计

一、题目及功能描述

题目:万年历的设计

利用C语言设计出万年历,使其实现如下要求

1、输入一个年份,在屏幕上输出该年的年历(包括每月的天数和所对应的星期几),并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐、美观,符合年历显示规范。假定输入的年份在1-9999年之间。

2、输入年月,输出该月的月历。

3、输入年月日,输出距今天还有多少天,是星期几,是否是公历节日。:

4、指定键盘的某些键,用于控制变换不同年、月、日的显示。即:当前若正在显示20##年的年历,按下键盘“←”方向键后,年历变为20##年的。

二、使用的所有变量的说明

变量说明:(以下均为整型变量)

year 表示年份的变量

month 表示月份的变量

day 表示日期的变量

select 表示菜单选择的变量

i 表示月份的变量

j 表示一个月中的某一天的变量

sum 判断某天是一年中的第几天的变量

number判断某天离公元1年1月1日还有几天的变量

a[] 表示每月天数的数组变量

year1 系统时间年份的变量

month1 系统时间月份的变量

day1 系统时间日期的变量

三、程序清单及其说明

#include "time.h"       /*包含的头文件*/

#include "stdio.h"

#include "math.h"

#include "windows.h"

#include "conio.h"

#define   KEYNUMUp                   0x48         /*宏定义*/

#define   KEYNUMDown                 0x50 

#define   KEYNUMLeft                 0x4b  

#define   KEYNUMRight                0x4d

#define   KEYNUMPageUp               0x49

#define   KEYNUMPageDown             0x51 

int eachyeartotal(int year,int month,int day);                   /*函数声明*/

int counterdays(int year,int month,int day);

int nowtime(int year,int month,int day);

int week(int year,int month,int day);

int maxDay(int year,int month);

int isleap(int year);

void whatweek(int year,int month,int day);

void display(int year ,int month);

void display2(int year,int month);

void display3(int year,int month,int day) ;

void setDay1(int year,int month,int day);

void setDay2(int year,int month,int day);

void setDay3(int year,int month,int day);

void jieri(int month,int day);

void display1(int year);

void getmenu();

void main()                                              /*主函数*/

{

  int year,month,day,select;

  while(1)

  {

    getmenu();

    printf("  请输入相应数字:");                         /*菜单选择 */

    scanf("%d",&select);

    system("cls");

    switch(select)

    {

      case 1:                                   /*当选择为1时显示年历*/

      printf("   年历显示:输入年(如2011):");

      scanf("%d",&year);

      if(year>0&&year<10000)                    /*显示年份从0-10000 */

       {

              display1(year);  /*调用函数*/

        printf(" 提示  按↑:上一年   按↓:下一年   按其他键:返回菜单\n\n");      

        setDay1( year,month, day);

        }

         else

         system("cls");

         printf("  输入无效,重新输入!\n");

          break;

     

      case 2:                                  /*当选择为2显示月历*/

      printf("  月历显示:输入年月(如2011,6):");

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

      if(year>0&&year<10000&&month>=1&&month<=12)

       {

        display2(year,month);

        printf(" 提示  按←:上个月   按→:下个月   按其他键:返回菜单\n\n");

        setDay2( year,month, day);

        }

         else

         system("cls");

         printf("  输入无效,重新输入!\n");

         break;

     

      case 3:                                 /*当选择为3时显示日期*/

      printf("  日期显示:输入年月日(比如2011,6,23):");

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

      if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month))

       {

        display3(year,month,day);

        printf(" 提示  按PageUp:前一天    按PageDown:后一天   按其他键:返回菜单\n\n");

        setDay3( year,month, day);

        }

         else

         system("cls");

         printf("  输入无效,重新输入!\n");

         break;

        

       case 4:

       exit(0);

        

      default:                  /*当输入其他数字时,输入无效,重新输入*/

      system("cls");

      printf("  输入无效,重新输入!\n");

    

    }

  }

}

int isleap(int year)                                /*判断是否为闰年*/

{

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

 return 1;

 else

 return 0;

 }

int maxDay(int year,int month)  /*每月的天数*/

{

  int a[]={31,28,31,30,31,30,31,31,30,31,30,31};            /*每个月中的天数*/

  if(isleap( year)) 

  a[1]=29;                                     /*闰年2月份有29天*/

  return a[month-1];

 }

int eachyeartotal(int year,int month,int day)       /*判断某天是一年中的第几天*/

{

  int i,sum=0;

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

  sum+=maxDay(year,i);

  sum+=day;

  return sum;

  }

int week(int year,int month,int day)           /*对天数进行判断确定是星期几*/

{

  int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400

  +eachyeartotal(year,month,day);

  number=number%7  ;

  return number;

}

void display(int year ,int month)                           /*输出年月*/

{

  int max,number,i,j=1;

  max=maxDay(year,month);

  number=week(year,month,1);

  printf("  %4s  %4s  %4s  %4s  %4s  %4s  %4s\n","Sun","Mon","Tue","Wed",

 "Thu","Fri","sat");

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

  printf("      ");                             /*1号前的星期补空格*/

  while(j<=max)

  {

    printf("%6d",j);

    if (i%7==6) 

     printf("\n");                                    /* 每7格换一行*/

     i++;

     j++;

   }

   printf("\n\n");

}

void display1(int year)                                       /*输出年历*/

{

  int i;

  printf("\n");

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

 {

   printf("%d 年 %d 月\n\n ",year,i);

   display(year,i);

  }

}

void display2(int year,int month)                             /*输出月历*/

{

  printf("\n%d 年  %d 月\n ",year,month);

  display(year,month);

 }

void display3(int year,int month,int day)                     /*输出日历*/

{

  whatweek( year,month,day);

  jieri(month,day);

  counterdays(year,month, day);

  }

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+eachyeartotal(year,month,day);

          days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1);

           days=days0-days1;             /*计算出两个日期之间的时间差*/

            printf("\n  今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);

            return days;

             }

void whatweek(int year,int month,int day)                  /*判断是星期几*/

{

  int number;

  number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);

  number=number%7  ;

  switch( number)

  {

    case 0:

    printf( "\n  %d年%d月%d日是星期日",year,month,day);break;

    case 1:

    printf( "\n  %d年%d月%d日是星期一",year,month,day);break;

    case 2:

    printf( "\n  %d年%d月%d日是星期二",year,month,day);break;

    case 3:

    printf( "\n  %d年%d月%d日是星期三",year,month,day);break;

    case 4:

    printf( "\n  %d年%d月%d日是星期四",year,month,day);break;

    case 5:

    printf( "\n  %d年%d月%d日是星期五",year,month,day);break;

    case 6:

    printf( "\n  %d年%d月%d日是星期六",year,month,day);break;

    default:

    system("cls");

    printf(" 出现错误!\n" );

      }

 }

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 setDay1(int year,int month,int day) /*通过键盘“↑”“↓”控制年历的变换*/

{   char k;

    getch();

    k=getch();

    switch(k)                      

    {

     case KEYNUMUp:                               /*“↑”年份减小*/

         if(year<2)

         { 

            system("cls");

            printf("  警告!超出范围!\n");

          

            break;

         }

           year--;

           display1(year);

           setDay1(year,month,day);

           break;

     case KEYNUMDown:                         /*“↓”年份变大*/

         

         year++;

           

            display1(year);

            setDay1(year,month,day);

            break;

     default:

      system("cls");

 

    }

   

}

void setDay2(int year,int month,int day) /*通过键盘“←”“→”控制月历的变换*/

  {

    char k;

    getch();

    k=getch();

    switch(k)

    {

      case KEYNUMLeft:                       /*“←”月份变小*/

           if(month<2)

           {

            month+=12;

            year--;

            }

             if(year<1)

              {

                     system("cls");

               printf("  警告!超出范围!\n");

                break;

               }

             month--;

             display2(year , month);

             setDay2(year,month,day);

             break;

      case KEYNUMRight:/*“→”月份变小*/

           if(month>11)

            {

             month-=12;

             year++;

            }

             if(year<9999);

             month++;

             display2(year , month);

             setDay2(year,month,day);

             break;

       default: 

       system("cls");

    ;

     

    }

   

  }

 

 

void setDay3(int year,int month,int day)        /*通过键盘“PageUp”“PageDown”控制日期的变换*/

 {

     char k;

     getch();

     k=getch();

     switch(k)

     {

       case KEYNUMPageUp:                   /*“PageUp”日期变小*/

            if(day<2)

            {

             month--;

             day=maxDay(year,month);

             }

              if(month<1)

               {

                month+=12;

                year--;

                }

                 if(year<1)

                  {

                   system("cls");

                   printf(" 警告!超出范围!\n");

                   break;

                  }

                   day--;

                   display3(year , month,day);

                   setDay3(year,month,day);

                   break;

       case KEYNUMPageDown:                   /*“PageDown”日期变大*/

            day++;

            if(day>maxDay(year,month))

            {

             day=1;

             month++;

            }

             if(month>12)

              {

                month-=12;

                year++;

              }

              if(year<10000);

                 display3(year , month,day);

                 setDay3(year,month,day);

                 break;

        default:      

        system("cls");

        ;

    }

}

void getmenu() /* 显示菜单选择*/

{

    printf("              ************主菜单************\n\n");

    printf("              *     欢迎进入万年历系统     *\n\n");

    printf("              *      1、年历显示           *\n\n");

    printf("              *      2、月历查询           *\n\n");

    printf("              *      3、日期查询           *\n\n");

    printf("              *      4、退出系统           *\n\n");

    printf("              ******************************\n\n");

}

四、运行结果清单

打开软件,进入如下菜单界面,输入数字进行选择

1年历的显示

(1)输入数字1进入年历的显示

 

(2)输入年份2011,显示20##年的年历如下

 

(3)按↑键盘显示上一年(20##年)的年历,显示如下

(4)按↓键盘显示上一年(20##年)的年历,显示如下

 

2、月历的显示

(1)在菜单中选择2,进入月历的显示,输入2011,6,显示20##年6月份的月历,显示效果如下

 

(2)按←键盘显示上一个月(5月)的月历,显示效果如下

(3)按→键盘显示上上个月(7月)的月历,显示效果如下

3、日历的显示

(1)输入选择3进入日历的显示,如图输入2011,10,1显示这天的星期,是否为公历节日,距离现在还有多少天

 

(2)按PagDown显示前一天的日历,显示如下

 

(3)按PagUp显示后一天的日历,显示如下

4 退出程序

输入选择4,显示如下界面,按任意键退出程序

五、总结和体会

本次用C语言编写的万年历系统主要实现了年历、月历、日历的显示,并且可通过键盘来变换相应的年月日,最终的设计结果达到的这些要求,是一次成功的课程设计。

在设计初期,首先温习了课本内容,再次熟熟悉了C程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。当然,由于时间和能力的原因,选作部分农历的显示没有实现。

通过这次课程设计,使我对C语言了解不在停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。

附:参考文件

[1] 谭浩强. C程序设计(第三版).北京:清华大学出版社.2005

[2] 谭浩强. C程序设计题解与上机指导(第三版).北京:清华大学出版社.2005

[3] 徐慧 林锐 C语言实例解析精粹 .武汉:华中理工大学出版社.1996

[4] 戴建鹏译 C语言大全(第三版)  .北京:电子工业大学出版社.1994

相关推荐