1.Şubat, içinde bulunulan yılda kaç gün?
2.Hangi yıllar "artık yıl"?
3.Yüzyılı başlatan yılların hepsi "artık yıl" mı?
* Çoğumuz program yazarken bu tür soruları sormuş ve cevap arayıp kod üretmiş veya
üretmeye çalışmışızdır. Ya da yardım istemişizdir. Hatta burda örnekleri de var.
* Pek çoğunuz, "Biz bu tür konuları çoktan geçtik" de diyebilir. Amaç; bilgi tazelemek,
Türk programramcılığına biraz olsun katkıda bulunabilmek ve yeni başlayan arkadaşlara
ışık tutmak.
* Yukarıdaki sorulara, "IsLeapYear" fonksiyonu içindeki "mod" aritmetiksel operatörü
cevap veriyor.
1. Şubat, 4 ile bölünebilen yıllarda(ki bunlar artık yıl) 29, diğer yıllarda 28 gündür.
2. Son iki rakamı 00 ve 4'ün katları olan yıllar "Artık Yıl"'dır.
Örnek:
Son iki rakamı -> 2000,2004,2008,2012,2016,2020,2024,2028,2032,2036,2100 .. v.b.
yıllar 4 ile kalansız bölünebildikleri için "Artık Yıl"dır.
Şubat 29 gündür.
3. 400 ile kalansız bölünebilen yüzyıllar artık yıldır.
Örnek:
Yüzyıl başlatan -> 400,800,1200,1600,2000,2400,2800,3200,3600,4000 .. v.b.
yıllar 400 ile kalansız bölünebildikleri için "Artık Yıl"dır.
Şubat 29 gündür.
1900,2100,2200,2300,2500,2600,2700 .. v.b. yıllar 4 ile kalansız
bölündüğü ve Şubat 29 gün olduğu halde, yüzyılı başlatan "Artık Yıl"lar
değildirler. Çünkü 400'e kalansız bölünmezler.
*** Ayrıca, DelphiX\Source\Rtl\Common dizini altındaki DateUtils.pas dosyasını
inceleyebilirsiniz.
//
function IsLeapYear(Year: Word): Boolean;
begin
Result:= (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
//
unit Subat;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
PDayTable = ^TDayTable;
TDayTable = array[1..12] of Word;
TForm1 = class(TForm)
Label3: TLabel; Label4: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
//
{ Public declarations }
end;
var
Form1: TForm1;
Tarih: TDateTime;
GUN, AY, YIL: Word;
Hour, Min, Sec, MSec: Word;
DayTable: PDayTable;
function GetDayTable(Year: Word): PDayTable; //İstenilen yılın aylarının gün sayılarını
//döndürür.
function IsLeapYear(Year: Word): Boolean; //İstenilen yılın artık yıl olup olmadığını
//kontrol eder ve sonuç True ise Şubat 29 gündür. İkinci şart da True ise yüzyıl
//artık yıldır. Takvim de buradan dönecek sonuca göre oluşur.
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Tarih:= Now;
DecodeDate(Tarih,YIL,AY,GUN);
DecodeTime(Tarih, Hour, Min, Sec, MSec);
DayTable:= GetDayTable(YIL);
end;
function IsLeapYear(Year: Word): Boolean;
begin
Result:= (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
function GetDayTable(Year: Word): PDayTable;
const
DayTable1: TDayTable = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
DayTable2: TDayTable = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
DayTables: array[Boolean] of PDayTable = (@DayTable1, @DayTable2);
begin
Result := DayTables[IsLeapYear(Year)];
end;
//
* Yukarıdaki kod örneği ve fonksiyonlar, içinde bulunulan yılda Şubat ayı kaç gün,
artık yıl mı ve şuanki ay kaç gün ... gibi sorulara cevap verir.
//
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label4.Caption:= IntToStr(Hour)+':'+IntToStr(Min)+':'+
IntToStr(Sec)+':'+IntToStr(MSec);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
GUN:= DayTable^[AY];
Label3.Caption:= IntToStr(YIL)+' yılının '+IntToStr(AY)+'.ayı '+
IntToStr(GUN)+' gündür.';
end;
İşinizi görmesi dileğimle,
Çalışmalarınızda başarılar dilerim.
NeverFear - Linklerin Görülmesine Izin Verilmiyor
Linki Görebilmek Için
Üye Ol veya
Giris Yap