Nesneye Yönelik Programlama

Slides:



Advertisements
Benzer bir sunumlar
Bölüm 11 Metin Dosyaları Metin Dosyaları Dosya Açma ve Kapama
Advertisements

Fonksiyonlar - Functions
Makine Müh. & Jeoloji Müh.
Bilgisayar Programlama Güz 2011
EKRAN ÇIKTISI.
Bilgisayar Programlama Güz 2011
Nesneye Yönelik Programlama
Nesneye Yönelik Programlama
Nesneye Yönelik Programlama
C++ STACK SINIFI.
Soru1: kuvvet(taban,us) Şeklinde bir yinelenen fonksiyon yazın
Fonksiyonlar ve Alt Programlar
Excel’de VBA programlama (Visual Basic Application) Ders 4
Nesneye Yönelik Programlama
Nesneye Yönelik Programlama
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Nesneye Dayalı Programlama
Fonksiyonlar Fonksiyon nedir?
Fonksiyonlar.
 2006 Pearson Education, Inc. All rights reserved. Görsel C# ile Windows Programlama Güz 2009 (5. Hafta)
Bilgisayar Programlama Güz 2011
Nesneye Dayalı Programlama
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 5: Fonksiyonlar
Nesneye Yönelik Programlama
Bilgisayar Programlama
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 8: Windows Formları
Nesneye Dayalı Programlama
C ile Programlamaya Giriş
Paralel Programlamaya Giriş
SABİT NESNE VE ELEMAN FONKSİYONLAR VE ELEMAN NESNELER
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
BM-103 Programlamaya Giriş Güz 2014 (7. Sunu)
Bilgisayar Programlama
BTP205 – Görsel Programlama I
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ VE SINIFLARIN DİĞER ÖZELLİKLERİ Yılmaz Kılıçaslan.
Bölüm 5 - Fonksiyonlar index 5.1 Giriş 5.2 C de Program Modülleri
© Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved. 1 Amaçlar Bu derste öğrenilecekler: –Uygulamaları “method”
BM-103 Programlamaya Giriş Güz 2014 (4. Sunu)
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
C++ Ders Notları 2.Ders (Dilin Yapısı)
C++ Ders Notları 3.Ders (String İşlemleri)
C++.
 this anahtar sözcüğü, içinde bulunulan nesneye ait bir referans döndürür; bunun sayesinde nesnelere ait global alanlara erişme fırsatı bulunur. Şöyle.
BM-103 Programlamaya Giriş Güz 2014 (9. Sunu)
Paralel Programlamaya Giriş 2
Paralel Programlamaya Giriş
HAZIRLAYAN:SEMİH KÜRTÜNCÜ
Debugging-Hata Giderme
1 Yapılandırılmamış programlama Prosedür/Fonksiyon gerekliliği Prosedural Programlama Fonksiyon Tanımlama/Prototip/Çağırma Örnek fonksiyonlar Fonksiyon.
BMS-301 Kabuk Programlama Güz 2015 (6. Sunu) (Yrd. Doç. Dr. Deniz Dal)
BMS-301 Kabuk Programlama Güz 2015 (5. Sunu) (Yrd. Doç. Dr. Deniz Dal)
BM-103 Programlamaya Giriş Güz 2012 (3. Sunu)
Fonksiyonlar.
Fonksiyonlar.
Fonksiyonlar ve Diziler
C Programlama Dili Bilgisayar Mühendisliği.
BM-103 Programlamaya Giriş Güz 2016 (4. Sunu)
C’de Fonsiyonlar Aslı Ergün.
Düzenleme ve Hata Ayıklama
C Programlama Diline Giriş
BM-103 Programlamaya Giriş Güz 2016 (11. Sunu)
FONKSİYONLAR.
Fonksiyonlar.
YAPISAL PROGRAMLAMA Hafta-6
Bölüm 6: Kullanıcı Tanımlı Fonksiyonlar I
C ile Programlamaya Giriş
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

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

Fonksiyonlara Giriş En iyi program yazma ve geliştirme pratiği tek bir büyük program yazmak yerine onu daha kolay kontrol altında tutmamıza yardımcı olabilecek küçük programların (fonksiyonların) birleşimi halinde oluşturmaktır. Bu yönteme “Böl&Yönet” (“Divide&Conquer”) adı verilir. Bir fonksiyon gerektiğinde fonksiyon adı ile çağrılır ve fonksiyonun işleyeceği bilgiler argüman (parametre) olarak fonksiyona aktarılır. Örneğin bir patron (fonksiyonu çağıran) bir çalışanını (çağrılan fonksiyon) yanına çağırır ve doldurması için eline bir dosya verir (argüman). Çalışanı işini bitirdiği zaman işlenmiş dosyayı patronuna geri götürür (return).

