Odliczanie od daty

Zad. C++.
Napisz program, który oblicza ile dni upłynęło od podanej
daty do dnia uruchomienia programu. Skorzystaj z doświadczeń programu
dzień i funkcji time przekazującej liczbę sekund jakie upłynęły od
godziny 000 dnia 1 stycznia 1970 roku.
W zależności od wprowadzonych danych wynikiem działania programu
powinno by¢ wypisanie jednego spośród poniższych komunikatów:

a) Dziś masz masz jubileusz!
b) Jutro masz masz jubileusz!
c) Pojutrze masz masz jubileusz!
d) Do najbliższej 1000-nicy zostało Ci n dni.
e) Czy na pewno się już urodziłeś?


Rozwiązanie


// Program oblicza liczbę dni jakie upłynęły od zadanej daty.
//
// Paweª Klimczewski, 11 listopada 2005
#include <iostream>
#include <ctime>
#include "czytaj.h"
using namespace std;
int main()
{
int r;
czytaj_z_wejscia( r, "Podaj rok" );
int m;
czytaj_z_wejscia( m, "Podaj miesi¡c" );
int d;
czytaj_z_wejscia( d, "Podaj dzie«" );
// Konwersja podanej daty do postaci wymaganej we wzorze Gaussa, czyli
// rok zaczyna si¦ w marcu.
if ( m > 2 )
{
m = m - 2;
}
else
{
m = m + 10;
r = r - 1;
}
// Obliczamy numer podanego dnia ze wzoru Gaussa.
int t = r / 4 - r / 100 + r / 400 + 367 * m / 12 + d + r * 365;
// 1 stycznia 1970 odpowiada we wzorze Gaussa dacie 1 listopada 1969.
// Obliczamy numer tego dnia.
int t0 = 1969 / 4 - 1969 / 100 + 1969 / 400 + 367 * 11 / 12 + 1 + 1969 * 365;
// Zatem od 1 stycznia 1970 do podanego dnia upªynelo t - t0 dni.
// Z drugiej strony funkcja time podaje liczb¦ sekund jakie upªyn¦ªy
// od 1 stycznia 1970 roku od godziny 0.00 do chwili obecnej.
// Razem upªyn¦ªo:
int n = t0 - t + time( NULL ) / 3600 / 24;
if ( n > 0 )
{
cout << "żyjesz już " << n << " dni." << endl;
if ( n % 1000 == 0 )
{
cout << "Dzi± masz maªy jubileusz!" << endl;
}
else
{
long p = 1000 - n % 1000;
if ( p == 1 )
{
cout << "Jutro masz maªy jubileusz!" << endl;
}
else if ( p == 2 )
{
cout << "Pojutrze masz maªy jubileusz!" << endl;
}
else
{
cout << "Do najblizszej 1000-nicy zostalo Ci " << p << " dni." << endl;
}
}
}
else
{
cout << "Na pewno ju» si¦ urodziªe±?" << endl;
}
return 0;
}
Zad.