gokhanca.com

programlarım ve konu anlatımlarım

  • Yazı boyutunu yükselt
  • Varsayılan yazı boyutu
  • Yazı boyutunu düşür

Futbol Ligi Sıralama Algoritması

E-posta Yazdır
Kullanıcı DeÄŸerlendirmesi: / 7
ZayıfMükemmel 
Okullarda bilgisayar programlama derslerinde her zaman hocalar bu soruyu sormuÅŸtur. 18 takımlı bir futbol liginde takımları gerçek futbol kurallarına göre dizmek. Bir çok öÄŸrenci bunu en baÅŸta kolay zanneder. Alt tarafı bir sıralama iÅŸlemi der. Bu kısmen doÄŸrudur. Ama iÅŸler baÅŸladığında bunun çok da kolay olmadığı görülür. Åžimdi 18 takımı sıralamadan önce gerçek futbol kuralları nelerdir kısaca bir hatırlayalım.
  1. Bütün takımlar büyük puandan küçük puana doÄŸru sıralanır.
     
  2. EÄŸer aynı puana sahip takımlar varsa bunlar kendi aralarında oynadıkları maçlardaki puan üstünlüÄŸüne göre yerleÅŸir.
     
  3. Kendi aralarındaki maçlarda puan eÅŸitliÄŸi varsa kendi aralarında oynadıkları maçlardaki gol averajına göre yerleÅŸir. EÄŸer kendi aralarındaki maçlarda atılan gollerde eÅŸitlik var ise deplasmanda fazla gol atan takım üstün sayılmaz.
     
  4. Kendi aralarındaki maçlarda puan ve gol eÅŸitliÄŸi devam ediyorsa, genel puantajdaki gol averajına bakılır.
     
  5. Takımlar arasındaki gol averajı da eÅŸit ise genel toplamda daha fazla gol atmış olan takım üstün sayılır.
     
  6. Bu ÅŸartlara raÄŸmen eÅŸitlik devam ediyorsa hükmen yenilgisi olmayan takım üstün sayılır.
     
  7. Bütün bu ÅŸartlara raÄŸmen eÅŸitliÄŸin devam etmesi halinde ilgili takımlar arasında yapılacak tek maçlar neticesinde kazanan takım üstün sayılarak nihai sonuç alınır. Yani, bir A takımı ile bir B takımı sadece 1 maç yapar. Maçlar denmesinin sebebi aynı anda 2'den fazla takım olması durumudur.

DİZİ TANIMLAMAK

Şimdi aklımıza hemen bir dizi oluşturmak gelmiş olabilir. Diziyi aşağıdaki gibi tanımlayalım.

Dim Takim(1 to 18) As String
Dim Puan(1 to 18) As Integer
Dim Oynadigi(1 to 18) As Integer
Dim Attigi(1 to 18) As Integer

Genelde ilk akla gelen uygulama budur. Her özellik için ayrı bir dizi oluÅŸturulur ve aynı indisli veriler aynı takıma ait olan verilerdir. Örnek:

'5 nolu takım bilgileri
Takim(5) = "Galatasaray"
Puan(5) = 28
Oynadigi(5) = 16
Attigi(5) = 20

Bu ÅŸekildeki bir mantık doÄŸrudur fakat çok hantaldır. Özellikle sıralama iÅŸlerinde diziler karışır ve gereksizce fazla kod yazılır. Kodların takibi ve düzeni arapsaçı gibi olur. ÇoÄŸu kiÅŸinin hata yaptığı nokta doÄŸru dizi mantığı kuramamaktadır. Åžimdi bu iÅŸ için örnek bir dizi tanımı yapalım. TYPE yapısı oluÅŸturarak birden çok deÄŸiÅŸkeni tek bir özellik altında gruplayabiliriz. Bu sayede bir nesnenin özelliklerini oluÅŸturmuÅŸ oluruz.

' Dizi için özel deÄŸiÅŸken tipi tanımlanıyor
Type TakimOzellik
    Index As Integer
    isim As String
    Oynanan As Integer
    Galibiyet As Integer
    Beraberlik As Integer
    Maglubiyet As Integer
    Attigi As Integer
    Yedigi As Integer
    Puan As Integer
    HukmenMaglubiyet As Integer
    ikilipuan As Integer   ' İkili sınama durumunda puan
    ikiligol As Integer    ' ikili sınama durumunda gol sayısı
End Type

Bir tanesi yedek olmak üzere 19 takım tanımlanır.
Public Takim(1 To 19) As TakimOzellik

Bu sayede tek bir diziye deÄŸiÅŸik özellikler eklemiÅŸ olduk. Artık bu diziyi bir nesne gibi kullanabiliriz. Yukarıdaki kodları proje içerisinde bir module içine yazın. Böylece tüm proje içerisinde kullanabilirsiniz. Takim dizisine nasıl bir özellik kattığımızı aÅŸağıda görebilirsiniz.

www.gokhanca.com

Artık dizimiz tek bir isim altında deÄŸiÅŸik özelliklere sahip olarak oluÅŸturuldu. Yani nesne modelli programlamanın bir avantajını kullanmış olduk. Program baÅŸlarken sadece Erase Takim komutunu kullanarak diziyi resetleyebilir. Daha sonra istediÄŸiniz bir yöntemle takimlar hakkındaki bilgileri Takim dizisi içerisine yazabilirsiniz. Bu konuda istediÄŸiniz uygulamayı yapabilirsiniz. Ben örnek programımda bir text dosya içerisine maç skorlarını yazdırıp yine aynı dosyadan gerekli bilgileri okutturdum. İsteyen veritabanı da kullanabilir.

SIRALAMA MANTIÄžI 

Futbol kurallarına göre bir algoritmik akış ÅŸeması oluÅŸturalım. Akış ÅŸeması biraz uzun olduÄŸu için Burayı Tıklatarak ayrı bir pencerede algoritmasını görebilirsiniz. Sıralama iÅŸlemi için birkaç sub programı tanımlayalım. Bunlar bizi her defasında benzer kodları yazma derdinden kurtaracak. Aynı zamanda daha anlaşılabilir bir kod düzeni saÄŸlayacak. İlk Sub'ımız a ve b indisli takımları yer deÄŸiÅŸtirmekle ilgili.

Public Sub TakimDegistir(a, b)
    ' indexi a ve b olan iki takım yer deÄŸiÅŸtirilir.
    ' takim(19) boÅŸ olan takımdır. DeÄŸiÅŸtirme iÅŸlemi için kullanılır.
    Takim(19) = Takim(a)
    Takim(a) = Takim(b)
    Takim(b) = Takim(19)
End Sub

GördüÄŸünüz gibi a ve b indisli takımları yer deÄŸiÅŸtirmek ne kadar kolay. EÄŸer bir sürü dizi tanımlasaydık gereksizce fazladan kod yazacaktık. Devam edelim. EÄŸer proje içerisinde tablo olarak MSHFlexGrid kullanacaksanız aÅŸağıdaki kod iÅŸinize yarayacaktır. Bu kod modül içerisindedir ve anaform adlı form üzerinde bulunan bir MSHFlexGrid nesnesine deÄŸer yazar. Obje deÄŸeri için anaformdaki MSHFlexGrid nesnesinin adını yazmalısınız. Bunun kullanılmasının anlamı, anaform üzerinde birden fazla MSHFlexGrid kullanıyorsanız nesne ismini yollayıp istediÄŸiniz tabloya yazdırma iÅŸlemi yaptırabilmenizdir.

Public Sub TabloyaYaz(satir, sutun, yazi As String, obje As MSHFlexGrid)
    ' Satir ve Sutun kooordinatlarındaki hücreye Yazi deÄŸerini yazar.
    With anaform
        obje.Col = sutun
        obje.Row = satir
        obje.Text = yazi
    End With
End Sub

' Örnek Kullanım
TabloyaYaz 4,3,"Fenerbahçe", PuanTablosu
TabloyaYaz 1,3,"Galatasaray", PuanTablosu
TabloyaYaz 2,2,"BeÅŸiktaÅŸ", MaclarTablosu

Bu Sub ise seçilen bir takıma puan vermek için kullanılır. Özellikle maçların sonuçlarını deÄŸerlendirirken iÅŸinize yarayacaktır.

Sub PuanVer(TakimAdi As String, Puan As Integer, Att As Integer, Yed As Integer)
      
' Takımın Adına Göre Dizi Taranır. Bulunan Yerde DeÄŸiÅŸiklikler İşlenir.
    For i = 1 To 18
       
        If Takim(i).isim = TakimAdi Then
           
            Takim(i).Attigi = Takim(i).Attigi + Att
            Takim(i).Yedigi = Takim(i).Yedigi + Yed
            Takim(i).Puan = Takim(i).Puan + Puan
           
            Select Case Puan
                Case 1: Takim(i).Beraberlik = Takim(i).Beraberlik + 1
                Case 3: Takim(i).Galibiyet = Takim(i).Galibiyet + 1
                Case 0: Takim(i).Maglubiyet = Takim(i).Maglubiyet + 1
            End Select
           
            Takim(i).Oynanan = Takim(i).Oynanan + 1
            Exit For

        End If
    Next

End Sub

' Örnek Kullanım-1 : Galatasaray, GençlerbirliÄŸi'ni  4-1 yendiyse

PuanVer "Galatasaray" , 3 , 4 , 1
PuanVer "GençlerbirliÄŸi" , 0 , 1 , 4

Örnek Kullanım-2 : Real Madrid, Barcelona 2-2 berabere kaldıysa

PuanVer "Real Madrid", 1 , 2 , 2
PuanVer "Barcelona", 1 , 2 , 2

Yukarıdaki 3 Sub program ile birçok iÅŸi zahmetsizce yapabiliriz. Åžimdi sıralamaya geçelim. Bir Command butona bastığımızda sıralama iÅŸlemi baÅŸlamış olsun. AÅŸağıdaki kodları bir Command butonun Click yordamına yazın.

For i = 1 To 17
    For j = i + 1 To 18

        ' i. ve j. takımların puanları kontrol edilir.
        If Takim(i).Puan < Takim(j).Puan Then   ' Puan ÜstünlüÄŸü Durumu

            TakimDegistir i, j

        ElseIf Takim(i).Puan = Takim(j).Puan Then   ' Puan EÅŸitliÄŸi Varsa

            KendiMaclari i, j

        End If
       
    Next
Next

İşte bütün sıralama iÅŸlemi bu kadar. Burada kullanılan sıralama algoritması EXCHANGE SORT (YerdeÄŸiÅŸtirme Sıralaması) olarak bilinen algoritmadır. EÄŸer dikkat ettiyseniz, "Sıralamada alttaki takımın puanı, Üstteki takımın puanından büyükse deÄŸiÅŸiklik yap" diye bir kontrol var. Sadece bu kontrol bize yeter. Çünkü üstteki takımın puanı büyükse zaten yer deÄŸiÅŸtirmeye gerek yoktur. Bir de puan eÅŸitliÄŸi olayı var. EÄŸer seçilen 2 takımın puanı eÅŸitse, konunun en başında anlattığım futbol ligi sıralama kurallarına göre tek tek kontrol yapılması gerekir. Bu kontroller KendiMaclari adlı Sub program içerisinde yapılmaktadır. İşte bütün olayı  gerçekleÅŸtiren ana sub programı burası.

Sub KendiMaclari(a, b)

   ' Bu kısımda takımların kendi aralarında oynadıkları maçlara bakılarak
   ' İkiliGol ve İkiliPuan deÄŸerleri hesaplanır. Ben bu kısımdaki kodları yazmadım
   ' Siz kendinize uygun iÅŸlemle bu bilgileri derleyin.
   ' ---------------------------   

   ' AÇIKLAMA : a indexi her zaman b indexinden küçüktür.
   ' a takımının ikili puanı b takımından büyükse yer deÄŸiÅŸtirmeye gerek yoktur.
           
    If Takim(a).ikilipuan < Takim(b).ikilipuan Then
        TakimDegistir a, b
       
      ElseIf Takim(a).ikilipuan = Takim(b).ikilipuan Then
        ' İkili Puan eÅŸitliÄŸi durumunda ikili Gollere bakılır.

        If Takim(a).ikiligol < Takim(b).ikiligol Then
            TakimDegistir a, b
           
          ElseIf Takim(a).ikiligol = Takim(b).ikiligol Then
            ' İkili Goller de eÅŸit ise Genel Gol Averajına bakılır.

            If (Takim(a).Attigi - Takim(a).Yedigi) < (Takim(b).Attigi - Takim(b).Yedigi) Then
                TakimDegistir a, b

              ElseIf (Takim(a).Attigi - Takim(a).Yedigi) = (Takim(b).Attigi - Takim(b).Yedigi) Then
                ' Genel Gol Averajları da eÅŸitse toplamda fazla gol atan takıma bakılır

                If Takim(a).Attigi < Takim(b).Attigi Then
                    TakimDegistir a, b
               
                  ElseIf Takim(a).Attigi = Takim(b).Attigi Then
                   If Takim(b).HukmenMaglubiyet = 0 And Takim(a).HukmenMaglubiyet <> 0 Then
                        TakimDegistir a, b
                      Else
                        If Hafta = 36 Then
                      ' EÄŸer Ligin Son Haftasıysa :                                             ' Sıralamayı Belirleyecek Tek Maç Yapılır.
                      ' Bu maçta eÅŸitlik durumu olmayacaktır.
                      ' Beraberlik durumunda Penaltılar sonucu belirler.

                         End If
                    End If
                End If
            End If
        End If
    End If
End Sub

Bu hazır Sub programlarını, kendi programınız içerisinde kullanabilirsiniz. GörüldüÄŸü gibi TYPE yapısıyla doÄŸru ÅŸekilde dizi tanımlayınca iÅŸlemler çok basite indirgenmektedir. Programlarım sayfasından Futbol-Ligi adlı projeyi indirip kodlarda eksik kalan kısımlara bakabilirsiniz.

PerÅŸembe, 29 Mayıs 2008 10:33 tarihinde güncellendi  

Yorumlar  

 
0 #1 volkan 2010-04-19 22:43
bana futbol ligi sıralama programının kodları ve hangi nesneleri kullanmam gerekiyo yardımcı olursan sevinirim
Alıntı
 
 
0 #2 gokhan 2010-04-20 06:40
Quoting volkan:
bana futbol ligi sıralama programının kodları ve hangi nesneleri kullanmam gerekiyo yardımcı olursan sevinirim

Programlarım sayfasına girerseniz orada bu programı görebilirsiniz. Zaten yukarıda da belirttim bunu. Zip şifresi gokhanca.com olacak.
Alıntı
 

Yorum ekle

TCK'ya aykırı, yasadışı ve genel ahlaka aykırı yazılar ile konu dışında yazılar, istekler, spam ve reklam amaçlı mesajlar yazılması YASAKTIR. Bu tür yazılar görüldüğü anda tarafımdan silinecektir. Herhangi bir uygunsuzluğun olduğunu düşündüğünüz yazılar için lütfen bana eposta yoluyla haber veriniz.


Güvenlik kodu
Yenile

mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterBugün92
mod_vvisit_counterDün184
mod_vvisit_counterBu Hafta1504
mod_vvisit_counterÖnceki Hafta1681
mod_vvisit_counterBu Ay1154
mod_vvisit_counterÖnceki Ay9853
mod_vvisit_counterTüm Zamanlar50626

Åžu anda: 3 ziyaretçi Ã§evrimiçi
IP No: 38.107.191.97
 , 
Bugün: 05 Eyl 2010