Sayfa: [1]   Aşağı git
  Yazdır  
Gönderen Konu: İçinde bulunulan yıl, Şubat kaç gün( yıl " artık yıl " mı )?  (Okunma Sayısı 590 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
NeverFear
Acemi Üye
**


Karma: 0
Offline Offline

Cinsiyet: Bay
Mesaj Sayısı: 29


Üyelik Bilgileri


« : 06 Ağustos 2008, 00:16:55 »




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;
//
Kod:
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.
//
Kod:
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
Logged
Sayfa: [1]   Yukarı git
  Yazdır  

 
Gitmek istediğiniz yer: