D�Z�LER

Dizi Tan�m� ve Kullan�m�         Dizi Kullan�m�na �rnekler         Bir Diziyi Fonksiyona G�nderme       

Dizinin Boyutunu De�i�ken K�lma        S�ralama        �ok Boyutlu Diziler        Dizilerin Bellekte Saklanma Bi�imi

Yap�sal de�i�ken :Benzer verilerin tek bir de�i�ken alt�nda grupland�r�lmas�.

Dizi veri yap�s� :Ayn� tip verilerin toplan�p tek isim verilmesi.

1. Dizi Tan�m� ve Kullan�m�

Tip_Ad� de�i�ken[boyut];

�rne�in

float a[100];

Bu tan�mlamayla a adl� de�i�keni 100 reel de�erin sakland��� bir diziyi g�sterir. Bu 100 veriye a de�i�keni ile eri�ilir.

Dizinin herhangi bir eleman�na eri�mek veya de�i�tirmek i�in ka��nc� eleman oldu�unu g�sterir indis bilgisini vermek gerekir. �lk eleman�n indisi 0 d�r.

A[4] dizinin 5. eleman�

A[0] dizinin ilk eleman�

A[1] := 45; dizinin 2. eleman�na 45 atan�r

A[7] := A[7] + A[1]; dizinin 8. eleman�na kendisi ile 2. eleman�n toplam� atan�r

Dizinin eleman de�erler tan�mlama an�nda yap�labilir.

int a[10] = {25, 18, 20, 0, 29, 5, 4, 8,19,13}

0

1

2

3

4

5

6

7

8

9

25

18

20

0

29

5

4

8

19

13

2. Dizi Kullan�ma �rnekler

�rnek: Dizi elemanlar�na de�er ata, yazd�r.

/* 1-10 ars�ndaki say�lar�n karesini dizi elemanlar�na y�kle yazd�r */

main()

{

int a[10];

int i;

for (i=0; i<=9; i++)

a[i] = (i+1)*(i+1);

for (i=0; i<=9; i++)

printf("%d . eleman�n de�eri = %d\n", i, a[i]);

}

Ekranda ��kacak g�r�nt�

0 . eleman�n de�eri = 1

1 . eleman�n de�eri = 4

...

9 . eleman�n de�eri = 100

�rnek : Dizide ilk 20 Fibonacci say�y� olu�tur

/* ilk 20 Fibonacci f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */

#include <stdio.h>

main()

{

int fib[20];

int i;

fib[0] = 0;

fib[1] = 1;

for (i=2; i<=19; i++)

fib[i] = fib[i-1] + fib[i-2];

clrscr();

for (i=0; i<=19; i++)

printf("%d . Fibonacci say�s� = %d\n", i, fib[i]);

}

Ekranda ��kacak g�r�nt�

0. Fibonacci say�s� = 0

1. Fibonacci say�s� = 1

2. Fibonacci say�s� = 1

...

19. Fibonacci say�s� = 4181

3. Diziyi Bir Fonksiyona G�nderme

�u ana kadar ��renilen bilgi �er�evesinde fonksiyonlara g�nderilen parametrelerin i�eriklerinin fonksiyon i�erisinde de�i�tirilmesi m�mk�n de�ildir. Fonksiyona de�i�kenin de�eri g�nderilir. Fonksiyon i�erisindeki i�lemlerden parametre etkilenmez.

Dizilerde durum b�yle de�ildir. Normal kullan�mda dizi fonksiyona g�nderildi�inde elemanlar de�i�tirilebilir (referans). Dizinin sadece herhangi bir eleman� g�nderildi�inde ise de�eri de�i�tirilemez (de�er) Diziyi fonksiyona g�nderirken sadece ad�n� parametre olarak yazmak yeterlidir.

Notlar

- tan�mlama an�nda int a[10] = {13, 45 ..}; /* fazla eleman yaz�l�rsa hata olu�ur */

int a[ ]= 13, 45, 56}; /* boyut belirtilen de�er kadar olur */

- giri� yapt�rarak scanf("%d", &a[i]);

- do�rudan de�er atayarak a[i] = 4;

4. Dizinin Boyutunu De�i�ken K�lma

#define �ni�lemci direktifi (preprocessor directive)

