Sayfalar

1/24/2011

İfadeler ve Komutlar (Bölüm - 1)

(Expressions and Statements)

Bir program, özünde, sırayla çalıştırılan bir komutlar bütünüdür. Bir programın gücü, belirli bir koşul doğru veya yanlış olarak gerçekleştiğinde belirli bir grup komutu çalıştırabilme becerisinden gelir.

Bu bölümde öğrenecekleriniz:
  • Komutlar nedir?
  • Bloklar nedir?
  • İfadeler nedir? 
Komutlar:
C++'da bir komut yürütmenin sırasını denetler, bir ifadeyi değerlendirir veya hiç bir şey yapmaz (boş komut). Tüm C++ komutları noktalı virgülle sonlanır, sadece noktalı virgülden ibaret olan boş komut da bu şekilde sonlanır. En genel komutlardan biri aşağıdaki atama komutudur:

x = a + b;

Cebirden farklı olarak bu komut x'in a+b'ye eşit olduğu anlamına gelmez. Bunun anlamı "a ve b'nin değerleri toplamını x'e ata" veya "x'e a+b'yi ata" şeklinde yorumlanmalıdır. Bu komut aynı anda iki iş yapıyor olsa da tek bir komuttur ve tek bir noktalı virgülü vardır. Atama operatörü eşit işaretinin sağındakini işaretin solundakine atar.

Boşluk (Aralık veya boş satır da denebilir)

Tab, ara boşluğu ve yeni satırlar genellikle komutlarda ihmal edilirler. Yukarıdaki atama komutu şu şekilde de yazılabilir ve hatalı değildir:

x =a
+ b ;

Boşluk kullanımı bir kodu daha okunur kılabileceği gibi yukarıdaki örnekte görüldüğü üzere tamamen karmaşık (fakat yine de hatalı olmayan) yazım örnekleri de üretebilir.

Bloklar ve Bileşik Komutlar

