FBEB-512. C++ ile Nesne Tabanlı Programlama. Güz (5. Hafta)

Benzer belgeler
C++ Dersi: Nesne Tabanlı Programlama

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

Pointer Kavramı. Veri Yapıları

Diziler (Arrays) Çok Boyutlu Diziler

Fall Object-Oriented Programming Laboratory 02 - Structures

Göstericiler (Pointers)

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Konular. Hafta 5 Veri Tipleri (Devam) BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

Pros and Cons of Pointers. Pointers. Avantajlar. Dezavantajlar

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

HSancak Nesne Tabanlı Programlama I Ders Notları

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Özyineleme (Recursion)

C++ Operatörler (Operators)

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

BİLG Dr. Mustafa T. Babagil 1

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

Matlab da Dizi ve Matrisler. Mustafa Coşar

Programlama Dilleri 3

NESNEYE YÖNELİK PROGRAMLAMA

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

sayi=3 harf=a reelsayi=8.72 Bellek durumu 5. İşaretç iler (pointers)

BİL1001 Bilgisayar Bilimlerine Giriş 1

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

C++ Dersi: Nesne Tabanlı Programlama

10/17/2007 Nesneye Yonelik Programlama 3.1

C++ Dersi: Nesne Tabanlı Programlama

C Programlama Dilininin Basit Yapıları

Örnek1: #include <iostream> #include <string> using namespace std;

Giriş. ENF102 Jeoloji

Standard Template Library

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-10 Diziler. Yrd. Doç. Dr. Ümit ATİLA

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

Hafta 12 Karakter Tutan Diziler

C++ Dersi: Nesne Tabanlı Programlama

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

ALGORİTMA VE PROGRAMLAMA II

PROGRAMLAMAYA GİRİŞ DERS 2

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

1 PROGRAMLAMAYA GİRİŞ

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

Dr. Fatih AY Tel: fatihay@fatihay.net

Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır

Bölüm 6. Diziler (arrays) Temel kavramlar Tek boyutlu diziler Çok boyutlu diziler

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Dr. Fatih AY Tel: fatihay@fatihay.net

2. Dereceden Denklemin Köklerini Bulan Program

D İ Z İ L E R A R R A Y S

ALGORİTMA VE PROGRAMLAMA II

DİZİLER 5/4/2010. ENF-102 Jeoloji Giriş. Tek Boyutlu Diziler. Tek Boyutlu Diziler. Örnek. Örnek

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

JAVADA DİZİ İŞLEMLERİ

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

C++ Dersi: Nesne Tabanlı Programlama

YZM 2116 Veri Yapıları

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Pointers (İşaretçiler)

Programlama Dilleri 1. Ders 4: Diziler

ALGORİTMA VE PROGRAMLAMA II

BİL-142 Bilgisayar Programlama II

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-11 Karakter Diziler. Yrd. Doç. Dr. Ümit ATİLA

BLM111 Programlama Dilleri I. Hafta 10 Diziler. Yrd. Doç. Dr. Caner ÖZCAN

DİZİLER. Bu ünitede yapılan örnekler Visual Studio 2010 programındaki Visual Basic programlama diliyle çözülmüştür.

ALGORİTMA VE PROGRAMLAMA I

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

Algoritma ve Programlama: Karar Yapıları ve Döngüler

C++ Dersi: Nesne Tabanlı Programlama

BİLG Dr. Mustafa T. Babagil 1

KOCAELİ ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ. BİLGİSAYAR LABORATUVARI II FİNAL SINAVI SORU ve CEVAPLARI(I. ogr)

YZM 2105 Nesneye Yönelik Programlama

String ve Karakter Dizileri. Yrd. Doç. Dr. Fehim KÖYLÜ Erciyes Üniversitesi Bilgisayar Mühendisliği Bölümü

BMT 101 Algoritma ve Programlama I 5. Hafta. Yük. Müh. Köksal Gündoğdu 1

