--------------------------------------------------------------------------------
Okullarda bilgisayar programlama derslerinde her zaman hocalar bu soruyu sormuştur. 18 takımlı bir futbol liginde takımları gercek futbol kurallarına gore dizmek. Bir cok oğ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 cok da kolay olmadığı gorulur. Şimdi 18 takımı sıralamadan once gercek futbol kuralları nelerdir kısaca bir hatırlayalım.
1.) Butun takımlar buyuk puandan kucuk puana doğru sıralanır.
2.) Eğer aynı puana sahip takımlar varsa bunlar kendi aralarında oynadıkları maclardaki puan ustunluğune gore yerleşir.
3.) Kendi aralarındaki maclarda puan eşitliği varsa kendi aralarında oynadıkları maclardaki gol averajına gore yerleşir. Eğer kendi aralarındaki maclarda atılan gollerde eşitlik var ise deplasmanda fazla gol atan takım ustun sayılmaz.
4.) Kendi aralarındaki maclarda 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 ustun sayılır.
6.) Bu şartlara rağmen eşitlik devam ediyorsa hukmen yenilgisi olmayan takım ustun sayılır.
7.) Butun bu şartlara rağmen eşitliğin devam etmesi halinde ilgili takımlar arasında yapılacak tek maclar neticesinde kazanan takım ustun sayılarak nihai sonuc alınır. Yani, bir A takımı ile bir B takımı sadece 1 mac yapar. Maclar 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.
' Takımlar icin Diziler Tanımlanıyor..
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 ozellik icin ayrı bir dizi oluşturulur ve aynı indisli veriler aynı takıma ait olan verilerdir. Ornek:
' 5 nolu takım bilgileri
Takim(5) = "Antalyaspor"
Puan(5) = 28
Oynadigi(5) = 16
Attigi(5) = 20
....
Bu şekildeki bir mantık doğrudur fakat cok hantaldır. Ozellikle sıralama işlerinde diziler karışır. Ve gereksizce fazla kod yazılır. Kodların takibi ve duzeni arapsacı gibi olur. Coğu kişinin hata yaptığı nokta doğru dizi mantığı kuramamaktadır. Şimdi bu iş icin ornek bir dizi tanımı yapalım. TYPE yapısı oluşturarak birden cok değişkeni tek bir ozellik altında gruplayabiliriz. Bu sayede bir nesnenin ozelliklerini oluşturmuş oluruz
Kod:
' Dizi icin ozel 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 uzere 19 takım tanımlanır. Public Takim(1 To 19) As TakimOzellik
Bu sayede tek bir diziye değişik ozellikler eklemiş olduk. Artık bu diziyi bir nesne gibi kullanabiliriz. Yukarıdaki kodları proje icerisinde bir modul icine yazın. Boylece tum proje icerisinde kullanabilirsiniz. Takim dizisine nasıl bir ozellik kattığımızı aşağıda gorebilirsiniz.
Kod:
Takim(1).isim = "Antalyaspor" Takim(1).Oynanan = 16 Takim(1).Beraberlik = 4 Takim(1).Attigi = 40
Artık dizimiz tek bir isim altında değişik ozelliklere 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 yontemle takimlar hakkındaki bilgileri Takim dizisi icerisine yazabilirsiniz. Bu konuda istediğiniz uygulamayı yapabilirsiniz. Ben ornek programımda bir text dosya icerisine mac skorlarını yazdırıp yine aynı dosyadan gerekli bilgileri okutturdum. İsteyen veritabanı da kullanabilir.
SIRALAMA MANTIĞI
--------------------------------------------------------------------------------
Sıralama işlemi icin birkac sub programı tanımlayalım. Bunlar bizi her defasında benzer kodları yazma derdinden kurtaracak. Aynı zamanda daha anlaşılabilir bir kod duzeni sağlayacak. İlk Sub'ımız a ve b indisli takımları yer değiştirmekle ilgili.
Kod:
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 icin kullanılır. Takim(19) = Takim(a) Takim(a) = Takim(b) Takim(b) = Takim(19) End Sub
Gorduğunuz gibi a ve b indisli takımları yer değiştirmek ne kadar kolay. Eğer bir suru dizi tanımlasaydık gereksizce fazladan kod yazacaktık. Aşağıdaki Sub ise secilen bir takıma puan vermek icin kullanılır. Ozellikle macların sonuclarını değerlendirirken işinize yarayacaktır.
Kod:
Sub PuanVer(TakimAdi As String, Puan As Integer, Att As Integer, Yed As Integer) ' Takımın Adına Gore 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 ' Ornek Kullanım-1 : Antalyaspor, Fenerbahce'yi 4-1 yendiyse PuanVer "Antalyaspor",3,4,1 PuanVer "Fenerbahce",0,1,4 ' Ornek Kullanım-2 : Antalyaspor, Barcelona ile deplasmanda 2-2 berabere kaldıysa ve Barcelona'nın 2 golunde de ofsayt varsa

Şimdi sıralamaya gecelim. 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 Kod:
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 Ustunluğu 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 butun sıralama işlemi bu kadar. Burada kullanılan sıralama algoritması EXCHANGE SORT (Yerdeğiştirme Sıralaması) olarak bilinen algoritmadır. Bununla ilgili detaylı bilgiyi [1] nolu algoritma konu anlatımında bulabilirsiniz. Eğer dikkat ettiyseniz, "Sıralamada alttaki takımın puanı, Ustteki takımın puanından buyukse değişiklik yap" diye bir kontrol var. Sadece bu kontrol bize yeter. Cunku ustteki takımın puanı buyukse zaten yer değiştirmeye gerek yoktur. Bir de puan eşitliği olayı var. Eğer secilen 2 takımın puanı eşitse, konunun en başında anlattığım futbol ligi sıralama kurallarına gore tek tek kontrol yapılması gerekir. Bu kontroller KendiMaclari adlı Sub program icerisinde yapılmaktadır.
Kod:
Sub KendiMaclari(a, b) ' Bu kısımda takımların kendi aralarında oynadıkları maclara 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. ' --------------------------- ' ACIKLAMA : a indexi her zaman b indexinden kucuktur. ' a takımının ikili puanı b takımından buyukse 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 ' Atılan Goller de Eşitse ' Hukmen Yenilgisi Olmayan Takım Secilir. ' Her ikisinin hukmen yenilgi sayısı 0'dan buyukse secim yapılmaz. ' Bu durumda ancak b nin hukmen yenilgisi yoksa a nın ustune cıkar. ' Tersi durumda zaten a, b den usttedir. 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 Mac Yapılır. ' Bu macta 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 icerisinde kullanabilirsiniz. Gorulduğu gibi TYPE yapısıyla doğru şekilde dizi tanımlayınca işlemler cok basite indirgenmektedir.
__________________