Python ile sayı sistemlerini birbirine çeviren program
Dijital eketronik ile ilgili konulara giriş yapıldığında ilk incelenen ve öğretilen konunun sayı sistemleri olduğu, ilgili kitapların kapağı ilk açıldığında anlaşılmaktadır. Elektronikçiler açısından da bir programlama diline başlangıç uygulamasının yine sayı sistemleri olması gerekmektedir.
Sayı sistemleri tabana göre açıklanmaktadır. En çok kullanılanları, onluk (decimal), ikilik (binary), onaltılık (hexadecimal), sekizlik (octal). Bu yazıda onluk, ikilik ve onaltılık sayı sistemlerini birbirine çevirecek python programı üzerinde çalışma yapacağız. Öncelikle programın parçalarını oluşturup çevrim için gerekli temel sistemi anlattıktan sonra bir bütün olarak grafik arayüzü olan bir program hazırlayacağız.
Aşağıda verilen bütün programlarda değişkenler harf sırasına göre ihtiyaç duyulduğu kadar kullanılmıştır. Kullanılan değişkenlerin isimlendirmesine özen gösterilmemiş, anlaşılırlığına dikkat edilmiştir.
Onluk (decimal) sayıyı ikilik (binary) sayıya çevirmek:
Onluk sayı sistemi günlük hayatta kullanılan ve işlemlerin yapıldığı sistemdir. Tabanı 10'dur. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 rakamları ile ifade edilir.
İkilik sayı sistemi genellikle bilgisayar ve dijital elektronik alanında kullanılmaktadır. Tabanı 2'dir. 0 ve 1 rakamları ile ifade edilr. Ayrıca dijital konularda "Low" ve "High" ifadeleri de sonuç açısından kullanılmaktadır.
onluk sayılari ikilik sayılara çevirmek için bölme 2 metodu kullanılır ve sonuç tersinden yazılır. 13 ondalık sayısını ikilik sayıya çevirelim:
Bölünen Bölüm Kalan ------- ------- ------- 13/2 6 1 6/2 3 0 3/2 1 1 1/2 0 1
Kalanlar tersten yazıldığında "1101" sonucuna ulaşılır. Bu sonuç aranan ikilik sayı değeridir. Biz aynı yöntemi kullanarak pythonda bu işlemi yapacağız. Program dosyası python konsolu üzerinde çalışmakta olduğundan Idle'yi kullanınız. Idle'de program dosyasını açtıktan sonra ">Run>Run Module F5" ile veya direk F5 tuşuna basarak çalışır.
#!/usr/bin/python # -*- coding: utf8 -*- # mehmet.yilmaz@teknomerkez.net a=raw_input("Ondalık (decimal) sayıyı giriniz: ") a=int(a) # girilen degeri sayiya ceviriyoruz f="" # kalanlari toplayacagimiz degiskene (bos) deger atiyoruz print "Girdiğiniz sayı: ", a # girilen sayi gosteriliyor while a>0: # 0'a ulasincaya kadar bolme islemi yapilacak b=a/2 # girilen sayi 2'ye bolunup b degiskenine ataniyor print "2'ye bölünen değer: ", b c=b+b # farki bulmak icin girilen sayiya ulasilmaya calisiliyor print "2'ye bölünen sayının sonuçları toplandı: ", c d=a-c # fark bulunuyor print "kalan: ", d # cikan fark gosteriliyor e=str(d) # fark sayidan karaktere cevriliyor a=b # bolum girilen sayi olarak ataniyor f=e+f # kalanlar bir araya getiriliyor print "kalanlar: ", f # kalanlar gosteriliyor print "İkilik (Binary) Sayı: ", f
Önce girilen sayı 2'ye bölünüyor. Kalanı bulmak için bölüm kendisi ile toplanıyor ve girilen sayıdan çıkarılarak kalan bulunuyor. İşlem ilerledikçe kalanlar tersinden biriktiriliyor. İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Program sadeleştirilmiş olarak yazılacak olursa:
#!/usr/bin/python # -*- coding: utf8 -*- # mehmet.yilmaz@teknomerkez.net a=raw_input("Ondalık (decimal) sayıyı giriniz: ") a=int(a) f="" while a>0: b=a/2 c=b+b d=a-c e=str(d) a=b f=e+f print "İkilik (binary) sayı: ", f
İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız.
İkilik (binary) sayıyı ondalık (decimal) sayıya çevirmek
Bir ikilik sayının yazılışının her hanesini 2'nin kuvveti (üssü) ile çarparak ondalık sayı elde edilir. Örnek:
1101 = 1*23 + 1*22 + 0*21 + 1*20 1101 = 1*8 + 1*4 + 0*2 + 1*1 = 8 + 4 + 0 + 1 = 13Aynı işlem python ile de çok rahat yapılır:
#!/usr/bin/python # -*- coding: utf8 -*- # mehmet.yilmaz@teknomerkez.net sonu=0 a=raw_input("Binary (ikilik) sayıyı giriniz: ") b=len(a) say=b print "eleman sayısı: ",b print "liste halinde sayilar: ", a print "=== ISLEM BASI ===" for c in a: print "string değer: ", c print "integer değer: ", int(c) say=say-1 print "2'nin üssü olarak carpilacak: ", say print "2'nin üssü ile carpilan: ", 2**say son=int(c)*2**say print "son: ",son sonu=sonu+son print "gelinen sonuç: ",sonu print "------" print "=== ISLEM SONU ===" print "Decimal (onluk) deger: ",sonu
İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Programda sadeleştirme yapılacak olunursa:
#!/usr/bin/python # -*- coding: utf8 -*- # mehmet.yilmaz@teknomerkez.net sonu=0 a=raw_input("Binary (ikilik) sayıyı giriniz: ") b=len(a) say=b for c in a: say=say-1 son=int(c)*2**say sonu=sonu+son print "Decimal (onluk) deger: ",sonu
İşlemin sonucunu görmek için tıklayınız. Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Burada verilen örnek programda binary dışında sayı girilgiğinde işlem yapmaktadır. Bu durum aslında bir hatalı çalışma şeklidir ve çalışmasında hata vardır. Bilgilendirme amaçlı olması ve kısaca izah yapılması amaçlandığından bu hata gözardı edilmiştir. Programın kendisinde ise bu hata düzeltilmiştir.
Diğer çevrimler:
Diğer çevrimler kodlarla basit olarak yapıldığından sadece kaynak kodları verilecek, ayrıntısına girilmeyecektir.
Ondalık (decimal) sayıyı onaltılık (hexadecimal) sayıya çevirmek:
#!/usr/bin/python # -*- coding: utf8 -*- a=raw_input("Lütfen decimal sayı giriniz: ") b=hex(int(a)) print "Hexadecimal sayı: ", b
İşlemin sonucu:
>>> Decimal (ondalık) sayı giriniz: 13 Hexadecimal (onaltılık) sayı: 0xd >>> >>> Decimal (ondalık) sayı giriniz: 13 Hexadecimal (onaltılık) sayı: 0xd >>>
Programın şıkıştırılmış dosyasını indirmek için tıklayınız.
Onaltılık (hexadecimal) sayıyı ondalık (decimal) sayıya çevirmek:
#!/usr/bin/python # -*- coding: utf8 -*- a=raw_input("Hexadecimal (onaltılık) sayı giriniz: ") b=int(a, base=16) print "Ondalık (decimal) sayı: ", b
İşlemin sonucu:
>>> Hexadecimal (onaltılık) sayı giriniz: d Ondalık (decimal) sayı: 13 >>>
Programın şıkıştırılmış dosyasını indirmek için tıklayınız.
Onaltılık (hexadecimal) sayıyı binary (ikilik) sayıya çevirmek:
Bu işlem, temel olarak onaltılık sayıyı onluk sayıya, çıkan onluk sonucu da ikilik sonuca çevirme işlemidir.
#!/usr/bin/python # -*- coding: utf8 -*- a=raw_input("Hexadecimal (onaltılık) sayıyı giriniz: ") a=int(a, base=16) f="" while a>0: b=a/2 c=b+b d=a-c e=str(d) a=b f=e+f print "İkilik (binary) sayı: ", f
İşlemin sonucu:
>>> Hexadecimal (onaltılık) sayıyı giriniz: d İkilik (binary) sayı: 1101 >>>
Programın şıkıştırılmış dosyasını indirmek için tıklayınız.
Binary (ikilik) sayıyı onaltılık (hexadecimal) sayıya çevirmek:
Bu işlemi temel olarak şöyle gerçekleştiriyoruz. Önce ikilik sayıyı onluk sayıya çeviriyor, çıkan onluk sonucu onaltılık sayıya çeviriyoruz.
#!/usr/bin/python # -*- coding: utf8 -*- sonu=0 a=raw_input("Binary (ikilik) sayıyı giriniz: ") b=len(a) # eleman sayisini buluyoruz say=b # eleman sayisi for c in a: say=say-1 sonu=sonu+(int(c)*(2**say)) sonuc=hex(sonu) print "Hexadecimal (onaltılık) değer: ",sonucİşlemin sonucu:
>>> Binary (ikilik) sayıyı giriniz: 1101 Hexadecimal (onaltılık) değer: 0xd >>>
Programın şıkıştırılmış dosyasını indirmek için tıklayınız. Burada verilen örnekte yine Binary'den Decimale çevrimde olan hata oluşmakta, programda binary dışında sayı girilgiğinde işlem yapmaktadır. Bu durum aslında bir hatalı çalışma şeklidir ve çalışmasında hata vardır. Bilgilendirme amaçlı olması ve kısaca izah yapılması amaçlandığından bu hata gözardı edilmiştir. Programın kendisinde ise bu hata düzeltilmiştir.
Programın tasarımı ve inşası:
Buraya kadar anlatılanlar, temel Python işlemleri olarak programın parçalarını oluşturmaktadır. Bu parçalar birleştirilerek ve bir bütün olarak kullanıma hazır hale getirilmiştir. Arayüz için Python ile tümleşik olarak gelen Tkinter'i kullanılmıştır. Sade, kullanışlı ve anlatım açısından yeterli olmasına özen gösterilmiştir. Program hem Linux, hem de Windows işletim sistemlerinde hiç bir değişiklik yapmadan çalışmaktadır. Windows'ta çalışırken arka planda konsolun ayrı bir pencere olarak görünmemesi için programın adındaki "sayicevir.py" olan uzantısı "sayicevir.pyw" olarak değiştirilmelidir.
Resim 1: Programın çalışmasından bir görüntü.
Programa ait kod dosyasını sıkıştırılmış dosya olarak indirmek için tıklayınız.
Devrenin Programı:
#!/usr/bin/python # -*- coding: utf8 -*- # mehmet.yilmaz@teknomerkez.net import sys from Tkinter import * def hakkinda(): ekranyazi.set("Hazırlayan: mehmet.yilmaz@teknomerkez.net") ekran.config(textvariable=ekranyazi, font=("bold", 10), bg="#004040", fg="white", justify=CENTER) gekran.config(text="", font=("normal", 8)) def yardim(): ekranyazi.set("Yardım için www.teknomerkez.net sitesine bakınız") ekran.config(textvariable=ekranyazi, font=("bold", 10), bg="#004040", fg="white", justify=CENTER) gekran.config(text="", font=("normal", 8)) def yeni(): ekranyazi.set("Yeni bir sayıyı çevirmek için hazır") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="#004040", fg="white", justify=CENTER) girisyazi.set("") giris.config(textvariable=girisyazi, font=("bold", 14), bg="white", fg="black", justify=RIGHT) gekran.config(text="", font=("normal", 8)) def decbin(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor a=int(a) f="" while a>0: b=a/2 c=b+b d=a-c e=str(d) a=b f=e+f ekranyazi.set(f) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Decimal'den Binary'e", font=("normal", 8)) def bindec(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor uyari="hatayok" sonu=0 sonu2="" b=len(a) # eleman sayisini buluyoruz if b==0: ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) else: for d in a: dd=int(d) if dd>1: uyari="hata" if dd<2 and uyari<>"hata": b=b-1 sonu=sonu+(int(d)*(2**b)) sonu2=str(sonu) if uyari=="hata": ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) else: ekranyazi.set(sonu2) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Binary'den Decimal'e", font=("normal", 8)) def dechex(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor b=hex(int(a)) ekranyazi.set(b) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Decimal'den Hexadecimal'e", font=("normal", 8)) def hexdec(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor b=int(a, base=16) ekranyazi.set(b) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Hexadecimal'den Decimal'e", font=("normal", 8)) def binhex(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor uyari="hatayok" sonu=0 sonu2="" b=len(a) # eleman sayisini buluyoruz if b==0: ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) else: for d in a: dd=int(d) if dd>1: uyari="hata" if dd<2 and uyari<>"hata": b=b-1 sonu=sonu+(int(d)*(2**b)) sonuc=str(hex(sonu)) if uyari=="hata": ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) else: ekranyazi.set(sonuc) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Binary'den Hexadecimal'e", font=("normal", 8)) def hexbin(): try: # sayi girilmisse (hata incelemesi yapiliyor, hata yoksa) a=giris.get() # kutulardaki bilgiler çagriliyor a=int(a, base=16) f="" while a>0: b=a/2 c=b+b d=a-c e=str(d) a=b f=e+f ekranyazi.set(f) ekran.config(textvariable=ekranyazi, font=("bold", 18), bg="#004040", fg="red", justify=CENTER) except: #sayi disinda karakter girilmis ve islem yapılamıyorsa ekranyazi.set("Hatalı giriş yaptınız, kontrol ediniz!") ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="red", fg="white", justify=CENTER) gekran.config(text="Hexadecimal'den Binary'e", font=("normal", 8)) pencere=Tk() pencere.title("Sayı sistemlerini birbirine çevirici") # pencere basligi pencere.geometry("400x200") # pencere boyutlari ekranyazi=StringVar() girisyazi=StringVar() # Ekran (islem sonuclarinin ve uyarılarin kullaniciya aktarildigi alan) ekranvarsayilan="Yeni bir sayıyı çevirmek için hazır" ekranyazi.set(ekranvarsayilan) ekran=Entry() ekran.config(textvariable=ekranyazi, font=("bold", 12), bg="#004040", fg="white", justify=CENTER) ekran.place(x=10,y=10,width=380,height=40) # gorev ekrani gekran=Label() gekran.config(text="", font=("normal", 8)) gekran.place(x=10, y=110) # sayi girisi giris=Entry() giris.config(font=("bold", 14), bg="white", fg="black", justify=RIGHT) giris.place(x=10,y=60,width=200, heigh=35) # islem yapma amacli dugmeler Button(text="Yeni", command=yeni, font=("bold", 10)).place(x=190, y=160, width=80, height=30) Button(text="Dec/Bin", command=decbin, font=("bold", 10), bg="#E1F2F7").place(x=230, y=60, width=80, height=30) Button(text="Bin/Dec", command=bindec, font=("bold", 10), bg="#E1F2F7").place(x=310, y=60, width=80, height=30) Button(text="Dec/Hex", command=dechex, font=("bold", 10), bg="#E1F2F7").place(x=230, y=93, width=80, height=30) Button(text="Hex/Dec", command=hexdec, font=("bold", 10), bg="#E1F2F7").place(x=310, y=93, width=80, height=30) Button(text="Hex/Bin", command=hexbin, font=("bold", 10), bg="#E1F2F7").place(x=230, y=125, width=80, height=30) Button(text="Bin/Hex", command=binhex, font=("bold", 10), bg="#E1F2F7").place(x=310, y=125, width=80, height=30) # Bilgilendirme amacli dugmeler Button(text="Hakkında", command=hakkinda, font=("bold", 10)).place(x=10, y=160, width=80, height=30) Button(text="Yardım", command=yardim, font=("bold", 10)).place(x=100, y=160, width=80, height=30) Button(text="Çıkış", command=sys.exit, font=("bold", 12), bg="#FFCCFF").place(x=330, y=160, width=60, height=30) pencere.mainloop()
Yorumlarınız
sizin gibi duyarlı arkadaşlara çok ihtiyacımız var sağ olunuz.
Bir yorum ekleyin
İzin verilen html etiketler (tag): <p><div><b><strong><i><u><del><hr><sup><sub><br>