Değişken Kavramı

20Ara2011

Merhaba arkadaşlar,

İnsanlar için hafızanın önemi yadsınamaz bir gerçek. Biz onunla bilir, onunla farkında olur, onunla analiz yapar, özetle onunla yaşarız.

Fakat hayatta hafızadan mahrum olan insanlar da vardır tabi.

Leonard Shelby, karısı öldükten sonra tüm hayatını karısını öldüren adamı bulup ondan intikam almaya adar. Yalnız katili belirleme aşamasında büyük bir zorlukla karşı karşıyadır. Leonard nadir görülen ve tedavisi olmayan kısa süreli hafıza kaybı hastalığına yakalanmıştır. 15 dakikalık hafızaya sahiptir O. Eğer uzun cümleler kurarsa cümlenin başını unutabilecek kadar hastadır hatta. Buna rağmen adalet arayışı sonucu çözümü de bulmuştur. Hayatını vücuduna dövme şeklinde yaptığı ve ufak kağıtlara  aldığı notlara göre yaşamaktadır. Hafıza defteri (Memento) isimli film de adını Leonard'ın notlarından almaktadır.

Aklınızda tutamadığınız her bilgi, Leonard gibi vücudunuza veya bir kağıt parçasına yazmıyorsanız eğer, yok olmaya mahkumdur..

Bir deney..

Size şuan aklınızdan bir sayı tutun ve daha sonra da tuttuğunuz sayı ile 8'i toplayın ve bana sonucu söyleyin desem ne yaparsınız? Önce aklınızda tuttuğunuz sayıyı alır yanına 8'i koyarak toplama işlemini yapar ve sonucu söylersiniz değil mi?

Gelin bu işin detaylarına inelim..

Sayı tutun dediğimde ilk yaptığınız işlem onu unutmamak için ekstra bir konsantrasyonla sayının hafızanızda yer etmesini sağlamak oldu. Eğer böyle bir çabanız olmasaydı bilgi boşlukta yok olup gidecekti. Bu tıpkı enfes bir tabloyu duvara asmanıza benzer. Eğer duvarda çivi yoksa güzelim tablo yere düşecektir. Dolayısıyla öncelikle duvara bir çivi çakmalı ve sonrasında da tabloyu asmalısınız. Bilgiyi de hafızanızdan düşmesini engelleyecek şekilde aklınıza çivilemelisiniz.

Bilgisayarlar.. İnsanı, onun akıl yapısını, hayatını kendine model alırak onu taklit ederler.. Dolayısıyla yukarıdaki senaryo bilgisayarlar için de geçerlidir.

Dikkat!.. Can alıcı nokta!

O halde ileride programımda kullanacağım sayı veya değerleri bilgisayarın hafızasına yerleştirebilirsem balık hafızalı programlar yerine çok ciddi projeler yazabilirim.

Peki bunu nasıl yaparım?

"Saklamak" sihirli kelime..

Karşılaştığımız bu sorunun çözümü yazılımdaki değişken kavramında gizlidir. Değişkenin kısa bir tanımını yapacak olursak önümüzdeki sis bulutu biraz daha aralanmış olacaktır. Değişkenler, programlarımızda kullanıcıdan aldığımız veya program içinde bizim ürettiğimiz değerlerin yok olmasının önüne geçer. Değişkenler bizim değerlerimizi saklayan kutular gibidir. Onlara ihtiyacımız olduğunda yanlarına gider, değeri alır veya içine değer koyar programımıza kaldığı yerden devam ederiz.

Peki değişkenleri nasıl tanımlayabiliriz?

Size matematikten bir örnekle bunu açıklayamaya çalışacağım ve ne kadar kolay olduğunu göreceksiniz..

Gelin matematikteki çok basit bazı kuralları hatırlayalım..

Şuan matematikten konuşuyoruz. Size bir soru sorsam, elimde bir x değişkeni var ve ben ona 2 değerini vermek istiyorum desem bunu nasıl ifade edersiniz? "x = 2" olarak değil mi? Kesinlikle!

Bakın C#'ta da değer tanımlaması aynen bu şekilde yapılır. Soldaki değişken eşitliğin sağındaki değeri alır ve yoluna devam eder.

Bu bilgiden sonra ilk değişken tanımlamamızı yapalım.

string mesaj = "Merhaba";

Bunun anlamı şudur: aynen matematikteki gibi isim değişkeni "Merhaba!" ya  eşittir. Buraya kadar herhangi bir sorun yok sanırım.

Yalnız aklınıza mesaj değişkeninin önüne yazılmış olan string ifadesi takılmış olabilir. Bu ifade değişkenin tipini göstermektedir. Hemen açıklayalım..

Öncelikle bir kaç soru..

1.       Adınız soyadınız nedir?
2.       Yaşınız?
3.       Aylık kazancınız?
4.       Üniversite mezunu musunuz?