Matematik Kütüphanesi Fonksiyonları Bu fonksiyonlar standart kütüphaneden <cmath> header dosyası include edilerek kullanılabilir. Matematik kütüphanesinin bütün fonksiyonları genellikle double veri tipinde parametre(ler) alırlar ve geriye double veri tipinde bir değer döndürürler. Örnek: cout<<sqrt(900.0); Bu örnekte matematik kütüphanesi fonksiyonlarından “sqrt” çağrılır. “900.0” rakamı bu fonksiyonun argümanı olarak adlandırılır. Yukarıdaki deyim ekrana sonuç olarak “30.0” yazdırır. “sqrt” fonksiyonu kendisine double veri tipinde bir argüman alır ve yine double veri tipinde bir değer döndürür. Fonksiyon argümanları sabit bir sayı, değişken ya da bunların bir karması olabilir.

Matematik Kütüphanesi Fonksiyonları

Örnek: pow Fonksiyonu #include <iostream>//cout İçin #include <cmath> //pow İçin using namespace std; int main() { int sayi1=2, sayi2=8; cout<<pow((double)sayi1,sayi2)<<endl; return 0; }

Fonksiyonlar Nasıl Çağrılırlar? #include <iostream>//cout ve cin Kullanımları İçin using namespace std; int KaresiniAl(int);//Fonksiyon Prototipi veya İmzası int main() { for(int i=1;i<=10;i++) cout<<KaresiniAl(i)<<" "; cout<<endl; return 0; } //Fonksiyon Tanımı int KaresiniAl(int y) return y*y;

Fonksiyon Formatı “döndürülen veri tipi” “FonksiyonunAdı”(parametre listesi) { deklarasyonlar ve deyimler; return anahtar kelimesi; } 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ülen veri tipi “void” ise bu fonksiyon hiçbir veri geri döndürmez ve return anahtar kelimesi kullanılmak zorunda değildir.

Fonksiyon Prototipi Fonksiyon prototipi, derleyiciye, kullanılacak fonksiyonun adını, döndürülecek veri tipini, kaç parametre alınacağını ve tiplerini, bu parametrelerin hangi sırada olacağı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ğer fonksiyon prototipte tanımlandığı gibi çağrılmazsa derleyici hata verir. Bütün bunlar fonksiyon kullanımını daha da kolaylaştırmak ve yapılacak yanlışları önlemek içindir. Eğer fonksiyon, çağrılmadan önce tanımlanmışsa prototipe gerek yoktur. Sonra tanımlanmışsa gerek vardır. Örneğin: int Maksimum(int,int,int); prototipi Maksimum adlı fonksiyonun 3 integer parametre alacağını ve geriye yine bir integer döndüreceğini söyler.

void Fonksiyonlar void EkranaBas(); şeklinde tanımlı prototip EkranaBas adlı fonksiyonun hiçbir argüman almadığını ve geriye hiçbir değer döndürmediğini söyler bize. #include <iostream>//cout Kullanımı İçin using namespace std; void EkranaBas();//Fonksiyon Prototipi int main() { EkranaBas();//Fonksiyonu Çağır return 0; } //Fonksiyon Tanımı void EkranaBas() cout<<"Bu Fonksiyon Hicbir Arguman Almaz ve " <<"Geriye Hicbir Deger Cevirmez.\n";

Paskal Notasyonu 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.

Başlık (Header) Dosyaları Standart kütüphanenin her bir elemanı, bünyesinde barındırdığı fonksiyonların prototiplerini ve tanımlarını “başlık dosyası” olarak isimlendirdiğimiz ve “include” deyimi ile programımızın başına eklediğimiz dosyaların içerisinde saklar. Standart kütüphaneden eklediğimiz “başlık” dosyaları < ile > karakterleri arasına konur. Kullanıcının oluşturduğu “başlık” dosyaları ise " ile " karakterleri arasına yerleştirilir ve uzantısı ".h" dir. Örnek: #include <iostream> #include "bm104.h"

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

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

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

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

Rastgele integer Sayı Üretme Standart kütüphaneden <cstdlib> include edilir ve burada tanımlı rand() fonksiyonu bu iş için kullanılır. rand() fonksiyonu 0 ile RAND_MAX arasında rastgele bir tamsayı üretir. RAND_MAX cstdlib kütüphanesi içerisinde tanımlı sabit bir sayıdır ve değeri şu an itibariyle 32767 dir. rand() fonksiyonunun ürettiği rastgele sayı istenilen aralığa modülüs(%) operatörü kullanılarak çekilir. Örneğin rand()%6 bize 0 ile 5 arasında integer sayılar üretir. Örneğin rand()%6+1 bize 1 ile 6 arasında integer sayılar üretir. rand() fonksiyonu programımızı test veya debug ederken bize kolaylık olsun diye programı çalıştırdığımız her sefer aynı sayıyı üretir.

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 sorularla aklımızı karıştırmayınız

