İkinici algoritma ödevimiz ve benim çözümüm…
[rawr]
#include <stdio.h>
#include <stdlib.h>
/* Program genelinde fonksiyonlar -1 HAYIR, 0 EVET degerini dondurur. */
int yil_gecerli_mi(int yil)
{
if(yil<1) return -1; /* Milattan önce desteðimiz bulunmamaktadir. */
return 0;
}
int ay_gecerli_mi(int ay)
{
if (ay>12 || ay<1) return -1;
return 0;
}
int gun_gecerli_mi(int gun, int ay, int yil)
{
int gunsayisi=31;
if (gun<1 || gun>aydaki_gun(ay,yil)) return -1;
return 0;
}
int yil_artik_mi(int yil)
{
/* Bir yýlýn 4'e bölümünden kalan 0 ise o yýl artýktýr. */
/* Ancak o yýl 100'e bölünüyorsa artýk deðildir. Ama 400'e de bölünüyorsa artýktýr. */
if ((yil % 4 == 0 && yil % 100 != 0) || (yil % 400 == 0)) return 0;
return -1;
}
int fark_hesapla(int ilkgun, int ilkay, int ilkyil, int songun, int sonay, int sonyil)
{
int i;
int ilk_kacinci_gun=0;
int son_kacinci_gun=0;
for (i=1;i<ilkay;i++) // Ilk girdide kac gun var?
{
ilk_kacinci_gun = ilk_kacinci_gun + aydaki_gun(i,ilkyil);
}
ilk_kacinci_gun = ilk_kacinci_gun + ilkgun;
for(i=1;i<sonay;i++) // Son girdide kac gun var?
{
son_kacinci_gun = son_kacinci_gun + aydaki_gun(i,sonyil);
}
son_kacinci_gun = son_kacinci_gun + songun;
if (ilkyil==sonyil) // OOh kebap, ayný yýldan iki güzel gün.
{
return son_kacinci_gun - ilk_kacinci_gun;
} else { // Bir de yillararasi gun farki var :( bööööö
ilk_kacinci_gun = 365 + yil_artik_mi(ilkyil) + 1 - ilk_kacinci_gun;
for (i=ilkyil+1;i<sonyil;i++) {
ilk_kacinci_gun = ilk_kacinci_gun + 365 + yil_artik_mi(i) + 1;
}
return son_kacinci_gun + ilk_kacinci_gun;
}
}
int aydaki_gun(int ay, int yil)
{
switch(ay)
{
case 2:
if (yil_artik_mi(yil) == 0)
return 29;
else
return 28;
break;
case 4:
case 6:
case 9:
case 11:
return 30;
}
return 31;
}
int hangisi_buyuk(int ilkgun, int ilkay, int ilkyil, int songun, int sonay, int sonyil)
{
// Bu fonksiyonda etkinlik için else yapýsýna gerek yok. Çüknü if=þartý saðlýyorsa then fonskiyon biter.
if (sonyil>ilkyil) return 0; // Sorun yok, devam edelim :)
if (ilkyil>sonyil) return -1; // Eleman normalde geçmiþ olmasý gereken tarihe gelecek tarihi yazmýþ.
// E fonksiyon hala iþliyorsa o zaman demek ki yýllar ayný.
// O zaman ne yapýyoruz? Aylara bakýyoruuuuuuuzzz!!
if (sonay>ilkay) return 0;
if (ilkay>sonay) return -1; //Gýcýklýk.
// Hala mý devam... O zaman artýk günlere bakalým.
if (songun>ilkgun) return 0;
if (ilkgun>songun) return -1;
// Ama ayný gün de yazýlmaz ki! Ne yapýyoruz, o zaman da -2 gönderiyoruz ki bir çözüm bulsunlar.
return -2;
}
void gun_sonrasi(int gun, int ay, int yil, int eklenecek)
{
gun = gun + eklenecek;
while (gun>aydaki_gun(ay,yil))
{
gun = gun - aydaki_gun(ay,yil);
++ay;
if (ay>12)
{
ay=1;
++yil;
}
}
printf("\nTarih %d.%d.%d olacaktir.\n",gun,ay,yil);
}
void gun_oncesi(int gun, int ay, int yil, int cikarilacak)
{
gun = gun - cikarilacak;
while (gun<1)
{
--ay;
if (ay<1)
{
ay=12;
--yil;
if (yil<1) { /* Milattan once destegi vermiyorum */
printf("Uzgunuz ama su an icin milattan oncesi icin destegimiz bulunmamaktadir.\n");
return;
}
}
gun = gun + aydaki_gun(ay,yil);
}
printf("\nTarih %d.%d.%d olacaktir.\n",gun,ay,yil);
}
void beklet()
{
printf("\nDevam etmek icin bir tusa basin.");
getche();
}
int main()
{
/* Bugünün deðiþkenleri */
int yil=-1;
int ay;
int gun;
/* Menü deðiþkenleri */
int sag_serbest=-1;
char secenek=0;
/* Diðer alýnan tarih verileri deðiþkenleri */
int ilkyil=-1, ilkay=-1, ilkgun=-1;
int sonyil=-1, sonay=-1, songun=-1;
int once_sonra=-1;
printf("Umut BENZER\n");
printf("05-06-7670\n");
printf("Ege Universitesi Bilgisayar Muhendisligi 1. Sinif\n");
printf("https://ubenzer.com\n");
printf("Tarih Hesaplama Yazilimi 1.2\n\n");
printf("Baslamadan once sizden bugunun tarihini isteyecegim.\n");
while (yil_gecerli_mi(yil) == -1) /* Niye bu tarih_gecerli mi degil de boyle uc tane fonksiyon?? */
{
printf("Yil: ");
scanf("%d",&yil); /* Cunku odevde denildi ki, tarih gecersizse devamini isteme. */
}
while (ay_gecerli_mi(ay) == -1)
{
printf("Ay: ");
scanf("%d",&ay);
}
while (gun_gecerli_mi(gun,ay,yil) == -1)
{
printf("Gun: ");
scanf("%d",&gun);
}
while (sag_serbest==-1)
{
system ("cls");
printf("*** Menu *** (Bugun: %d.%d.%d)\n\n",gun,ay,yil);
printf("1. Verilen iki tarih arasinda kac gun fark oldugunun bulunmasi \n");
printf("2. Verilen bir tarihten bugune kadar gecen gun sayisinin bulunmasi \n");
printf("3. Verilen bir yil icerisinde verilen iki tarih arasinda gecen gun sayisinin bulunmasi \n");
printf("4. Verilen bir tarihten verilen gun sayisi kadar sonraki tarihin bulunmasi \n");
printf("5. Bugunden verilen gun sayisi kadar onceki tarihin bulunmasi \n");
printf("6. Bugunden verilen gun sayisi kadar sonraki tarihin bulunmasi \n");
printf("7. Cikis \n\n");
printf("Lutfen istediginiz islemin numarasini giriniz. ");
secenek=getche();
system ("cls");
switch(secenek) /* char fonksiyonu girilen karakterin ASCII kodunu verir. */
{ /* Onun icin secenek degiskenini switche sayi olarak sokabiliyorum.*/
case 49: /* ve case'lere de ASCII kodlarini yerlestiriyorum. :) */
ilkyil=-1;
ilkay=-1;
ilkgun=-1; /* Önce sýfýrlayalým */
sonyil=-1;
sonay=-1;
songun=-1;
printf("1. Verilen iki tarih arasinda kac gun fark oldugunun bulunmasi \n");
while (yil_gecerli_mi(ilkyil) == -1)
{
printf("Ilk tarihin yilini giriniz: ");
scanf("%d",&ilkyil);
}
while (ay_gecerli_mi(ilkay) == -1)
{
printf("Ilk tarihin ayini giriniz: ");
scanf("%d",&ilkay);
}
while (gun_gecerli_mi(ilkgun,ilkay,ilkyil) == -1)
{
printf("Ilk tarihin gununu giriniz: ");
scanf("%d",&ilkgun);
}
while (yil_gecerli_mi(sonyil) == -1)
{
printf("Son tarihin yilini giriniz: ");
scanf("%d",&sonyil);
}
while (ay_gecerli_mi(sonay) == -1)
{
printf("Son tarihin ayini giriniz: ");
scanf("%d",&sonay);
}
while (gun_gecerli_mi(songun,sonay,sonyil) == -1)
{
printf("Son tarihin gununu giriniz: ");
scanf("%d",&songun);
}
switch (hangisi_buyuk(ilkgun,ilkay,ilkyil,songun,sonay,sonyil))
{
case -1: // Kullanýcý tarih sýrasýný ters girmiþ. Ama biz hata mesajý vermiyor, bu hatayý düzelterek kullanýcýya yardýmcý oluyoruz. (Yardýmsever program)
printf ("\nUYARI: Son tarih, ilk tarihten daha once.\n");
printf("\nArada %d gun var.",fark_hesapla(songun, sonay, sonyil, ilkgun, ilkay, ilkyil));
break;
case 0: // Sorun yok
printf("\nArada %d gun var.",fark_hesapla(ilkgun, ilkay, ilkyil, songun, sonay, sonyil));
break;
case -2: // Haydaaaaaaaa
printf ("\nGirdiginiz tarih degerleri ayni. Demek ki gun gecmemis. :)\n");
}
beklet();
break;
case 50:
ilkyil=-1;
ilkay=-1; /* Önce sýfýrlayalým */
ilkgun=-1;
printf("2. Verilen bir tarihten bugune kadar gecen gun sayisinin bulunmasi \n");
while (yil_gecerli_mi(ilkyil) == -1)
{
printf("Yil: ");
scanf("%d",&ilkyil);
}
while (ay_gecerli_mi(ilkay) == -1)
{
printf("Ay: ");
scanf("%d",&ilkay);
}
while (gun_gecerli_mi(ilkgun,ilkay,ilkyil) == -1)
{
printf("Gun: ");
scanf("%d",&ilkgun);
}
switch (hangisi_buyuk(ilkgun,ilkay,ilkyil,gun,ay,yil))
{
case -1: // Kullanýcý günümüzden daha ileriki bir tarihi girmiþ. Olsun varsýn, onu da söyleriz biz. (Yardýmsever program)
printf("\n Girdiginiz tarih %d gun SONRASININ tarihi.\n",fark_hesapla(gun, ay, yil, ilkgun, ilkay, ilkyil));
break;
case 0: // Sorun yok
printf("\nGirdiniz tarihten bu zamana kadar %d gun gecmis.",fark_hesapla(ilkgun, ilkay, ilkyil, gun, ay, yil));
break;
case -2: // Haydaaaaaaaa
printf ("\nBu gunun tarihini girdiginizin farkinda misiniz? Uykulusunuz? :))\n");
}
beklet();
break;
case 51:
ilkyil=-1;
ilkay=-1;
ilkgun=-1; /* Önce sýfýrlayalým */
sonay=-1;
songun=-1;
printf("3. Verilen bir yil icerisinde verilen iki tarih arasinda gecen gun sayisinin bulunmasi \n");
while (yil_gecerli_mi(ilkyil) == -1)
{
printf("Olay hangi yil icinde gelisecek? ");
scanf("%d",&ilkyil);
}
while (ay_gecerli_mi(ilkay) == -1)
{
printf("Ilk tarihin ayini giriniz: ");
scanf("%d",&ilkay);
}
while (gun_gecerli_mi(ilkgun,ilkay,ilkyil) == -1)
{
printf("Ilk tarihin gununu giriniz: ");
scanf("%d",&ilkgun);
}
while (ay_gecerli_mi(sonay) == -1)
{
printf("Son tarihin ayini giriniz: ");
scanf("%d",&sonay);
}
while (gun_gecerli_mi(songun,sonay,ilkyil) == -1)
{
printf("Son tarihin gununu giriniz: ");
scanf("%d",&songun);
}
switch (hangisi_buyuk(ilkgun,ilkay,ilkyil,songun,sonay,ilkyil))
{
case -1: // Kullanýcý tarih sýrasýný ters girmiþ. Ama biz hata mesajý vermiyor, bu hatayý düzelterek kullanýcýya yardýmcý oluyoruz. (Yardýmsever program)
printf ("\nUYARI: Son tarih, ilk tarihten daha once.\n");
printf("\nArada %d gun var.",fark_hesapla(songun, sonay, ilkyil, ilkgun, ilkay, ilkyil));
break;
case 0: // Sorun yok
printf("\nArada %d gun var.",fark_hesapla(ilkgun, ilkay, ilkyil, songun, sonay, ilkyil));
break;
case -2: // Haydaaaaaaaa
printf ("\nGirdiginiz tarih degerleri ayni. Demek ki gun gecmemis. :)\n");
}
beklet();
break;
case 52:
ilkyil=-1;
ilkay=-1; /* Önce sýfýrlayalým */
ilkgun=-1;
once_sonra=-1;
printf("4. Verilen bir tarihten verilen gun sayisi kadar sonraki tarihin bulunmasi \n");
while (yil_gecerli_mi(ilkyil) == -1)
{
printf("Yil: ");
scanf("%d",&ilkyil);
}
while (ay_gecerli_mi(ilkay) == -1)
{
printf("Ay: ");
scanf("%d",&ilkay);
}
while (gun_gecerli_mi(ilkgun,ilkay,ilkyil) == -1)
{
printf("Gun: ");
scanf("%d",&ilkgun);
}
while (gun_gecerli_mi(ilkgun,ilkay,ilkyil) == -1)
{
printf("Gun: ");
scanf("%d",&ilkgun);
}
while (once_sonra < 0)
{
printf("Kac gun sonrasini hesaplamami istersiniz? ");
scanf("%d",&once_sonra);
}
gun_sonrasi(ilkgun,ilkay,ilkyil,once_sonra);
beklet();
break;
case 53:
printf("5. Bugunden verilen gun sayisi kadar onceki tarihin bulunmasi \n");
once_sonra=-1; /* Önce sýfýrlayalým */
while (once_sonra < 0)
{
printf("Bugunden kac gun oncesini hesaplamami isterdiniz? ");
scanf("%d",&once_sonra);
}
gun_oncesi(gun,ay,yil,once_sonra);
beklet();
break;
case 54:
printf("6. Bugunden verilen gun sayisi kadar sonraki tarihin bulunmasi \n");
once_sonra=-1; /* Önce sýfýrlayalým */
while (once_sonra < 0)
{
printf("Bugunden kac gun sonrasini hesaplamami isterdiniz? ");
scanf("%d",&once_sonra);
}
gun_sonrasi(gun,ay,yil,once_sonra);
beklet();
break;
case 65:
printf("Supriz Yumurta | Easter Egg\n");
printf("I would love to change the world, but they won't give me the source code.\n");
printf("http://en.wikiquote.org/wiki/Computers#Programming (Anonim)\n\n\n");
printf("Tebrikler, bu programin gizli ozelligini buldunuz. :)\n Devam etmek icin bir tusa basin.\n");
getche();
break;
case 55:
do {
printf ("\nCikmak istediginizden emin misiniz? (E-H)");
secenek = getche();
if (secenek == 'E' || secenek == 'e') {
sag_serbest = 0;
secenek = 'H';
}
} while (secenek != 'H' && secenek != 'h');
break;
default:
printf("Lutfen 1'den 7'ye kadar bir secim yapin.",secenek);
beklet();
break;
}
}
printf("\n\nProgram sonlandi. :)");
return 0;
}
[/rawr]
Kaynak kodunu incelemek ve fikir sahibi olmak amacıyla kullanabilirsiniz. Ama doğrudan kopyala yapıştır yapmak veya kendinize mal etmek yasak. Kopya çekmeyelim. =)
Hepimize bol kaynak kodlu günler. =)
Not: Bu ödev 95 aldı. (5 puan değişken isimlerinin uzun olmasından gitmiş, bence sorun yok, ama naaapalım hocaya göre uzunmuş, sorun yok.)