C#'ta bilgiler işlerimizi kolaylaştırmak için farklı veri tipleri ile saklanır. Örneğin ad ve soyad bilgisi alfanümerik yani metinsel, yaşınız ise nümerik bir bilgidir dolayısıyla farklı bir tip ile değeri saklanır. Aylık kazanç bilgisi ise parasal olduğundan bu veri tipi de para birimi ile ilgili değişken tipinde tutulur. Son sorunun da cevabı yalnızca doğru veya yanlış olabilen özel bir tür ile değeri tutulan bir veridir.

Önemli nokta.. Amaca göre değişken..

C#'ta farklı veri tiplerinin bulunmasının ana nedeni ihtiyaçların farklı farklı olmasıdır. İhtiyaçlar göz önünde bulundurularak her yazılımcının gereksinimini karşılayacak veri tipleri C# içerisine konmuştur.

Bu veri tipleri nelerdir?

Sayısal veri tipleri

1-      Tamsayılar;

byte : 0 - 255 arasında değerler alır. byte bir değişkene 255 üzerinde bir değer atamanız durumunda visual studio tarafında daha programınız derlenmeden hata alırsınız. Dikkat!
Değişken tiplerine alabileceği kadar değerler vermek yazacağınız programın sorunsuz çalışmasına katkı sağlayacaktır.
Bu tip ile hangi veriler saklarım? Ayakkabı numarası, insanın yaşı vs bilgiler için byte veri tipi biçilmiş kaftandır.
RAM yönetimi açısından da byte veri tipinin sadece 8 bit yer kapladığını söylemek yararlı olacaktır. Dolayısıyla byte ile degerini saklayabileceğiniz bir değişkeni daha büyük değerleri de alabilen int gibi bir veri tipinde tutmak RAM'de daha fazla yeri işgal etmenize neden olacaktır. Bu, yarım litre suyu 1 litrelik kova (burada byte oluyor) yerine 4 litrelik kovada (bu da int veri tipidir) muhafaza etmek gibi oluyor. Dolayısıyla bu durum kovanın koyulan yerde de daha fazla yer kaplamasına neden olacaktır. Günümüz bilgisayarlarında RAM kapasitelerinin çok yüksek seviyelere getirildiğini biliyoruz.  Ancak buna rağmen RAM yönetimi konusunda olabildiğimiz kadar cimri davranmalıyız. Bu durum daha hızlı çalışan programlar olarak bize geri dönüş sağlayacaktır.

sbyte : byte veri tipinde negatif değerler tutmamız mümkün değildir. Örneğin -10 değerini bir değişkende tutmak isterseniz ne yaparsınız?
Bu ihtiyaç göz önünde bulundurulmuş ve negatif değerler de alabilen  'signed byte' (işaretli byte) veri tipi oluşturulmuştur. Bu veri tipinde saklayabileceğiniz değer aralığı  -128 ile +127 'dir.
RAM'de kapladığı yer de byte gibi 8 bit'tir.

short : Basit bir toplama işlemi yaptığınızı düşenelim. Sonuç ortalama olarak 1000 civarında çıkıyor. Bu toplam değerini hangi değişkende tutarız? Şuana kadar gördüğümüz byte ve sbyte kabul edersiniz ki bu konuda aciz kalıyor. Evet bu gibi 255'ten daha büyük değerler için short veri tipi imdadımıza yetişen bir kurtarıcı gibidir.
short veri tipi -32.768 ile 32.767 arasında değer alabilir.
RAM'de kapladığı alan 16 bit'tir.

ushort : Bazen negatif sayılar hesaplamalarınıza dahil olmayabilir. Siz yapacağınız işlemlerde sürekli pozitif sayılarla çalışacak olabilirsiniz. Bu durumda işaretsiz short (unsigned short) veri tipi hizmetinize sunulmuştur. Söz konusu veri tipi 0 ile 65.535'e kadar değerler alır.

int : Programlarımızın prensi olan ve sayısal veriler için en çok kullanılan veri tipidir. int veri tipi short'a göre daha büyük değerler alabiliyor olması sebebiyle programcılar tarafından tercih edilir. int -2.147.483.648 ile 2.147.483.647 arasında değerler alabilir.
RAM'de kapladığı alan 32 bit'tir.

uint : int veri tipinin işaretsiz hali (unsigned int) yani yalnızca pozitif sayılar için üretilmiş versiyonudur. Söz konusu veri tipi 0 ile 4.294.967.295 arasında değerler saklayabilir.

long : Çok çok büyük sayıları saklamak için kullanılır. long veri tipi -9.223.372.036.854.775.808 ile 9.223.372.036.854.775.807 arasında değerler alabilir.
RAM'de kapladığı alan 64 bit'tir.

ulong : long veri tipinin işaretsiz halidir. Sadece pozitif değerler alabilir. Alabileceği değer aralığı 0 ile 18.446.744.073.709.551.615 arasındadır.


2-      Ondalıklı Sayılar


double : İki sayıyı böldüğünüzü düşünelim, örneğin sonuç da '2,3' gibi bir değer çıktı. Bu değeri nasıl tutarım? Bu zamana kadar biz tamsayıları inceledik. Eğer bir tamsayı veri tipinde bu değeri tutmaya kalkışırsanız tamsayı veri tipi doğası gereği virgülden sonrasını almayacak ve bu değeri 2 olarak saklayacaktır. Bu durum da ince hesapların karışmasına neden olarak başınızı baya bi ağırtacaktır. Böyle bir eksiklik double türü ile giderilmiştir. Bu tip ondalıklı sayıları saklayabilmeniz için yaratılmıştır. Özellikle matematiksel işlemlerde, bölüm sonucu yansıtmak ve bunun benzeri işlerde sıklıkla kullanılan bir tiptir.
RAM'de 64 bit yer kaplar.

