ACM 1030:日历本

这个只能得50分,提示格式有错,1800通过,2010通过,1900出错,自己也不知道哪里格式没对。

题目描述

我们经常需要使用日历,所以需要一个能生成日历的程序。
先要求你写一个程序,只需要输入年份,就能生成正确的日历。

输入格式

输入包含多组测试数据。每组输入一个整数Y(1800<=Y<=2100),表示公元年份。

输出

对于每组输入,输出对应的日立本。选中下面的输出样例查看具体的输出格式,注意空格的输出。

样例输入

2010

样例输出

                              2010                              

      January               February               March        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                1  2      1  2  3  4  5  6      1  2  3  4  5  6
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   7  8  9 10 11 12 13
10 11 12 13 14 15 16  14 15 16 17 18 19 20  14 15 16 17 18 19 20
17 18 19 20 21 22 23  21 22 23 24 25 26 27  21 22 23 24 25 26 27
24 25 26 27 28 29 30  28                    28 29 30 31         
31                                                              
       April                  May                   June        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3                     1         1  2  3  4  5
 4  5  6  7  8  9 10   2  3  4  5  6  7  8   6  7  8  9 10 11 12
11 12 13 14 15 16 17   9 10 11 12 13 14 15  13 14 15 16 17 18 19
18 19 20 21 22 23 24  16 17 18 19 20 21 22  20 21 22 23 24 25 26
25 26 27 28 29 30     23 24 25 26 27 28 29  27 28 29 30         
                      30 31                                     
        July                 August              September      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3   1  2  3  4  5  6  7            1  2  3  4
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   5  6  7  8  9 10 11
11 12 13 14 15 16 17  15 16 17 18 19 20 21  12 13 14 15 16 17 18
18 19 20 21 22 23 24  22 23 24 25 26 27 28  19 20 21 22 23 24 25
25 26 27 28 29 30 31  29 30 31              26 27 28 29 30      
                                                                
      October               November              December      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                1  2      1  2  3  4  5  6            1  2  3  4
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   5  6  7  8  9 10 11
10 11 12 13 14 15 16  14 15 16 17 18 19 20  12 13 14 15 16 17 18
17 18 19 20 21 22 23  21 22 23 24 25 26 27  19 20 21 22 23 24 25
24 25 26 27 28 29 30  28 29 30              26 27 28 29 30 31   
31                                                             

//#include "stdafx.h"

#include<iostream>
#include<iomanip>
using namespace std;

int SpaceSize=0;
//判断是否为闰年
int isLeapYear(int year)
{
    int leap=0;
    if (year%4==0&&year%100!=0||year%400==0)
    {
        leap=1;
    }
    return leap;
}


int GetMonthDayNumber(int year , int month){   //返回 某一年某一月天数
        int daynumber ;
        if(   2 == month  ) {                       //二月单独处理
            if( isLeapYear( year ) )
                daynumber = 29 ;
            else
                daynumber = 28 ;    
        }else{
            if( ( month < 8  && 1 == month % 2) || ( month >= 8 && 0 == month % 2 ) )  //  八月前奇数月为31 天 八月后 偶数为 31 天
                daynumber = 31 ;
            if( ( month < 8  && 0 == month % 2) || ( month >= 8 && 1 == month % 2 ) )  //  八月前偶数月 30 天  八月后 奇数月30 天
                daynumber = 30 ;
        }
        return daynumber;
    }
