iki dizilimin eşleşen noktalarını gösteren bir tablo oluştuturur.
• Ödevi yapacağım dil olarak Python programlama dilini seçtim.• Görsel programlama için ise PyQt5 modülünü kullanmaya karar verdir.
• PyQt5 modülünde Qt Designer aracı ile form tasarımı yapılabiliyor. Bende biri kullanıcıdan değerleri alacak olan pencere, diğeri tablo penceresi olmak üzere 2 pencere(widget) oluşturdum. Bunları _window ve _table olarak isimlendirdim.
• _window ve _table dosyaları üzerinde de düzenlemeler yaptım. Qt Designer ile oluşturduğum yapıyı iskelet olarak kullandım.
• Sonrasında işlemlerimi yürüteceğim process.py dosyasında _window ve _table’ı import ettim.
• İşlemlerimi daha kolay yürütebilmek için, process.py’da bir sınıf oluşturdum ve isim olarak “Match” ismini verdim. Bütün süreci bu sınıf üzerinden yönettim.
• Pythonda __init__ metodu yapılandırıcı metot(constructor) olarak kullanılıyor. Match sınıfını oluştururken QtWidget sınıfından miras aldım. __init__ metodunda super() ile miras aldığım QtWidget’a gerekli değerleri gönderdim.
• Yine __init__ metodunda, ui isminde bir nesne oluşturdum ve bu nesneyi pencerelerimi yönetmek için kullandım. İlk pencereyi ve sonrasında açılan tabloyu bu nesne ile yönettim.
• Son olarak da __init__ metodunda kullanıcıdan dizilimleri ve keymer değerini alacağım pencerenin kurulumunu yaptım ve pencereyi açtım.
• Bu pencerede kullanıcıdan alınacak olan, first sequence değeri ve second sequence
değeri düzgün bir değer olduğu varsayılmıştır. Kullanıcının gireceği
keymer değeri(n-value) de bir tamsayı olarak varsayılmıştır. .
• Kod tarafında kullanıcıdan gelen değerleri almak için getSequence() metodunu ve
gelen sekansı keymerlerine ayırmak için de divideSequence() metodunu kullandım.
Ardından getSequence() metodu içerisinde kullanıcından değerleri alan pencereyi
kapattım.
• Tabloyu oluşturması için createTable() isimli bir metot tanımladım ve bu metoda
getSequence() metoduyla kullanıcıdan alınmış ve divideSequence() metoduyla
keymerlerine ayrılmış liste tipindeki first ve second sekanslarını verdim.
• Sekansların uzunluklarını bulup, bu uzunluklara göre tablomu
oluşturdum. Tabloda first sekansını sütun başlıklarına, second sekansını satır
başlıklarına verdim.
• Tablodaki bütün satır ve sütunların genişliklerini ayarlayan bir metot bulamadım,
setColumnWidth() ve setRowHeight() metotları sadece belli bir satır veya sütunun
genişliğini ayarlayabiliyordu bu yüzden, döngü kullanıp bütün satır-sütunların
genişliklerini ayarladım.
• Ardından tabloda eşleşen keymerleri bulma, sayma ve renklendirme işlemine geçtim.
Bu işlemi en verimli nasıl yaparım diye üzerinde düşündükten sonra, çözüm olarak
sırasıyla tablodaki diagonelleri gezmeye karar verdim. Algoritmayı anlatması biraz
zor, özet olarak; first sekans uzunluğu + second sekans uzunluğu – 1 adet olan
digonalleri gezmek için biri ortadaki diagonal, diğer biri ortadaki diagonalin üst
kısmındaki diagonaller, sonuncusu da ortadaki diagonalin alt kısmındaki diagonaller
için olmak üzere 3 döngü sistemi kurdum. Bu döngüler, eşleşme bulduğunda countı
arttırıp, renklendirir ve count sayısını o hücreye yazar. Eşleşme bulamadığı yerde de
countı sıfırlayıp oluşturduğum newColor() metodundan farklı bir renk alır. Bu şekilde
bütün diagonalleri gezip, eşleşen yerleri renklendirir. Son olarak da tabloyu gösterir.