Simgesel sabit tan�mlanmas�n� sa�lar. C dili deyimlerinden biri de�ildir (#include gibi). Kullan�m bi�imi

#define Sabit_Ad� De�eri

Program �al��t�r�ld���nda derleme i�lemi �ncesinde program i�erisinde Sabit_Ad� simgesinin ge�ti�i yerlere De�eri konur.

�rnek : 25 ki�ilik bir s�n�ftaki ��rencilerin s�nav sonu�lar�n� okuyup ortalamas�n� bulan program.

#include <stdio.h>

#define OGR_SAY 25

void giris(int [ ]);

float ortalama(int [ ]);

main()

{

int ogr[OGR_SAY];

clrscr();

giris(ogr);

printf("Ortalama = %f\n", ortalama(ogr));

}

void giris(int ogr[ ])

{

int i;

for (i=0; i<OGR_SAY; i++) /* 0 dan ba�lad��� i�in < kullan�ld� */

{

printf("%d. ��rencinin notunu gir : ",i+1);

scanf("%d", &ogr[i]);

}

}

float ortalama(int ogr[ ])

{

float x;

int i;

x = 0;

for (i=0; i<OGR_SAY; i++)

x = x + ogr[i];

return x / OGR_SAY;

}

(Bu fonksiyonlar�n yaz�ld��� farzediliyor)

5.S�ralama

Dizi elemanlar�n�n k���kten b�y��e veya b�y�kten k����e do�ru dizilmesi i�lemi. Farkl� performansa sahip bir�ok y�ntem vard�r. �imdilik en basit olanlardan biri incelenecektir.

Selection Sort (se�im)

Dizinin en k���k eleman� bulunur ve birinci eleman ile yer de�i�tirilir. Bu i�lem (n-1). elemana kadar tekrar edilir. Her ad�mda en k���k eleman dizinin kalan elemanlar�ndan bulunur. �rne�in a�a��da 4 elemanl� bir diziye y�ntemin uygulanmas� g�sterilmi�tir.

Buble Sort

Bu y�ntemde ard���k iki eleman kar��la�t�r�l�r. E�er �nceki eleman sonrakinden b�y�k ise elemanlar yer de�i�tirilir. Bu �ekilde dizi taran�r. E�er herhangi bir de�i�iklik yap�lm�� ise i�lem tekrar edilir.

Ba�lang��

1. ad�m

2. ad�m

3. ad�m

34

21

18

18

21

18

21

21

18

25

25

25

25

34

34

34

G�r�ld��� gibi, bu y�ntemde dizi s�raland�ktan sonra bir defa daha taran�yor.

6. �ok Boyutlu Diziler

�ok boyutlu bilgileri veya veri tablolar�n� saklamak i�in kullan�l�r. �ki boyutlu diziler daha s�k kullan�l�r. �rne�in; y�llara ve aylara enflasyon rakam�n�n takibi, matematikteki matris i�lemlerinin ger�eklenmesi, ��renciler ve ald�klar� derslerin takibi vb.

Tan�mlama bi�imi : �ki t�rl� yap�labilir.

Tip De�i�ken_Ad�[ indis1 ][ indis2 ][ indisn ];

�rne�in ;

float Enf[5][12];

Enf tipi iki boyutlu bir dizidir. Birinci boyut ( sat�r ) y�llar�, ikinci boyut ( s�tun ) aylar� g�sterir.

 

1.Ay

2.Ay

3.Ay

4.Ay

5.Ay

6.Ay

7.Ay

8.Ay

9.Ay

10.Ay

11.Ay

12.Ay

1

                       

2

                       

3

                       

4

                       

5

                       

C dilinde boyut say�s�nda bir s�n�r yoktur. Bilgisayar�n belle�i boyutu s�n�rlar.

7. Dizilerin Bellekte Saklanma Bi�imi

Eri�imin kolay olmas� i�in dizinin t�m elemanlar� pe� pe�e saklan�r. Burada �nce sat�r sonra s�tunlar (tan�mlan�� s�ras�na g�re) saklan�r .

 �rnek : �ki boyutlu dizi �zerine.

#include <stdlib.h>

#define SATIR 5

#define SUTUN 5

double enbuyuk(double [ ][SUTUN], int );

void matris_oku(double [ ][SUTUN]);

main()

{

double a[SATIR][SUTUN];

double b[SATIR]; /* satirlardaki en buyuk elemanlar */

double c[SATIR]; /* satirlardaki sutunlarin toplami */

int i, j;

matris_oku(a); /* Satirdaki elemanlarin toplamlarinin olusturdugu matris */

for (i = 0; i < SATIR; i++)

b[i] = enbuyuk(a,i);

for (i = 0; i < SATIR; i++)

{

c[i] = 0;

for (j = 0; j < SUTUN; j++)

c[i] = c[i] + a[i][j];

}

clrscr();

for (i = 0; i < SATIR; i++) {

for (j=0; j<SUTUN; j++)

printf("%3.0f ", a[i][j]); /* Bi�imli yazd�rma */

printf(" %4.0f %4.0f\n",b[i],c[i]);

}

}

double enbuyuk(double a[ ][SUTUN], int sat)

{

double r;

int i;

r = a[sat][0]; /* ilk eleman en buyuk */

for (i = 1; i < SUTUN; i++)

if (a[sat][i] > r)

r = a[sat][i];

return r;

} /* Function EnBuyuk */

void matris_oku(double a[ ][SUTUN])

{

int i, j;

for (i = 0; i < SATIR; i++)

for (j = 0; j < SUTUN; j++)

a[i][j] = random(10);

} /* matris_oku */