Örnek: rand() Fonksiyonu #include <iostream>//cout İçin #include <cstdlib> //rand() ve RAND_MAX İçin using namespace std; int main() { cout<<"Uretilebilecek Maksimum Tamsayi: " <<RAND_MAX<<endl; for(int i=1;i<=20;i++) cout<<(1+rand()%6)<<endl; return 0; }

srand(seed) Fonksiyonu Programımızı test ettikten ve tam olarak çalıştığına emin olduktan sonra programın çalıştırıldığı her sefer farklı bir sayı üretilsin isteriz. Bunun için yine standart kütüphanenin <cstdlib> header dosyasından srand fonksiyonunu kullanırız. srand fonksiyonu kendisine unsigned int veri tipine sahip bir argüman alır. Bu argüman çekirdek değer (seed) olarak adlandırılır.

Örnek: srand(seed) Fonksiyonu #include <iostream>//cout İçin #include <cstdlib> //rand() ve srand(seed) İçin using namespace std; int main() { unsigned int seed; cout<<"Cekirdek Degeri Girin: "; cin>>seed; srand(seed); for(int i=1;i<=20;i++) cout<<(1+rand()%6)<<endl; return 0; }

srand(time(0)) Fonksiyonu Her seferinde farklı bir çekirdek değer girmek yerine srand fonksiyonuna argüman olarak standard kütüphanenin <ctime> header dosyasının içinde tanımlı time fonksiyonu kullanılır. Örneğin time(0) (time fonksiyonu sıfır değerini kendisine argüman olarak almış) bilgisayarın o anki saat değerini saniye cinsinden geriye döndürür. srand(time(0)) ise üretilen bu saat değerini unsigned integer e çevirir ve çekirdek değer olarak kullanır.

Örnek: srand(time(0)) Fonksiyonu #include <iostream>//cout İçin #include <cstdlib> //rand() ve srand(seed) İçin #include <ctime> //time() İçin using namespace std; int main() { srand(time(0));//Programın Çalıştığı Andaki Saatin Değeri cout<<"Saatin Tam Su Anki Degeri: "<<time(0)<<endl; for(int i=1;i<=20;i++) cout<<(1+rand()%6)<<endl; return 0; }

Rekürsif Fonksiyonlar 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)

Rekürsif Fonksiyonlar Şu ana kadar gördüğümüz ve tanımladığımız fonksiyonlarda hiyerarşik bir yapı içerisinde bir fonksiyon başka bir fonksiyonu çağırıyordu. Bazı problemler için fonksiyonların kendi kendilerini çağırmaları daha faydalı olabilir. Bu tür fonksiyonlara Rekürsif Fonksiyonlar denir. Bir rekürsif fonksiyonun ne zaman kendi kendini çağırmayı durduracağını bilmesi gerekir. Biz buna temel durum (base case) diyoruz. Eğer bu şart sağlanmazsa program sonsuza kadar çalışır. Öte yandan rekürsif fonksiyonlarla gerçekleştirilebilen işlemler döngüler ile de yapılabilirler.

Örnek: Rekürsif Faktöriyel Hesaplama 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? #include <iostream> using namespace std; int Faktoriyel(int);//Fonksiyon Prototipi int main() { for(int i=0;i<=10;i++) cout<<i<<" != "<<Faktoriyel(i)<<endl; return 0; } //Rekürsif Faktöriyel Hesaplayan Fonksiyonun Tanımı int Faktoriyel(int sayi) if(sayi<=1)//Temel Durum return 1; else //Rekürsif (Genel) Durum return sayi*Faktoriyel(sayi-1);

5!

Değer ve Referans ile Fonksiyon Çağırma Birçok bilgisayar dilinde argümanlar fonksiyonlara iki şekilde iletilirler. Değer ile (call-by-value) veya Referans ile (call-by-reference). Bir argüman Değer ile bir fonksiyona aktarıldığında argümanın bir kopyası alınır ve fonksiyon içersinde değerlendirilir. Fonksiyon içinde argüman değerine yapılan değişiklikler fonksiyonun çağrıldığı yerdeki değişkeni etkilemez. (ORİJİNAL EVRAKIN FOTOKOPİSİ) Bu sunuda şu ana kadar gördüğümüz örneklerde güvenli olduğu için hep bu yolu kullandık. Ama bazı durumlarda Referans ile fonksiyon çağırmak icap eder. Bu yolla, fonksiyonu çağıran, fonksiyona aktardığı argümanın değiştirilmesine de izin vermiş olur. (ORİJİNAL EVRAK) Bu tür bir fonksiyona en güzel örnek “swap” fonksiyonudur. Referans parametresi ya da argümanı ile ilgilendiğimizi göstermek için “&” karakterini kullanırız.

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

