Giriş

Orijinalini görmek için tıklayınız : C'de Diziler(Arrays)


Code
12 Ekim 2015, 21:46
Diziler elemanları aynı tür değerlerden oluşan veri yapılarıdır. Dizi elemanlarının her biri dizi içerisindeki konumlarına göre ayrı ayrı seçilebilir ve üzerlerinde işlem yapılabilir.
C dilinde tek boyutlu ve çok boyutlu olmak üzere iki çeşit dizi bulunur.
Tek Boyutlu Diziler
En basit dizi türüdür. Bu tür dizilerin elemanları kavramsal olarak düzenleniş tek bir satırdan oluşur. Örneğin aşağıda b adında tek boyutlu bir diziyi görselleştirebiliriz.
[Only Registered Users Can See Links]
Bir dizinin program içerisinde kullanılabilmesi için bildiriminin yapılması gerekir. Dizinin bildirimi ile dizi ismi ile birlikle dizi elemanların sayısı ile türü belirtilir.
Örneğin aşağıda karakter türünde 5 elemandan oluşan adres adında bir dizi tanımlamış oluruz.
char adres[5];
Dizinin herhangi bir elemanına erişmek için, dizinin ismi ile köşeli parantez içerisinde dizi elemanının yerini gösteren indeks numarasını yazmak yeterlidir. İndeks numarası, 0 ile dizi boyutunun bir eksiğine eşittir. Örneğin yukarıdaki adres[5] örneğini incelediğimizde dizinin indeksi 0 ile 4 arasında olur. Dizi elemanlarının gösterimi ise adres[0], adres[1]… adres[4] olur.
[Only Registered Users Can See Links]
Örnek
Aşağıdaki kod parçasında adres dizisinin 3. elemanına 'c' karakteri atanıyor ve printf fonksiyınu ile bu değer ekrana gönderiliyor.
adres[2]=’c’;
printf(“Adres gostergesi = %c”, adres[2] );
For döngüsü ile dizi arasında yakın bir ilişki bulunur. Örneğin aşağıdaki örnekte dizinin her bir elemanına ‘0’ karakteri atanır.
for(i = 0;i < dizi_boyutu;i++)
adres[i]=’0’;
Örnek
Aşağıdaki kod parçasında sivas olarak ilk değer girilen adres dizisinin her bir karakteri ekrana gönderiliyor.
adres[5]=”sivas”;
for(i = 0; i < 5; i++)
printf(“%c”, adres[i]);
Örnek
Aşağıdaki örnekte 10 elemana sahip bir dizinin elemanlarının toplamını veren bir kod bulabilirsiniz.
#define dizi_uzunlugu 10
int sayi[dizi_uzunlugu]
int toplam;
for(i = 0; i < dizi_boyutu; i++)
toplam+=sayi[i];
for döngüsü kullanılırken döngünün nerede bitirileceğine dikkat edilmesi gerekir. for(i = 0; i < =dizi_boyutu; i++) ifadesi bazı derleyicilerde döngünün yanlış çalışmasına neden olacaktır.
Dizi indeksi sonucu tamsayı olan herhangi bir ifade de olabilir. Eğer indeks olarak ifade kullanılıyorsa, ifade sonucunun 0 ile (dizi boyutu-1) aralığında olmasına dikkat edilmelidir.
adres[sayi*2 - i]
Diziye İlk Değer Atama
Bildirimi esnasında diziye ilk değer ataması yapılabilir. Dizilere değer atama işleminin en yaygın biçimi değerlerin süslü parantez içerisinde aralarında virgül konularak yazılması şeklindedir. Bu şekilde yapılan ilk değer atamasında dizi elemanlarına sırasıyla parantez içerisindeki değerler atanır.
char adres[5]= {‘s’,’i’,’v’,’a’,’s’};
Yukarıdai bildirimi yapılan dizinin elemanlarının alacağı değerler aşağıdaki gibi olur.
adres[0]=’s’; adres[1]= ‘i’; adres[3]=’v’; adres[4]=’a’; adres[5]=’s’;
Örnek
int sayi[3]={3,2,1};

