【经典算法】:用C语言画日历表

写这篇博客的目的是为了写一份作业,要求是要画日历表,所以为了完成这个作业,我就写了这个程序。

功能如下:
1,查询某天是星期几
2,给出年和月,把该月的日历表画出来

就是如上两个功能

值得一提的是,我的代码实现了上述两个功能,但是不是最优化的,因为我是用我上一次的代码重构的这个程序。所以大家就拿着使就好了,至于想看懂的话,真的挺费劲的,因为我也懒得改了。。。

好吧,给上代码

#include <iostream>
#include <iomanip>
using namespace std;
int num1[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int num2[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int frontday(int year,int month,int day){  //计算这年过了多少天了
    int sum=0;
    if((year%100!=0 &&year%4==0) || year%400==0){
        for(int i=0;i<month-1;i++){
            sum+=num1[i];
        }
        return sum+day;
    }
    else{
        for(int i=0;i<month-1;i++){
            sum+=num2[i];
        }
        return sum+day;
    }
}
int backday(int year,int month,int day){//计算这年还剩多少天
    int sum=0;
    if((year%100!=0 &&year%4==0) || year%400==0){
        for(int i=0;i<month-1;i++){
            sum+=num1[i];
        }
        return 366-(sum+day);
    }
    else{
        for(int i=0;i<month-1;i++){
            sum+=num2[i];
        }
        return 365-(sum+day);
    }
}
int isyear(int year){ //计算某年是否是闰年,返回不同天数
    if((year%100!=0 &&year%4==0) || year%400==0){
        return 366;
    }
    else return 365;
}
int JudgeMonthDay(int year,int month1,int month2,int day1,int day2){      //计算几个月之间的天数,这个思路同计算不同年之间的天数
        int sum=0;
        if((year%100!=0 &&year%4==0) || year%400==0){
            if(month1==month2)  return day2-day1;
            if((month2-month1)==1){
                return (num1[month1-1]-day1+day2);
            }
            if((month2-month1)>1){
                sum = num1[month1-1]-day1+day2;
                for(int i=month1+1;i<=month2-1;i++){
                    sum+=num1[i-1];
                }
                return sum;
            }
        }
        else{
            if(month1==month2)  return day2-day1;
            if((month2-month1)==1){
                return num2[month1-1]-day1+day2;
            }
            if((month2-month1)>1){
                sum = num2[month1-1]-day1+day2;
                for(int i=month1+1;i<=month2-1;i++){
                    sum+=num2[i-1];
                }
                return sum;
            }
        }
}
int weekday(int year1,int year2,int month1,int month2,int day1,int day2){
    int sum=0;    //以下分类讨论计算不同年之间天数
    if((year2-year1)<0) cout<<"应该先输入小的年份,输入错误";
    if((year2-year1)==0){
            sum = JudgeMonthDay(year1,month1,month2,day1,day2);

    }
    if((year2-year1)==1)   sum = backday(year1,month1,day1)+frontday(year2,month2,day2);
    if((year2-year1)>1){
        sum = backday(year1,month1,day1)+frontday(year2,month2,day2);
        for(int i=year1+1;i<=year2-1;i++){
            sum+=isyear(i);
        }
    }
    int temp;
    if((sum+1)%7==0) temp = 7;
    else temp = (sum+1)%7;
    return temp;
}
void main(){
    int k;
    cout<<"输入1进入查询功能,查询某天的信息"<<endl;
    cout<<"输入2进入月份功能,输入月份查询该月信息"<<endl;
    cin>>k;
    if(k==1){
          cout<<"请输入您想要查找的日期,分别为年月日,都用空格隔开"<<endl;      
          int year1,month1,day1;
          int year2,month2,day2,temp;
          year1 = 1900 ; month1 = 1;day1 = 1;
          cin>>year2>>month2>>day2;
          cout<<"您查询的日期是星期"<<weekday(1900,year2,1,month2,1,day2)<<endl;
    }
    if(k==2){
    cout<<"请输入您想要查询的月份,格式为年 月,之间有空格"<<endl;
    int year1,month1,day1;
    int year2,month2,day2,temp;
    year1 = 1900 ; month1 = 1;day1 = 1;
    cin>>year2>>month2;
    int pos;
    if((year2%4==0&&year2%100!=0) ||year2%400==0){
          pos = num1[month2-1];
    }
    else{
          pos = num2[month2-1];
    }
    cout<<pos<<endl;            //测试通过,正确显示日期
    temp = weekday(1900,year2,1,month2,1,1);
    cout<<setw(7)<<"星期一"<<setw(7)<<"星期二"<<setw(7)<<"星期三"<<setw(7)<<"星期四"<<setw(7)<<"星期五"<<setw(7)<<"星期六"<<setw(7)<<"星期日"<<endl;
    int count = temp-1;
    for(int j=0;j<temp-1;j++){
        cout<<setw(7)<<" ";
    }
    for(int i=1;i<=pos;i++){
        cout<<setw(7)<<i;
        count++;
        if(count==7){
            count = 0;
            cout<<endl;
        }
    }
    cout<<endl;
    }
  // cout<<sum<<endl; //sum是相距的日子,算星期几的时候需要加1
    system("pause");
}

使用截图:

你可能感兴趣的:(算法,重构,C语言,日历)