int NowToDay(int year,int month ,int day){
    int DiDay , i ;
    for( i = 1800 , DiDay = 0 ; i < year ; i++)  // 闰年 单独+ 366 天
        if( isLeapYear( i ) )
            DiDay += 366 ;
        else
            DiDay += 365 ;
    for( i = 1 ; i < month ; i++ )
        DiDay += GetMonthDayNumber( year , i );

    DiDay += day - 1 ;

    return DiDay;
}
int DisplayYear ( int year ){
    int    i , j, k , n , month1 ,month2 ,month3 ;  // 一个季度输出 month1 month2 month3 是 该月应该有天数
    int  Excur1 , Excur2 , Excur3 ;                    //  i , j , k 分别表示 三个月的 天数值  Excur1,Excur2,Excur3 表示偏移量
    int  sea; 
    char Months[12][30]={{"      January         "},{"      February        "},{"       March        "},
                         {"       April          "},{"        May           "},{"        June        "},
                         {"        July          "},{"       August         "},{"     September      "},
                         {"      October         "},{"      November        "},{"      December      "}};
    SpaceSize =2 ;
    cout<<"                              "<<year<<"                              "<< endl<< endl;
    for( sea = 1 ; sea <= 12 ; sea += 3 ){             // 分四个季度显示
        Excur1 = ( NowToDay(year,sea   , 1 ) + 3 ) % 7;   // 分别计算 3 个月的偏移量
        Excur2 = ( NowToDay(year,sea+1 , 1 ) + 3 ) % 7;
        Excur3 = ( NowToDay(year,sea+2 , 1 ) + 3 ) % 7;
        month1 = GetMonthDayNumber( year ,sea );         // 分别计算 3个月的 天数
        month2 = GetMonthDayNumber( year ,sea + 1 );
        month3 = GetMonthDayNumber( year ,sea + 2 );     //显示三个月的 星期
        cout <<Months[ sea - 1 ] <<Months[ sea ] <<Months[ sea + 1 ] << endl;
        cout <<"Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa"<<endl;
        
        for( n = 1 ; n <= Excur1 ; n++)      // 第一行 单独处理  首先输出 多余的空格 然后在输出天数  
            cout<< setw( SpaceSize ) << " "<<" "  ;  // i ,j , k 单独保存当前的日期
        for( n  ; n <= 7 ; n++)
            cout<< setw( SpaceSize ) << n - Excur1<<" ";
        cout<<" " ;
        i =  n - Excur1 ;
        
        for( n = 1 ; n <= Excur2 ; n++)
            cout<< setw( SpaceSize ) << " "<<" "  ;
        for( n  ; n <= 7 ; n++)
            cout<< setw( SpaceSize ) << n - Excur2<<" ";
        cout<<" " ;
        j = n - Excur2 ;

        for( n = 1 ; n <= Excur3 ; n++)
            cout<< setw( SpaceSize ) << " "<<" "  ;
        for( n  ; n <= 7 ; n++)
            if (n==7)
                cout<< setw( SpaceSize ) << n - Excur3;
            else
                cout<< setw( SpaceSize ) << n - Excur3<<" ";            
        cout<< endl ;
        k = n - Excur3 ;
        int LineNum=1;
        while (  i <= month1 || j <= month2 || k <= month3){  // 当三个月的日期都大于 应有的天数后  循环结束
            for( n = i  ; i < n + 7; i++)                    // 接下来的 7 天输出一次。但是 大于天数的部分输出空格
                if( i <= month1 )
                    cout<< setw( SpaceSize )<< i<<" " ;
                else
                    cout<< setw(3)<<" " ;
            cout<<" " ;

            for( n = j  ; j < n + 7; j++)
                if( j <= month2 )
                    cout<< setw( SpaceSize )<< j<<" " ;
                else
                    cout<< setw( 3 )<<" " ;
            cout<<" " ;
        
            for( n = k  ; k < n + 7; k++)
                if( k <= month3 )//最后一个空格判断
                    if (k==n+6)cout<< setw( SpaceSize )<< k;
                    else cout<< setw( SpaceSize )<< k<<" " ;
                else
                    if (k==n+6)cout<<"  " ;
                    else cout<<"   " ;
            cout<< endl;
            LineNum++;
        }
        if ((LineNum==5)&&(sea<10))
        {cout<<"                                                                ";cout<<endl;}
    }
    return 0;
}



int main()
{
    int year;
    cin>>year;
    if (year>=1800&&year<=2100)
    {
        DisplayYear(year);
    }
    else
    {
        return 0;
    }
}
                              1900                              

      January               February               March        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3               1  2  3
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   4  5  6  7  8  9 10
14 15 16 17 18 19 20  11 12 13 14 15 16 17  11 12 13 14 15 16 17
21 22 23 24 25 26 27  18 19 20 21 22 23 24  18 19 20 21 22 23 24
28 29 30 31           25 26 27 28           25 26 27 28 29 30 31
                                                                
       April                  May                   June        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7         1  2  3  4  5                  1  2
 8  9 10 11 12 13 14   6  7  8  9 10 11 12   3  4  5  6  7  8  9
15 16 17 18 19 20 21  13 14 15 16 17 18 19  10 11 12 13 14 15 16
22 23 24 25 26 27 28  20 21 22 23 24 25 26  17 18 19 20 21 22 23
29 30                 27 28 29 30 31        24 25 26 27 28 29 30
                                                                
        July                 August              September      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7            1  2  3  4                     1
 8  9 10 11 12 13 14   5  6  7  8  9 10 11   2  3  4  5  6  7  8
15 16 17 18 19 20 21  12 13 14 15 16 17 18   9 10 11 12 13 14 15
22 23 24 25 26 27 28  19 20 21 22 23 24 25  16 17 18 19 20 21 22
29 30 31              26 27 28 29 30 31     23 24 25 26 27 28 29
                                            30                  
      October               November              December      
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3                     1
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   2  3  4  5  6  7  8
14 15 16 17 18 19 20  11 12 13 14 15 16 17   9 10 11 12 13 14 15
21 22 23 24 25 26 27  18 19 20 21 22 23 24  16 17 18 19 20 21 22
28 29 30 31           25 26 27 28 29 30     23 24 25 26 27 28 29
                                            30 31               

提示格式错误,有意者求留言,谢谢!

原文地址:https://www.cnblogs.com/bkycjj/p/3506413.html