BİL-142 Bilgisayar Programlama II

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir.

ALGORİTMA VE PROGRAMLAMA I

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

NESNEYE YÖNELİK PROGRAMLAMA

#ifndef VEKTOR_H #define VEKTOR_H. struct vektor_s { double x; double y; double z; }; typedef struct vektor_s vektor_t;

Operatörlere Yeni İşlevler Yüklenmesi (Operator Overloading)

Nesne Yönelimli Programlama

Lambda İfadeleri (Lambda Expressions)

C++ Dersi: Nesne Tabanlı Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Deney 7: Fonksiyon Tanımlama ve Parametre Aktarım Yöntemleri

Statik veri üyeleri sınıf dosyası içerisinde, ancak sınıf bildirimi dışında başlatılmalıdır. Statik üye fonksiyonları

Transkript:

FBEB-512 C++ ile Nesne Tabanlı Programlama Güz 2009 (5. Hafta) (Yrd. Doç. Dr. Deniz Dal)

Diziler (Arrays) Diziler (arrays), aynı veri tipine sahip birden fazla veriyi bünyelerinde saklayan veri yapılarıdır. (Data Structures) Değişkenler içerisinde yalnız bir tek bilgi depolarken dizileri kullanarak aynı türden birden fazla bilgiyi saklayabiliriz. Programımız içerisinde kullanacağımız 100 adet tamsayıyı 100 farklı değişken içinde saklamak yerine bu amaçla içinde 100 tamsayı saklı bir dizi kullanmak daha mantıklıdır.

Diziler (Arrays) C++ ta diziler statik yapılardır. Yani program işletilmeden önce depolayacakları bilgi miktarı belirlidir ve işletilme esnasında bu miktar hiçbir şekilde değiştirilemez. Daha sonraki derslerimizde göreceğimiz bazı veri yapılarının (örneğin list, queue ve stack) işletilme esnasında kapasiteleri büyüyebilir veya küçülebilir.

Diziler (Arrays) Bir dizinin elemanlarının hepsi aynı veri tipine sahiptir ve bellekte ardışıl olarak sıralanırlar. Bir dizinin elemanlarına indeks (index) ile ulaşılır. İndeks: Belirli bir dizi elemanına ulaşmak amacıyla pozisyon numarası olarak kullanılır. Köşeli parantezler [ ] içine yazılır. Dizinin ilk elemanının indeks değeri daima sıfırdır.!!!!!!! Örneğin (a = 5 ve b = 6 değerleri için) c[ a + b ] += 2; deyimi c[11] dizi elemanının değerine 2 ekler.