decimal : Hatırlarsanız veri tiplerine giriş yapmadan önce 4 soru sormuştum. Bunların 3.'sü maaşınızın ne kadar olduğu ile ilgiliydi. Bu tip soruları kullanıcıya yönelttikten sonra kullanıcının gireceği değeri decimal veri tipinde tutarsınız. Çünkü söz konusu veri tipi parasal değerler için özel olarak üretilmiştir. Özellikle bankalara ait programlarda bu veri tipi sıkça kullanılır.
RAM'de 128 bit yer kaplar.

float : double veri tipinden daha hassas davranır. Virgülden sonra daha çok basamak gösterir ve daha çok grafiksel işlemlerde kullanılır.
RAM'de kapaladığı alan 32 bit'tir.


Karaktersel veri tipleri


char : Bankalar açısından anne kızlık soyadının ilk harfi büyük önem taşımaktadır. Bankada çalışan görevliler çok işlemde bankaya müracat eden müşterilerine bu soruyu yöneltirler. Peki biz tek bir karakter saklamamız gerektiğinde hangi veri tipini kullanırız?
Şuana kadar gördüğümüz veri tiplerinin hepsi sayısaldı. Burada ise amacımız çok farklıdır. Bir karakter tutmak istediğinizde size yardımcı olacak veri tipi char'dır. İçinde bir harf yani karakter saklar.

string : Adınız, soyadınız, yaşadığınız şehir, mezun olduğunuz okullar, hobileriniz, vs. bilgiler tek bir karakterden ziyade karakterler bütünüdür. Böyle bir veri de ancak şuana kadar incelemediğimiz bir veri tipinde tutulabilir. Çünkü dikkat ederseniz saklayacağımız olan değer tek bir karakter yerine karakterler bütününden oluşmaktadır. Buradaki gereksinim yeni bir veri tipini ortaya çıkarmıştır. O da string anahtar kelimesi ile temsil edilir. Sayısız miktarda harf içerebilir, karaktersel veri tipleri içinde en çok kullanılan tiptir.


Mantıksal veri tipleri


bool : Arabanız var mı? İstanbul'da mı yaşıyorsunuz? Lise mezunu musunuz? Sigara kullanır mısınız? vs vs sorular çoğaltılabilir. Dikkat ederseniz bu soru cevaplarının iki ihtimali var. Karşı taraf bu soruları ya evet ya da hayır olarak yanıtlayacaktır. Böyle durumlarda bizim de evet veya hayır alabilen bir değişkene ihtiyacımız var değil mi? Kesinlikle!

bool veri tipinin ortaya çıkışında da bu ihtiyaç yatmaktadır arkadaşlar. Bu veri tipi true(doğru) ve false(yanlış) olarak iki değer alabilmektedir.


Sınıflama dışı bir veri tipi


object : Bazı sinema oyuncuları hakkında, her rolün oyuncusu gibi sözler duyarız. Hatta bazen futbolda veya diğer sporlarda da yaşanır bu, spor yorumcuları başarılı bir oyuncu için hangi mevkiye koyarsan koy en iyi şekilde oynar diye yorumlar yapar. Bahsi geçen oyuncular gerektiği yerlerde farklı kişiliklere bürünerek görevlerini en iyi şekilde yaparlar.
object veri tipi de aynen böyledir. Tüm değerlerin atası olarak da niteleyebileceğimiz bu tip içine her türden değeri alabilmektedir.
               
object ile birlikte yazımızın sonuna da iyice yaklaştık..

Sonuç olarak kullanıcıdan aldığım değerleri programımda kullanamıyorum veya programım içinde üretilen değerleri kaybediyorum diyorsanız bir hastalığa yakalandığınız kesin..

Yakalanmış olduğunuz hastalık yazılım dilinde "değişkensizlik sendromu" olarak adlandırılan bir vak'adır. C#'taki reçeteniz int, string, double vs türünden veri tiplerini kullanmak..

Bi doktordan tavsiye, program yazarken değişkenlerinizi yanınıza alın ve gerektiği yerde kullanmaktan sakınmayın..

Bir sonraki yazımızda görüşmek dileğiyle.

Sağlıklı günler..

2 yorum:

İbrahim KILIÇ 20 Aralık 2011 16:44  

Yine çok güzel bir makale olmuş Keyifle okudum. Emeğine ve ellerine sağlık. Yeni yazılarını beklemeye devam ediyorum.

İbrahim KILIÇ

Ertgrl_ISIK 21 Aralık 2011 01:25  

Kardeşim yorumların beni mutlu etmekle birlikte bu işe daha da motivasyonlu bir şekilde sarılmamı sağlıyor. Çok teşekkürler..

Yorum Gönder