İlk olarak kredi kartı numarasının doğruluğunu kontrol etmek için kullanacağımız Luhn Algoritmasını bu bağlantıda bulunan alttaki görsel üzerinden inceleyelim.
Aslında görselde verilen örnek gayet açıklayıcı, bize düşen bunu programa dökmek olacak, hadi başlayalım 🙂
Programın matematiksel kısmına geçmeden önce bazı koşulları netleştirmemiz gerekiyor. Nedir bunlar? Programa sadece 16 hanelik bir sayı girildiğinde işlem yapılması lazım, bunun dışındaki olası durumlar için birer hata mesajı yayımlayalım.
kartNo=input("\nLütfen 16 haneli Kart Numarasını Giriniz : ") if len(kartNo)==0: print("Kart No Boş Olamaz") elif kartNo.isdigit()==False: print("Sadece Rakam Giriniz") elif len(kartNo)<16: print("Kart No 16 Haneden Az Olamaz") elif len(kartNo)>16: print("Kart No 16 Haneden Fazla Olamaz")
Kullanıcıdan 16 haneli Kart Numarasını girmesini istedik. Daha sonra sırası ile kart numarası girilip girilmediğini, rakam dışında bir karakter girilip girilmediğini ve 16 haneden az veya fazla rakam girildiği gibi kontrolleri yapıyoruz. Asıl işlem bundan sonra başlıyor.
elif len(kartNo)==16: for i in range(len(kartNo)): if i%2==0: carp=int(kartNo[i])*2 if carp<10: sayı1+=carp if carp>9: sayı2+=1+carp%10 sayı3=sayı1+sayı2 for i in range(len(kartNo)): if i%2==1: sayı4+=int(kartNo[i]) top=sayı3+sayı4 print("\nKontrol Yapılıyor...") time.sleep(1.5) if top%10==0: print("\nGirilen Kredi Kartı Numarası Gerçektir") else: print("\nGirilen Kredi Kartı Numarası Sahtedir")
Aşama aşama anlatalım şimdi:
Artık elimizde 16 haneli bir kartNo var, for döngüsü ile kartNo uzunluğu kadar bir döngü başlatıp, if ile 2,4,6,8,10,12,14 ve 16ncı haneleri aldık ve bu hanelerin her birini 2 ile çarpıp topladık. Yalnız buradaki püf nokta şu; eğer 2 ile çarpım sonucunda iki haneli bir sayı elde ediliyorsa bu iki haneli sayıyı olduğu gibi değil rakamlarını toplayarak eklemek. Kodumuzdaki 7 ve 8. satırlar bu işe yarıyor.
İkinci for döngümüzde ise 1,3,5,7,9,11,13 ve 15inci haneleri topluyoruz. Son olarak iki for döngümüz neticesinde elde ettiğimiz toplamları birbirine ekleyerek bulduğumuz rakamın mod 10’unu yani birler basamağını alıyoruz. Bu rakam sıfıra eşitse girilen kredi kartı numarası gerçektir aksi halde kart numarası sahtedir.
Tabi burada bazı değişkenler kullandık fakat onları üst kısımda tanımlamamız lazım. Ayrıca 15. satırda time.sleep kullandık onuda yine üst kısımda import etmek lazım. Programın tamamını altta paylaşacağım fakat ondan önce öğrenmenizi istediğim son bir şey kaldı. Oda bu programı biraz süslemek.
Öncelikle bütün bu kod bloğunu bir while döngüsü içerisine alacağım ve her defasında “yeni bir kart kontrolümü yoksa programdan çıkış mı yapmak istediğimi bana sormasını” isteyeceğim. Daha sonra programın başına bu program ile ilgili bilgiler veren bir print bloğu ekleyeceğim.
import time print(""" ******************************************************************** * Kredi Kartı Dogruluk Kontrolu | Yazar: Hamit FIRAT | 02.01.2021 * ******************************************************************** ******************************************************************** * Bu program 16 haneli kredi kartı numarası girildiginde kartın * * geçerli olup olmadıgını kontrol eder. (Luhn Algoritması) * * * * Programdan çıkmak için Ç'ye basınız... (Çıkış) * * Yeni bir Kart Kontrolü için K'ye basınız... (Kontrol) * ******************************************************************** """) while True: sayı1=sayı2=sayı3=sayı4=carp=top=0 işlem=(input("\nİşlem Harfi (K veya Ç) Giriniz : ")) if (işlem=="ç" or işlem=="Ç"): print("\nProgram Sonlandırılıyor...") time.sleep(1.5) break elif (işlem=="k" or işlem=="K"): kartNo=input("\nLütfen 16 haneli Kart Numarasını Giriniz : ") if len(kartNo)==0: print("Kart No Boş Olamaz") elif kartNo.isdigit()==False: print("Sadece Rakam Giriniz") elif len(kartNo)<16: print("Kart No 16 Haneden Az Olamaz") elif len(kartNo)>16: print("Kart No 16 Haneden Fazla Olamaz") elif len(kartNo)==16: for i in range(len(kartNo)): if i%2==0: carp=int(kartNo[i])*2 if carp<10: sayı1+=carp if carp>9: sayı2+=1+carp%10 sayı3=sayı1+sayı2 for i in range(len(kartNo)): if i%2==1: sayı4+=int(kartNo[i]) top=sayı3+sayı4 print("\nKontrol Yapılıyor...") time.sleep(1.5) if top%10==0: print("\nGirilen Kredi Kartı Numarası Gerçektir") else: print("\nGirilen Kredi Kartı Numarası Sahtedir") else: print("\nGeçersiz İşlem...")
Evet, programımız bu kadar. Bir sonraki yazımızda PyQt5 ile bu programa görsel bir ara yüz kazandıracağız.