1 / 38

BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 3 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal)

BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 3 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal). Fonksiyonlara Giri ş.

pepper
Download Presentation

BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 3 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. BM-104 Nesneye Yönelik Programlama Bahar2013 (3. Sunu) (Yrd. Doç. Dr. Deniz Dal)

  2. FonksiyonlaraGiriş • En iyi program yazmavegeliştirmepratiğitekbir büyük program yazmakyerineonudahakolaykontrol altındatutmamıza yardımcıolabilecek küçük programların(fonksiyonların)birleşimihalindeoluşturmaktır.Bu yönteme“Böl&Yönet” (“Divide&Conquer”) adıverilir. • Birfonksiyongerektiğindefonksiyon adıileçağrılır vefonksiyonunişleyeceğibilgilerargüman (parametre)olarakfonksiyonaaktarılır. Örneğin bir patron (fonksiyonuçağıran)birçalışanını(çağrılanfonksiyon)yanınaçağırır vedoldurmasıiçinelinebirdosyaverir(argüman). Çalışanıişinibitirdiğizamanişlenmişdosyayıpatronunageri götürür (return).

  3. Matematik Kütüphanesi Fonksiyonları • Bu fonksiyonlarstandart kütüphaneden<cmath> header dosyasıincludeedilerekkullanılabilir. • Matematikkütüphanesinin bütün fonksiyonları genellikle doubleveri tipinde parametre(ler) alırlar ve geriyedoubleveri tipinde bir değer döndürürler. • Örnek: cout<<sqrt(900.0); • Bu örnektematematik kütüphanesifonksiyonlarından “sqrt” çağrılır. “900.0” rakamıbufonksiyonunargümanıolarakadlandırılır. Yukarıdakideyimekranasonuçolarak “30.0” yazdırır. “sqrt” fonksiyonukendisine doubleveri tipinde birargüman alır veyinedoubleveri tipinde bir değer döndürür. • Fonksiyonargümanlarısabit bir sayı, değişken ya da bunların bir karmasıolabilir.

  4. Matematik KütüphanesiFonksiyonları

  5. Örnek: pow Fonksiyonu

  6. Fonksiyonlar NasılÇağrılırlar?

  7. Fonksiyon Formatı “döndürülenveritipi” “FonksiyonunAdı”(parametrelistesi) { deklarasyonlarvedeyimler; returnanahtarkelimesi; } • Parametre listesindeki birden fazla parametre birbirlerinden virgül ile ayrılır. Herbir parametre fonksiyon içerisinde bir değişken olarak kullanılacağı için bir isme ve bir veri tipine sahiptir. • Döndürülenveri tipi “void” isebufonksiyon hiçbirverigeri döndürmezvereturnanahtarkelimesikullanılmakzorunda değildir.

  8. Fonksiyon Prototipi • Fonksiyonprototipi, derleyiciye, kullanılacakfonksiyonun adını, döndürülecekveritipini, kaçparametre alınacağınıvetiplerini, buparametrelerinhangi sıradaolacağını hatırlatır. Parametre olarak kullanılan değişkenlerin isimleri prototip içine yazılmaz. Sadece değişkenlerin veri tipleri yazılır. Eğerfonksiyonprototipte tanımlandığıgibiçağrılmazsaderleyicihataverir. Bütün bunlarfonksiyonkullanımınıdaha da kolaylaştırmakve yapılacakyanlışlarıönlemekiçindir. • Eğerfonksiyon, çağrılmadanönce tanımlanmışsaprototipegerekyoktur. Sonra tanımlanmışsagerekvardır. • Örneğin: intMaksimum(int,int,int);prototipiMaksimumadlıfonksiyonun 3 integer parametrealacağınıve geriyeyinebir integer döndüreceğini söyler.

  9. voidFonksiyonlar void EkranaBas();şeklinde tanımlı prototip EkranaBasadlıfonksiyonunhiçbirargüman almadığınıvegeriye hiçbir değer döndürmediğini söylerbize.

  10. PaskalNotasyonu • Fonksiyonlar isimlendirilirken en fazla kullanılan notasyonlardan birisi Paskal notasyonudur (pascal notation). Bu notasyon, fonksiyon ismi birden fazla kelime içeriyorsa ilk kelime de dahil bütün kelimelerin ilk karakterlerinin büyük harfle yazıldığı bir notasyondur. KaresiniAl, AsalMi, Swap gibi.

  11. Başlık (Header)Dosyaları • Standart kütüphanenin her birelemanı, bünyesinde barındırdığıfonksiyonların prototiplerinive tanımlarını“başlık dosyası”olarak isimlendirdiğimiz ve“include”deyimiile programımızın başınaeklediğimizdosyaların içerisinde saklar. • Standart kütüphanedeneklediğimiz“başlık”dosyaları<ile>karakterleriarasınakonur. Kullanıcının oluşturduğu “başlık”dosyalarıise"ile"karakterleriarasınayerleştirilirveuzantısı".h"dir. • Örnek: #include <iostream> #include "bm104.h"

  12. C++ Standart Kütüphanesinin Başlık Dosyaları

  13. C++ Standart Kütüphanesinin Başlık Dosyaları

  14. C++ Standart Kütüphanesinin Başlık Dosyaları

  15. C++ Standart Kütüphanesinin Başlık Dosyaları

  16. Rastgele integer SayıÜretme • Standartkütüphaneden<cstdlib> include edilirveburada tanımlırand()fonksiyonubuişiçin kullanılır. • rand()fonksiyonu 0 ile RAND_MAXarasında rastgele bir tamsayı üretir. RAND_MAXcstdlib kütüphanesi içerisinde tanımlı sabit bir sayıdır ve değeri şu an itibariyle 32767dir. • rand() fonksiyonunun ürettiği rastgele sayı istenilenaralığa modülüs(%)operatörükullanılarak çekilir. • Örneğin rand()%6bize0ile5arasında integer sayılarüretir. • Örneğin rand()%6+1bize1ile6arasında integer sayılarüretir. • rand()fonksiyonu programımızı test veya debugederkenbizekolaylık olsundiye programıçalıştırdığımız her seferaynı sayıyıüretir.

  17. Soru......... 32 ile 122 arasında rastgele bir tamsayı üretecek C++ deyimi aşağıdakilerden hangisidir? a) rand()%122+32 b)rand()%32+122 c) rand()%90+32 d)rand()%32+90 e)Hocam!! Bu tür sorularlaaklımızı karıştırmayınız

  18. Örnek: rand() Fonksiyonu

  19. srand(seed) Fonksiyonu • Programımızı test ettiktenve tam olarakçalıştığınaeminolduktansonra programın çalıştırıldığı her seferfarklıbir sayıüretilsinisteriz. • Bununiçin yinestandart kütüphanenin<cstdlib> header dosyasındansrandfonksiyonunukullanırız. srandfonksiyonukendisineunsigned intveritipinesahipbirargüman alır. Bu argüman çekirdek değer(seed)olarakadlandırılır.

  20. Örnek: srand(seed) Fonksiyonu

  21. srand(time(0)) Fonksiyonu • Her seferindefarklı birçekirdek değergirmekyerinesrandfonksiyonunaargüman olarak standard kütüphanenin<ctime> header dosyasının içinde tanımlıtimefonksiyonukullanılır. • Örneğin time(0) (time fonksiyonu sıfır değerinikendisineargüman olarakalmış) bilgisayarın o ankisaat değerinisaniyecinsindengeriye döndürür. • srand(time(0))iseüretilenbusaat değerini unsigned integer e çevirirveçekirdek değerolarakkullanır.

  22. Örnek: srand(time(0)) Fonksiyonu

  23. RekürsifFonksiyonlar • 5!=5*4!=5*4*3! ….. (Rekürsif Faktöriyel) • 35=3*34=3*3*33….. (Rekürsif Üs Alma) • 4*7=4+4*6=4+4+4*5 ….. (Rekürsif Çarpma)

  24. RekürsifFonksiyonlar • Şu anakadar gördüğümüz ve tanımladığımız fonksiyonlardahiyerarşikbir yapıiçerisindebirfonksiyonbaşkabirfonksiyonuçağırıyordu. Bazıproblemleriçin fonksiyonların kendikendileriniçağırmalarıdahafaydalıolabilir. Bu tür fonksiyonlaraRekürsif Fonksiyonlar denir. • Birrekürsiffonksiyonun ne zamankendikendiniçağırmayıdurduracağınıbilmesigerekir. Biz bunatemel durum (base case)diyoruz. Eğerbuşart sağlanmazsa program sonsuzakadarçalışır. • Öte yandan rekürsiffonksiyonlarlagerçekleştirilebilenişlemlerdöngülerile de yapılabilirler.

  25. Örnek: RekürsifFaktöriyelHesaplama Döngü değişkeninin üst limiti 10 yerine 13 olsaydı ne olurdu? Programınız mevcut haliyle 13 sayısının faktöriyelini doğru olarak hesaplar mıydı? Bu sorunu nasıl çözüme kavuşturursunuz?

  26. 5!

  27. Değerve ReferansileFonksiyonÇağırma • Birçok bilgisayardilindeargümanlarfonksiyonlaraikişekildeiletilirler. Değerile (call-by-value) veyaReferansile (call-by-reference). • BirargümanDeğerilebirfonksiyonaaktarıldığındaargümanın birkopyası alınır vefonksiyoniçersinde değerlendirilir. Fonksiyoniçindeargüman değerine yapılan değişikliklerfonksiyonunçağrıldığıyerdeki değişkenietkilemez. (ORİJİNAL EVRAKIN FOTOKOPİSİ) Bu sunudaşu anakadargördüğümüz örneklerde güvenliolduğu içinhepbuyolukullandık. • AmabazıdurumlardaReferansilefonksiyonçağırmakicapeder. Bu yolla, fonksiyonuçağıran, fonksiyona aktardığıargümanın değiştirilmesine de izinvermişolur. (ORİJİNAL EVRAK)Bu tür birfonksiyona en güzelörnek“swap”fonksiyonudur. • Referansparametresiya da argümanıileilgilendiğimizi göstermekiçin “&”karakterinikullanırız.

  28. İKİ DEĞİŞKENİN DEĞERİNİN YER DEĞİŞTİRMESİ (SWAPPING) A B Elinizdeki TV kumandası yardımıyla kayıtlı 2kanalın yerini nasıl değiştirirsiniz? geciciDegisken=A; A=B; B=geciciDegisken; !!! GEÇİCİ BİR DEĞİŞKENE İHTİYAÇ VAR !!!

  29. Değer ile Swap Fonksiyonu (Çalışmaz)

  30. Referans ile Swap Fonksiyonu (Çalışır)

  31. Soru • Fonksiyonlar return komutuyla sadece bir değer geriye çevirirler (döndürürler). Geriye birden fazla değer çevirebilmek (döndürebilmek) için ne yapmamız gerekir? • (3 sayının en küçüğünü ve en büyüğünü tek bir fonksiyon içerisinde hesaplayıp geriye döndürmeniz gerektiğini hayal edin.) • (void fonksiyonların hangi amaçlarla kullanıldıklarını hatırlayın.)

  32. Referans ile Değişken Kontrolü • Referanslarbaşka değişkenlerinyerinetakmaisim (alias) olarak da kullanılabilirler. • Alias (orijinal değişkeninbaşkabir adıolarak da düşünülebilir)olarak tanımlananbir değişken üzerinde yapılan her türlüişlemorjinal değişken uzerinde degerçekleşir. • Alias değişkenlerMUHAKKAK ilk değerli (initialization) olarakdeklare edilmelidirler. • Örnek: • int count = 1;int &ref = count;ref++; • count değişkeninin değeri ref adlı alias kanalıyla1 artırılır.

  33. Fonksiyon Aşırı Yüklemesi (Function Overloading) • C++ aynı fonksiyon adına sahip birden fazla fonksiyonun kullanımına izin verir. Ancak bu durum sadece aynı adlı fonksiyonların farklı argüman listelerine ya da dönüş değerlerine sahip olması durumunda geçerlidir. • C++ derleyicisi aşırı yüklenmiş bir fonksiyon çağrıldığında fonksiyonun kaç argümana sahip olduğuna, argüman veri tiplerine ve argümanların sırasına bakarak uygun fonksiyonu çalıştırır. • Fonksiyon aşırı yüklemesi, genellikle, benzer işleri farklı veri tipleri üzerinde yapan aynı ada sahip fonksiyon tanımları için kullanılır. • Örnek: int KaresiniAl(int x){return x*x;} double KaresiniAl(double y){return y*y;}

  34. FonksiyonŞablonları (Function Templates) • Fonksiyonşablonlarınıkullanarakaynıişlemifarklıveritipleriüzerindeyapanfonksiyonlariçin birdenfazlafonksiyon tanımıyapmakzorundakalmayız. • Fonksiyonşablonlarıtemplateanahtarkelimesiilebaşlarveveritiplericlassanahtarkelimesiile“<“ve“>”karakterleriarasında tanımlanır.

  35. FonksiyonŞablonları (Function Templates)

  36. Hata Ayıklama (Debugging) (Ne Umuyordum Ne Buldum?) • Yazdığımız programlar ya hiç çalışmayabilir ya da çalışır ama beklediğimiz sonuçları üretmez. • ÇALIŞAN AMA BEKLEDİĞİMİZ GİBİ SONUÇLAR ÜRETMEYEN programlarımızdaki MANTIKSAL hataları bulmak için Visual Studio programının DEBUG menüsü seçeneklerinden faydalanırız. • Debug Menüsü -> Run ToCursor (Ctrl+F10): İmlecin bulunduğu satırın öncesindeki bütün satırlar Visual Studio tarafından işletilir ve kontrol imlecin olduğu satırda kullanıcıya devredilir. • Debug Menüsü -> Step Over (F10):Kontrolü devralan kullanıcı F10 tuşu yardımıyla programın kalan satırlarını manuel olarak işletir. F10 tuşu fonksiyonların içerisine dallanmaz. • Debug Menüsü -> Step Into (F11):F11 tuşu yardımıyla fonksiyonların içerisine de girilir. • Programlarımızdaki mantıksal hataları tespit edebilmenin bir başka yolu da hatanın kaynaklanabileceğini düşündüğümüz noktanın (noktaların) öncesine veya sonrasına cout deyimleri eklemektir.

More Related