Programlamanın temellerinden olan C++ üzerine başlattığımız makalelere yeni bir bölüm ile devam ediyoruz. Bu makalemizde "İndsileri kullanmak", "Sizeof, Diziler ve Adresler", "Sözcükler", "Çok boyutlu Diziler" ve "Karakter Dizinleri" konularına değineceğiz.
İNDİSLERİ KULLANMAK
Bir dizi tanımlandığı zaman
İnt stok[100]; Bu dizinin elemanları için ardışık bir alan açılır. Bu alanların her birine indisi kullanarak erişebiliriz.
İnt i=0; Stok[5]=3; Cout<<stok[i];
Yukarıdaki örnekte olduğu gibi. Ancak dikkat edilmesi gereken şey dizi boyutunu geçmemektir. Sık yapılan bir hata Cont int boyut=100; Double dizi[boyut]; //… dizi [boyut]=x;
şeklindedir. Burada dizi elemanlarının indisleri 0 dan 99 a kadarken, biz indisi 100 olan bir elemana erişmeye çalışıyoruz. Bazı derleyiciler bu durumu doğrudan hata olarak rapor ederlerken, bazıları da değişken boyutlu diziler varsaydıkları için bu durumu görmezden gelirler. Bu durumda dikkatli olmak programcının sorumluluğundadır.
Dizi indisleri birer sabit yada değişken olabileceği gibi, int tipine dönüşe herhangi bir ifade de olabilir.
İnt x,y,z; İnt a[100]; //… a[x-y+z]=5; Tabii, yine bu ifadelerin dizi sınırlarını aşıp aşmayacağı derleyici tarafından bilinmez, çünkü bu değişkenlerin değerleri değerleri Program akışı sırasında değişebilir.
SİZEOF, DİZİLER VE ADRESLER
Sizeof işleci dizilerle de kullanılabilir. Örneğin, aşağıdaki program ile tanımlanan bir dizinin boyutunu byte olarak görebiliyoruz.
// 4_13_1.cpp #include <iostream> void main() { int a[10]; cout<<” a dizisinin boyutu “<<sizeof (a)<<endl; }
Dizilerin içerdiği elemanların adresleri tek tek elde edilebilir. Bu aşağıdaki şekilde yapılır.
&a[i]
ifadesi, a dizisinin i indisli elemanının adresini verir. Aşağıdaki program bunu göstermektedir.
//4_13_2.cpp
#include<iostream> #include<conio.h>
void main() { int a[10] ; cout<<”sizeof (int) is “<<endl; for (int i=0;i<10;i++) cout<<”&a[“<<i<<”]=”<<&a[i]<<endl; }
Bu program derlendikten sonra aşağıdaki çıktıyı vermektedir.
Sizeof(int) is 4 &a[0]=0x0064fddc &a[1]=0x0064fde0 &a[2]=0x0064fde4 &a[3]=0x0064fde8 &a[4]=0x0064fdec &a[5]=0x0064fdf0 &a[6]=0x0064fdf4 &a[7]=0x0064fdf8 &a[8]=0x0064fdfc &a[9]=0x0064fd00
Onaltılı sayı düzeni ile ilgili bir bilginiz varsa, bu sayıların farkı hemen algılanmıştır. Ancak kalın yazılan ikililerde verilen sayıların arasındaki farkın 4 olduğu diğer satırlardan kolay anlaşılıyor.
Yani, gerçekten de bir dizinin elemanları bellekte ardışık yerlerde saklanmaktadır.
SÖZCÜKLER
C ve C++’da sözcükler için (strings) için ayrı bir temel tip yoktur. Ancak gerek işaretçiler, gerekse diziler kullanılarak sözcüklerle ilgili işlemler kolaylıkla yapılır.
char x[8]=”merhaba”; char y[8]={‘m’, ’ e’, ’r’, ’h’, ’a’, ’b’, ’a’ , ‘\0’ };
dizilerinin içerikleri tamamen aynıdır.
ÇOK BOYUTLU DİZİLER
Şimdiye kadarki örnekler hep tek boyutlu yani elemanlarına tek indizle ulaşılabilen diziler içeriyordu. İki boyulu dizi ise aslında, elemanları tek boyutlu diziler olan bir dizidir - matris. Tanımlanması ise tek boyutlu dizi gibi - ama iki boyutu da vererek olur:
veritipi diziadi[boyut1][boyut2]
İki boyutlu diziler, boyutlardan birisinin satır sayısını, diğerinin ise sütun sayısını gösteren bir matris olarak kabul edilebilir.
int t, i, num[3][4];
for (t=0; t<3; t++) for (i=0; i<4; i++) num[t] = (t*4)+i+1;
kod parçası num adlı iki boyutlu diziye 1-12 arası sayılar atar ve bunlar şu şekilde yerleştirilir:
0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 Bu dizi hafızaya yerleştirilirken önce satır satır yerleştirilir. (Çizim)
İki boyultu dizilerin tanımlandığı gibi, ikiden fazla boyuta sahip diziler de tanımlanabilir:
veritipi diziadi[boyut1][boyut2]…[boyutn]
Fakat bu kullanım çok gerekmedikçe kullanılmaz çünkü doğru erişimi gerçekleştirmek oldukça zordur. Const int satır=5; Const int sutun=3;
int veri [satır][sutun]= {0,1,2, 3,4,5, 6,7,8, 9,10,11, 12,13,14 };
Burada 5 satır ve 3 sutundan oluşan bir iki boyutlu dizi tanımlanmış.
ÖRNEK: Bir uçak benzetimi(simulasyon) yazarsak, yerküredeki girinti ve çıkıntıları, örneğin dağları bir şekilde saklamanız gerekli. Coğrafyadan hatırlayacağınız eş yükselti eğrileri bunun için çok uygun olmayabilir. Bunun yerine bütün haritayı karelere ayırmayı önerebiliriz. 100 200 200 100 100 200 300 200 100 100 300 200 100 100 100 100 Burada coğrafi haritayı 16 eşit parçaya ayırıp, her parçanın solda yükseklik tanımını verdik. Şekle bakarsanız karmaşık bir haritanın son derece küçük bir veri miktarı ile simgelenecek hale geldiğini görürsünüz. Bu veri, gerçeği tam yansıtmasa bile iş görecek durumdadır.
Peki biz bu veriyi nasıl saklamalıyız? İki boyutlu bir dizimiz olsaydı ve iki ayrı indeks kullanarak iki ayrı koordinat sistemindeki değerleri verebilseydik, işimizi görürdü. İşte c++’da da biz aynen bunu gerçekleştireceğiz.
ÖRNEK: #include<iostream.h> #include<conio.h> const int boyut=4; int dizi[boyut][boyut];
main() { clrscr(); int a; for (int i=0;i<boyut;i++) { for (int k=0;k<boyut;k++) { cout<<"yükseklikleri giriniz :"; cin>>a; dizi[i][k]=a; } }
cout<<"----------------------\n"; for (int t=0;t<boyut;t++) { for (int r=0;r<boyut;r++)
cout<<dizi[t][r]<<" "; cout<<"\n"; }
getch(); return 1; }
Karakter Katarı Fonksiyonları ve Karakter Dizileri
Karakter katarı veri tiplerinin yönetim biçimlerinden dolayı, fonksiyon argümanı olarak karakter dizilerini kullanan birçok fonksiyon burada incelenmemiştir. Bu fonksiyonlar özellikle gets( ), puts( ), fgets( ), fputs( ),sprintf( ), stpcpy( ), strcat( ), strncmp( ) ve strln( ) fonksiyonlardır. Bu fonksiyonları anlatmanın en kolay yollarından biri, birkaç örnek program göstermektir.
gets( ), puts( ), fgets( ), fputs( ) ve sprintf( )
strcpy( ) fonksiyonu bir karakter katarının (szsource_string) içeriğini ikinci karakter katarına (szdestination_string)kopyalar.
strcat( ) fonksiyonu iki karakter katarını birleştirir. İki karakter katarı da null sonlandırmalı olmalıdır ve sonucun kendiside null sonlandırmalıdır. Aşağıdki program strcpy( ) fonksiyonu bilginizin üzerine kuruludur ve strcat( ) foksiyonunu tanıtır:
// // strcat.cpp :Konsol uygulaması için giriş noktası tanımlanıyor. // strcat fonksiyonunu gösteren ir c++ programı // copyright (c) Chris H. Papas and William H. Murray, 2001 // #include <string.h> using namespace std #define iSTRING_SIZE 35
int main (int argc, char* argv[]) { char szgreeting[]= “Good morning”, szname[]=”Carolyn,”, szmessage[iSTRING_SIZE]; strcpy(szmessage, szgreeting); strcat(szmessage, szname); strcat(szmessage,”how are you?”); cout<<”\n<<szmessage;
return(0); }
Bu örnekle ilk değer ataması szgreeting ve szname değişkenlerine yapılmış, szmessage değişkenine yapılmamıştır. Daha sonra strcat( ) fonksiyonu, szname (“carolyn,”) ile “Good morning” karakter katarını birleştirir ve sonuç, szmessage içinde saklanır. Son strcat( ) fonksiyon çağrısı, bir karakter katarı sabitinin bir karakter katarına nasıl eklenebildiğini gösteriyor. Burada “how are you?”, szmessage güncel içeriğine ekleniyor (“good morning caroline,”). Program aşağıdaki çıktıyıverir:
Good morning Carolyn, how are you?
strcmp( ) İki sözcüğün (iki karakter katarının) aynı olup olmadığını kontrol etmek için kullanılır. Bu fonksiyon büyük/küçük harf duyarlı değildir.
strlen( ) fonksiyonu çok yararlıdır. İşaret edilen karakter katarındaki, null sonlandırıcısı hariç karakter sayısını döndürür. Faruk Alkaya Selçuk Üniversitesi - Teknik Eğitim Fakültesi
- turkstudent.net
- programlama.com
- mutasyon.net
- papatya.gen.tr
- VİSUAL C++.NET
- Chris H.Pappas , William H. Murray,III ISBN: 975-297-217-9
- C++ İLE NESNE TABANLI PROGRAMLAMA Bora GÜNGÖREN
|
C++ Dersleri 12 Yazar nurcanela açık 2006-10-09 13:00:58 "your computer is in danger" ne demek? Ekranım karardı ve bu ibare var yardım edin.rnrn
Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır
| C++ Dersleri 12 Yazar kolcu açık 2006-10-09 13:10:51 cevap bu konuda....rnrnWindows İpucuları | C++ Dersleri 12 Yazar Okuyucu açık 2006-11-03 15:00:53 Bilgisayarına Virüs Girmiş yada aşırı ısınmış olabilir. |
Powered by AkoComment 2.0! |