c++:今天星期几?

img


//在这里给出函数被调用进行测试的例子:
#include <iostream>
#include <string>
using namespace std;

string week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

struct Calendar{
    int year;
    int month;
    int day;
    int weekday;//注:星期天为0,星期一为1,...,星期六为6;01-1-1为星期四
    int fromInitDays();
    void setValue(int y,int m,int d);
    void show();

};
int main()
{
    Calendar birthday;
    int y,m,d;
    cin>>y>>m>>d;
    birthday.setValue(y,m,d);
    cout<<birthday.fromInitDays()<<endl;
    birthday.show();
    return 0;
}
int Calendar::fromInitDays()
{
    int sum=0,i,j;
    for(i=1;i<year;i++){
        if((i%4==0&&i%100!=0)||(i%400==0))
            sum+=366;
        else sum+=365;    
    }
    for(j=1;j<month;j++){
        if(j==2){
            if((year%4==0&&year%100!=0)||(year%400==0))
                sum+=29;
            else sum+=28;    
        }
        else if(j==1||j==3||j==5||j==8||j==10||j==12||i==7)
        {
            sum+=31;
            }
        else {
            sum+=30;
        }        
    }
    sum+=day-1;
    if(sum>577724){
    
        sum=sum-10;
    }
    weekday=(sum+4)%7;
    return sum;    
}
void Calendar::setValue(int xx,int yy,int zz)
{
    //cout<<this->fromInitDays() <<endl;
    if(xx<1) year=1;
    else year=xx;
    if(yy<1) month=1;
    else if(yy>12) month=12;
    else month=yy;
    if(zz<1) day=1;
    else if(zz>31) day=31;
    else day=zz; 
    //cout<<year<<month<<day<<endl;
 } 
void Calendar::show() 
{
    cout<<year<<"-"<<month<<"-"<<day<<":"<<week[weekday]<<endl;
}

请问这个哪错了啊?输入1582 10 4,1582 10 15,2000 15 50的总天数答案少了一天。

sum+=day-1;改为sum+=day;


//在这里给出函数被调用进行测试的例子:
#include <iostream>
#include <string>
using namespace std;

string week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

struct Calendar{
    int year;
    int month;
    int day;
    int weekday;//注:星期天为0,星期一为1,...,星期六为6;01-1-1为星期四
    int fromInitDays();
    void setValue(int y,int m,int d);
    void show();

};
int main()
{
    Calendar birthday;
    int y,m,d;
    cin>>y>>m>>d;
    birthday.setValue(y,m,d);
    cout<<birthday.fromInitDays()<<endl;
    birthday.show();
    return 0;
}
int Calendar::fromInitDays()
{
    int sum=0,i,j;
    for(i=1;i<this->year;i++){
        if((i%4==0&&i%100!=0)||(i%400==0))
            sum+=366;
        else sum+=365;    
    }
    for(j=1;j<this->month;j++){
        if(j==2){
            if((this->year%4==0&&this->year%100!=0)||(this->year%400==0))
                sum+=29;
            else sum+=28;    
        }
        else if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
        {
            sum+=31;
            }
        else {
            sum+=30;
        }        
    }
    sum+=this->day-1;
    if (this->year > 1582 || this->year == 1582 && this->month > 10|| this->year == 1582 && this->month == 10 && this->day > 4)
        sum -= 10; 
    weekday=(sum+4)%7;
    return sum;    
}
void Calendar::setValue(int xx,int yy,int zz)
{
    //cout<<this->fromInitDays() <<endl;
    if(xx<1) year=1;
    else year=xx;
    if(yy<1) month=1;
    else if(yy>12) month=12;
    else month=yy;
    if(zz<1) day=1;
    else if(zz>31) day=31;
    else day=zz; 
    //cout<<year<<month<<day<<endl;
 } 
void Calendar::show() 
{
    cout<<year<<"-"<<month<<"-"<<day<<":"<<week[weekday]<<endl;
}

发现了错误在将i==7放在了i==12后面,或运算有误
ps:以下为其他正确答案,它的答案更加简介,但会多判断一下今年是否为闰年,我的则不会,但我的看起来不简洁

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

string week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

struct Calendar{
    int year;
    int month;
    int day;
    int weekday;//注:星期天为0,星期一为1,...,星期六为6;01-1-1为星期四
    int fromInitDays();
    void setValue(int y,int m,int d);
    void show();

};
int main()
{
    Calendar birthday;
    int y,m,d;
    cin>>y>>m>>d;
    birthday.setValue(y,m,d);
    cout<<birthday.fromInitDays()<<endl;
    birthday.show();
    return 0;
}
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool leap(int x)
{
    if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) return 1;
    return 0;
}

int Calendar::fromInitDays() //计算天数, 初始化星期几
{
    int sum = 0;  
 
 //年份
    for (int i = 1; i < this->year; i ++ ) 
        if (leap(i)) sum += 366;
        else sum += 365;  
 
 //月份
    for (int i = 1; i < this->month; i ++ )
        sum += days[i];  
 
 //天数
    sum += this->day - 1;  
 
 //当年为润年   sum+1;
    if (leap(this->year) && this->month > 2) sum ++ ;  
 
 //判断是否在1582.10.4之后, 如果是, 则减10天;
    if (this->year > 1582 || this->year == 1582 && this->month > 10|| this->year == 1582 && this->month == 10 && this->day > 4)
        sum -= 10;  
 
 //计算星期几
    this->weekday = (4 + sum) % 7;  
 
 //返回结果
    return sum ;
}
void Calendar::setValue(int y, int m, int d)
{
    if (y < 1) y = 1;
    this->year = y;

    if (m < 1) m = 1;
    if (m > 12) m = 12;
    this->month = m;

    if (d < 1) d = 1;
    if (d > 31) d = 31;
    this->day = d;
}

void Calendar::show()

{
    printf("%d-%d-%d:%s", this->year, this->month, this->day, week[this->weekday].c_str());
}