fpganedir.com'da ara

fpganedir mail

* Giriş

* Genel C Kuralları

* Değişken ve Sabitler

* Operatörler

 * Diziler (Arrays)

DİZİLER (ARRAYS)

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.

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.

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

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

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

 

Anasayfa | Fpga | VHDL | VHDL Sözlüğü | Embedded Sistem | Android | Sayısal Tasarım | Simulasyon | PCB | Örnekler | Forum | İletişim
Copyright © 2010-2013 FPGAnedir. All Rights Reserved.