Programlama Dilleri 1 Ders 4: Diziler
Genel Bakış Tanım Dizilerin tanımlanması Dizilere ilk değer verilmesi Yerel ve Global diziler Dizilerin birbirine atanması Diziler ile ilgili örnekler Çalışma soruları char türden diziler sizeof işleci nedir? Programlama Dilleri 1 2
Dizi Nedir? Bellekte bitişik bir biçimde bulunan, aynı türden nesnelerin oluşturduğu veri yapısına Dizi (Array) denir. Dizi yapısının en önemli özelliği, mantıksal bir ilişki içindeki aynı tür verilerin bellekte bitişik tutulmasıdır. Programlama Dilleri 1 3
Dizilerin Tanımlanması Diziler aşağıdaki şekilde tanımlanabilir: <tür ismi> <dizi ismi> [<eleman sayısı>]; tür ismi: dizinin tüm elemanlarının türünü belirtir. dizi ismi: isimlendirme kurallarına uygun dizi ismi eleman sayısı: dizinin kaç elemanlı olduğunu belirtir. Örnekler: double merhaba[20]; int isme_bak[50]; char alan_adi[15]; Programlama Dilleri 1 4
Dizilerin Tanımlanması int a=100; int dizi15[a]; // Geçersizdir. Derleme sırasında dizinin eleman sayısını derleyici elde edebilmelidir. unsigned int row[5.]; // Geçersizdir. Eleman sayısı tamsayı olmalıdır. char surname[4*5]; // Geçerlidir. surname [20] #define ELEMAN_SAYISI 10 int a[eleman_sayisi ]; int a=100, x[25], y[50]; Programlama Dilleri 1 5
Dizilere ilk değer verilmesi dizi ismi [eleman sayısı]={ilk eleman,,son eleman}; double b[5]={2.5, 1.7, 5.9, 4.2, 3.3}; int bm[10]={1,18,-4,0,1,57,3,-89,17,100}; char name[4]={'d', 'a', 't', 'a'}; int xyz[100]={0}; float a[100]={55.275}; int selam[3]={x, x+1, x+2}; // Geçersizdir. int y[5]={4, 14, 0, 4, -54,3}; // Geçersizdir. long int uzun[ ]={5, 4, 3, 2, 1}; // eleman sayısı=5 Programlama Dilleri 1 6
Dizilere ilk değer verilmesi for (i=0;i<size;i++) a[i]=1; // dizinin elemanları 1 olur. int i=0; while (i<size) a[i++]=1; // alternatif bir kod int bilecik[20], i=5, k=10; bilecik[++k]=100; // bilecik[11]=100; bilecik[i--]=0; // bilecik[5]=0; ve i=4 olur. ++bilecik[5]; Programlama Dilleri 1 7
Dizi Kullanımı int b[ ]={11, 22, 33, 44}; i=1; printf("%d",b[i++]); // 22 i=1; printf("%d",b[++i]); // 33 i=1; printf("%d",b[--i]); // 11 i=1; printf("%d",b[i--]); // 22 printf("%d",++b[2]); // 34 b[2]=34 printf("%d",b[2]++); // 33 b[2]=34 Programlama Dilleri 1 8
Yerel ve Global diziler #include<stdio.h> #define ELEMAN_SAYISI 10 int global[eleman_sayisi]; //global tanımlı dizi main( ) { int local[eleman_sayisi], k; //yerel tanımlı dizi for (k=0;k<eleman_sayisi;++k) printf("global[%d]=%d\n",k,global[k]); } for (k=0;k<eleman_sayisi;++k) printf("local[%d]=%d\n",k,local[k]); Programlama Dilleri 1 9
Dizilerin birbirine atanması int x[size], y[size]; /***/ x=y; // Geçersizdir. // iki dizi ancak bir döngü deyimi ile kopyalanabilir. for (k=0;k<size;++k) x[k]=y[k]; k=0; // alternatif bir kod daha while(k<size) x[k]=y[k++]; Programlama Dilleri 1 10
Diziler ile ilgili Örnek 1 Programlama Dilleri 1 11
Diziler ile ilgili Örnek 2 Programlama Dilleri 1 12
Diziler ile ilgili Örnek 3 Programlama Dilleri 1 13
Diziler ile ilgili Örnek 4 k i a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 54 22 98 1 36 72 10 40 82 62 0 0 22 54 98 1 36 72 10 40 82 62 0 8 22 54 1 36 72 10 40 82 62 98 1 0 22 54 1 36 72 10 40 82 62 98 1 7 22 1 36 54 10 40 72 62 82 98 2 0 1 22 36 54 10 40 72 62 82 98 2 6 1 22 36 10 40 54 62 72 82 98 3 0 1 22 36 10 40 54 62 72 82 98 3 5 1 22 10 36 40 54 62 72 82 98 4 0 1 22 10 36 40 54 62 72 82 98 4 4 1 10 22 36 40 54 62 72 82 98 5 0 1 10 22 36 40 54 62 72 82 98 5 3 1 10 22 36 40 54 62 72 82 98 6 0 1 10 22 36 40 54 62 72 82 98 6 2 1 10 22 36 40 54 62 72 82 98 7 0 1 10 22 36 40 54 62 72 82 98 7 1 1 10 22 36 40 54 62 72 82 98 8 0 1 10 22 36 40 54 62 72 82 98 Programlama Dilleri 1 14
Diziler ile ilgili Örnek 5 k i temp a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 22 54 22 98 1 36 72 10 40 82 62 1 1 22 22 54 98 1 36 72 10 40 82 62 2 98 22 54 98 1 36 72 10 40 82 62 2 2 98 22 54 98 1 36 72 10 40 82 62 2 1 98 22 54 98 1 36 72 10 40 82 62 3 1 22 54 98 1 36 72 10 40 82 62 3 3 1 22 54 1 98 36 72 10 40 82 62 3 2 1 22 1 54 98 36 72 10 40 82 62 3 1 1 1 22 54 98 36 72 10 40 82 62 4 1 36 1 22 36 54 98 72 10 40 82 62 5 1 72 1 22 36 54 72 98 10 40 82 62 6 1 10 1 10 22 36 54 72 98 40 82 62 7 1 40 1 10 22 36 40 54 72 98 82 62 8 1 82 1 10 22 36 40 54 72 82 98 62 9 1 62 1 10 22 36 40 54 62 72 82 98 Programlama Dilleri 1 15
Diziler ile ilgili Örnek 6 k i min index a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 0 54 0 54 22 98 1 36 72 10 40 82 62 0 9 1 3 54 22 98 1 36 72 10 40 82 62 1 22 1 1 22 98 54 36 72 10 40 82 62 1 9 10 6 1 22 98 54 36 72 10 40 82 62 2 98 2 1 10 98 54 36 72 22 40 82 62 2 9 22 6 1 10 98 54 36 72 22 40 82 62 3 54 3 1 10 22 54 36 72 98 40 82 62 3 9 36 4 1 10 22 54 36 72 98 40 82 62 4 54 4 1 10 22 36 54 72 98 40 82 62 4 9 40 7 1 10 22 36 54 72 98 40 82 62 5 72 5 1 10 22 36 40 72 98 54 82 62 5 9 54 7 1 10 22 36 40 72 98 54 82 62 6 98 6 1 10 22 36 40 54 98 72 82 62 6 9 62 9 1 10 22 36 40 54 98 72 82 62 7 72 7 1 10 22 36 40 54 62 72 82 98 7 9 72 7 1 10 22 36 40 54 62 72 82 98 8 82 8 1 10 22 36 40 54 62 72 82 98 8 9 82 8 1 10 22 36 40 54 62 72 82 98 Programlama Dilleri 1 16
Diziler ile ilgili Örnek 7 Programlama Dilleri 1 17
Diziler ile ilgili Örnek 8 Programlama Dilleri 1 18
Çalışma Soruları 1 30-70 arasında rastgele tamsayılardan oluşan 20 elemanlı bir dizinin en büyük ikinci elemanını bulan C kodunu yazınız. A[10] ve B[20] şeklinde sıralı tamsayılardan oluşmuş iki diziyi bir sıralı C[30] dizisi şeklinde birleştiren C kodunu yazınız. dizi[50] 50-70 arasında rastgele üretilen sayılardan oluşmuş bir dizi olduğuna göre 55 sayısının bu dizi içerisinde kaç kez tekrarlandığını ekrana döken C kodunu yazınız. Programlama Dilleri 1 19
char türden diziler Karakter dizileri char türden dizilerdir. char dizimiz[25]; dizimiz[0]='a'; dizimiz[1]='l'; dizimiz[2]='i'; // dizi 25 elemanlı bir dizi olmasına rağmen daha kısa yazılarda bu dizi de tutulabilir for (k=0; k<25;++k) putchar(dizimiz[k]); //bu döngü ile yalnızca ALI ekrana yazılmaz. Dizinin diğer 22 çöp elemanı da yazılır. Programlama Dilleri 1 20
char türden diziler C dilinde karakterler üzerinde işlemlerin hızlı ve etkin yapılabilmesi için sonlandırıcı (Null) karakter kullanılır. Sonlandırıcı karakter '\0' ASCII tablosunun 0 numaralı karakteridir. Görüntüsü yoktur. main( ) { printf("%d\n", '0'); // 48 (0 ın ASCII kodu) basar. printf("%d\n", '\0'); // 0 basar. } char türden dizilerin uzunluğunu bilmeye gerek yoktur. Çünkü yazının sonunda ' \0 ' bulunur. Bu sebeple SIZE elemanlı bir dizide en fazla SIZE-1 lik yazı saklanabilir. Programlama Dilleri 1 21
char türden diziler char name[8]={'b', 'i', 'l', 'e', 'c', 'i', 'k', '\0'}; char name[5]={'v', 'a', 'n'}; /* dizinin kalan kısmına yandaki gibi sonlandırıcı karakter eklenir.*/ char name[5]="van"; /*sonlandırıcı karakteri otomatik olarak ekler.*/ char name[3]="van"; /* sonlandırıcı karakter eklenmez.*/ char name[6]= "Bilecik"; //Geçersizdir. char name[25]; gets(name); //klavyeden enter basılana kadar girilmiş karakterleri name dizisine sırasıyla atar. Programlama Dilleri 1 22
char türden diziler gets işlevi ile klavyeden alınan karakterler diziye yerleştikten sonra dizinin sonuna '\0' konulur. Programlama Dilleri 1 23
char türden diziler #include<stdio.h> #define SIZE 100 int main( ) { char name[20],surname[30]; int no; printf("isim soyisim ve numara girin: "); scanf("%s%s%d",name,surname,&no); puts(name); puts(surname); printf("%d",no); } Klavyeden alınan bir yazı char türden bir diziye scanf komutu ile yerleştirilebilir. Bu amaçla %s format karakteri kullanılır. Klavyeden alınan ilk boşluk karakteri ile diziye yerleştirme sona erer. Programlama Dilleri 1 24
char türden diziler printf("%s\n", name); // puts(name) kodu yerine yazılabilir. printf ile yazılan kodun tek farkı, imleci alt tarafa taşımaz. //puts(name) yerine aşağıdaki kod da yazılabilir for (i=0; name[i]!= '\0'; ++i) putchar(name[i]); putchar('\n'); main( ) { char sehir [ ] = "Bilecik"; sehir[7]= '!'; //sonlandırıcı karakter yerine bir karakter girilmis puts(sehir); //ilk sonlandırıcı karaktere kadar ekrana basar } Programlama Dilleri 1 25
Çalışma Soruları 2 Klavyeden girilen bir verinin uzunluğunu bulan C kodunu yazınız. Klavyeden girilen isim ve soy isminizi tersten ekrana basan C kodunu yazınız. Klavyeden alınan yazıdaki küçük harfleri büyük, büyük harfleri ise küçük harfe döndürüp ekrana basan C kodunu yazınız. Klavyeden girilen bir yazının içinde bulunan tüm İngilizce harfleri sayarak kaç tane olduklarını ekran basan C kodunu yazınız. Programlama Dilleri 1 26
Çalışma Soruları 3 Klavyeden bir diziye alınan yazının içinden rakamları silen C kodunu yazınız. Klavyeden bir diziye alınan yazının içinde ardışık olarak yer alan eş karakterleri bire indiren C kodunu yazınız. Klavyeden alınan 10 tane kelimeyi sözlük sırasına göre ekrana basan C kodunu yazınız. Programlama Dilleri 1 27
sizeof işleci nedir? sizeof bir ifadenin türünün bellekte kaç byte yer kapladığını bildiren bir işleçtir. sizeof (int); sizeof(long); sizeof(double); //terim olarak bir ifade kullanılabilir double x; sizeof (x); sizeof (17.8); sizeof (fonk()); double a[10]; /* dizi elemanlarını toplam byte uzunluğunu verir.*/ sizeof (a); i=sizeof (a) / sizeof(a[0]); // neyi verir? Programlama Dilleri 1 28
sizeof işleci nedir? // Bu kod ne iş yapar? //A dizisine birkaç eleman daha eklenir ise ne olur? //sizeof bir işlev değil, bir işleçtir. Programlama Dilleri 1 29
sizeof işleci nedir? /* sizeof (func()) satırında func() işlevi çağrılmaz. Yalnızca int func() tür olarak yer alır. */ Programlama Dilleri 1 30