Güzel parantez ( { ) arasında yer alan tüm komutlar bir blok olarak değerlendirilir. Bir blok { ile başlar/açılır ve } ile biter/kapatılır.

{
temp = a;
a = b;
b = temp;
}

Bu blok tek bir komut olarak çalışır ve a ile b'nin değerlerini kendi aralarında değiştirir.

İfadeler

C++'ta bir değere tekabül eden her şey bir ifadedir. Yani bir ifade bir değer döndürmelidir. 3+2 ifadesi 5 değerini döndürür ve bu durumda bir ifadedir. Tüm ifadeler birer komuttur.

İfade olarak nitelendirilebilecek birçok kod parçacığı sizi şaşırtabilir. İşte bir kaç örnek:

3.2 ; //3.2 değerini döndürür.
PI ; //3.14 değerini döndüren float const değer.
SecondsPerMinute ; //60 değerini döndüren int const değer.

PI'nin 3,14'e eşit, SecondsPerMinute'in 60'a eşit birer sabit olduğunu varsayarsak bu üç komut da birer ifadedir.

x = a + b;

ifadesi sadece a ve b'yi toplayıp x'e atamaz, ayrıca bu atamanın sonucunu da (x'in değerini) döndürür.

Bu durumda bu komut da bir ifadedir. İfade olduğu için bir atama operatörünün sağ tarafında olabilir:

y = x = a + b;

Bu satır şu sırayla değerlendirilir: a'yı b'ye ekle.

a + b'nin sonucunu x'e ata.

x = a + b atama ifadesinin sonucunu y'ye ata.

a, b, x ve y'nin hepsi birer tam sayıysa ve a'nın değeri 2 ve b'nin değeri 5 ise, hem x'e hem de y'ye 7 değeri atanır.

Örnek: Karmaşık ifadelerin değerlendirilmesi

#include <iostream.h>
int main()
{
     int a=0, b=0, x=0, y=35; //Burada dört değişken tanımlanıp ilk atamalar yapılıyor
     cout << "a: " << a << " b: " << b; //a ve b'nin değerleri ekrana bastırılıyor
     cout << " x: " << x << " y: " << y << endl; //x ve y'nin değerleri ekrana bastırılıyor
     a = 9; //a'ya 9 değeri atanıyor
     b = 7; //b'ye 7 değeri atanıyor
     y = x = a+b; // a ve b toplanıp değeri x'e atanıyor.  
                         //x = a + b ifadesi bir değere karşılık geliyor ve bu değer de y'ye atanıyor.            
     cout << "a: " << a << " b: " << b; //a ve b'nin değerleri ekrana bastırılıyor
     cout << " x: " << x << " y: " << y << endl; //x ve y'nin değerleri ekrana bastırılıyor
     return 0;
}


Ekran Çıktısı: a: 0 b: 0 x: 0 y: 35
a: 9 b: 7 x: 16 y: 16

Operatörler

Bir operatör, derleyiciye işlem yapacağını bildiren bir simgedir. Operatörler terimler üzerinde işlem yapar ve C++ tüm terimler birer ifadedir. C++'da bir kaç farklı kategoride operatör bulunur. Bu kategorilerden iki tanesi

Atama operatörleri ve

Matematik operatörleridir.

Atama Operatörü

Atama operatörü (=), operatörün sağ tarafındaki değerin sol tarafındaki terime atanmasına sebep olur (yani kabaca söylemek gerekirse, sol taraftaki terime daha önceden bir değer verilmişse bu değer silinir, yerine yeni değer yazılır).

x = a + b;

yukarıdaki ifade a ve b toplamının sonucunda elde edilen değeri x terimine atar.

Atama operatörünün sol tarafına yazılmasında sakınca bulunmayan bir terime lvalue da denir (buradaki "l" harfi sol anlamına gelen "left"in ilk harfidir). Aynı şekilde operatörün sağ tarafındaki terime de rvalue (sağ kelimesinin ingilizcesi olan "right"ın ilk harfi) denir.

Sabitler rvalue tipindedir. Bunlar lvalue tipinde olamazlar, bundan ötürü

x = 35; // ok

yazabilirsiniz ancak

35 = x; // hata, bir lvalue değil!

yazamazsınız! çünkü 35 bir sabittir ve üzerine atama yapılmaz.

Matematik Operatörleri

Beş adet matematik operatörü vardır: toplama (+), çıkartma (-), çarpma (*), bölme (/) ve modülüs (%).

Toplama ve çıkartma işlemleri tahmin ettiğiniz üzere çalışır; fakat  unsigned integer tipindeki değerlerle yapılan çıkartma işlemlerinde sonuç negatif sayı verecekse (örneğin 3 - 5 işleminin sonucu -2'dir) süpriz sonuçlar ortaya çıkabilir.

Ayrıca bölme işlemlerinde 0'a bölme durumu belirsiz bir sonuç ürettiği için mutlaka kontrol edilmelidir. Yani bölen sayının 0'dan farklı bir değer olduğu kontrol edilmelidir ve 0 olduğu durumlarda işlem gerçekleştirilmemeli ve kullanıcı uyarılmalıdır.


Tam Sayı Bölme ve Modülüs

Tam sayı bölme işlemi gündelik yaşamda gerçekleştirdiğimiz bölme işleminden biraz faklıdır. 21'i 4'e böldüğünüzde elde edeceğiniz sayı ondalıklıdır. Tam sayıların ondalık kesirleri yoktur ve "kalan" değer kesilir, ihmal edilir. Dolayısıyla bu bölme işleminin sonucu tam sayı olarak 5'tir. Bu bölme işleminin kalanını elde etmek için modülüs (%) operatörünü kullanırsanız sonuç 1 olur. Yani 21 / 4'ün sonucu 5 iken, 21 % 5'in sonucu 1'dir. Modülü operatörü bir tam sayı bölme işlemi sonucunun kalan değerini verir.

Kalan hesabı her 10'uncu işlemde mesaj bastırmak istediğinizde faydalı olabilir. Sadece 10 ve 10'un katları olan sayılar 10'a tam olarak bölünebildiğinden bunların kalanları 0'dır. Bu durumda bir sayının 10'a bölündüğünde kalanını elde etmek için modülüs operatörü 0 döndürdüğünde 10. (veya 10'un katı olan) işlem bulunmuş olur. Bu özelliği daha sonra loop (çevrimlerde) işlemlerinde kullanacağız.

int x = 10;
int kalan = x % 10;
if (kalan == 0)
    printf("x, 10'a tam bolunebilir");

Bölüm 1'in sonu.

12/24/2010

Değişkenler ve Sabitler

(Variables and constants)

Programların kullanacakları verileri depolayabilecekleri araçlara ihtiyacı vardır. Değişkenler ve sabitler bu verileri sunmak ve üzerlerinde değişiklik yapabilmek için çeşitli yöntemler sunar.


Bu yazımda değişkenleri ve sabitlerin nasıl deklare edileceğini ve tanımlanacağını, bunlara nasıl değer atanacağını ve bu değerlerin nasıl kullanılacağını, bir değişkenin değerinin ekrana nasıl bastırılacağını anlatacağım.


Değişken Nedir?
C++'ta bir değişken tanımladığınızda derleyiciye bunun ne tür bir değişken olduğunu belirtmelisiniz: tam sayı, karakter ve benzeri. Bu bilgi derleyicinin ne kadar alan ayıracağını ve bu değişkene ne tür bir değer atanabileceğini belirler.


Hafızanın her birimi bir bit büyüklüğündedir. Oluşturduğunuz değişken iki bit boyutundaysa hafızadan iki birim alana ihtiyaç duyar. Değişkenin türü derleyiciye hafızadan ne kadar alan ayırması gerektiğini anlatır.


Bilgisayarlar değerleri göstermek için bitler ve baytlar kullandığından ötürü ve hafıza da bayt olarak ölçüldüğünden bu kavramları anlayıp bunlara aşina olmanız önemlidir. Bunu daha iyi anlamak için "C++ Anahtar Kelimeleri" sekmesine (Keywords) bakınız.


Tam Sayılar
Bir bilgisayarda her tür değişkenin değişmeksizin kaplayacağı alan bellidir. Tam sayı değişkeninin kapladığı alan bir bilgisayarda iki bayt iken başka birinde dört bayt olabilir (32bit - 64bit farkından dolayı olabilir) fakat bu tam sayı değişken aynı makinada her zaman aynı alanı kaplayacaktır.


Bir char değişkeni (karakterler için kullanılır) genellikle bir bayt uzunluğundadır. short değişkeni çoğu bilgisayarda iki bayttır, long dört bayttır. int (short veya long anahtar kelimeleri kullanılmaksızın) iki veya dört bayt olabilir.


Aşağıdaki programı kullanarak bilgisayarınızdaki değişkenlerin boyutlarını öğrenebilirsiniz:


1: #include
2:
3: int main()
4: {
5: cout << "Bir int degiskenin boyutu:\t\t" << sizeof(int) << " bayt.\n";
6: cout << "Bir short int degiskenin boyutu:\t" << sizeof(short) << " bayt.\n";
7: cout << "Bir long int degiskenin boyutu:\t" << sizeof(long) << " bayt.\n";
8: cout << "Bir char degiskenin boyutu:\t\t" << sizeof(char) << " bayt.\n";
9: cout << "Bir float degiskenin boyutu:\t\t" << sizeof(float) << " bayt.\n";
10: cout << "Bir double degiskenin boyutu:\t" << sizeof(double) << " bayt.\n";
11:
12: return 0;
13: }

Output: Bir int degiskenin boyutu: 2 bayt.
Bir short int degiskenin boyutu: 2 bayt.
Bir long degiskenin boyutu: 4 bayt.
Bir char degiskenin boyutu: 1 bayt.
Bir float degiskenin boyutu: 4 bayt.
Bir double degiskenin boyutu: 8 bayt.

NOT: Bilgisayarınızda gösterilen bayt değerleri farklılı olabilir.

Temel Değişken Türleri
C++ içerisinde tanımlanmış çeşitli değişkenler vardır. Bunlar tam sayı değişkenler, kayan noktalı değişkenler ve karakter değişkenlerdir.

Kayan noktalı değişkenler kesirli olarak ifade edilen değerlere - yani gerçek sayı değerlerine sahip olurlar. Karakter değişkenleri tek bir bayt büyüklüğünde olup 256 ASCII karakter ve simgesi ve genişletilmiş ASCII karakter setleri için kullanılırlar.


Değişken Türleri
Boyut ve Alabileceği Değerler
unsigned short int
2 bayt  0 ila 65,535
short int
2 bayt  -32,768 ila 32,767
unsigned long int
4 bayt  0 ila 4,294,967,295
long int
4 bayt  -2,147,483,648 ila 2,147,483,647
int (16 bit)
2 bayt  -32,768 ila 32,767
int (32 bit)
4 bayt  -2,147,483,648 ila 2,147,483,647
unsigned int (16 bit)
2 bayt  0 ila 65,535
unsigned int (32 bit)
2 bayt  0 ila 4,294,967,295
char
1 bayt  256 karakter değeri
float
 4 bayt  1.2e-38 ila 3.4e38
double
8 bayt  2.2e-308 ila 1.8e308


Değişken Tanımlama
Bir değişkeni önce tipini sonra bir boşluk koyup değişlen adını yazıp noktalı virgülle sonlandırmak suretiyle oluşturursunuz. Değişken adı herhangi bir harf-rakam kombinasyonu olabilir ancak başlangıç karakteri rakam olamaz, içerisinde boşluk olamaz. Örneğin: x, x1, ogreniadi, ogrenci_yasi, not, dogumTarihi. İyi tanımlanmış değişken adları değişkenlerin kullanım amacını yansıtır; adlandırmayı ne kadar iyi yaparsanız program akışınızın anlaşılması o kadar kolaylaşır.

Aşağıdaki ifade dogumTarihim adında bir tam sayı değişkeni tanımlar:

int dogumTarihim;

Genel programlama alışkanlığı adına J23qrsnf gibi korkunç adları asla veya amacını anlatmayan x1, x2, x3 gibi değişkenleri zorda kalmadıkça kullanmayın. Amacını anlatan değişlenler kullanamaya çalışın, örneğin dogumTarihim veya kacAdet gibi. Bu gibi adlar kodun üzerinden aylar geçtikten sonra geri dönüp baktığınızda o satırda ne yapmak üzere olduğunuzu anlatmakta fayda sağlayacaktır.

Aşağıda iki kod parçası vereceğim, bu kodların amacının ne olduğunu anlamaya çalışın:

Kod 1
main()
{
unsigned short x;
unsigned short y;
ULONG z;
z = x * y;
}

Kod 2
main ()
{
unsigned short Genislik;
unsigned short Uzunluk;
unsigned short Alan;
Alan = Genislik * Uzunluk;
}

Şimdi karar verin, hangi kod daha anlaşılır?


Büyük-Küçük Harf Duyarlılığı
C++ büyük-küçük harflere duyarlıdır. Yani dogumTarihim ile DogumTarihim farklı değişkenlerdir.

Adlandırma yaparken kullanılabilecek çeşitli standartlar mevcuttur (Camel, Hungarian...) ancak önemli olan bunu tüm programınız genelinde aynı şekilde kullanabilmektir. Bu tutarlılığı ne kadar iyi sağlarsanız programınızın okunurluğu o kadar artar.

Birden Fazla Değişkenin Aynı Anda Oluşturulması
unsigned int myAge, myWeight; // iki unsigned int değişken
long area, width, length; // üç long değişken

Değişkenlere Değer Atama
Önce değişkeni tanımlayıp daha sonra = operatörüyle değeri atayabilirsiniz;

unsigned short Width;
Width = 5;


ya da ikisini aynı anda yapabilirsiniz.
unsigned short Width = 5;

Hatta birden fazla değişkeni de bu şekilde tanımlayıp değer ataması yapabilirsiniz:
long genislik = 5, uzunluk = 7;

Karakter ataması da aşağıdaki şekilde yapılır.
char harfDegeri = 'A';

Burada dikkat edilecek husus tek tırnak (') simgesidir. Karakterler için tek tırnak, karakter dizileri için çift tırnak (") kullanılır. Bunu aklınızdan çıkarmayın.

Ayrıca C++'ın tanıdığı bazı özel karakterler vardır, bunlar biçimlendirme amaçlı kullanılırlar ve sola yatık bölü işaretinden sonra yazılarak kullanılırlar.

Bazıları aşağıdaki gibidir:


Karakter
Anlamı
\n
Yani satır
\t
Tab
\b
backspace
\"
çift tırnak
\'
tek tırnak
\?
soru işaret
\\
sola eğik çizgi

12/10/2010

C++’a Giriş – Bölüm 2

Geçen bölümde genel olarak programlama ve C++’a dair genel kavramlardan bahsetmiştim. Bu yazımda ise C++’a biraz daha fazla değineceğim.

ANSI C++
Amerikan Ulusal Standartları Enstitüsü (American National Standards - ANSI) C ve C++ dahil olmak üzere bir çok programlama dili için “resmi” ve genel olarak kabul görmüş standart tanımları sunar. Sadece ANSI C++ ile yazılmış bir programın ANSI standartlarına uyan bir yazılıma sahip herhangi bir bilgisayarda çalışabileceği garantidir. Başka bir deyişle bu standart ANSI C++ programlarının taşınabilir olduğunu garanti eder. Uygulamada ise çoğu C++ sürümünde ANSI C++ çekirdekte yer almakla birlikte farklı bilgisayarların işletim sistemleriyle daha yumuşak bir etkileşimi olanaklı kılmak için makineye bağlı ilave özellikler bulunur. Makineye bağımlı bu özellikler tedbirli bir şekilde kullanılmalıdır. Hatta bir C++ programına ANSI standardına uymayan bir bileşen dahil edildiğinde bunlar açık bir şekilde işaretlenmeli ve mümkün olduğunca programın geri kalan kısmından ayrı tutulmalıdır, böylece farklı makineler ve işletim sistemleri için düzenleme yapmak daha kolaylaşır.

Örnek Program ve bir C++ Programının Ana Yapısı

// C++ derleyicisi, çift bölü işaretiyle başlayan
// kullanıcı yorumlarını satır sonuna kadar yok sayar.

/* Yorumlar bölü ve yıldız işaretiyle başlayıp
yıldız ve bölü işaretiyle bitecek şekilde de yazılabilir.
Burada da gördüğünüz üzere bu şekilde yazılan
Yorumlar birden fazla satıra yayılabilir.*/

/* Programlarda HER ZAMAN yeterli miktarda yorum-görüş bulunmalıdır */

/* Yazar: Rob Miller and William Knottenbelt
Son Değişiklik : 30 Eylül 2001 */

/* Turkcelestiren: Evren Daglioglu */

/*Bu program, kullanıcıdan hangi yılda olduğumuzu,
yaşını ve başka bir yıl girmesini ister. Daha sonra
kullanıcının ikinci girilen yılda hangi yaşta olacağını(oldugunu)
hesaplar. */

#include

using namespace std;

int main()
{
    int year_now, age_now, another_year, another_age;
   cout << "Hangi yilda oldugunuzu girin ve RETURN tusuna basin.\n"; 
   cin >> year_now;
 
   cout << "Kac yasinda oldugunuzu girin.\n"; 
   cin >> age_now;

    cout << "Kac yasinda oldugunuzu ogrenmek istediginiz yili girin.\n"; 
    cin >> another_year;

    another_age = another_year - (year_now - age_now);

    if (another_age >= 0)
   {
        cout << another_year << "yilindaki yasiniz" << ": "; 
        cout << another_age << "\n"; 
    }
   else 
   { 
        cout << another_year;
        cout << "yilinda daha dogmamissiniz!" << "!\n"; 
   } 
    
   return 0; 
}

Bu program tüm C++ programlarının genel bazı özelliklerini göstermektedir. Bir bildirimle başlar (Yorum ve görüşlerin hemen altında ). 


#include

Bu bildirime “include” (dahil etme) direktifi denir. Derleyiciye ve bağlayıcıya, klavyeden yapılan girişleri ve ekrana yapılacak çıkışları (özellikle daha sonra kullanacağımız cin ve cout bildirimlerini ) idare eden yordam (routine) kütüphanelerinin programla ilişkilendirileceğini bildirir. “iostream” başlık dosyasında bu kütüphaneyle ilgili temel bilgiler bulunur. Kod kütüphaneleriyle ilgili ileride daha detaylı bilgi verilecektir.

Bu dahil etme direktifinden sonra:

using namespace std;

satırı gelir. Bu bildirime “using” (kullanma) direktifi denir. C++ standaardının en son sürümleri adları (örneğin cin ve cout) namespace (ad alanları) denen alt alanlara ayırmıştır. Bu “using” direktifi programın “std” ad alanında kendileri için tamınlanmış anlama sahip adları kullanacağını ifade eder (bizim örneğimizde iostream başlığı std ad alanında cout ve cin’in anlamlarını tanımlar).

Bazı C++ derleyicilerinde daha ad alanı desteği yoktur. Bu durumda “include” direktifinin eski biçimini kullanabilirsiniz (“using” direktifini gerektirmez ve tüm adları tek bir global ad alanında toplar):

#include


Bu eski tarz başlıklarla karşılaşma olasılığınız yüksektir (özellikle eskiden yazılmış kodlarda).

Programımız kısa olduğu için tek bir program bildirimi ve komutları listesi halinde kolayca paketlenir. İnclude ve using direktiflerinden sonra programın temel yapısı şu şekildedir:
 

int main()
{
İlk bildirim;
...
...
Son bildirim;

return 0;
}

Tüm C++ programları bu temel “üst seviye” yapıya sahiptir. Program ne kadar karmaşık veya büyük olursa olsun en tepede bu yapı vardır. Programın gövdesindeki her bir bildirimin noktalı virgülle sonlandırıldığında dikkat edin. İyi tasarlanmış büyük bir programda bu bildirimlerin çoğunda alt programlara referanslar veya çağrılar bulunur; bu alt programlar ana programın arkasına eklenmiş veya ayrı bir dosyaya dahil edilmiştir. Bu alt programlar buradaki programla kabaca aynı çerçeveye sahiptir ancak sadece bir tane “main” adlı yapı vardır. Alt programlar ileride detaylı olarak anlatılacaktır.

Ana (main) programın sonunda

return 0;

satırı bulunur, bu “programın başarılı bir şekilde tamamlandığını bildirmek için bilgisayarın işletim sistemine 0 değerini döndür” anlamına gelir. Genel olarak söylemek gerekirse “return” bildirimi belirli bir alt programın sonlandığını-tamamlandığını bildirir ve kontrol akışına paralel olarak programın bir üst seviyesine bir değer döndürür. Bu da ileride detaylı olarak anlatılacaktır.

Örnek programımızda dört adet değişken kullanılmaktadır:

year_now, age_now, another_year ve another_age

Program değişkenleri matematikteki değişkenler gibi değildir. Bunlar daha çok program çalışırken farklı zamanlarda farklı değerleri muhafaza etmekte kullanılan “bilgisayar hafızası gruplarını” temsil eden sembolik adlardır. Bu değişkenler programımızda ilk olarak değişken deklerasyonunda sunulmuştur:

int year_now, age_now, another_year, another_age;


Bu deklerasyon, programın sonraki yürütülmesi sırasında “int” (tam sayı) tipinde dört adet değişkeni muhafaza edebilmesi için yeterli hafızayı ayırması maksadıyla derleyiciyi bilgilendirir. Bu sebeple değişkenler bir programda her zaman kullanılmadan önce deklare edilmelidir. Bir programda veya alt programda kullanılacak tüm değişkenlerin en başta deklare edilmesi iyi programcılık-uygulama olarak kabul edilir. Değişkenler C++’taki çeşitli farklı tiplerden biri olabilir. Değişkenler ve tipleri ileride detaylı olarak anlatılacaktır.

Çok basitçe Giriş, Çıkış ve Atamalar
Yukarıdaki programı derlendikten sonra çalıştırabiliriz. Sonuç aşağıdaki gibi olacaktır:

Hangi yilda oldugunuzu girin ve RETURN tusuna basin.
2010
Kac yasinda oldugunuzu girin.
36
Kac yasinda oldugunuzu ogrenmek istediginiz yili girin.
2015
2001 yilindaki yasiniz: 41

Yukarıdaki birinci, üçüncü, beşinci ve yedinci satırlar program tarafında ekranda oluşturulur. Genel olarak aşağıdaki program bildiriminin:

cout << Expression1 << Expression2 << ... << ExpressionN; 


ekrandaki görünümü şu şekilde olur: 

Expression1Expression2...ExpressionN 

Bu bildirimi şu şekilde yaparsak: 

cout << Expression1; 
cout << Expression2;
... 
... 
cout << ExpressionN; 

yine aynı çıktıyı elde ederiz. Çıktı yapılan ifadelerin arasında boşluk veya ara satıra ihtiyaç varsa “ “ (tırnak arası bir boşluk) veya “\n” (boş satır) ibaresi kullanılarak dahil edilirler. endl ifadesi de yeni satır için kullanılır ve birçok durumda kullanımı “\n” yerine tercih edilir. Örnek ekran çıktısındaki kalın yazılmış rakamlar kullanıcı tarafından girilmiştir. Bu durumda kullanıcı “2015” yazıp RETURN tuşuna bastıktan sonra aşağıdaki program bildirimi 

cin >> year_now;

year_now değişkenine 2015 değerinin atanmasıyla sonuçlanır. 


Programlarda atama bildirimleri de bulunur, basit bir örnek vermek gerekirse

another_age = another_year - (year_now - age_now);

ifadesinde = işareti “değerini ata” anlamına gelir. (C++’ta “Eşitlik” == (çift eşit) ile temsil edilir)

Basit Kontrol Akışı
Örnek programımızın (“return 0” haricindeki) diğer satırları aşağıdaki gibiydi:
 

if (another_age >= 0) 
{    cout << another_year << "yilindaki yasiniz"<< ": "; 
    cout << another_age << "\n"; 

else 

    cout << another_year; 
    cout << "yilinda daha dogmamissiniz!" << "!\n"; 


“if ... else ...” dallanma mekanizması bir çok prosedürel programlama dilinden tanıdık bir yapıdır. C++’ta basitçe if bildirimi olarak anılır ve genel sentaksı aşağıdaki gibidir: 

if (koşul) 

    Statement1; 
    ... 
    ... 
    StatementN; 
}
else 

    StatementN+1; 
    ... 
    ... 
    StatementN+M; 
}


Burada mantıksal olarak kurulan yapı şu şekilde çalışır: koşul gerçekleşmişse içeri gir, gerçekleşmemişse bir sonraki koşula bak veya varsa “else” bölümüne gir. Yukarıdaki örnekte ikinci bir koşul tanımlı olmadığı ve “else” bölümü olduğu için ikinci kısıma girer. Bir “if bildiriminin” “else” kısmı yok sayılabilir ve hatta “if” sonrasında sadece bir bildirim olacaksa aşağıdaki gibi de yazılabilir: 

if (condition) 
    Statement; 


“if bildirimlerinin” bir programda aşağıdaki gibi kullanımı da oldukça yaygındır: 

... 
... 
if (total_test_score < 50) 
    cout << "Başarısızsınız. Daha çok çalışmalısınız.\n"; 
else if (total_test_score < 65) 
    cout << "Testten kılpayı geçtiniz.\n"; 
else if (total_test_score < 80) 
    cout << "Oldukça iyisiniz.\n"; 
else if (total_test_score < 95) 
    cout << "Puanınız mükemmel. Aferin.\n"; 
else 

    cout << "Kopya çektiniz!\n"; 
    total_test_score = 0; 

... 
... 


Yukarıdaki örnekte de görüldüğü üzere arka arkaya bir sürü koşul eklenebilmektedir. Bu kadar uzun bir bildirimde hem okunabilirliği artırmak hem de derleyicinin istediğimiz gibi davranmasını sağlamak için süslü ayraç kullanılabilir. 

Temel Program Yazma Tarzına Dair Uyarılar  

C++ derleyicisi söz konusu olduğu müddetçe aşağıdaki program ilk başta verilen programla tam aynı programdır. 

#include using namespace std; int main()
{ int year_now, age_now, another_year, another_age; cout << "Hangi yilda oldugunuzu girin ve RETURN tusuna basin.\n"; cin >> year_now; cout
<< "Kac yasinda oldugunuzu girin.\n"; cin >> age_now; cout << "Kac yasinda oldugunuzu ogrenmek istediginiz yili girin.\n"; cin >>
another_year; another_age = another_year - (year_now - age_now); if
(another_age >= 0) { cout << another_year << "yilindaki yasiniz"<< ": ";
cout << another_age << "\n"; } else { cout <<
another_year ; cout << “yilinda daha dogmamissiniz”<< "!\n"; } return
0; }


Ancak programlama yorumlarının, boşluklar, yeni satırlar ve girintilerin bulunmaması bu programı kabul edilemez kılar. Programları düzgün bir şekilde düzenlemek için iyi bir programlama tarı geliştirmekten daha fazlası vardır, ancak bu yine de iyi bir başlangıçtır. Program yerleşiminizi tutarlı kılın ve yaptığınız girintilerin ve bıraktığınız boşlukların programın mantıksal yapısını yansıttığından emin olun. Ayrıca değişkenlere anlamlı isimler varmak her zaman için bir fikirdir: "year_now", "age_now", "another_year " ve "another__age " gibi ifadeler y_n", "a_n", "a_y" ve "a_a" ifadelerinden daha iyidir ve hatta "w", "x", "y" ve "z" gibi ifadelerden çok daha iyidir. Unutmayın programlarınızda ileride başka bir programcı tarafından değişiklik yapılması gerekebilir. Ne kadar anlaşılır olursanız program mantığı o kadar kolay anlaşılır.

Özet
Bu ve öncesindeki yazımda değişkenler ve türleri, giriş ve çıkış, atama ve koşul bildirimlerini (if bildirimleri) gördük. Sonraki bölümlerde bunların her birini daha detaylı olarak anlatmaya çalışacağım.

Bir sonraki yazımda görüşmek üzere iyi çalışmalar



Referanslar:
1) Introducing C++

12/09/2010

C++’a Giriş – Merhaba Dünya!

Programlama veya başka bir tabirle program yazma, bir veya daha fazla görevi veya problem çözme işlemini bir bilgisayar yardımıyla yerine getirme sürecinin esas faaliyetidir.

Fakat işler bu tanım kadar basit değildir. Özellikle problem çözümüne dair şartlar ve koşullar bilgisayara konuşma lisanıyla iletilememektedir. Dahası sadece problemin veya görevin tanımına ilave olarak söz konusu problemin nasıl çözüleceğine veya görevin nasıl icra edileceğine dair bilgileri de içermelidir. İşte bu sebeple programlama dillerine ihtiyaç vardır.



Problem Tanımı
Bir sayının asal sayı olup olmadığının belirlenmesi
Algoritma
 x'i gir
1 ile x arasında yer alan her bir z sayısı için
x, z’ye bölündüğünde artan sayı kalıyorsa (yani tam olarak bölünemiyorsa) “asal değil” ibaresini ekrana bas ve dur

böyle bir rakam bulunamadıysa “asal sayı” ibaresini ekrana bas ve dur
Yüksek seviyeli yapısal programlama dili
#include <iostream>
using namespace std;
int main() {
  int x;
  cout << "bir sayı girin:\n";
  cin >> x;
  for (int z = 2; z<x; z++) 
    if (x % z == 0) {
       cout << "asal sayı değil\n";
       return 0;
    }
  cout << "asal sayı\n";
  return 0;
}
Basit makine nesne kodu
İkilik düzende makine talimatları (kısmi)
Uygulama
İkilik düzende makine talimatları (tam)


Piyada mevcut bir sürü farklı programlama dili ve bunları sınıflandırmak için çeşitli yöntemler bulunmaktadır. Örneğin “yüksek seviye” programlama dilleri sentaksı doğal dile görece yakın olanlarken “düşük seviyeli” diller bilgisayın 1 ve 0’larına bir çok referans içerirler. “Bildirimsel” diller (“prosedürel” dillerin tersine) bilgisayarın bir problemi nasıl çözeceğine veya belirli bir çıktının nasıl üretileceğine dair olarak programcının katkısını asgari düzeyde tutmasını sağlar. “Nesne yönelimli diller” ilgili “nesnelerin” davranışını belirlemek ve tanımlamak suretiyle problemler ve görevlerin nasıl düşünüleceğine dair belirgin bir yaklaşımı yansıtır. Smalltalk saf nesne yönelimli dile bir örnektir. C++’ta nesne yönelimli programlama için imkanlar bulunduğu gibi daha geleneksel prosedürel programlama için imkanlar da vardır.

C++’ın Kökenleri

C++ (Türkçe okunuşu: c artı artı, İngilizce okunuşu: si plas plas), Bell Labotaruvarlarından Bjarne Stroustrup tarafından 1979 yılından itibaren geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir. İlk olarak C With Classes (Sınıflarla C) olarak adlandırılmış, 1983 yılında ismi C++ olarak değiştirilmiştir.
Genel olarak her C programı aynı zamanda bir C++ programıdır, ancak her C++ programı bir C programı değildir.

Örnek Program 

# include
using namespace std;

int main ()
{
      cout << "!!Merhaba Dunya!!" << endl;
      return 0;
}
 

Buraya kadar C++'dan ziyade programlamaya dair genel konulardan ve çok kısaca C++'ın geçmişinden bahsettim. Son olarak C++'ın geleneksel hale gelmiş "Hellor World" programını verdim. Bir sonraki yazımda bir C++ programının genel yapısından ve bölümlerinden bahsedeceğim.

İyi çalışmalar.

Bu bölümün devamı için tıklayınız.

Referanslar:
1) Introducing C++
2) Introduction for use
3) C++ (Wikipedia)