c dizinin adıdır. c dizisi 12 elemana sahiptir. ( c[0], c[1], c[11] ) c[0] `ın (yani dizinin ilk elemanının) değeri -45 tir.

!!! Dikkat!!! Dizilerin indeks numaraları sıfırdan başladığı için, c[7] ile bu dizinin yedinci elemanı farklı şeyleri ifade eder. c[7] normalde dizinin sekizinci elemanıdır.

Dizilerin Deklare Edilmesi Dizinin boyutunu ve dizi elemanlarının veri tipini programcı belirler. Örnek: int c[ 12 ]; deyimi c adında içinde 12 tane integer saklayan bir dizi tanımlar. Bir dizinin boyutu sıfırdan büyük bir integer değerine sahip olmalıdır.

Döngü ile Dizi Elemanlarına İlk Değer Atama 1. Diziyi boyutu ve saklayacağı veri tipi ile deklare et. 2. Herhangi bir döngü yapısı kullanarak herbir dizi elemanına bir ilk değer ata. (Mesela, çok yaygın bir uygulama olarak, başlangıçta tüm dizi elemanlarına sıfır değeri atanabilir.)

1 2 // Dizi elemanlarına ilk değer atanması 3 #include <iostream> //cout, left, right ve endl 4 #include <iomanip> //setw 5 using namespace std; 6 7 8 9 10 int main() 11 { 12 int n[ 10 ]; // İçerisinde 10 tamsayı saklayan n adlı bir dizi deklarasyonu 13 14 // Bir döngü yardımıyla dizi elemanlarına ilk değer olarak sıfır atama 15 for ( int i = 0; i < 10; i++ ) 16 n[ i ] = 0; // Dizinin i. elemanına sıfır ata 17 18 cout << "Eleman" << setw( 13 ) << "Deger" << endl; cout << "Eleman" <<right<<setw( 13 ) << Deger" << endl; //varsayilan olarak zaten saga dayali cout << "Eleman" <<left<< setw( 13 ) << Deger" << endl;

19 20 // Dizinin herbir elemanını yazdır 21 for ( int j = 0; j < 10; j++ ) 22 cout << setw( 6 ) << j << setw( 13 ) << n[ j ] << endl; 23 24 return 0; 25 } Eleman Deger 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0

İlk Değer Atama Listesi ile Dizi Oluşturma Bir dizi hem deklare edilebilir hem de aynı anda ilk değer atama listesi (initializer list) yardımıyla dizi elemanlarına ilk değer atanabilir. Dizi elemanları parantez içine ( { } ) yazılan ilk değer atama listesindeki değerlerle atanırlar ve bu elemanlar birbirlerinden virgül ile ayrılırlar. Örnek: int n[] = { 10, 20, 30, 40, 50 }; Dizinin boyutu bu tanımda yazılmadığı için derleyici bu dizinin boyutunu ilk değer atama listesinin eleman sayısını temel alarak belirler. Yukaridaki deyim 5 elemanlı bir dizi tanımlar. Dizi elemanlarının indeks değerleri sırasıyla: 0, 1, 2, 3, 4 Dizi elemanlarının ilk değerleri sırasıyla: 10, 20, 30, 40, 50

İlk Değer Atama Listesi ile Dizi Oluşturma Eğer ilk atama değer listesindeki eleman sayısı dizinin boyutundan az ise kalan elemanlara sıfır değeri atanır. Örnek: int n[ 10 ] = { 0 }; Dizinin ilk elemanının değeri olarak sıfır seçildiği açıkça bellidir. Kalan dokuz elemanın değeri olarak yine sıfır atanacağı dolaylı olarak bilinir. Eğer ilk değer atama listesindeki eleman sayısı dizinin boyutundan fazla ise derleyici hata verir.

Sabit Değişkenler (Constant Variables) Bu başlık sizlere de ilginç geldi mi? (Oxymoron) Bu tür değişkenler const anahtar kelimesi ile deklare edilirler. Sadece okunabilir değişkenler (read-only variables) olarak da adlandırılırlar. Bu tür değişkenlere, deklare edildikleri anda muhakkak bir ilk değer ataması yapılır ve bu değer daha sonra değiştirilemez. Sabit değişken tanımlamak ve bunu dizilerin boyutu olarak kullanmak genel olarak tercih edilen bir yoldur. Sebep?

Sabit Değişkenler (Constant Variables) Sabit değişkenleri diğer değişkenlerden ayırtedebilmek için kullanılabilecek bir notasyon: Sabit değişken isimlerinin bütün karakterlerini büyük harfle yaz, değişken ismi birden fazla kelimeden oluşuyorsa kelimeleri birbirinden alt çizgilerle ayır. ÖRNEK: const int DIZI_BOYUTU;

1 2 // sabit degisken tanimlama ve kullanma 3 #include <iostream> //cout ve endl 4 using namespace std; 5 6 7 int main() 8 { 9 const int X = 7; // ilk deger atanmis sabit degisken 10 11 cout << "The value of constant variable X is: " << X << endl; 12 13 return 0; 14 } The value of constant variable X is: 7

1 2 // Sabit bir degiskene deklarasyon aninda muhakkak bir ilk deger atanmalidir 3 4 int main() 5 { 6 const int X; // Error: X must be initialized 7 8 X = 7; // Error: cannot modify a const variable 9 10 return 0; 11 } Borland C++ command-line compiler error message: Error E2304 fig07_07.cpp 6: Constant variable 'x' must be initialized in function main() Error E2024 fig07_07.cpp 8: Cannot modify a const object in function main() Microsoft Visual C++.NET compiler error message: C:\cpphtp5_examples\ch07\fig07_07.cpp(6) : error C2734: 'x' : const object must be initialized if not extern C:\cpphtp5_examples\ch07\fig07_07.cpp(8) : error C2166: l-value specifies const object GNU C++ compiler error message: fig07_07.cpp:6: error: uninitialized const `x' fig07_07.cpp:8: error: assignment of read-only variable `x'

