2015-02-25 3 views
-1

У меня есть проект на C++, целью которого является создание календаря для любого месяца и года. Часть проекта требует, чтобы я сначала вычислил количество дней с 1 января 0000 года до любой указанной даты. Функция должна принимать три параметра, представляющих год, месяц и день. Я новичок в C++, поэтому, пожалуйста, сократите меня, если есть некорректно используемые команды или логика. Пока это то, что у меня есть, но число отключено на несколько дней, когда я его тестирую. Может кто-нибудь, пожалуйста, скажите мне, где мой код поступил не так?Как рассчитать количество дней с 1 января 0000 года до любой указанной даты, включая високосные годы?

int const day_of_forever(int const year, int const month, int const day) 
{ 
    int count[]={0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; 
    if ((year % 400==0) && (year % 100 != 0) && (year % 4 == 0)&& (month>=2)) 
     ((count[month-1]+day)+1); 
    return (count[month-1]+day)+(((year)*365)+1) +((year)/4)-(year/100)+(year/400); 
} 

void main() 
{ 
    int const year=2000; 
    int const day=1; 
    int const month=1; 

    int const something=day_of_forever(year,month,day); 
    print (something); 
} 
+1

Mr. Debugging Tool может помочь вам отладить вашу программу. Каков был результат использования инструмента отладки? –

+0

Вы забыли указать [Календарь закона 1752] (http://www.webexhibits.org/calendars/year-text-British.html) и различные разные даты в разных странах изменили календари. Кроме того, ваш код указывает, что все високосные годы равны нулю mod 400, что явно неверно. –

+0

Возможно, в начале кода вы с ошибкой, так как функция 'main' возвращает' int'. Всегда. –

ответ

5

Ваше заявление о проблеме не определено. Вы не можете просто сказать «любую указанную дату», потому что многие даты неоднозначны из-за различных календарей, используемых в разных местах в разное время. Возможно, вам следует придерживаться дат после 1800 года, чтобы сохранить управляемость.

В любом случае, если вы пытаетесь реализовать proleptic Gregorian calendar:

  1. Вы не зарегистрированы на Calendar Act of 1752.

  2. Ваше заявление if ничего не делает, оно просто добавляет 1 к чему-то и отбрасывает это.

  3. Логика в вашем тесте на високосные годы неверна. Он говорит, что високосный год должен быть нулевым модом 400 и множеством других вещей. Но большинство leap years не равны нулю по модулю 400.

  4. + - + логика в конце вашего return заявления не считает ли дата, до или после високосного дня.

  5. Вы не учитываете Julian leap days not in the proleptic Григорианский календарь. Вам может понадобиться или не понадобиться, в зависимости от того, как определена дата ввода.

  6. Не было никакого года. Так что 1 января 0000 года никогда не было.

+0

1752, когда Великобритания и имущество (включая то, что сейчас является США) изменились с юлианского на григорианский календарь. Большая часть Европы была включена в 1582 году; другие страны переключались в разное время вплоть до 20-го века. Если вы собираетесь учитывать это изменение, вам необходимо указать информацию о местоположении или признать, что ваши результаты - это только приложение в определенных местах. –

+0

@KeithThompson Я согласен. Это удивительно трудная проблема. Утверждение наивной задачи скрывает эту сложность с фразой «любая заданная дата», которая, конечно, не очень четко определена. (Я добавил дополнительные разъяснения.) –

+0

Направления в лаборатории должны были подсчитать день, включая високосные годы с 1 января 0000 года до указанной даты. Это не мои правила, они есть в самом лабораторном задании. Я думаю, они сделали это так, поэтому было бы легче определить, с чего начать. Я, как и профессор, знает, что нет 1 января 0000 года. Я понимаю, что моя логика отключена, поэтому я пробовал две разные вещи: одна содержится в выражении if, а другая - это уравнение. Я опубликовал сочетание обоих, чтобы понять, как я должен идти. Извините за путаницу. – SwtNemesis

1

Ваш високосный тест должен быть чем-то вроде

if((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) && month >= 2) 

Делите и наслаждайтесь.

+0

'' 'year% 4 = 0''' nice try – Ulterior

+1

@Ulterior - спасибо. Исправленный. –

Смежные вопросы