Uygulamaya ait örnek dosyayı buradan indirebilirsiniz.
Mini süper ligimize ait takımların kurada hangi sırada olacağını bir önceki makalemizde belirlemiştik. Bu makalemizde kura çekimine geçebiliriz artık.
b) Kuraların çekilmesi
Geldik en önemli bölüme. Kuralar nasıl çekilecek. Öncelikle kaç hafta maç oynanacağını bulmaya çalışalım. Bizim belirlediğimiz takım sayısı 4. Buna n diyelim.
Birinci yarı maç sayısı n - 1 yani 4 - 1 = 3 hafta olacaktır. İkinci yarı da aynı maç oynanacağına göre, 2 * (n - 1) toplam maç sayısını bulmamızı sağlayacaktır.
Peki her hafta kaç maç oynanacak. Bir maç için 2 takıma ihtiyaç olduğuna n / 2 toplam maç sayısını bize verecektir. Buna göre her hafta 2 maç oynanacaktır. Buna göre birinci yarıda 3 * 2 = 6 maç oynanacaktır.
Geldik takımları eşleştirmeye. Burada kümeler konusundan yararlanacağız. Yukarıda verilen takimlar kümesi 4 elemanlı olduğuna göre, bunun 2 elemanlı alt kümeleri bizim kura çekimimizi oluşturacaktır. K(4,2) küme eleman sayısı 6 olduğuna göre bu da bizim ilk yarı maç sayısını vermektedir. Bu alt kümeyi oluşturmak için ikilik sayı sisteminden yararlanacağız. Seçilen takımlara 1, seçilmeyen takımlara ise 0 verdiğimizde ikili alt kümeleri bulmuş olacağız.
Bunu örneklendirmeye çalışalım.
Galatasaray - Fenerbahçe için 1 1 0 0 ikilik sayısı yani 12 sayısı kullanılacaktır. Verilen onluk sayı ikilik sayı sistemine dönüştürüldüğünde elde edilen ikilik sayıda iki tane 1 varsa, bu bizim ikili alt kümemizi yani takım eşleştirmesini verecektir. 4 elemanlı bir kümenin her bir elemanı 1 olduğunda bu bize kümenin onlu maksimum sayısını verecektir. Buna göre 1111 ikili sayısı 15 sayısına denk gelir. 1 ile 15 sayısı arasındaki sayıların ikilik sayı karşılıkları içinde 2 tane 1 olursa bu bize maç eşleştirmesini verecektir.
1 0 1 0 ise Galatasaray - Beşiktaş
0 1 1 0 ise Fenerbehçe - Beşiktaş
0 1 0 1 ise Fenerbahçe - Trabzonspor
Yukarıda verilen eşleştirmelerde görüldüğü gibi, artık takımlarımızı ikili eşleştirmiş olduk. Geldik bu anlatılanları kodlamaya.
Öncelikle verilen sayıyı ikilik sayıya dönüştüren metodu ve ikilik sayı sisteminde yer alacak birlerin sayısını bulan fonksiyonları tanımlayalım. Metotlarımıza DtoB ve CountOnes isimlerini verelim. Tanımladığımız DtoB metodu ana programdan sayısal bilgi alacak, ana programa string bir bilgi yollayacaktır. CountOnes ise ana programdan string bir bilgi alacak, ana programa sayısal bir bilgi yollayacaktır.
Public Function DtoB(ByVal a As Double) As String
Dim aktar As String
Dim k As Double
aktar = ""
Do While a > 0
k = a Mod 2
a = Int(a / 2)
aktar = CStr(k) & aktar
Loop
DtoB = aktar
End Function
Public Function CountOnes(ByVal value As String) As Integer
Dim i As Integer, sayac As Integer
sayac = 0
For i = 1 To Len(value)
If Mid(value, i, 1) = "1" Then
sayac = sayac + 1
End If
Next i
CountOnes = sayac
End Function
Fonksiyonumuzu tanımladık. Sıra geldi uygulamaya ait değişkenleri tanımlamaya. Bu uygulamaya ait değişkenler aşağıda verilmiştir.
Dim bValue As String
Dim setSize As Integer, finalValue As Long
Dim bValueSize As Integer, max As Integer
setSize = UBound(takimlar) + 1
finalValue = 2 ^ setSize
max = setSize * (setSize - 1) / 2
Dim m() As String
ReDim m(max - 1, 1)
Dim p As Integer, q As Integer
p = 0
Geldik işlemleri yapmaya. Döngümüzü 2n = 24 = 16 sayısına kadar döndüreceğiz. Döngüde sırası gelen sayıyı ikilik sayıya dönüştüreceğiz. Elde edilen ikilik sayıda iki tane bir varsa, takimlar dizisinde bir sayılarının olduğu takımları m dizisine aktaracağız.
For i = 1 To finalValue
bValue = DtoB(i)
bValueSize = Len(bValue)
' Eksik bitleri sola sıfır ekleyerek tamamla
Do While Len(bValue) < setSize
bValue = "0" & bValue
Loop
q = 0
' Kaç tane 1 var?
If CountOnes(bValue) = 2 Then
Dim j As Integer
For j = 1 To setSize
If Mid(bValue, j, 1) = "1" Then
m(p, q) = takimlar(j - 1)
q = q + 1
End If
Next j
p = p + 1
End If
Next i
İşlemler tamam. Artık eşleştirmeleri listeleyebiliriz.
ActiveDocument.Content.InsertAfter "Mini Süper Lig Eşleşmeleri" & vbCr
Dim k As Integer
For k = 0 To max - 1
ActiveDocument.Content.InsertAfter _
Format(m(k, 0), "@@@@@@@@@@@@@@@") & " - " & _
m(k, 1) & vbCr
Next k
Böylece 4 takımlı bir ligde takımların eşleşmeleri tamam. Takımları eşleştirdik. Aşağıdaki pencere görüntüsünü programı çalıştırdığımda aldım.

Yukarıdaki ekranda görüldüğü gibi, Galatasarayın maçları arka arkaya. Halbuki bir haftada tek maç oynamalıydı. Dersimizi burada bitirelim. Kafamız karışmadan en önemli aşamaları bir sonraki derste anlatmaya çalışalım. Makaleyi beğenmeyi ve paylaşmayı unutmayalım.