Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество дней между двумя датами, пропадает один день 
V
    Опции темы
Chupik
Дата 10.6.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Всем доброго времени суток.

Пишу первую программу на C++. Решил взять задание из олимпиады по информатике. ( smile )
Задание таково: даны две корректные даты, причём первая раньше второй. Нужно вывести разность между датами.

//Также пояснение, что високосными считаются года, чьи номера делятся на 4 и не делятся на 100 и те года, что делятся на 400.

Итак, листинг моего кривенького поделия:

Код

#include <iostream>
using namespace std;

class user_date 
{
public:
    user_date(int, int, int);
    long get_days_number(void);
    void show_user_date(void);
    bool typeofyear(int);
private:
    int day, mounth, year;
};

//Конструктор
user_date::user_date(int day, int mounth, int year)
{
    user_date::day = day;
    user_date::mounth = mounth;
    user_date::year = year;
}

void user_date::show_user_date(void) {
    cout << "It's " << day << " " << mounth << " " << year << " now." << endl;
}

//Количество дней от 01 01 01 до данной даты
long user_date::get_days_number(void) {
    int i, result = 0;
    for (i=1; i < user_date::year; i++) {
        if (typeofyear(i)) result = result + 366;
        else result = result + 365;
    }
    for (i=1; i < user_date::mounth; i++) {
        if (i % 2 == 0) {
            if (i != 2) result = result + 30;
            else if ((i == 2) && (typeofyear(user_date::year))) result = result + 29;
            else if ((i == 2) && (!typeofyear(user_date::year))) result = result + 28;
        }
        else if (i % 2 != 0) result = result + 31;
    }
    result = result + user_date::day;
    return result;
}

//Проверка на "високосность"
bool user_date::typeofyear(int testyear) {
    if ((testyear % 4 == 0) && (testyear % 100 != 0)) return 1;
    else if (testyear % 400 == 0) return 1;
    else return 0;
}

void main() {
    int d1, m1, y1, d2, m2, y2, n;
    cin >> d1 >> m1 >> y1;
    cin >> d2 >> m2 >> y2;
    user_date todate1(d1, m1, y1);
    user_date todate2(d2, m2, y2);
    //user_date todate1(01, 01, 1900);
    //user_date todate2(24, 9, 2010);
    todate1.show_user_date();
    todate2.show_user_date();

    cout << "Otvet: " << todate2.get_days_number() - todate1.get_days_number() << endl;
    cin >> n;
}


Итого программа даже что-то считает, проходит все тесты, кроме:

Цитата

19 03 1968
23 09 1990
Должно быть: 8223, у меня: 8222;


Цитата

07 11 1917
22 06 1941
Должно быть: 8628, у меня: 8629


Цитата

01 01 1900
24 09 2010
Должно быть: 40443, у меня: 40442.


В чём может быть ошибка? Больше всего подозрений у меня вызывает просчёт количества дней в феврале...
PM MAIL   Вверх
awesome
Дата 10.6.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



в июле и августе по 31 дню
PM MAIL   Вверх
Chupik
Дата 10.6.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



awesome, точно! Забыл про последовательность месяцев с 31 числом.  smile Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.