17 Ağustos 2015

C++'ta İki Değişkenin Değerini Birbirine Atamak

Yazdığınız programlarda bazen iki değişkenin değerini birbirine atamanız gerekebilir. Bunun için kullandığınız dilde özel fonksiyonlar olabileceği gibi daha temel bazı işlemlerle de karşılıklı değer değiştirme gerçekleştirilebilir.

Yazı yeni başlayanları hedeflediği için durumu olabildiğince basit ifade etmeye çalışacağım. İki bardağınız olduğunu varsayın, birinde çay diğerinde kahve var. Ama siz çay olan bardakta kahve, kahve olan bardaktaysa çay olmasını istiyorsunuz. Çünkü siz bunu isteyebilecek türde bir insansınız :)

Bunu gerçekleştirmek için hemen aklınıza geçici üçüncü bir bardak kullanma fikri gelecektir sanırım. Üçüncü bardağa çayı döküp boşalan çay bardağına kahveyi koyup sonrasında da üçüncü bardaktaki çayı boşalan kahve bardağına doldurduğunuzda amacınıza ulaşmış olacaksınız sizin de göreceğiniz üzere. Artık çay olan bardakta kahve, kahve olan bardakta çay var. Ama ya üçüncü bardağımız yoksa ya da üçüncü bardağı kirletmek istemiyorsak?

Çay, kahve ve iki bardak sadece problemi kafanızda canlandırabilmeniz içindi. Gerçek dünyada bilgisayardaki kadar serbest olamayacağımız için anlatacağım yöntemler işe yaramayacaktır çoğunlukla.

Şimdi sayıları kullanalım. Elimizde a ve b isminde iki değişkenimiz olsun, a=5 ve b=7 değerlerini taşısın. Programımızdaki nihai amacımıza ulaşmak için de a'nın değerini b'ye, b'nin değerini de a'ya atamamız gerektiğini düşünelim, yani a=7 ve b=5 olmalı. Bunu yapmak için C++'ta ne gibi yöntemler olduğuna bakalım.

Üçüncü Değişken Kullanımı
Bu değerleri takas etmek için en basit yoldur. Bu yöntemde üç değişken kullanılır, ikisi değerleri değiştirilecek değişkenler, üçüncüsüyse bu işlemi gerçekleştirmek için bize yardımcı olacak geçici değişkendir.

Şimdi bu yöntemi C++'ta nasıl uygulayabileceğimize bakalım:
int a=5; // a'nın değeri 5
int b=7; // b'nin değeri 7
int gecici=0; //gecici'nin değeri 0
gecici=a; // gecici'nin değeri a
a=b; // a'nın değeri 7
b=gecici; // b'nin değeri 5

İki Değişken ve Toplama/Çıkarma İşlemi Kullanımı
Bu yöntemde takas işlemi için yalnızca iki değişken kullanacağız ama iki değişkenli yönteme geçmeden önce yöntemin daha iyi anlaşılması için üç değişken kullanalım.

a, b, c isminde üç değişkenimiz olsun. c, a ve b'nin toplamını tutsun, yani c=a+b olsun. Eğer c'den a'yı çıkartırsanız b'yi, eğer c'den b'yi çıkartırsanız a'yı elde edersiniz. Nasıl olduğuna bakalım:
Eğer c=a+b ise
c-a=(a+b)-a=b veya basitçe c-a=b
ve c-b=(a+b)-b=a veya basitçe c-b=a

Sayısal değerler vererek daha iyi anlaşılmasını sağlayalım:
Eğer a=5, b=7 olursa c=a+b=12
sonra c-a = 12-5=7
ve c-b=12-7=5

Şimdi bunun için bir C++ kod parçacığı yazalım:
int a=5, b=7, c=0;
c=a+b; // c=5+7=12
a=c-a; // a=12-5=7
b=c-b; // b=12-7=5

Yukarıdaki kod kolayca iki değişken kullanılarak da yazılabilir, burada üçüncü bir değişken kullanımına gerek yoktur:
int a=5, b=7;
a=a+b; // a=5+7=12
b=a-b; // b=12-7=5
a=a-b; // a=12-5=7