Bir Dizinin Elemanlarını Toplayan Program 1 2 // Bir dizinin elemanlarının değerlerini toplayan program 3 #include <iostream> //cout ve endl 4 using namespace std; 5 6 7 int main() 8 { 9 const int DIZI_BOYUTU = 10; // Dizinin boyutunu saklayan sabit değişken 10 int a[ DIZI_BOYUTU ] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; 11 int toplam = 0; 12 13 14 for ( int i = 0; i < DIZI_BOYUTU; i++ ) 15 toplam += a[ i ]; 16 17 cout << "Dizi elemanlarinin toplami: " << toplam << endl; 18 19 return 0; 20 } Dizi elemanlarinin toplami: 849

!!! Dikkat!!! Eğer bir dizinin elemanları bir döngü içerisinde değerlendiriliyorsa, diziye ulaşmamızı sağlayan indeks değeri hiçbir zaman sıfır değerinin altına düşmemeli ve daima dizinin sahip olduğu eleman sayısından küçük olmalıdır.

Karakter Dizileri Kullanarak String Manipülasyonu Karakter dizileri kullanarak string depolayabilir ve manipüle edebiliriz. String leri char veri tipi ile tanımladığımız dizilerde depolayabiliriz. Örnek: (Aşağıdaki iki kullanım birbirine denktir.) 1. char string1[] = "Hi"; 2. char string1[] = { 'H', 'i', '\0' }; Örnekteki dizi, depolanması istenen karakterleri ve dizinin en son elamanı olarak da özel bir karakter olan ve Null karakteri ('\0') diye adlandırılan string sonlandırma karakterini (string-termination character) muhafaza eder.

Karakter Dizileri Kullanarak String Manipülasyonu cin>> kullanarak klavyeden girilen bir string i bir karakter dizisinin içine atayabiliriz. Örnek: cin >> string1; Fakat cin>> ile dizinin kapasitesinden fazla karakterin okunabileceği unutulmamalıdır. Fazladan girilen bilgi kaybolacaktır. Null ile sonlandırılmış bir string i temsil eden bir karakter dizisi cout<< ile ekrana yazdırılabilir.

1 2 // Karakter dizileri string oluşturmak için kullanılabilir 3 #include <iostream> //cout, cin ve endl 4 using namespace std; 5 6 7 8 int main() 9 { 10 char string1[ 20 ]; // 20 karakter saklayan bir dizi (NULL dahil) 11 char string2[] = "String Dizisi"; // 14 karakter rezerve edilir (NULL dahil) 12 13 14 cout << "\"Merhaba Dunya\" yaz: "; 15 cin >> string1; // string1 içerisine sadece Merhaba atanır 16 // Dunya kelimesi input buffer içerisinde okunmayı bekler 17 // string1 ve string2 yi ekrana yazdir 18 cout << "1. String : " << string1 << "\n2. String : " << string2; 19 20 cout << "\nkarakterleri arasina 1 bosluk birakilmis 1. String :\n"; 21