Değer ile Swap Fonksiyonu (Çalışmaz) #include <iostream> using namespace std; void Swap(int,int);//Fonksiyon Prototipi int main() { int a=2,b=5; cout<<"Swap Fonksiyonu Cagrilmadan Once:\n"; cout<<"a="<<a<<" b="<<b<<endl; Swap(a,b); cout<<"Swap Fonksiyonu Cagrildiktan Sonra:\n"; return 0; } //Fonksiyon Tanımı void Swap(int a, int b) int geciciDegisken=a ; a=b; b=geciciDegisken;

Referans ile Swap Fonksiyonu (Çalışır) #include <iostream> using namespace std; void Swap(int&,int&);//Fonksiyon Prototipi int main() { int a=2,b=5; cout<<"Swap Fonksiyonu Cagrilmadan Once:\n"; cout<<"a="<<a<<" b="<<b<<endl; Swap(a,b); cout<<"Swap Fonksiyonu Cagrildiktan Sonra:\n"; return 0; } //Fonksiyon Tanımı void Swap(int &a, int &b) int geciciDegisken=a ; a=b; b=geciciDegisken;

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.)

Referans ile Değişken Kontrolü Referanslar başka değişkenlerin yerine takma isim (alias) olarak da kullanılabilirler. Alias (orijinal değişkenin başka bir adı olarak da düşünülebilir) olarak tanımlanan bir değişken üzerinde yapılan her türlü işlem orjinal değişken uzerinde de gerçekleşir. Alias değişkenler MUHAKKAK ilk değerli (initialization) olarak deklare edilmelidirler. Örnek: int count = 1; int &ref = count; ref++; count değişkeninin değeri ref adlı alias kanalıyla 1 artırılır.

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;}

Fonksiyon Şablonları (Function Templates) Fonksiyon şablonlarını kullanarak aynı işlemi farklı veri tipleri üzerinde yapan fonksiyonlar için birden fazla fonksiyon tanımı yapmak zorunda kalmayız. Fonksiyon şablonları template anahtar kelimesi ile başlar ve veri tipleri class anahtar kelimesi ile “<“ ve “>” karakterleri arasında tanımlanır.

Fonksiyon Şablonları (Function Templates) #include <iostream> using namespace std; template <class T>//Fonksiyon Prototipi T Maksimum(T,T,T); int main() { int int1=5,int2=7,int3=17; cout<<Maksimum<int>(int1,int2,int3)<<endl; double double1=7.32,double2=13.45,double3=21.56; cout<<Maksimum<double>(double1,double2,double3)<<endl; return 0; } template <class T>//Fonksiyon Tanımı T Maksimum(T value1,T value2,T value3) T max=value1; if(value2>max) max=value2; if(value3>max) max=value3; return max;

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 To Cursor (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.

//Bir Aralıktaki Asal Sayıları Bulan Program #include <iostream>//cout ve cin using namespace std; bool AsalSayiMi(int);//Prototip int main() { int altLimit,ustLimit; cout<<"Lutfen Alt ve Ust Limiti Giriniz: "; cin>>altLimit>>ustLimit; for(int i=altLimit;i<=ustLimit;i++) if(AsalSayiMi(i)) cout<<i<<endl; return 0; } bool AsalSayiMi(int sayi) if(sayi<2) return false; else //Bir Asal Sayının Karekökünden Daha Büyük //Bir Böleni Yoktur for(int i=2;i*i<=sayi;i++) if(sayi%i==0) return true;

//Bir Aralıktaki Asal Sayıları Bulan Program #include <iostream>//cout ve cin using namespace std; void AraliktakiAsallar(int,int);//Prototip int main() { int altLimit,ustLimit; cout<<"Lutfen Alt ve Ust Limiti Giriniz: "; cin>>altLimit>>ustLimit; AraliktakiAsallar(altLimit,ustLimit); return 0; } void AraliktakiAsallar(int alt,int ust) bool asal; for(int i=alt;i<=ust;i++) if(i>=2) asal=true;//Sayiyi Asal Kabul Et for(int j=2;j*j<=i;j++) if(i%j==0) asal=false;//Asal Degil break; if(asal) cout<<i<<endl;