#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 ответ
Не надо написать using namespace std;
.
Однако вы можете в файле CPP (не в файле H) или внутри функции поместить отдельные using std::string;
и т. д. (см. SF.7.)
int a,d,m,y,v,k,n,r,z;
Не объявляйте все переменные вверху, а размещайте их там, где это необходимо, и когда вы можете их инициализировать. Не объявляйте несколько переменных в одном операторе.
Четверка const
все, что следует за этим, в порядке, но в более новых версиях C ++ вы можете использовать constexpr
вместо.
Ваш ввод принимает целые числа для y
,m
,и d
. Но у вас есть массивы дней в месяце, отсчитываемые от нуля. Входы относятся к 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}
)