22 // NULL karaktere rastlayıncaya kadar 1. String i ekrana yazdır 23 for ( int i = 0; string1[ i ]!= '\0'; i++ ) 24 cout << string1[ i ] << ' '; 25 26 cin >> string1; // input buffer dan Dunya yı oku ve yeniden string1 e ata 27 cout << "\n1. String : " << string1 << endl; 28 29 return 0; 30 } Merhaba Dunya yaz : Merhaba Dunya 1.String : Merhaba 2.String : String Dizisi Karakterleri Arasina 1 Bosluk Birakilmis 1. String : M e r h a b a 1.String : Dunya

Bir Diziyi Bir Fonksiyonun Argümanı Olarak Kullanma Bir diziyi bir fonksiyona argüman olarak iletmek için: Dizinin adı parantezler olmadan kullanılır. Mesela dizimiz şu şekilde deklare edilmiş olsun. int a[ 24 ]; Bu dizinin argüman olarak kullanıldığı fonksiyon ise: DiziyiDegistir( a, 24 ); dizinin adı ve boyutu fonksiyona argüman olarak iletilir. Fonksiyon diziden istenen kadar elemanı işleyebilsin diye dizinin boyutu fonksiyona ikinci bir argüman olarak verilir. Fonksiyon ise şöyle tanımlanır. void DiziyiDegistir( int b[], int diziboyutu );

Bir Diziyi Bir Fonksiyonun Argümanı Olarak Kullanma Diziler fonksiyon argümanı olarak referansla (call-byreference) çağrılırlar. Fonksiyon, dizinin baslangıç adresini argüman olarak kullanır ve böylece bellekteki yeri bilinmiş olur. Çağıran fonksiyon böylelikle çağırdığı fonksiyona argüman olarak verilen bilgiyi manipule edebilme hakkını da vermiş olur. Diziler değer ile (call-by-value) fonksiyonlara arguman olarak atansalardı eğer bu bir performans eksikliğine yol açardı. (Fonksiyon içerisinde işlensin diye dizinin herbir elemanının kopyası alınırdı.) SIKLIKLA çağrılan fonksiyonlardaki kapasitesi büyük diziler böyle bir soruna sebep olurdu.

1 2 // Dizileri veya dizi elemanlarını fonksiyonlara argüman olarak geçme 3 #include <iostream> //cout ve endl #include <iomanip> //setw 4 using namespace std; 5 6 7 8 9 10 void DiziyiDegistir( int [], int ); //prototip 11 void ElemaniDegistir( int ); //prototip 12 13 int main() 14 { 15 const int DIZI_BOYUTU = 5; 16 int a[ DIZI_BOYUTU ] = { 0, 1, 2, 3, 4 }; // Diziye ilk deger ata 17 18 cout << "Fonksiyona referansla gonderilmeden once dizinin icerigi: \n"; 19 20 21 // Orjinal dizi elemanlarini ekrana yazdir 22 for ( int i = 0; i < DIZI_BOYUTU; i++ ) 23 cout << setw( 3 ) << a[ i ]; 24 25 cout << endl; 26 27 // Diziyi fonksiyona referansla gonder 28 DiziyiDegistir( a, DIZI_BOYUTU ); 29 cout << "Fonksiyon icinde degistirilmis dizinin icerigi: \n";

30 31 // Fonksiyon icinde degistirilmis dizi elemanlarini ekrana yazdir 32 for ( int j = 0; j < DIZI_BOYUTU; j++ ) 33 cout << setw( 3 ) << a[ j ]; 34 35 cout << "\n\nfonksiyona degerle bir dizi elemanini gonderme: " 36 << "\nfonksiyon oncesi a[3]: " << a[ 3 ] << endl; 37 38 ElemaniDegistir( a[ 3 ] ); // Dizinin a[ 3 ] elemanini degerle gonder 39 cout << "Fonksiyon sonrasi a[3]: " << a[ 3 ] << endl; 40 41 return 0; 42 } 43 44 // Fonksiyon tanimi 45 void DiziyiDegistir( int b[], int dizininboyutu ) 46 { 47 // Herbir dizi elemanini 2 ile carp 48 for ( int k = 0; k < dizininboyutu; k++ ) 49 b[ k ] *= 2; 50 }

