Programın ana mantığı yorum satırlarında açıklanmıştır.
#include <stdio.h> #include <stdlib.h> #include <string.h> void Yaz(int yil,int ay) { ayinIsminiYaz(yil,ay); ayinGunleriniYaz(yil,ay); } void ayinIsminiYaz(int yil,int ay) { printf("-------------------------------------------------------"); printf( "\n\tpaz\tpte\tsal\tcar\tper\tcum\tcte\n"); } /* Ayın ismini ekrana yazdırmak için kullanacağımız fonksiyonumuz */ char ayinIsmi[7]; void ayinIsminiAl(int ay) { switch(ay) { case 1: strcpy(ayinIsmi, "Ocak"); break; case 2: strcpy(ayinIsmi,"Şubat"); break; case 3: strcpy(ayinIsmi,"Mart"); break; case 4: strcpy(ayinIsmi,"Nisan"); break; case 5: strcpy(ayinIsmi,"Mayıs"); break; case 6: strcpy(ayinIsmi,"Haziran"); break; case 7: strcpy(ayinIsmi,"Temmuz"); break; case 8: strcpy(ayinIsmi,"Ağustos"); break; case 9: strcpy(ayinIsmi,"Eylül"); break; case 10: strcpy(ayinIsmi,"Ekim"); break; case 11: strcpy(ayinIsmi,"Kasım"); break; case 12: strcpy(ayinIsmi,"Aralık"); break; } } /* daha önceden IlkGunuAl fonksiyonu ile hesaplanan kurala göre ekrana ayın günleri yazılır. */ void ayinGunleriniYaz(int yil,int ay) { int BaslamaGunu=IlkGunuAl(yil,ay); int AydakiGunSayisi=AydakiGunSayisiniAl(yil,ay); int i; for(i=0;i<BaslamaGunu;i++) printf("\t"); for(i=1;i<AydakiGunSayisi;i++) { if(i<10) printf("\t%d",i); else printf("\t%d",i); if((i+BaslamaGunu)%7==0) printf("\n"); } printf("\n"); } /* 1800 yılı baz alınarak ilgili yılın ilgili ayındaki ilk günün haftanın kaçıncı gününe geldiği hesaplanır */ int IlkGunuAl(int yil,int ay) { int IlkGun1800=3; int GunlerinToplamSayisi=GunlerinToplamSayisiniAl(yil,ay); return (GunlerinToplamSayisi+IlkGun1800)%7; } /* Bu fonksiyon 1800 yılından itibaren parametre olarak aldığı ay ve yıl değerine kadar kaç gün olduğunu hesaplar */ int GunlerinToplamSayisiniAl(int yil,int ay) { int Toplam=0,i,sonuc; for(i=1800;i<yil;i++) { sonuc=ArtikYilHesap(i); if(sonuc==1) Toplam=Toplam+366; else Toplam=Toplam+365; } for(i=1;i<ay;i++) { int ags=AydakiGunSayisiniAl(yil,i); Toplam+=ags; } return Toplam; } /* Bu fonksiyon parametre olarak aldığı ay ve yil degerlerini kullanarak ilgili ayın kaç gün olduğunu hesaplar. Şubat ayı için oluşan özel durumu da kontrol eder */ int AydakiGunSayisiniAl(int yil,int ay) { if(ay==1||ay==3||ay==5||ay==7||ay==8||ay==10||ay==12) return 31; if(ay==4||ay==6||ay==9||ay==11) return 30; if(ay==2) { int sonuc= ArtikYilHesap(yil); if(sonuc==1) return 29; else return 28; } return 0; } /* Artık yıl, Miladî takvimde (Gregoryen takvim) 365 yerine 366 günü olan yıl. Bu fazladan gün (artık gün), normalde 28 gün olan şubat ayına 29 Şubat'ın eklenmesi ile elde edilir. Dört yılda bir yapılan bu uygulamanın nedeni Dünya'nın Güneş çevresinde dönme süresinin (astronomik yıl), Güneş'in aynı meridyenden iki kez geçişi arasındaki ortalama zamanın (gün) tam katı olmamasıdır. Bir astronomik yıl yaklaşık olarak 365,242 gün olmasına rağmen[1] normal bir takvim yılı 365 gündür. Artık yılların belirlenmesi Genel bir kural olarak artık yıllar 4 rakamının katı olan yıllardır: 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020 gibi. Ancak bu kuralın iki istisnası vardır: 1. 100'ün katı olan yıllardan sadece 400'e kalansız olarak bölünebilenler artık yıldır: Örneğin 1200, 1600, 2000 yılları artık yıldır ancak 1700, 1800 ve 1900 artık yıl değildir. Sadece 400'e tam olarak bölünebilenlerin artık yıl kabul edilmesinin nedeni, bir astronomik yılın 365,25 gün değil, yaklaşık olarak 365,242 gün olmasından kaynaklanan hatayı gidermektir.[1] 2. Hesabı daha da hassas hâle getirmek için -400'e kalansız bölünebildiği halde- 4000'e kalansız olarak bölünebilen yıllar artık yıl kabul edilmez:[1] Örneğin 4000, 8000, 12000, 16000, 24000, 32000 ve 48000 yılları 400'e tam bölünebildiği halde artık yıl kabul edilmeyecektir.[1] */ int ArtikYilHesap(int yil) { if(yil%400==0||yil%4==0&&yil%100!=0) return 1; else return 0; } int main(void) { int yil,ay; printf("Olusturmak Istediginiz takvimin yili: "); scanf("%d",&yil); printf("\nOlusturmak Istediginiz takvimin ayi: "); scanf("%d",&ay); Yaz(yil,ay); return 0; }
Program çıktısı:
Bir yanıt yazın