12/08/2010

Neden C++?

Microsoft .NET teknolojilerinin ağırlığının tüm haşmetiyle hissedildiği bir dönemde bazı insanlar neden hala C++ diyorlar? C# ve VB.Net'in kolay kullanılabilirliği yetmiyor mu?

Özellikle .Net teknolojileri ortaya çıktıktan sonra kendini programcı sayanların miktarında ciddi bir artış olduğu kaçınılmaz bir gerçek. Ayrıca .Net pazarını ortaya koyduğunuzda bu pazardan ekmek yemek isteyecek çok insan çıkacaktır. Fakat buna rağmen .net'in nüfuz edemediği alanlar mevcut ve bu alanlarda hala C++ at koşturuyor. (en azından şimdilik).

Bu girizgahtan sonra gelelim C++'a. C++, diğer programlama dilleriyle kıyaslandığında karakteristik özelliklere sahiptir. Bunlardan bazıları:

Nesne Tabanlı (Nesne yönelimli) programlama
Programlamayı nesne yönelimli yapmak programcının uygulamasını yapısal bir koddan ziyade nesneler arasında iletişim kurma şeklinde tasarlayabilmesine olanak tanır. İlave olarak kodun daha mantıksal ve üretken bir biçimde tekrar kullanılabilmesini (code reuseability) sağlar.

