Всем доброго времени суток.
Пишу первую программу на C++. Решил взять задание из олимпиады по информатике. ( ) Задание таково: даны две корректные даты, причём первая раньше второй. Нужно вывести разность между датами.
//Также пояснение, что високосными считаются года, чьи номера делятся на 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.
|
В чём может быть ошибка? Больше всего подозрений у меня вызывает просчёт количества дней в феврале... |