İki Değişken ve Çarpma/Bölme İşlemi Kullanımı
Bu yöntem yukarıdakine benzer, tek fark toplama ve çıkarma işlemi yerine çarpma ve bölme işleminin kullanılıyor oluşudur.
int a=5, b=7;
a=a*b; // a=5*7=35
b=a/b; // b=35/7=5
a=a/b; // a=35/5=7

Unutmayın ki bu yöntem çok güvenilir değildir çünkü değerlerini değiştirmek istediğiniz değişkenlerin çarpımı kullandığınız veri tipinin üst sınırını aşarsa takas işleminin doğru şekilde yapılması mümkün olmayacaktır. Ayrıca sayılardan biri 0 ise de bu yöntem düzgün çalışmayacaktır.

İki Değişken ve XOR İşlemi Kullanımı
Bu yöntem sizin için epey karmaşık görünebilir ama eğer XOR ikilik işlemi hakkında biraz bilginiz varsa yöntemin çok basit olduğunu göreceksiniz.

Bu konuda eğer bilginiz yoksa kısa bir kitap başvurusu veya Google araştırması size yardımcı olacaktır. Bool Cebrine de göz atmak isteyebilirsiniz ayrıca.

Yine a, b ve c isminde üç değişkenimiz olsun. a ve b kendi değerlerini, c ise a ve b'nin XOR'lanması sonunda elde edilen sonucu tutsun.
c = a XOR b olsun
eğer a'yı c ile XOR'larsanız b'yi elde edersiniz
eğer b'yi c ile XOR'larsanız a'yı elde edersiniz

Nasıl olduğuna daha yakından bakalım:
eğer c = a XOR b ise
c XOR a = (a XOR b) XOR a = b veya basitçe c XOR a = b
ve c XOR b = (a XOR b) XOR b = a veya basitçe c XOR b = a

Şimdi sayısal değerler verip daha iyi anlaşılmasını sağlayalım:
eğer a=5, b=7 ise c=a XOR b = 3 (5=0101, 7=0110 => 0011)
sonra c XOR a = 3 XOR 5 = 7 (0011 XOR 0101 => 0110)
ve c XOR b = 3 XOR 7 = 5 (0011 XOR 0110 => 0101)
Şimdi bunun için yalnızca iki değişken kullanarak C++ karşılığını yazalım:
int a=5, b=7;
a=a^b; // a=5^7=3
b=a^b; // b=3^7=5
a=a^b; // a=3^5=7
Sizin için yeteri kadar havalı değilse bir de şöyle deneyebilirsiniz:
int a=5, b=7;
a^=b;
b^=a;
a^=b;
Bu yöntemi kullanmanın da pek harika bir fikir olmadığına dair bir şeyler okumak isterseniz XOR swap algorithm maddesine bakabilirsiniz.

Standart Kütüphane Kullanımı
Daha üst seviye bir şeyler arıyorsanız standart kütüphanenin sunduğu swap() fonksiyonunu da kullanabilirsiniz:
int a = 5, b = 7;
std::swap(a,b);

Kaynaklar

26 Temmuz 2015

Yazmaya Geri Dönmek

Yazmayınca dünyanın sonunun gelmediğini görüp anlayınca yazmayı bıraktım epeydir ama Ağustos sonunda tekrar günlüğe yazmaya başlayacağım. Belki eskisi kadar uzun ve sık sık değil ama az da olsa yazmamak da sıkıyor bir noktadan sonra. Yani ilk kez günlüğe başlamamdaki motivasyonum yine yazmaya iten beni.

Bazı arkadaşlar birkaç soru sormuştu e-posta ve anlık iletişim programlarıyla, onlar da biraz daha uygun zamanda cevaplamak istememin sonucu olarak uzun zamandır cevapsız kaldı, onları da en azından Eylül sonu gibi cevaplayacağım umarım.

Bu arada çeşitli gerekli gereksiz çevrimiçi serviste daha hesap açtım akıllı telefona geçmemle. Facebook, Instagram, Ask.fm, Periscope... Buralarda da ne yapıyor ne ediyor diye bakmanız gerekiyorsa artık bakabilirsiniz.

Bu kadar yeter bir geri döneceğim yazısı için.