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.
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 |
�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)
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.
�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 */