Eğer bildirim esnasında ilk değer olarak atanan değerler dizinin eleman sayısından az ise dizinin diğer elemanları varsayılan olarak 0 değerini alır.
Örnek
int sayi[8]={1,2,3,4};
bu dizinin elemanlarının ilk değerleri
int sayi[8]={1,2,3,4,0,0,0,0}; şeklinde olur.
Bu özellik bir dizinin bildirimi esnasında bütün elemanlarını 0 yapmak için kullanılır.
int sayi[8]={0}; //sayi dizisinin bütün elemanlarını 0 yap.

Dizinin bildirimi esnasında ilk değer olarak boş girilmesi uygun değildir. Bu yüzden ilk değer ataması gerekiyorsa yalnızca 1 tane 0 yazılması uygundur.
int sayi={ }; Yanlış
int sayi{0};
İlk değer atamasında atanan değerlerin dizinin eleman sayısından fazla olması da uygun değildir. Bu durumda derleyici program fazla olan değerleri göz ardı edecektir.
char adres[5]= {‘s’,’i’,’v’,’a’,’s’,’m’,’n’,’k’};
Yukarıdaki ifade de m,n ve k karakterleri derleyici tarafından işleme alınmayacaktır.
İlk değer ataması yapılan dizilerin bildirimleri esnasında dizi boyutunun yazılmasına gerek yoktur. Bu durumda derleyici program, dizinin boyutunu atanan değerlerin sayısından anlayacaktır. Böyle bir durumda dizinin bütün değerlerine atama yapılması gerekir.
int sayi[]={4,5,6,7,8};
Dizinin Belli Elemanlarına İlk Değer Ataması
Bazen dizinin yalnızca bazı elemanlarına atama yapılması gerekebilir. Bu durumda atama dizi elemanın indeks numarası kullanılarak yapılır. Bu atama şeklinde dizi elemanları sırayla yazılmasına gerek yoktur.
int sayi[10]={ [1]=5, sayi[8]=9, sayi[3]=7 };

