Поиск дня недели для даты в качестве входных данных

#include <iostream>
using namespace std ;

int main(){
    
    int a,d,m,y,v,k,n,r,z;
    const int ref=1601;
    
    
    const int AnzMonate = 12 ;
    const int TageImMonat[AnzMonate] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ;
    const int TageImMonattwo[AnzMonate] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} ;
    cout << "Give date: Day Month Year";
    cin >> d >> m >> y;
    
    if(y%4==0){
        if(y%100==0){
            if(y%400==0){
                v=0;
            }else{
                v=1;
            }
            
        }else{
            v=0;
        }
    }else{
        v=1;
    }
    
    
    if(v==0){
        for(n = 0; n<m-2; n++){
            r+=TageImMonattwo[n];
        }
        k = (y-1601);
        a = k/4;
        z = a*366 + (k-a)*365 + r + d - 1;
        
        switch (z%7)
        {
            case 0 : cout << "Monday" ; break ;
            case 1 : cout << "Tuesday" ; break ;
            case 2 : cout << "Wednesday" ; break ;
            case 3 : cout << "Thursday" ; break ;
            case 4 : cout << "Friday" ; break ;
            case 5 : cout << "Saturday" ; break ;
            case 6 : cout << "Sunday" ; break ;
        }
    }else{
        
        for(n = 0; n<m-2; n++){
            r+=TageImMonat[n];
        }
        k = (y-1601);
        a = k/4;
        z = a*366 + (k-a)*365 + r + d - 1;
        
        switch (z%7)
        {
            case 0 : cout << "Monday" ; break ;
            case 1 : cout << "Tuesday" ; break ;
            case 2 : cout << "Wednesday" ; break ;
            case 3 : cout << "Thursday" ; break ;
            case 4 : cout << "Friday" ; break ;
            case 5 : cout << "Saturday" ; break ;
            case 6 : cout << "Sunday" ; break ;
        
    }
    
 
    }
    return 0;
}
    
    

Я пытаюсь сделать небольшую программу, которая сообщает мне, какой сегодня день недели для заданной даты от пользователя. У меня есть правильное решение, но я хотел проверить себя и попытался сам написать всю программу. Пока код работает и все выглядит нормально, когда я сравниваю даты между программами, я получаю разные результаты. Пример:

04.03.2009 в данном решении = среда. 04.03.2009 в моем решении = воскресенье.

Что касается формулы, это правильно, потому что я проверил онлайн количество дней между двумя днями, начиная с 01.01.1601, и каждый раз получал правильные результаты.

v = 0: високосный год

v = 1: нормальный год

Так в чем моя проблема?

1 ответ
1

Не надо написать using namespace std;.

Однако вы можете в файле CPP (не в файле H) или внутри функции поместить отдельные using std::string; и т. д. (см. SF.7.)


int a,d,m,y,v,k,n,r,z;

Не объявляйте все переменные вверху, а размещайте их там, где это необходимо, и когда вы можете их инициализировать. Не объявляйте несколько переменных в одном операторе.


Четверка const все, что следует за этим, в порядке, но в более новых версиях C ++ вы можете использовать constexpr вместо.


Ваш ввод принимает целые числа для y,md. Но у вас есть массивы дней в месяце, отсчитываемые от нуля. Входы относятся к 1 == января? Я не вижу каких-либо корректировок.


if(y%4==0){
        if(y%100==0){
            if(y%400==0){
                v=0;
            }else{
                v=1;
            }
            
        }else{
            v=0;
        }
    }else{
        v=1;
    }

Это трудно читать.
Что такое v? Если предполагается, что это високосный год, назовите его bool leap_year. По крайней мере, разбейте его на функцию, чтобы можно было написать:

const leap_year = is_leap_year(y);

и спрячьте весь этот кусок кода в функции с понятным именем и целью.

(Есть более простые способы вычислить день недели. Когда я был подростком, я придумал способ сделать это в своей голове. Совет: сохраните массив с суммарным количеством дней в году, не дни в каждом месяце, и вам не нужно их суммировать, когда вы его используете. И вы можете сохранить это по модулю 7; например {0,3,3,5,6,1,4,6,2,5,0,3,5})

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *