Futbol Ligi Sıralama Algoritması
Makale - Visual Basic
Yazar ugokhan   
Pazartesi, 08 Ekim 2007 17:18

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.

  1. Dim Takim(1 to 18) As String
  2. Dim Puan(1 to 18) As Integer
  3. Dim Oynadigi(1 to 18) As Integer
  4. 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:

  1. '5 nolu takım bilgileri'
  2. Takim(5) = "Galatasaray"
  3. Puan(5) = 28
  4. Oynadigi(5) = 16
  5. 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.

  1. ' Dizi için özel değişken tipi tanımlanıyor'
  2. Type TakimOzellik
  3. Index As Integer
  4. isim As String
  5. Oynanan As Integer
  6. Galibiyet As Integer
  7. Beraberlik As Integer
  8. Maglubiyet As Integer
  9. Attigi As Integer
  10. Yedigi As Integer
  11. Puan As Integer
  12. HukmenMaglubiyet As Integer
  13. ikilipuan As Integer   ' İkili sınama durumunda puan'
  14. ikiligol As Integer    ' ikili sınama durumunda gol sayısı'
  15. End Type
  16.  
  17.  
  18. 'Bir tanesi yedek olmak üzere 19 takım tanımlanır.'
  19. 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.

  1. Public Sub TakimDegistir(a, b)
  2. ' indexi a ve b olan iki takım yer değiştirilir.'
  3. ' takim(19) boş olan takımdır. Değiştirme işlemi için kullanılır.'
  4. Takim(19) = Takim(a)
  5. Takim(a) = Takim(b)
  6. Takim(b) = Takim(19)
  7. 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.

  1. Public Sub TabloyaYaz(satir, sutun, yazi As String, obje As MSHFlexGrid)
  2. ' Satir ve Sutun kooordinatlarındaki hücreye Yazi değerini yazar.'
  3. With anaform
  4. obje.Col = sutun
  5. obje.Row = satir
  6. obje.Text = yazi
  7. End With
  8. End Sub
  9.  
  10.  
  11. ' Örnek Kullanım'
  12. TabloyaYaz 4,3,"Fenerbahçe", PuanTablosu
  13. TabloyaYaz 1,3,"Galatasaray", PuanTablosu
  14. 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.

  1. Sub PuanVer(TakimAdi As String, Puan As Integer, Att As Integer, Yed As Integer)
  2.  
  3. ' Takımın Adına Göre Dizi Taranır. Bulunan Yerde Değişiklikler İşlenir.'
  4. For i = 1 To 18
  5.  
  6. If Takim(i).isim = TakimAdi Then
  7.  
  8. Takim(i).Attigi = Takim(i).Attigi + Att
  9. Takim(i).Yedigi = Takim(i).Yedigi + Yed
  10. Takim(i).Puan = Takim(i).Puan + Puan
  11.  
  12. Select Case Puan
  13. Case 1: Takim(i).Beraberlik = Takim(i).Beraberlik + 1
  14. Case 3: Takim(i).Galibiyet = Takim(i).Galibiyet + 1
  15. Case 0: Takim(i).Maglubiyet = Takim(i).Maglubiyet + 1
  16. End Select
  17.  
  18. Takim(i).Oynanan = Takim(i).Oynanan + 1
  19. Exit For
  20.  
  21. End If
  22.  
  23. End Sub

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

  1. PuanVer "Galatasaray" , 3 , 4 , 1
  2. PuanVer "Gençlerbirliği" , 0 , 1 , 4

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

  1. PuanVer "Real Madrid", 1 , 2 , 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.

  1. For i = 1 To 17
  2. For j = i + 1 To 18
  3.  
  4. ' i. ve j. takımların puanları kontrol edilir.'
  5. If Takim(i).Puan < Takim(j).Puan Then   ' Puan Üstünlüğü Durumu'
  6.  
  7. TakimDegistir i, j
  8.  
  9. ElseIf Takim(i).Puan = Takim(j).Puan Then   ' Puan Eşitliği Varsa'
  10.  
  11. KendiMaclari i, j
  12.  
  13. End If
  14.  

İş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ı.

  1. Sub KendiMaclari(a, b)
  2.  
  3. ' Bu kısımda takımların kendi aralarında oynadıkları maçlara bakılarak
  4. İkiliGol ve İkiliPuan değerleri hesaplanır. Ben bu kısımdaki kodları yazmadım
  5. Siz kendinize uygun iÅŸlemle bu bilgileri derleyin.
  6. ---------------------------   
  7.  
  8. AÇIKLAMA : a indexi her zaman b indexinden küçüktür.
  9. a takımının ikili puanı b takımından büyükse yer değiştirmeye gerek yoktur.'
  10.  
  11. If Takim(a).ikilipuan < Takim(b).ikilipuan Then
  12. TakimDegistir a, b
  13.  
  14. ElseIf Takim(a).ikilipuan = Takim(b).ikilipuan Then
  15. ' İkili Puan eşitliği durumunda ikili Gollere bakılır.'
  16.  
  17. If Takim(a).ikiligol < Takim(b).ikiligol Then
  18. TakimDegistir a, b
  19.  
  20. ElseIf Takim(a).ikiligol = Takim(b).ikiligol Then
  21. ' İkili Goller de eşit ise Genel Gol Averajına bakılır.'
  22.  
  23. If (Takim(a).Attigi - Takim(a).Yedigi) < (Takim(b).Attigi - Takim(b).Yedigi) Then
  24. TakimDegistir a, b
  25.  
  26. ElseIf (Takim(a).Attigi - Takim(a).Yedigi) = (Takim(b).Attigi - Takim(b).Yedigi) Then
  27. ' Genel Gol Averajları da eşitse toplamda fazla gol atan takıma bakılır'
  28.  
  29. If Takim(a).Attigi < Takim(b).Attigi Then
  30. TakimDegistir a, b
  31.  
  32. ElseIf Takim(a).Attigi = Takim(b).Attigi Then
  33. If Takim(b).HukmenMaglubiyet = 0 And Takim(a).HukmenMaglubiyet <> 0 Then
  34. TakimDegistir a, b
  35. Else
  36. If Hafta = 36 Then
  37. ' Eğer Ligin Son Haftasıysa sıralamayı Belirleyecek Tek Maç Yapılır.
  38. Bu maçta eşitlik durumu olmayacaktır.
  39. Beraberlik durumunda Penaltılar sonucu belirler.'
  40.  
  41. End If
  42. End If
  43. End If
  44. End If
  45. End If
  46. End If
  47. 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.

 

Yorumlar  

 
0 #4 2010-09-10 19:24
bir kulüp içerisindeki 5 ayrı takım farklı liglerde oynayacaktır. bu program sadece 1 adet lige göre hesaplama yapmakta. Siz 5 takım için ayrı ligler tutmalısınız. Burada yapacağınız şey kayıtlı verileri LigNo benzeri bir değişken ile takip etmek. 1 nolu Lig "Futbol Super Ligi", 2 nolu lig "Basketbol ligi" olabilir. LigNo ile bağlı kayıtları seçip aynı tabloda gösterebilirsin iz. Yalnız bu durumda maç girişleri farklılık gösterebilir. Onu da branşlara göre özel maç giriş formları ile ayarlarsınız.
Alıntı
 
 
0 #3 2010-09-09 22:38
iyi günler gökhan bey diyelimki bir kulüp içerisinde 5 kategoride takım var her birine ayrı ayrı form sayfalarımı eklemek gerekir maç girişleri puan durumu gibi
Alıntı
 
 
0 #2 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ı
 
 
0 #1 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ı
 

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