Programlamanın temellerinden olan C++ üzerine başlattığımız makalelere yeni bir bölüm ile devam ediyoruz. Bu makalemizde "Fonksiyonlar", "Fonksiyn Araçları", "Deklarasyon", "Değişken Atama" gibi birçok konuyu işleyeceğiz.
Not: C++ ile ilgili 31 adet örnek çalışmayı Program Arşivimizden indirebilirsiniz.
FONKSİYONLAR
Bir fonksiyon birkaç tane Program ifadesini tekbirim içinde gruplar ve buna bir isim verir. Bu birim daha sonra programın diğer bölümleri tarafından çağrılabilir. Fonksiyonları kullanmanın en önemli sebebi bir programın kavramsal olarak düzenlenmesine yardımcı olmaktadır.
Fonksiyon kullanmanın diğer bir sebebi fonksiyonlar programın boyutunu küçültmeleridir. Bir program içinde birden fazla yerde ortaya çıkan herhangi bir komut dizisi fonksiyon içine alınmaya adaydır. Fonksiyon program boyunca pek çok kere çalıştırılıyor olsa bile fonksiyonun kodu bellekte tek bir yerde saklanır.
Basit Fonksiyonlar
Şimdi basit fonksiyonlar konusunu basit bir program üzerinde inceleyerek anlatalım. Fonksiyonumuzun ismi TABLE ve programın listesi şöyledir:
// table.cpp // basit bir fonksiyon #include <iostream.h> #include <conio.h>
void starline(); // fonksiyonun deklare edilmesi
void main() { clrscr(); starline(); // fonksiyonun cagrilmasi cout << " ~~Bilgisayar data Bilgileri~~ " << endl; starline(); cout <<"Char -128 to 127" << endl <<"Short -32,768 to 32,767" << endl <<"Int Sisteme bagli " << endl <<"Long -2,147,483,648 to 2,147,483,647" << endl; starline(); // fonksiyona cagri getch(); } // Fonksiyon burada yaziliyor
void starline() { for(int j=0; j<40; j++) cout<<"*"; cout<<endl; }
Program çıktısı şöyledir
******************************************** Bilgisayar Data Bilgileri ******************************************** char -128 to 127 short -32,768 to 32,767 int system dependent long -2,147,483,648 to 2,147,483,647 ********************************************
Bu program iki fonksiyondan oluşur : main() ve starline(). Bir fonksiyonu programa dahil etmek için üç tane bileşen vardır : fonksiyon deklarasyonu, fonksiyona yapılan çağrılar ve fonksiyonun tanımı.
Fonksiyonun Deklare Edilmesi
Nasıl ki bir değişkeni derleyiciye bildirmeden kullanamıyorsunuz. Bunu yapmanın iki yolu vardır biri fonksiyonu çağrılmadan önce deklare etmektir. Diğeri çağrılmadan önce tanımlamaktır. Biz şimdi çağrılmadan önce deklare edeceğiz. TABLE programında starline() fonksiyonu şu satırda deklare edilir:
void starline();
Bu deklarasyon derleyiciye daha sonraki bir noktada starline isminde bir fonksiyon sunmayı planladığımızı anlatır. Void anahtar kelimesi fonksiyonun döndürdüğü bir değer olmadığını, boş parantezler ise argüman almadığını belirtir. Fonksiyon deklarasyonu noktalı virgülle sona erdiğine dikkat edin. Bu kendi başına komple bir ifadedir.
Fonksiyonun deklarasyonuna ayrıca prototip de denir,çünkü fonksiyon deklarasyonları fonksiyonların bir modelini veya taslağını sunar. Fonksiyon deklarasyonları derleyiciye,”Program içinde buna benzer bir fonksiyon birazdan ortaya çıkacak, bu nedenle,fonksiyonun kendisini görmeden onunla ilgili referansları görürsen bir problem yok” derler. Deklarasyonda kullanılan bilgiler (fonksiyondan dönen değerin tipi ve argümanların tipi ve sayısı) kimi zaman fonksiyonun imzası olarak adlandırılır.
Fonksiyonu Çağırmak
Fonksiyon main()’den üç kez çağrılır. Bu üç çağrının her biri şu şekilde görünür:
Starline();
Fonksiyonu çağırmak için yapmamız gereken işin hepsi bu kadar: Fonksiyon ismi ve peşinden gelen bir çift parantez. Çağrının söz dizimi, fonksiyon deklarasyonunda kullanılan ifade ile aynıdır; tek bir fark vardır, çağrıda fonksiyondan dönen değer yer almaz. Çağrı noktalı virgül ile sona erer. Çağrı ifadesini çalıştırmak fonksiyonu çalıştırmak demektir; yani kontrol fonksiyona geçer,fonksiyonun tanımındaki ifadeler çalıştırılır, sonra kontrol fonksiyon çağrısını takip eden ifadeye geri döner.
Fonksiyonun Tanımı
Nihayet fonksiyonun kendisine gelebildik. Buna fonksiyonun tanımı denir. Tanım fonksiyonun asıl kodunu içerir.starline()’tanımı şöyledir:
Void starline() //deklarator { for(int j=0; j<45;j++) // fonksiyonun gövdesi cout<<”*”; cout<<endl; }
Tanım deklaratör olarak adlandırılan bir satırdan ve bunu takip eden fonksiyon gövdesinden ibarettir. Fonksiyon gövdesi küme parantezleriyle sınırlandırılmış fonksiyonu oluşturan ifadelerden meydana gelir.
Deklaratör deklarasyonla uyuşmak zorundadır: Aynı fonksiyon ismini kullanmalı,aynı tiple ve aynı sırada argüman içermeli ve döndürdüğü değer aynı tipte olmalıdır.
Deklaratörün noktalı virgül ile sona ermediğine dikkat edin. Bir fonksiyon çağrıldığında kontrol fonksiyon gövdesindeki ilk ifadeye aktarılır.sonra fonksiyon gövdesindeki diğer ifadeler çalıştırılır. Kapanan parantez ile karşılaşınca kontrol, fonksiyonu çağıran programa geri döner.
Deklarasyondan Kurtulmak
Bir fonksiyonu bir program içine yerleştirmek için ikinci bir yaklaşım,fonksiyon deklarasyonunu kaldırmak ve fonksiyon tanımını program listesi içinde fonksiyona yapılan ilk çağrıdan önce yerleştirmektir.
Deklarasyonu ortadan kaldırdığından dolayı,kısa programlar için bu yaklaşım daha basit olabilir,fakat daha az esnekti. Birkaç taneden fazla fonksiyon olduğunda,bu tekniği kullanmak için programcının fonksiyonları düzenleme işine hatırı sayılır ölçüde emek vermesi gerekir. Öyle ki,her fonksiyon kendisini çağıran diğer fonksiyonlardan önce yer almalıdır. Kimi zaman bu imkansızdır. Ayrıca birçok programcı main()’i program listesinde en başa yerleştirmeyi tercih eder, çünkü program çalışmaya bu noktadan başlar.
Sabitleri Aktarmak
Örnek olarak son örnekteki starline() fonksiyonunun çok katlı olduğuna karar verdiğimizi varsayalım. Her zaman 45 yıldız basan bir fonksiyon yerine ,herhangi bir karakteri herhangi sayıda basacak bir fonksiyon istiyoruz. İşte bu fonksiyonu şu şekilde gösterebiliriz ;
//basit.cpp #include<iostream.h> #include<conio.h> void repchar(char,int); // fonksiyon deklarasyonu void main() { clrscr(); repchar('-',43); //fonksiyon cout << "Bilgisayar Data Bilgileri " << endl; repchar('=',23); cout <<"char -128 to 127" << endl <<"short -32,768 to 32,767" << endl <<"int Sisteme bagli" << endl <<"long -2,147,483,648 to 2,147,483,647" << endl; repchar('-',43); // fonksiyona cagri getch(); } // fonksiyon tanimi void repchar(char ch,int n) //fonksiyon deklaratoru { for(int j=0;j<n;j++) cout<<ch; //fonksiyon govdesi cout<<endl; }
Bu fonksiyonda gireceğimiz değerleri char ve int olarak belirledikten sonra istediğimiz yerde tek satırda ne kadar ve ne nasıl bir char değeri gireceğimizi yazdırabileceğimiz bir programı gösterdik. Programın çıktısı şöyle olurdu:
------------------------------------------- Bilgisayar Data Bilgileri ======================= char -128 to 127 short -32,768 to 32,767 int system dependent long -2,147,483,648 to 2,147,483,647 -------------------------------------------
Fonksiyon tanımındaki deklaratör bu parametrelerin hem veri tiplerini hem de isimlerini açıkça belirtir:
void repchar(char ch,int n);
Değişkenleri Aktarmak
Burada bir önümüzdeki örnekten farklı olan şey şudur kullanıcıya kaç tane ve nasıl bir karakter girmesi gerekeceğini siz sorduruyorsunuz. Bunu örnekte gösterelim:
// sira.cpp #include <iostream.h> #include<conio.h>
void repchar(char,int); // fonksiyon deklarasyonu
int main() { char chin; int nin; clrscr(); cout << "Bir Karakter Giriniz: "; cin >> chin; cout << "Kac kere tekrarlamak istediginizi giriniz: "; cin >> nin; cout << endl << endl; repchar(chin,nin); // fonksiyona cagri getch(); return 0; } //repchar() //fonksiyon tanimi void repchar(char ch,int n) // fonksiyon deklaratoru { for (int j=0;j<n;j++) // fonksiyon govdesi cout << ch; cout << endl; }
Deklarasyonda Yer alan İsimler
Bunu bir örnekle anlatabiliriz:
Void display_point(int,int); //deklarasyon
Fakat daha iyi bir yaklaşım şöyle olur:
Void display_point(inthoriz,intvert); //deklarasyon
Bu iki deklarasyon derleyiciye tam olarak aynı şeyi ifade eder. Ancak ilk yaklaşımda (int,int) ifadesi hangi argümanın düşey hangi argümanın yatay koordinat için olduğunu söylememektedir.İkinci programın avantajı programcı için daha avantajlı olmasıdır.
Fonksiyonlardan Değer Döndürmek
Bir fonksiyon çağrısını tamamladıktan sonra kendisini çağıran programa tek bir değer döndürebilir.Genellikle döndürülen bu değer,fonksiyonun çözdüğü problemin cevabını içerir Bunu pound ağırlık birimini kilograma çeviren bir programla inceleyelim:
//convert.cpp //poundu kilograma cevirir #include<iostream.h> #include<conio.h>
float Ibstokg(float); //deklarasyon
int main() { float Ibs,kgs; clrscr(); cout<< endl << "Agirligini pound degeri olarak gir: "; cin>>Ibs; kgs=Ibstokg(Ibs); cout<< "Senin agirligin " << kgs << " kilogram." << endl; getch(); return 0; } //Ibstokg() //poundu kilograma ceviriyor
float Ibstokg(float pounds) { float kilograms=0.453592*pounds; return kilograms; }
Bir fonksiyon değer döndürecekse, bu değerin veri tipi açıkça belirtilmelidir. Fonksiyon deklarasyonu bunu, veri tipini fonksiyon deklarasyonunda ve tanımında fonksiyon isminden önce yerleştirerek gerçekleştirilir. Önceki program örneklerindeki fonksiyonlar bir değer döndürmüyordu; bu nedenle döndürülen değer tipi için void kullanılmıştı bu programda Ibstokg() fonksiyonu float tipinde bir değer döndürür. Dolayısıyla, fonksiyon deklarasyonu şu şekilde olur:
Float Ibstokg(float); Birinci float döndürülen değerin tipini belirtir. Parantez içindeki float ise ibstokg()’a aktarılacak argümanın tipinin be float olduğunu ifade eder.
Return ifadesi
Ibsto kg() fonksiyonuna pound cinsinden bir ağırlığı simgeleyen bir argüman aktarılır ve bu değer pounds parametresinde saklanır. Fonksiyon pound değerini bir sabit ile çarparak kilogram cinsinden karşılık gelen ağırlığı hesaplar; sonuç kilograms değişkeninde saklanır. Bu değişkenin değeri sonra, fonksiyonu çağıran programa bir return ifadesi,kullanılarak döndürülür:
Dikkat ederseniz hem main()’de hem de Ibstokg()’da değişkenini saklamak için bir yer mevcuttur:main()içinde kgs ve Ibstokg()içinde kilograms. Fonksiyon döndüğü zaman kilograms içindeki değer kgs içine kopyalanır . Fonksiyonu çağıran program, fonksiyonun içindeki kilograms değişkenine erişmez; sadece değişkenin değeri döndürülür.
Bir fonksiyona birçok argüman aktarılabilirken,fonksiyondan sadece tek bir değer döner. Daha fazla bilgi döndürmeniz gerektiğinde bu bir kısıtlamadır. Bununla birlikte fonksiyonlardan birden fazla değişken döndürmenin başka yöntemleri de vardır.
Bir fonksiyonun döndürdüğü tipi fonksiyon deklarasyonuna her zaman dahil etmeniz gerekir. Eğer fonksiyon bir değer döndürmüyorsa,bunu belirtmek için void anahtar kelimesini kullanın. Eğer fonksiyon deklarasyonunda döndürülen değerin tipini kullanmazsanız,derleyici fonksiyonun bir int döndürdüğünü varsayar.
Gereksiz Değişkenlerden Kurtulmak
Convert programı anlaşılırlık amacıyla kullanılan ama gerçekten gerekli olmayan birkaç tane değişken içerir.
//convert.cpp //poundu kilograma cevirir #include<iostream.h> #include<conio.h>
float Ibstokg(float); //deklarasyon
int main() { float Ibs,kgs; clrscr(); cout<< endl << "Agirligini pound degeri olarak gir: "; cin>>Ibs; kgs=Ibstokg(Ibs); cout<< "Senin agirligin " << kgs << " kilogram." << endl; getch(); return 0; } //Ibstokg() //poundu kilograma ceviriyor
float Ibstokg(float pounds) { float kilograms=0.453592*pounds; return kilograms; }
main()’de kgs değişkeni converts programından çıkartılır. Bunun yerine cout ifadesinin içine Ibstokg(9 fonksiyonu doğrudan eklenir
Ayrıca Ibstokg() fonksiyonunda kilograms değişkeni artık kullanılmaz
return 0.453592*pounds;
Hesaplama tamamlanır ve elde edilen sonuç,tıpkı bir değişkenin değerinde olduğu gibi, fonksiyonu çağıran programa döndürülür. Anlaşılırlık sağlama için programcılar genellikle return ifadesinde kullanılan deyimin etrafına parantez koyarlar: return (0.453592*pounds);
Fonksiyonun Yinelenmesi
Fonksiyonların varlığı,yinelenme olarak adlandırılan bir programlama tekniğini mümkün kılıyor. Yinelenme, bir fonksiyonun kendisini çağırmasıdır. Bu biraz olmayacak bir şey gibi gelebilir; üstelik yinelenen bir fonksiyon genellikle bir programlama hatasıdır. Yinede doğru kullanıldığında bu teknik şaşırtıcı ölçüde güçlü olabilir. Yineleme uzun açılamalardan çok bir örnekle daha iyi anlaşılır:
//faktor.cpp //yineleme kullanarak faktoriyel hesabi #include<iostream.h> #include<conio.h>
unsigned long factfunc(unsigned long); //deklarasyon
int main() { int n; unsigned long fact; clrscr(); cout << "integer bir sayi giriniz: "; cin >> n; fact=factfunc(n); cout << n << " sayisinin faktoriyeli " << fact << endl; getch(); return 0; } //factfunc() //faktoriyelleri hesaplamak icin kendi kendisini cagirir unsigned long factfunc(unsigned long n) { if(n>1) return ( n * factfunc(n-1)); //kendini cagirir else return 1; }
Burada fonksiyon yinelenmesi bölümünde girilen herhangi bir sayı kendisini bir azaltarak sürekli kendisiyle çarpar buda faktöriyelin tanımıdır. Yinelenen her fonksiyonda,yinelemeye son vermek için bir şart sağlamak zorundayız. Aksi takdirde fonksiyon sonsuza kadar kendisini çağırır ve programın çökmesine neden olur. Factfunc () fonksiyonundaki if ifadesi bu görevi görür; n,1 olduğunda yinelemeyi durdurur.
Yinelenen bir fonksiyon kendisini çağırırken,bunun birçok versiyonunun bellekte saklandığı doğru mu? Aslında değil. Her versiyonun değişkenleri bellekte saklanır,fakat fonksiyonun kodu tek kopyadır. Böyleyken bile defalarca kendi kendini çağıran (yinelenen) bir fonksiyon bellekte saklanan çok sayıda değişken üretebilir; sistemin hepsini saklayacak yeterli yeri yoksa bu durum sistem açısından problem oluşturabilir.
Faruk Alkaya Selçuk Üniversitesi - Teknik Eğitim Fakültesi
 |
C++ Dersleri9 Yazar fasuto53 açık 2006-08-03 15:16:58 Ben bu konuyu merak ediyorumrnrnprogramlama işini amaçok kısıtlı bilgilere sahibim. bunlar bu işi bilen lere göre komik sorular olabilir:rnrnS1: Deklerasyon nedir?rnS2: Programlama işi sadece notdefterine birşeyler yazmakla mı oluyor?rnS3: Diyelimki bu üstte örneklerle verdiğin kodları girdik. Sonra ne yapacağız? kendi kendine grafikleri hazırlanmış bir program mı olacak. Bu işi yapmak içi yeni formatlanmış bilgisayarda bulununan bir not defterinden başka hiçbir şeye ihtiyaç yok mu? Mesela bir başka programa en azından bir painte.rnrnS4: Tamam not defterlerine bunları yazdıktan sonra dll dosyalarına ihtiyaç olmayacak mı? Olsa bile bunun için dll dosyalarını programlamak için bize birtane dll editör pro su lazım olmayacak mı?rnS5: Bu son galiba; diyelim ki ben bir pro yapmak istedim; ama gerekli kodları bilmiyorum. Bunları nerden bulacağım? ha bide bu işi öğrenmek uzun zaman alır mı yani okuma yazmayı sökersin ya söktükten sonra okumanı kendin geliştirirsin bu işite böyle mi? Bu işi öğrendikten sonra başka şeylere ihtiyaç olmuyor mu?..rn(bu işi eğer öğrenirsem ilk işim sana çok teşekkür etmek olur. İkincisi de kendi windows umu yaparım. İsmi dee şu olur "ifetsoft" microsoft a yeni bir rakip) Teşekkürler.rnUnutma ben bu işte acemiyim. | C++ Dersleri 9 Yazar Kolcu açık 2006-08-04 16:48:10 Derleyici gerekmektedir... Ayrıca programlarda kullanılan favicon dahil simgeleri yapmak için de tabiki araç kullanmak gerekiyor  | C++ Dersleri 9 Yazar HOTKEY açık 2006-09-04 14:41:02 Merhaba Turktekno'cu arkadaşlar meraklı bir ziyaretçimiz baya güzel sorular sormuş bizde elimizden geldiğince açıklamaya çalışalım....rnrnC1.Deklarasyon yukarıdaki //table programındaki anamını şu cümle gayet açık bi şekilde ifade eder sanırıyorum;rnvoid starline; rn�Program içinde buna benzer bir fonksiyon birazdan ortaya çıkacak, bu nedenle, fonksiyonun kendisini görmeden onunla ilgili referansları görürsen bir problem yok� rnYani ana programa geçmeden önce (main ile başlayan kısım) starline fonksiyonunun özelliklerini, şeklini, nasıl kullanılacağını belirtiyor...rnrnC2.Biz programcılar bir olayı bir problemi değerlendiriken önce problemin tipine bakarız, hangi prog. dilinde daha güzel cevaplanabileceğini irdeleriz. Sadece not defterine bişeyler yazmakla programcı olunmaz tabi, önemli olan nerde yazdığın veya hangi derleyici kullandığın değil, asıl olan probleme yaklaşım ve çözüm tarzındır....rnrnC3.Yukarıdaki programları ben BORLAND C++ derleyecisi ile derledim.Seninde kendi seçimine bağlı olarak bir derleyici kullanmanı öneririm, derleyici olmadan tam verim alamazsın...rnrnC4.Arkadaşım dll lerle falan uğraşmayacan sen derleyici programını kur yeter....rnrnC5.Eğer gerçek manada bir programcı yazılımcı olmak istiyorsan; mantığını, becerini, zamanını, sabrını özellikle meraklı yanını kullanmak gerekir... Bu iş araştırmakla yeni problemler bulup yeni çözümler bulmakla gelişir. Unutma bir problemin binlerce çözümü olabilir. Mesala sen yukarıdaki programları farklı yaklaşımlarla farklı bir mantıkla çözebilirsin...rnrnSorularına cevap vermeye çalıştım umarım faydalı olur. İlginiz için teşekkürler... | C++ Dersleri 9 Yazar Okuyucu açık 2006-10-28 15:21:55 void in ne işe yarar anlayamadim. | Yazar Okuyucu açık 2006-12-04 10:12:12 hımmm güzel olmuşşşşşşşş |
Powered by AkoComment 2.0! |