51 // Fonksiyon tanimi 54 void ElemaniDegistir( int e ) 55 { 56 // Parametreyi 2 ile carp 57 cout << "ElemaniDegistir fonksiyonu icinde parametre: " << ( e *= 2 ) << endl; 58 } Fonksiyona referansla gonderilmeden once dizinin icerigi: 0 1 2 3 4 Fonksiyon icinde degistirilmis dizinin icerigi: 0 2 4 6 8 Fonksiyona degerle bir dizi elemanini gonderme: Fonksiyon oncesi a[3]: 6 ElemaniDegistir fonksiyonu icinde parametre: 12 Fonksiyon sonrasi a[3]: 6

const ın Dizilerde Fonksiyon Parametresi Olarak Kullanılması Dizinin deklarasyonu anında başına const anahtar kelimesi yazılır. Böylelikle fonksiyonu çağıran, çağrılan fonksiyon içinde dizi elemanlarının modifiye edilmesinin önüne geçer. Dizi elemanlarının değeri fonksiyon gövdesi içinde sabittir ve değiştirilemez. Bu özellik sayesinde programcı değerlendirilen bilginin kazara değistirilmesini engellemiş olur.

1 2 // const dizilerin kullanimi 3 #include <iostream> //cout ve endl 4 using namespace std; 5 6 7 void DiziyiDegistir( const int [] ); // prototip 8 9 int main() 10 { 11 int a[] = { 10, 20, 30 }; 12 13 DiziyiDegistir( a ); 14 cout << a[ 0 ] << ' ' << a[ 1 ] << ' ' << a[ 2 ] << '\n'; 15 16 return 0; 17 } 18

21 void DiziyiDegistir( const int b[] ) 22 { 23 b[ 0 ] /= 2; // error 24 b[ 1 ] /= 2; // error 25 b[ 2 ] /= 2; // error 26 } Borland C++ command-line compiler error message: Error E2024 fig07_15.cpp 23: Cannot modify a const object in function trytomodifyarray(const int * const) Error E2024 fig07_15.cpp 24: Cannot modify a const object in function trytomodifyarray(const int * const) Error E2024 fig07_15.cpp 25: Cannot modify a const object in function trytomodifyarray(const int * const) Microsoft Visual C++.NET compiler error message: C:\cpphtp5_examples\ch07\fig07_15.cpp(23) : error C2166: l-value specifies const object C:\cpphtp5_examples\ch07\fig07_15.cpp(24) : error C2166: l-value specifies const object C:\cpphtp5_examples\ch07\fig07_15.cpp(25) : error C2166: l-value specifies const object GNU C++ compiler error message: fig07_15.cpp:23: error: assignment of read-only location fig07_15.cpp:24: error: assignment of read-only location fig07_15.cpp:25: error: assignment of read-only location

!!! Dikkat!!! Dizilerin fonksiyon parametresi olarak referansla gönderildiğini ve dolayısıyla fonksiyon içinde değiştirilebilecegini unutursak beklemediğimiz sonuçlarla karşılaşırız. Bunun önüne geçebilmek için const ı kullanabiliriz.

Dizi İçinde Lineer Arama Yapma (Linear Search) Dizi içinde herhangi bir aranan değerin varolup olmadığı ya da var ise eğer hangi indeks değerine sahip olduğu bilinmek istenebilir. Lineer Arama (Linear Search) Dizinin herbir elemanı aranan değer ile karşılaştırılır. Aranan değerin dizinin ilk elemanı olması ihtimali, son elemanı olması ihtimali ile aynıdır. Aranan değerin dizi içerisinde olmadığını garanti edebilmek için sözkonusu değer dizinin tüm elemanları ile karşılaştırılmalıdır. Halihazırda sıralı olmayan küçük dizilerde arama yaparken kullanılabilen bir metoddur.

1 2 // Dizi icinde lineer arama yapma 3 #include <iostream> //cout, cin ve endl 4 using namespace std; 5 6 7 8 int LineerArama( const int [], int, int ); // prototip 9 10 int main() 11 { 12 const int DIZI_BOYUTU = 100; 13 int a[ DIZI_BOYUTU ]; 14 int aranandeger; // dizi icinde aranacak tamsayi 15 16 for ( int i = 0; i < DIZI_BOYUTU ; i++ ) 17 a[ i ] = 2 * i; 18 19 cout << "Aranacak tamsayiyi gir: "; 20 cin >> aranandeger; 21 22 23 int indeks = LineerArama( a, aranandeger, DIZI_BOYUTU ); 24

25 26 if ( indeks!= -1 ) 27 cout << "Aranan degerin dizideki indeksi: " << indeks << endl; 28 else 29 cout << "Aranan deger bulunamadi..." << endl; 30 31 return 0; 32 } 33 34 // Aranan degeri dizinin icindeki butun elemanlarla kiyasla. 35 // Buldugun an indeksi geri gonder. 36 // Bulamazsan geriye -1 degerini gonder. 37 int LineerArama( const int dizi[], int deger, int dizininboyutu ) 38 { 39 for ( int j = 0; j < dizininboyutu; j++ ) 40 if ( dizi[ j ] == deger ) // aradigini bulduysan 41 return j; // indeksi geri gonder 42 43 return -1; // aradigini bulamadiysan geriye -1 gonder 44 } Aranacak tamsayiyi gir: 36 Aranan degerin dizideki indeksi: 18 Aranacak tamsayiyi gir: 37 Aranan deger bulunamadi...

