DİZİLER Dizi Nedir? Aynı türden nesnelerin oluşturduğu, bellekte bitişik bir biçimde bulunan veri yapısına dizi denir.mesela alfabe diye bir dizi tanımlarız, harfleri a,b,c,d... diye sıralarız.dizinin faydası, aynı mantıksal ilişki içindeki nesnelerin bir arada tutulmasıdır.örneğin kullanıcıdan 100 tane değer girmesini istediğimizde her bir değer için bir değişken tanımlamamız gerekirdi. int a,a1,a2... a99; diye.mümkün ama oldukça zahmetli. Bunun yerine int a[100] yazdığımızda bize bellekten 100 tane int değişken için alan ayrılıyor. Değişkene ulaşırken onun adını yazarız, dizilerde de bu böyledir aşağı yukarı. Tek fark, dizinin adıyla beraber elemanın numarasını da yanında yazarız. Örneğin d dizisinin 40. elemanını çağırmak için d[39] yazarız. 40 değil de 39 yazmamızın nedeni C programlama dilinde dizilerin 0 dan başlamasıdır.yani bir dizinin ilk elemanı d[0] dır. O nedenle ulaşmak istediğimiz elemanın bir eksiğini yazarız. a dizisinin 40.elemanı, a[39]; 100.elemanı a[99] ile çağırırız. Şimdi basit bir örnek verelim: /*5 sayinin ortalamasini alan program*/ #include <stdio.h> int dizi[5]; float toplam=0; float ortalama=0; for(i=0;i<5;i++) printf ("%d.degeri giriniz.. ", i+1); scanf("%d", &dizi[i]); toplam += dizi[i]; ortalama = toplam/5; printf("ortalama %.5f",ortalama); return 0;
Bu programın cıktısı şu şekilde olacaktır : Bu programda kullanıcıdan 5 değer istiyoruz, daha sonra bunların ortalamasını alıyoruz. Her değer için bir int değişkeni kullanmak yerine int dizi[5] yaparak bu işi tek satırda hallediyoruz. ------------------------------------------- Bir dizi tanımlarken onu 2 veya daha fazla boyutlu da tanımlayabiliriz Örneğin: int dizi [4][3] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; int dizi[3][5][4]; int dizi[1][5]; gibi, bu 1x5 lik bir matris oluyor aynı zamanda. Dizilere Değer Atama Bir değişken tanımlarken ona değer atayabiliriyoz.mesela int a = 2; diyoruz. Aynı şekilde diziyi tanımlarken elemanlarına değer atayabiliriz. int dizi[5] = 1,2,6,7,9 char name[ ] = O, z, a, n ; char city[5] = OZAN ; //HATALI char city[4]= OZAN ; GEÇERLİ İlk değer tanımı yapacaksanız eleman sayısı kısmını boş bırakabilirsiniz. int dizi[ ] = 1,2,6,7,9 şeklinde yapabilirsiniz.derleyici atanmak istenen değer sayısına bakar ve ona göre dizinin boyutunu belirler.
Dizi elemanlarına ilk değer verilmesinde kullanılan ifadeler, sabit ifadeleri olmalıdır. int a[10] = c, c + 3, d + 2; gibi bir ilk değer verme işlemi derleme zamanı hatası oluşturur. Diyelim ki elimizde 5 elemanlı bir dizi var biz bunun ilk elemanının değerini 3 diye atadık.diğerlerini atamadık.programı derleyip printf() ile diğer elemanları yazdırdığımızda hepsinin 0 olduğunu göreceğiz.yani int dizi[5]=3; yaparsak ilk eleman 3, diğerleri 0 olmuş olur. Derleyici değer atanmayan elemanlara otomatik olarak 0 değerini verir.yalnız; int dizi[5]; yapıp hiçbir elemanın değerini atamazsak bu sefer derleyici elemanlara 0 değerini atamaz. Bellekte, o dizinin olduğu yerde hangi değer varsa onu verir. Bir örnekle görelim : #include <stdio.h> main () int dizi[5]; for(i=0;i<5;i++) printf("%d\n",dizi[i]); Bu programın cıktısı şu şekilde olacaktır : Burada 5 elemanlı bir dizi tanımladık ama elemanlara herhangi bir değer atamadık. Dolayısıyla bellekte dizinin olduğu yerde hangi değer varsa elemanlara o atanmış oldu. Dizilerle ilgili diğer bir örnek:
//Maas ortalaması bulan program #include <stdio.h> #define calisansayisi 10 int maaslar[calisansayisi]; int i,y=0,toplam=0; float ortalama; while(1) for(i=0;i<10;i++) printf("%d.kisinin maasi\n",i+1); scanf("%d",&maaslar[i]); toplam +=maaslar[i]; ortalama=toplam/10; printf("ortalama = %f\n",ortalama); for(y=0;y<10;y++) if(maaslar[y]<ortalama) printf("%d.calisanin maasi ortalamanin altinda\n",y+1); else printf("%d.calisanin maasi ortalamanin ustunde\n",y+1); printf("yeni degerler giriniz\n"); Bu programın cıktısı aşağıdaki gibidir.
//mutlak deger programi #include<stdio.h> void mutlak( int[], int ); int a; int dizi[] = -32, 13, -13, -6, 0, 8 ; mutlak( dizi, 6 ); for( a = 0; a < 6; a++ ) printf("%d ", dizi[a]); void mutlak( int dizi[], int buyukluk ) int c; for(c = 0; c < buyukluk; c++) if( dizi[c] < 0) dizi[c] *= -1; Programın çıktısı : Dizilerin fonksiyonlara aktarımı Uzun uzun anlatmak yerine örnek üzerinde bakalım #include<stdio.h> //once fonksiyonların prototipleri float maksimum( float [ ], int ); float minimum( float [ ], int ); float ortalama( float [ ], int ); // 8 elemanli bir dizi tanimliyoruz ve degerler atiyoruz float sayilar[ 8 ] = 23.44, 48.98, 9.06, 15.1, 13, 2.455, 3.44, 2.33 ; float max, min, ortalama1; // Burada fonksiyonlardan yararlaniyoruz max = maksimum( sayilar, 8 ); min = minimum( sayilar, 8 );
ortalama1 = ortalama( sayilar, 8 ); printf( "Maksimum: %.2f\n", max ); printf( "Minimum: %.2f\n", min ); printf( "Ortalama: %.2f\n", ortalama1 ); return 0; //Maksimum bulma fonksiyonu float maksimum( float dizi[ ], int eleman_sayisi ) float max; max = dizi[0]; for( i = 1; i < eleman_sayisi; i++ ) if( max < dizi[ i ] ) max = dizi[ i ]; return max; //Minimum bulma fonksiyonu float minimum( float dizi[ ], int eleman_sayisi ) float min; min = dizi[ 0 ]; for( i = 1; i < eleman_sayisi; i++ ) if( min > dizi[ i ] ) min = dizi[ i ]; return min; //Ortalama alma fonksiyonu float ortalama( float dizi[ ], int eleman_sayisi ) float ortalama1 = 0; for( i = 0; i < eleman_sayisi; i++ ) ortalama1 += dizi[ i ]; return ortalama1/ 8;
Ekran Çıktısı : Burada belirlediğimiz dizinin elemanlarından en büyüğünü, en küçüğünü ve bu elemanların ortalamasını fonksiyonlar yardımıyla buluyoruz. Dizilere pointer ile erişim Pointerlar değişkenleri işaret ettiği gibi dizileri de işaret edebilirler. Ptr=dizi; yazmak bunun için yeterlidir. Bunun için atama işareti (&) kullanmaya gerek yoktur. Dizilerde birer pointer olduğundan & işaretine ihtiyaç duyulmaz. Ptr=dizi; yazdıktan sonra ptr[3] diye kullanabilirsiniz.ayrıca, örneğin dizinin üçüncü elemanına ulaşmak için *(ptr+3) i kullanabilirsiniz.*(ptr+x) =ptr[x]. Ayrıca pointerla ptr=&dizi[4] diyerek dizinin 5. elemanını atayabiliriz. Bir örnek: //pointerla dizi kullanimi #include<stdio.h> int dizi[ 6 ] = 3, 5, 18, 22, 44, 11 ; int *ptr; ptr = dizi; for( i = 0; i < 6; i++ ) printf( "%d\n", *( ptr + i ) ); return 0; Ekran çıktısı :
Dizilerin Sıralanması Sıralama için birçok algoritma kullanılabilir.kullanımı basit olan kabarcık(bubble) sıralamasını göreceğiz : #include <stdio.h> #define boyut 8 int x[boyut]=3,4,2,1,6,7,9,22; int a,b,c; for (a=0;a<boyut-1;a++) for(b=0;b<boyut-1-a;b++) if(x[b]>x[b+1]) c = x[b]; x[b]=x[b+1]; x[b+1]=c; for(b=0;b<boyut;b++) printf("%d\n",x[b]); return 0; Programın ekran çıktısı şu şekilde olacaktır: Ozan TEZCAN ozantezcan@msn.com İTÜ IEEE Bilişim Komitesi