GirişDizi bir kümedir. Aynı tipteki verilere tek bir isimle erişmek için kullanılır. Bir dizi bildirildikten sonra, dizinin bütün elemanları bellekte peşpeşe saklanır
[1]. Bu yüzden dizilere tek bir isim altında çok sayıda değişken içeren bellek bölgesi de denir. Buna göre bir diziyi dizi yapan iki temel özellik vardır
[2]:
- dizi elemanların bellekte sürekli biçimde bulunması
- dizi elemanların aynı türden değişkenler olması
Dizilerin BildirimiBir dizi çok sayıda değişken barındırdığından, bunları birbirinden ayırdetmek için
indis adı verilen bir bilgiye ihtiyaç vardır. C Programlama Dili'nde, bir dizi hangi tipte tanımlanmış olursa olsun başlangıç indisi her zaman 0'dır.
Bir dizinin bildirim işleminin genel biçimi söyledir:
tip dizi_adı[
eleman_sayısı];
Örneğin, 5 elemanlı bazı kütle verilerini tutmak için kutle dizisi şöyle tanımlanabilir: float kutle[5];
Bu dizinin elemanlarına bir değer atama işlemi şöyle olabilir: kutle[0] = 8.471
kutle[1] = 3.683
kutle[2] = 9.107
kutle[3] = 4.739
kutle[4] = 3.918
NOT
1. elemanın indisi 0, 5. elemanın indisinin 4 olduğuna dikkat edin.
Bildirim sırasında dizilerin eleman sayısı tamsayı türünden bir sabit ifadesiyle belirtilmesi zorunludur. Örneğin:
int n=100;
int a[n];
şeklindeki tanımlama, dizi uzunluğunun değişken (n) ile belirtilmesi nedeniyle geçersizdir. Bunun yerine dizilerin eleman sayısı sembolik sabitlerle belirtmek mümkündür. Örneğin:
#define n 100
...
int a[n];
Bir dizinin bellekte kapladığı alan bayt cinsinden sizeof operatörü ile öğrenilebilir
[4]. Örneğin:
int a[5],b,c;
...
b = sizeof(a); /* bellekte kapladığı alan: b = 4*5 = 20 bayt */
c = sizeof(a)/sizeof(int); /* Dizinin boyutu : c = 20/4 = 5 */
Dizilere Başlangıç Değeri VermeBir diziye başlangıç değerleri aşağıdaki gibi kısa formda atanabilir:
float kutle[5]= { 8.471, 3.683, 9.107, 4.739, 3.918 };
int kilo[3] = { 25, 72, 94 };
double a[4] = { 10.0, 5.2, 7.5, 0.0};
Küme parantezlerinin sonlandırıcı
; karakteri ile bittiğine dikkat ediniz. Bir dizinin uzunluğu belirtilmeden de başlangıç değeri atamak mümkündür. Örneğin:
int a[] = { 100, 200, 300, 400 };
float v[] = { 9.8, 11.0, 7.5, 0.0, 12.5};
Derleyici bu şekilde bir atama ile karşılaştığında, küme parantezi içindeki eleman sayısını hesaplar ve dizinin o uzunlukta açıldığını varsayar. Yukarıdaki örnekte, a dizisinin 4, v dizisinin 5 elemanlı olduğu varsayılır.
Dizileri Yazdırma/Okumaprintf ve scanf fonksiyonları bir dizinin okunması ve yazdırılması için de kullanılır. Örneğin bir A dizisinin aşağıdaki gibi bildirildiğini varsayalım:
int A[10];
Bu dizinin elemanlarını klavyeden okumak için:
for(i=0;i<10;i++)
scanf("%d",&A
);
daha sonra bu değerlerini ekrana yazmak için:
for(i=0;i<10;i++)
printf("%d\n",A[i]);
Program 9.1, klavyeden girilen [i]n = 10 adet sayının ortalamasını hesaplar. Ortalama
![DİZİLER Denklem-ort](http://www1.gantep.edu.tr/~bingul/c/images/denklem-ort.gif)
formülü ile hesaplanabilir.
Program 9.1: 10 sayının ortalamasını hesaplar
[color=gray] 1: /* 09prg01.c: 10 tamsayının aritmetik ortalamasını hesaplar */ 2: 3: #include <stdio>
4: 5: #define n 10
6: 7: void main(void)
8: {
9: int i,x[n],toplam=0;
10: float ort;
11: 12: for(i=0;i<n> tcc 09prg01.c
C:\TC> 09prg01
$ gcc 09prg01.c -o 09prg01
$ ./09prg01
ÇIKTI
1. sayi : 1
2. sayi : 0
3. sayi : 9
4. sayi : 7
5. sayi : 2
6. sayi : 10
7. sayi : 11
8. sayi : 4
9. sayi : 6
10. sayi : 5
Sayilarin ortalamasi = 5.500000
Program 9.1 dizi kullanmadan da yazılabilirdi. Bazı dizi kullanmak kaçınılmaz olur. Porgram 9.2,
n = 10 tane sayının ortalamasını ve standart sapmasını hesaplar.
Standart sapma:
![DİZİLER Denklem-std_sap](http://www1.gantep.edu.tr/~bingul/c/images/denklem-std_sap.gif)
formülü ile hesaplanabilir, burada
![DİZİLER Denklem-ort](http://www1.gantep.edu.tr/~bingul/c/images/denklem-ort.gif)
dir.
Program 9.2: n=10 sayının ortalamasını ve standart sapmasını hesaplar
[color=gray] 1: /* 09prg02.c:
2: 10 tamsayının aritmetik ortlamasını ve standart sapmasını hespalar. */ 3: 4: #include <stdio>
5: #include <math>
6: 7: #define n 10
8: 9: void main(void)
10: {
11: int i,x[n];
12: int toplam=0;
13: float ort,std_sap=0.0;
14: 15: /* ortalama hesabı */16: for(i=0;i<n;i++)
17: {
18: printf("%d. sayi : ",i+1);
19: scanf("%d",&x
);
20:
21: toplam += x[i];
22: }
23:
24: ort = (float) toplam/n;
25:
26: /* standart sapma hesabı */
27: for(i=0;i<n> tcc 09prg02.c
C:\TC> 09prg02
$ gcc 09prg02.c -o 09prg02
$ ./09prg02
ÇIKTI
1. sayi : 7
2. sayi : 8
3. sayi : 9
4. sayi : 6
5. sayi : 5
6. sayi : 8
7. sayi : 8
8. sayi : 10
9. sayi : 11
10. sayi : 6
Ortalama = 7.000000
Standart sapma = 2.054805
Sıralama (Sorting)Bazı uygulamalarda bir grup sayının büyükten küçüğe, veya küçükten büyüğe, doğru sıralanması gerekebilir. Bu tip sıralama problemleri için çeşitli algoritmalar geliştirilmiştir. Sıralama mantığını anlamadan önce bir dizinin en büyük (veya en küçük) elemanının nasıl bulunduğunu anlamak gerekir. Program 9.3 bir dizinin en büyük elemanını bulup ekrana yazar.
Program 9.3: [i]Bir dizinin en büyük elemanının bulunuşu
[color=gray] 1: /* 09prg03.c:
2: Bir dizinin en büyük elemanını bulup ekrana yazar */ 3: 4: #include <stdio>
5: 6: void main(void)
7: {
8: int a[10] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
9: int k,eb;
10: 11: eb = a[0];
/* ilk eleman en büyük kabul ediliyor */12: 13: for(k=1;k<10>eb) eb = a[k];
15: 16: printf("En buyuk eleman = %d\n",eb);
17: }
[color:c1a9=gray:c1a9]18:
En büyük sayıyı bulan bu algoritma oldukça kolaydır. 11. satırda eb = a[0]; ataması ile dizinin ilk elemanının en büyük olduğu varsayılır. Daha sonra büyüğe rastladıkça (14. satırda) eb = a[k]; ile eb değişmektedir.
DERLEME ve ÇALIŞTIRMA MS DOS (Turbo C)
Linux
C:\TC> tcc 09prg03.c
C:\TC> 09prg03
$ gcc 09prg03.c -o 09prg03
$ ./09prg03
ÇIKTI
En buyuk eleman = 900
Program 9.3 bir dizinin en büyük elemanını bulur. En büyük elemanın kaçıncı indis (eleman) olduğu sorgulanmak istendiğinde: programdaki koşul yapısını aşağıdaki gibi değiştirmek yeterlidir. eb değiştikçe, i değişkeni en büyük elemanın indisini tutar.
for(k=0;k<10>eb ){
eb = a[k];
i = k;
}
n elemanlı bir dizinin, elemanlarını büyükten küçüğe doğru sıralamak için çok popüler iki algoritma aşağıda verilmiştir
[2].
Seçerek Sıralama (Selection Sort):En büyük elemanı bul başa koy biçimindeki sıramadır. Algoritmanın uygulaması Program 9.4'de gösterilmiştir.
Bu algoritmada kullanılan kombinasyon sayısı (algoritmanın karmaşıklığı): n*(n-1)/2 dir.
Program 9.4: Seçerek Sıralama (Selection Sort) Algoritması
[color=gray] 1: /* 09prg04.c:
[color=gray] 2: Seçerek Sıralama (Selection Sort) Algoritması ile bir
[color:c1a9=gray:c1a9] 3: dizinin elemanlarını büyükten küçüğe dogru sıralar */
4: 5: #include <stdio>
6: 7: #define n 10
8: 9: void main(void)
10: {
11: int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
12: int i,j,k,eb;
13: 14: printf("Once : ");
15: for(k=0;k<n;k++)
/* Ekrana yaz */16: printf("%5d ",a[k]);
17: 18: for(k=0;k<n;k++)
/* Sırala */19: {
20: eb = a[k];
21: i = k;
22: 23: for(j=k+1;j<n>eb){
25: eb = a[j];
26: i = j;
27: }
28: a
= a[k];
29: a[k] = eb;
30: }
31:
32: printf("\nSonra: ");
33: for(k=0;k<n> tcc 09prg04.c
C:\TC> 09prg04
$ gcc 09prg04.c -o 09prg04
$ ./09prg04
ÇIKTI
Once : 100 -250 400 125 550 900 689 450 347 700
Sonra: 900 700 689 550 450 400 347 125 100 -250
Kabarcık Sıralama (Bubble Sort):
Yanyana elemanları karşılaştırarak yer değiştir biçimde sıralamadır. Algoritmanın uygulaması Program 9.5'de gösterilmiştir.
Bu algoritmanın karmaşıklığı: (n-1)2 dir.
Program 9.5: [i]Kabarcık Sıralama (Bubble Sort) Algoritması
[color=gray] 1: /* 09prg05.c:
[color=gray] 2: Kabarcık Sıralama (Bubble Sort) Algoritması ile bir
[color:c1a9=gray:c1a9] 3: dizinin elemanlarını büyükten küçüğe dogru sıralar */
4: 5: #include <stdio>
6: 7: #define n 10
8: 9: void main(void)
10: {
11: int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
12: int j,k,gecici;
13: 14: printf("Once : ");
15: for(k=0;k<n;k++)
/* Ekrana yaz */16: printf("%5d ",a[k]);
17: 18: for(k=0;k<n-1;k++)
/* Sırala */19: for(j=0;j<n-1;j++)
20: if(a[j]<a[j+1]){
21: gecici = a[j];
22: a[j] = a[j+1];
23: a[j+1] = gecici;
24: }
25: 26: printf("\nSonra: ");
27: for(k=0;k<n> tcc 09prg05.c
C:\TC> 09prg05
$ gcc 09prg05.c -o 09prg05
$ ./09prg05
ÇIKTI
Once : 100 -250 400 125 550 900 689 450 347 700
Sonra: 900 700 689 550 450 400 347 125 100 -250