Çok Boyutlu Diziler (Multidimensional Arrays) Örneğin 2 boyutlu dizileri ele alalım.(matrisler) İçinde bilgi saklanan bir tablo gibi düşünülebilir. Satırlar (rows) ve sütunlar (columns) vardır. Dizinin elemanlarına iki indeksle ulaşılır. ([ x ][ y ]) Genellikle m tane satıra ve n tane sütuna sahip bir dizi m-by-n array diye adlandırılır. Bu tür diziler 2 den fazla boyuta da sahip olabilirler.

İki Boyutlu Bir Diziyi Deklare Etme ve İlk Değer Atama int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; b[ 0 ][ 0 ]=1 ve b[ 0 ][ 1 ]=2 b[ 1 ][ 0 ]=3 ve b[ 1 ][ 1 ]=4 int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; b[ 0 ][ 0 ]=1 ve b[ 0 ][ 1 ]=0 (ima ile) b[ 1 ][ 0 ]=3 ve b[ 1 ][ 1 ]=4

3 satır ve 4 sütuna sahip 2 boyutlu bir dizi

Çok Boyutlu Dizileri Fonksiyon Parametresi Olarak Kullanma Bir boyutlu dizilerde olduğu gibi ilk boyutun kapasitesi belirtilmez. Takip eden boyutların kapasitesi ise belirtilmelidir. Derleyici ancak bu yolla ikinci satıra geçmek için kaç eleman atlayacağını bilir. Örneğin : void DiziyiYAzdir( const int a[][ 3 ] ); Bu fonksiyon 2. satıra geçebilmek icin ilk satırın 3 elemanını atlamak zorundadır.

Çok Boyutlu Dizilerde Bilgi Manipülasyonu Genellikle for deyimi kullanılır. Örnek: Örnek: Sadece bir satırın elemanlarını modifiye etmek için: for ( int sutun = 0; sutun < 4; sutun++ ) a[ 2 ][ sutun ] = 0; Dizinin tüm elemanlarını modifiye etmek için: total = 0; for ( satir = 0; satir < 3; satir++ ) for ( sutun = 0; sutun < 4; sutun++ ) total += a[ satir ][ sutun ];