Taşınabilirlik
Aynı C++ kodunu neredey her tür bilgisayarda ve işletim sisteminde herhangi bir değişiklik yapmadan derleyebilirsiniz. C++, dünyada en çok kullanılan ve taşınmış programlama dilidir.

Modüler Programlama
C++’ta bir uygulamanın gövdesi birden fazla kaynak kodu dosyasına ayrılıp ayrı ayrı derlenip daha sonra ilişkilendirilebilir. Küçük bir değişiklik yapıldığında tüm uygulamayı baştan derlemek yerine sadece değişikliği içeren dosyayı derlemek zaman tasarrufu sağlar. Ayrıca, bu özellik C++ kodunun Assembler veya C gibi dillerle üretilmiş kodlarla ilişkilendirilebilmesine de olanak sağlar.

C Uyumluluğu
C++, C diliyle geri dönük olarak uyumludur. C’de yazılmış herhangi bir kod, bir değişiklik yapılmaksızın C++ programına dahil edilebilir.

Hız
C++ hem yüksek seviyeli hem de düşük seviyeli bir dil sayılabildiğinden hem de dilin kendisinin düşük boyutu C++ derlemesi sonucu elde edilecek kodun çok efektif olmasını sağlar.

 Yukarıdaki avantajlar bir web sayfasından alıntıdır ve söz konusu bilgi 2009 tarihlidir. Microsoft .NET'i ve dolayısıyla C# ve VB.Net'i geliştirmek için inanılmaz çaba harcıyor. Sonuç olarak da bu diller ile C++ arasındaki boşluk oldukça hızlı bir şekilde kapanıyor. Fakat bu demek değildir ki biri iyidir diğeri de kötüdür. Artık günümüzde nasıl herkes anadilinden başka en az iki lisan bilmeli diyorsak bir programcının da portföyünde birden fazla programlama dili bulunmalıdır. Özellikle c++ ve c# bir arada kullanıldığında ortaya çıkan sonuç inanılmaz derece başarılı olabilmektedir.

Örneğin .Net'in remoting kütüphanelerini kullanarak kuracağınız bir iletişim altyapısı üzerine kurgulayacağınız bir c++ uygulamasını tek başınıza oldukça kısa sürede ortaya çıkartabilirsiniz.

Ayrıca kendi deneyimlerimden biliyorum, önce C++ öğrendiğinizde C#'ı inanılmaz kısa sürede öğrenebiliyorsunuz fakat tam tersi geçerli değil.

Bunların haricinde bir de işin parasal yönü var. Piyasada veya şirketlerde C++ ile yazılmış geçmişten gelen o kadar çok sistem ve uygulama var ki, bunların tekrar baştan yazılması maliyetler nedeniyle mümkün değil. Herkesin C# bildiğini iddia ettiği bir dönemde C++ da öğrenip sürüden ayrılmak, farklılaşmak kesinlikle size bir artı değer katacaktır.

Bu yola gireceklere şimdiden başarılar diliyorum, herkese iyi çalışmalar.


referanslar (ingilizce):
1) Why C++
2) A brief description
3) C++ in the Real World: Advice from the Trenches
4) Why C++ Remains Relevant