// doğum gününüzü gün ay yıl olarak girin.
// örneğin 3 Şubat 1999 için 3 2 1999 girin
/*
ilk yazar: Krishna Teja Yeluripati
https://sololearn.com/compiler-playground/ccd7Z974E05T
*/
// arayüzü Türkçeye çevirdik, Türkçe açıklamalar ekledik ve
// ufak tefek değişiklikler yaptık. örneğin, girdisiz de çalışsın.
// bu yıl kaç gün geçmiş saysın. -10000 yani milattan on bin yıl
// önceye kadar sayabilsin ...
// 2024.11.21
// döngü ekledik
// 2024.11.30
#include <iostream>
using namespace std;
// global yani küresel ya da evrensel değişkenler.
// bu dosyada heryerden erişilebilir
// genelde sakınmak, çok kullanmamak gerek
int now_date, now_month, now_year;
// artık yıl hesabı
bool isLeapYear(int year) {
return year % 4 == 0 &&
(year % 100 != 0 || year % 400 == 0);
}
// verilen ayda kaç gün var?
int daysInMonth(int month, int year) {
if (month == 1 || month == 3 || month == 5 || month == 7 ||
month == 8 || month == 10 || month == 12)
return 31;
else if (month == 4 || month == 6 || month == 9 || month == 11)
return 30;
else
return isLeapYear(year) ? 29 : 28;
}
// doğum günü geçmişte olmalı
bool isDOBvalid(int date, int month, int year) {
if (year > now_year) {
return false;
} else if (year == now_year) {
if (month > now_month) {
return false;
} else if (month == now_month) {
if (date > now_date)
return false;
else
return true;
} else {
return true;
}
} else {
return true;
}
}
// yıl ay ve gün hatalı olmasın
bool isDATEvalid(int date, int month, int year) {
// göbeklitepe yaklaşık 12 bin yaşında, kaç gün eder acaba?
bool hataVar = year < -10000 ||
month < 1 || month > 12 ||
date < 1 ||
date > daysInMonth(month, year);
return !hataVar;
}
// geçmiş günleri sayan işlev bu!
long int dates2days(int d1, int m1, int y1, int d2, int m2, int y2) {
int days = 0, month, year;
// doğum yılındaki günler.
// doğum gününden sonrakiler sayılıyor
days += daysInMonth(m1, y1) - d1 + 1;
month = m1 + 1;
while (month <= 12) {
days += daysInMonth(month, y1);
month++;
}
// sonraki yıllar ekleniyor
// bu yıl da dahil!
year = y1 + 1;
while (year <= y2) {
days += isLeapYear(year) ? 366 : 365;
year++;
}
// bu yılın fazladan sayılan günlerini
// çıkarmak gerek
days -= daysInMonth(m2, y2) - d2 + 1;
month = m2 + 1;
while (month <= 12) {
days -= daysInMonth(month, y2);
month++;
}
return days;
}
string date2day(int date, int month, int year) {
long int day = dates2days(1, 1, 1, date, month, year) % 7;
if (day == 0) return "Pazartesi";
else if (day == 1) return "Salı";
else if (day == 2) return "Çarşamba";
else if (day == 3) return "Perşembe";
else if (day == 4) return "Cuma";
else if (day == 5) return "Cumartesi";
else return "Pazar";
}
void sorVeBul();
int main() {
while(cin) sorVeBul();
return 0;
}
void sorVeBul() {
// Doğum günü.
// girdi yoksa bu yılın 1 Ocağı olsun
cout << "Doğum gününüzü gün ay ve yıl olarak girin. "
<< "\nÖrneğin: 29 2 2010\n"
<< "Sizinki nedir? ";
int dob_date{1}, dob_month{1}, dob_year{2024};
cin >> dob_date;
cin >> dob_month;
cin >> dob_year;
// girdi "test" gibi bir yazı olabilir
// cin sıfıra çevirir. onu düzeltelim
if (dob_date == 0) dob_date = 1;
// Bugünün tarihi
time_t now = time(0);
tm *ltm = localtime(&now);
now_date = ltm -> tm_mday;
now_month = 1 + ltm -> tm_mon;
now_year = 1900 + ltm -> tm_year;
// girdiyi doğrulamak gerek
if (cin.fail())
cout << "Hiç birşey girmediniz. 1 Ocak 2024'te doğan bir bebek olduğunuz varsayımıyla devam edelim 8-)" << endl;
else if (!isDATEvalid(dob_date, dob_month, dob_year)) {
cout << "Doğum gününü \"gün ay yıl\" olarak girin!" << endl
<< "\"gün\" 1 ile 31," << endl
<< "\"ay\" 1 ile 12," << endl
<< "\"yıl\" 1 ile "
<< now_year
/* << static_cast<
unsigned char>(236) */
<< " arasında olsun." << endl
<< endl << "Örneğin: 09 05 1996";
return;
}
// ya bugün girilmişse
if (dob_date == now_date && dob_month == now_month && dob_year == now_year) {
cout << dob_date << "/"
<< dob_month << "/"
<< dob_year
<< " yani bugün sizin doğum gününüz olamaz! :-)";
return;
}
// gelecek bir tarih de olmasın
if (!isDOBvalid(dob_date, dob_month, dob_year)) {
cout << dob_date << "/"
<< dob_month << "/"
<< dob_year << " henüz gelmedi!";
return;
}
// dogum günü bugün olabilir!
if (dob_date == now_date && dob_month == now_month)
cout << "Doğum gününüz kutlu olsun!" << endl;
// günleri sayan işlevi çağırıyor:
long int age = dates2days(dob_date, dob_month, dob_year, now_date, now_month, now_year);
cout << "Siz doğalı "
<< (age == 1 ? "sadece " : "")
<< age << " gün olmuş." << endl;
// tarihte doğum günü
string gunAdi = date2day(dob_date, dob_month, dob_year);
cout << "Doğum gününüz: "
<< dob_date << "/"
<< dob_month << "/"
<< dob_year << " "
<< gunAdi << "." << endl;
// bir sonraki doğum günü
int next_bday_date = dob_date,
next_bday_month = dob_month,
next_bday_year = now_year + 1;
if (dob_year < now_year && (dob_month > now_month || (dob_month == now_month && dob_date > now_date)))
next_bday_year = now_year;
if (dob_date == 29 && dob_month == 2)
while (!isLeapYear(next_bday_year))
next_bday_year++;
string gelecekDG = date2day(
next_bday_date,
next_bday_month,
next_bday_year);
string boşluk = string(15, ' ');
cout << "Bir sonraki doğum gününüz:"
<< endl << boşluk
<< next_bday_date << "/"
<< next_bday_month << "/"
<< next_bday_year << " "
<< gelecekDG << "." << endl;
}