Bir Dizinin En Küçük ve En Büyük Elemanını Bulma #include <iostream> //cout ve endl #include <cstdlib> //rand() #include <ctime> using namespace std; //time(0) void KucuguBuyuguBul(const int [ ], int, int&, int&); //Fonksiyon prototipi int main() { //srand(time(0)); int enkucuk, //Icinde dizinin en kucuk elemanini saklayacak degisken enbuyuk; //Icinde dizinin en buyuk elemanini saklayacak degisken const int DIZI_BOYUTU=10; //Dizinin boyutunu saklayan sabit degisken int a[dizi_boyutu]; cout<< Dizinin Icerigi:\n"; for(int i=0;i<dizi_boyutu;i++) { a[ i ]=rand()%6+1; //Dizinin i. elemanina 1 ile 6 arasinda rastgele bir sayi ata } cout<<a[ i ]<<" "; cout<<endl;

Bir Dizinin En Küçük ve En Büyük Elemanını Bulma KucuguBuyuguBul(a, DIZI_BOYUTU, enkucuk, enbuyuk); cout<< Dizinin En Kucuk Elemani: <<enkucuk<<endl; cout<< Dizinin En Buyuk Elemani: <<enbuyuk<<endl; } return 0;

Bir Dizinin En Küçük ve En Büyük Elemanını Bulma //Kendine arguman olarak aldigi dizinin en kucuk ve en buyuk elemanini bulan //fonksiyonun tanimi (Geriye referansla birden fazla degerin donduruldugune dikkat ediniz!!!!) void KucuguBuyuguBul(const int b[ ], int dizininboyutu, int &minimum, int &maksimum) { minimum=b[0]; //Dizinin en kucuk elemaninin ilk eleman oldugunu varsay maksimum=b[0]; //Dizinin en buyuk elemaninin ilk eleman oldugunu varsay for(int i=1 ; i<dizininboyutu ; i++) //i nin 1 den basladigina dikkat ediniz!!!! { if(b[ i ] < minimum) { minimum=b[ i ]; } if(b[ i ] > maksimum) { maksimum=b[ i ]; } } }

Selection Sort Sıralama Algoritması ile Küçükten Büyüğe Sıralama (Ascending Sort) #include <iostream> //cout ve endl #include <cstdlib> //rand() using namespace std; void DiziyiSirala(int [ ], int); //Fonksiyon prototipi int main() { const int diziboyutu=10; int a[diziboyutu]; cout<<"siralanmamis Dizinin Icerigi:\n"; for(int i=0 ; i<diziboyutu ; i++) { a[ i ]=rand()%6+1; } cout<<a[ i ]<<" "; cout<<endl;

Selection Sort Sıralama Algoritması ile Küçükten Büyüğe Sıralama (Ascending Sort) DiziyiSirala(a, diziboyutu); cout<<"siralanmis Dizinin Icerigi:\n"; for(int i=0 ; i<diziboyutu ; i++) cout<<a[ i ]<<" "; cout<<endl; } return 0;

Selection Sort Sıralama Algoritması ile Küçükten Büyüğe Sıralama (Ascending Sort) //Kendisine arguman olarak aldigi diziyi kucukten buyuge dogru siralayan fonksiyonun tanimi void DiziyiSirala(int b[ ], int dizininboyutu) { int minimumunindeksi; int gecicidegisken; } for(int i=0;i<(dizininboyutu-1);i++) { } minimumunindeksi=i; for(int j=i+1;j<dizininboyutu;j++) { } //swap yap gecicidegisken=b[ i ]; if(b[ j ]<b[minimumunindeksi]) b[ i ]=b[minimumunindeksi]; minimumunindeksi=j; b[minimumunindeksi]=gecicidegisken;