Sayfalar

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++

No comments:

Post a Comment