Dizi işlemlerinde sizeof operatörünün kullanılması
Sizeof operatörü ile bir dizinin bellekte kapladığı alan bayt olarak hesaplanabilir. Örneğin char adres[5] şeklinde bildirimi yapılmış bir dizinin sizeof(adres) işlemi sonucu 5 olur. int sayi[5] şeklinde bildirimi yapılmış bir dizinin sizeof(sayi) işlemi sonucu 20 olur.
Ayrıca dizinin her bir elemanının bellekte kapladığı alan da hesaplanabilir. Örneğin sizeof(adres[1]) işlemi sonucu 1 , sizeof(sayi[1]) sonucu ise 4 olacaktır.
Bir dizinin boyutu sizeof(dizi /sizeof(herhangi bir dizi elemanı) işlemiyle bulunabilir.
Örnek:
Aşağıdaki kod parçası ile 5 elemanı bulunan tamsayı türündeki bir türün bütün elemanları 10 yapılır.
for(i=0 ;i<sizeof(sayi)/ sizeof(sayi[0]); i++)
sayi[i]=10;
Yukarıdaki teknik sayesinde dizinin uzunluğu sonradan değiştirilse bile işlem sonucu değişmeyecektir.
Çok Boyutlu Diziler
Birden fazla boyutlu dizilerdir. Aşağıda 5x7 kapasitesinde iki boyutlu bir dizi örneği görebilirsiniz.
int a[5][7]
Bu dizinin gösterimi aşağıdaki gibidir.
[Only Registered Users Can See Links]
Çok boyutlu dizilerde dizi elemanlarına ulaşım için indeks numaraları kullanılır. Dizide dizinin boyutu kadar indeks numarası bulunur.
Örneğin a çok boyutlu dizisinin 2 . satır 3. sütununda ki elamanına ulaşmak için a[2][3] yazılır.
Her ne kadar a[5][7] dizisini yukarıdaki gibi görselleştirilse de, dizinin gerçek bellekte saklanması biraz faklıdır. C dizileri bellekte satır sırasını baz alarak saklar. Örneğin yukarıdaki a dizisi bellekte aşağıda verilen şekilde saklanır.
[Only Registered Users Can See Links]
Çok boyutlu dizilerde işlemler için genelde iç içe geçmiş for döngüsü kullanılır.
Örnek:
Bu örneğimizde birim matris oluşturalım. ( Birim matris, köşegeni (diagon) 1 ve geri kalan sayıları 0 olan karesel matristir)
#define N 10
int birim_matris[N][N];
int i,k;
for(i=0; i<N; i++)
{
for(k=0; k<N; k++)
{
if (i==k)
birim_matris[i][k]=1;
else
birim_matris[i][k]=0;
}
}
Çok Boyutlu dizilere ilk değer ataması
Çok boyutlu dizinin bildirimi sırasında diziye ilk değer ataması yapılabilir.
Örnek:
Aşağıdaki gösterimde iki boyutlu diziye yapılmış ilk değer ataması yapılmıştır. Bu atamada a dizisinin ilk elemanı olan a[0][0] değeri
int a[3][4] = { { 1, 1, 1, 0}, // a[0] satırındaki elemanlara atama yapılır.
{ 1, 0, 1, 0}, // a[1] satırındaki elemanlara atama yapılır.
{ 0, 1, 1, 0} }; // a[2] satırındaki elemanlara atama yapılır.
İlk değer atamasında atama yapılmamış elemanlar 0 ile doldurulur. Aşağıdaki örnekte a[0][4]’e ilk değer ataması yapılmadığı için bu değer 0 olur. Ayrıca a[3] satırı için atama yapılmadığı için bu satırın bütün elemanları 0 olur.
int a[3][4] = { { 1, 1, 1},
{ 0, 1, 1, 0} };
İlk değer atamasında satırlara karşılık gelen süslü parantezler yazılmayabilir.
int a[3][4] = { 1, 1, 1, 0,
1, 0, 1, 0,
0, 1, 1, 0 };
Yukarıdaki dizi bildirimini aşağıdaki gibi yazabiliriz.
int a[3][4] = { 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0 };
Dizi bildirimi esnasında sadece istenilen elemanlara ilk değer ataması yapılabilir. Atama yapılmayan değerler varsayılan olarak 0 değerini alır.
int a[3][4]= {[1][2]=10, [3][4]=20}
Örnek:
Bu örneğimizde girilen bir sayının tekrar eden rakamı varsa"Tekrar eden rakam var", yoksa "Tekrar eden rakam yok" ifadesini ekrana göndereceğiz.
Örneğin 354321 sayısı girildiğinde program “Tekrar eden rakam var” ifadesini ekrana gönderecektir.(3 den dolayı)
#include "stdio.h"
#define var 1
#define yok 0
int rakam_gorulme[10]= {yok};
long int sayi;
int rakam;
int main(void)
{
printf("Bir sayi giriniz\n\r");
scanf("%ld",&sayi);
while(sayi>0)
{
rakam = sayi % 10;
if (rakam_gorulme[rakam]) break;
rakam_gorulme[rakam]=var;
sayi/=10;
}
if (sayi>0)
printf("Tekrar eden rakam var");
else
printf("Tekrar eden rakam yok");

return 0;
}
Örnek;
Yukarıdaki örneği biraz genişletelim ve tekrar eden rakamları ekrana yazdıralım. Örneğin 354321 sayısı girildiği zaman ekrana 3 rakamını yazalım.


#include "stdio.h"
#define yok 0
#define var 1
#define tekrar 2
int rakam_gorulme[10]= {yok};
long int sayi;
int rakam;
int i;
int main(void)
{
printf("Bir sayi giriniz\n\r");
scanf("%ld",&sayi);
while(sayi>0)
{
rakam = sayi % 10;
switch (rakam_gorulme[rakam])
{
case yok:
rakam_gorulme[rakam]=var;
break;
case var:
rakam_gorulme[rakam]=tekrar;
break;
default:
break;
}
sayi/=10;
}
for(i=0; i<10; i++)
{
if(rakam_gorulme[i]==tekrar)
printf(" %d\n\r",i);
}
return 0;
}


Kaynak:FPGA Nedir - FPGA Hakkında Herşey ([Only Registered Users Can See Links])