Giriş DİZİLER Arrays Aynı isim altında, aynı türde birden fazla değer tutmak için kullanılan veri yapılarıdır (Data Structure). Dizi bir kümedir; aynı türde verilere tek bir isimle erişmek için kullanılır. Bir dizinin bütün elemanları bellekte ardışık olarak saklanır. Diziler bir veya daha çok boyutlu olabilirler. 2/51 Tek Boyutlu Diziler Buradaki eleman sayısı değişken olamaz. Fakat önceden tanımlanmış bir sembolik sabit olabilir. Tek Boyutlu Diziler Genel kullanımdaki köşeli parantez isteğe bağlı anlamında değildir. Köşeli parantez sembolü dizi tanımlamalarında mutlaka yazılmalıdır. GK: dizinintürü dizininadı [elemansayısı]; 4/68 Örnek int a[6]; /* 6 elemanlı, her elemanı int olan dizi*/ char d2[15]; /*15 elemanlı, her elemanı char olan dizi*/ Örnek float x[10]; /*10 elemanlı, her elemanı float olan dizi*/ double k[10]; /*10 elemanlı, her elemanı double olan dizi*/ 5/68 6/68 ENF-102 Jeoloji 2010 1
Açıklama Derleyici ilk örnekteki gibi bir komutla karşılaştığında, 6 adet sayının saklanacağı bellek alanını ayırır. Açıklama Dizi içerisindeki her bir elemana, dizi isminden sonra, yazılan pozisyon numarası; yani indis değeri (subscript) ile ulaşılır. İndis değerleri mutlaka tamsayı olmalıdır. Açıklama Tek Boyutlu Dizi C dilinde bütün dizilerin indis numarası 0'dan başlar. Dolayısı ile dizinin en büyük indis numarası eleman sayısından bir eksiktir. Tek boyutlu dizilere değer atanması Dizinin elemanlarına ulaşmak için dizinin ismi ve köşeli parantez içerisinde indis numarasını yazmak yeterlidir. a[0]=-12; /*dizinin 0 no'lu elemanına -12 değerini ata*/ Tek boyutlu dizilere değer atanması a[2]=a[4]+3; /*dizinin2noluelemanına4noluelemanının 3fazlasını ata.*/ for(i=0;i<6;i++) i i a[i] =0; /*0'dan 6'ya kadar */ /* dizinin elemanlarına 0 değerini ata.*/ ENF-102 Jeoloji 2010 2
Dikkat a[i] +1 ile a[i+1] İlk gösterim dizinin i no'lu indisindeki elemanın bir fazlası anlamına gelir, ikinci gösterim ise dizinin i'nin bir fazlası indisindeki elemanı anlamına gelir. Dolayısı ile bu iki ifade eşit değildir. Tek boyutlu dizilere ilk değer atanması (initialize) Tanımlanan dizilere ilk değer ataması ise aşağıdaki şekilde yapılır. int a[5]=4,5,3,1,8;,,, Tek boyutlu dizilere ilk değer atanması (initialize) İlk değer atama işleminde küme parantezi kullanılır. Küme işaretindenş sonra ( ; ) kullanılmasına dikkat ediniz. Böyle bir ilk değer atamasından sonra dizinin elemanları aşağıdaki gibi yerleşir. Tek boyutlu diziye ilk değer atamasından sonra elemanların yerleşimi Ayrıca Küme işaretleri içerisine dizinin eleman sayısından daha fazla eleman yazıldığında bir yazım hatası ortaya çıkar. Ayrıca Eleman sayısından daha az eleman yazıldığında ise, diğer elemanlar otomatik olarak sıfır değerini alır. İlk değer ataması yapılmayan dizilerin elemanları hafızadaki rasgele değerlerden oluşur. ENF-102 Jeoloji 2010 3
Ayrıca İlk değer ataması yapıldığında eleman sayısını yazma zorunluluğu yoktur. Ne kadar eleman yazılmışsa, eleman sayısı o kadar olur. ÖRNEK: Klavyeden girilen 5 adet tamsayıyı, giriş sırasının tersinden ekrana yazan C programını kodlayınız. Bu problemde dizi kullanılmayacak olsaydı, 5ayrı değişkene ihtiyaç duyulacaktı. Çünkü girilen her bir değereklavyedengirme işlemi bittikten sonra, tekrar ulaşmak gerekecektir. Kod: ÖRNEK: Klavyeden girilen 10 adet tamsayı sınav notuna göre, ortalamanın üstünde olanları ekrana yazan C programı Bu problem çözülürken öncelikle ortalamanın bulunması gereklidir. Ortalamanın bulunabilmesi için bütün notların toplamı alınacak ve not adedine bölünecektir. ÖRNEK: Klavyeden girilen 10 adet tamsayı sınav notuna göre, ortalamanın üstünde olanları ekrana yazan C programı Bu noktadan sonra daha önceden girilmiş notların her biri sıra ile ortalamayla karşılaştırılacak büyük olanlar ekrana yazdırılacaktır. Çözümde dizi kullanılmayacak olsaydı, 20 ayrı değişkene ihtiyaç duyulacaktı. Çünkü, girilen her bir değere klavyeden girme işlemi bittikten sonra tekrar ulaşmak gerekecektir. Örnek Çalışma: ENF-102 Jeoloji 2010 4
Kod: DİZGİLER STRINGS Giriş Karakterlerin (character) gruplanması ile oluşturulmuş veri yapılarına (data structure) dizgi (string) adı verilir. C dilinde karakterler tek tırnak arasına alınmış ifadelerdir. Örneğin m veya y gibi. Aslında temsil ettikleri değer birer tamsayıdır. Derleyici onları hafızada tutarken tamsayı karşılıkları ile saklar. Giriş Karakter serileri,rakamları (digit), harfleri (letter), özel karakterleri (special character) içerebilir. C dilinde dizgi (string) ifadeleri çift tırnak (double quotation) ( " " ) arasında gösterilirler. Örneğin: Vedat Köse (ad soyad) ENF 102" (ders kodu) "2341010" (telefon numarası) Bir dizgi iki şekilde tanımlanarak ilk değer ataması yapılabilir: C dilinde dizgi (string) aslında sonuna \0 karakteri eklenmiş karakter dizisidir (char array). Hafızada tutulan bir dizgiye ilk karakterinin adresi ile erişilir. Başlangıç adresinden 0 karakterine kadar olan bölgede, dizginin kendisi var demektir. 1. char türünde bir dizi tanımlayarak, char isim[]= Vedat Köse ; Burada sonlandırıcı karakter son eleman olduğundan toplam 11 elemanlık bir dizgidir. 1 2 3 4 5 6 7 8 9 10 11 V e d a t K ö s e \0 ENF-102 Jeoloji 2010 5
Dizgi giriş ve çıkış işlemleri Klavyeden bir dizgi okunması gerektiğinde ya da ekran Üzerine bir dizginin yazılması gerektiğinde printf ve scanf fonkiyonları kullanılabilir. Ancak yer tutucu olarak %s kullanılmalıdır. Klavyeden girilen ismi ekrana yazan C programı /*Klavyeden girilen ismi ekrana yazar*/ char ad[20]; printf( adınızı giriniz ); scanf( %s,ad); printf( \ngirdiğiniz isim=%s dir,ad); & işareti Ad değişkeninin önüne & işareti koyulmamıştır. Çünkü ad içerisinde zaten bir adres vardır. Dikkat edilmesi i gereken nokta en fazla 19 karakterlik bir kelime yazılması gerektiğidir. Dizgilerde işlem yapıla bilmesi için \0 karakterlerini bulundurmaları gerekir. Dikkat edilmesi gereken diğer bir husus ise, dizgi girilirken bu scanf fonksiyonu boşluk, tab, enter karakterlerini dizgi sonu olarak algılamaktadır. Klavyeden girilen bir il adının harf sayısını ekrana yazan C programı /*Klavyeden girilen il adının harf sayısını ekrana yazar*/ char ad[50]; int harfsayisi=0; printf( İl adınızı giriniz ); scanf( %s,ad); while (ad[harfsayisi]!= \0 ) harfsayisi++; /*for (harfsayisi=0; ad[harfsayisi]!= \0 ; harfsayisi++)*/ printf( \ngirdiğiniz il adı %d harften oluşuyor,harfsayisi); Klavyeden girilen bir ismi tersten yazan yazan C programı /*Klavyeden girilen ismi tersten yazar*/ char ad[50]; int i,s=0; printf( Adınızı giriniz ); scanf( %s,ad); printf( adınızın tersten yazlışı: ); while (ad[s]!= \0 ) s++; for(i=s-1;i>=0;i--) printf( \n%c,ad[i]); ENF-102 Jeoloji 2010 6
DİZGİ DİZİLERİ Dizgi Dizileri Bir dizgi ismi altında birden fazla değer saklama ve her bir dizgiye indis numarası vererek erişme ihtiyacı ortaya çıkabilir. İsimler Vedat Mete Neva Mehmet Hakan Dizgi Dizileri Her bir dizginin bir karakter dizisi olduğu hatırdan çıkarılmamalıdır. S0 S1 S2 S3 S4 S5 S6 S0 V E D A T \0 S1 M E T E \0 S2 N E V A \0 s3 M E H M E T \0 S4 H A K A N \0 Dizgiler Dizisi Bu yapı aşağıdaki gibi tanımlanabilir ve ilk değerleri atanabilir. char isimler [5][7]= Vedat, Mete, Neva, Mehmet, Hakan ; Klavyeden girilen beş ismi giriliş sırasının tersinden yazan C programı /*Klavyeden girilen isimleri giriliş sırasının tersinden yazar*/ char ad[5][20]; int i,j; for(i=0;i<5;i++) 0i 5i printf( %d. Adı giriniz,i); scanf( %s,ad[i]); /*çok önemli*/ printf( Ters olarak isimler ); for(i=4;i>=0;i--) printf( \n%s,ad[i]);/*çok önemli*/ Karakter Kütüphane Fonksiyonları ENF-102 Jeoloji 2010 7
Karakter Fonksiyonları Dizgi Kütüphaneleri Bu kütüphanede hazır fonksiyonlar, karakterler üzerinde test ve düzeltme işlemlerini yapmak amacı ile kullanılırlar. ctype.h başlık dosyası include direktifi ile bildirilmelidir. Ve geriye int değerinde değer döndürür. Fonksiyon prototipi int isdigit(int c) int isalpha(int c) int isalnum(int c) int isxdigit(int c) int islower(int c) Açıklaması Verilen karakter rakam ise doğru, diğer tüm hallerde yanlış değer döndürür. Verilen karakter harf ise doğru, diğer tüm hallerde yanlış değer döndürür. Verilen karakter rakam veya harf ise doğru, diğer tüm hallerde yanlış değer döndürür. Verilen karakter onaltılık ise doğru, diğer tüm hallerde yanlış değer döndürür. Verilen karakter küçük harf ise doğru, diğer tüm hallerde yanlış değer döndürür. Dizgi Kütüphaneleri Dizgi Kütüphaneleri Fonksiyon prototipi Açıklaması Fonksiyon prototipi Açıklaması int isupper(int c) Verilen karakter büyük harf ise doğru, diğer tüm hallerde yanlış değer döndürür. İnt iscntrl(int c) Verilen karakter kontrol karakteri ise doğru, diğer tüm hallerde yanlış değer döndürür. int tolower(int c) Verilen karakterin küçük harf karşılığını döndürür. İnt ispunct(int c) Verilen karakter noktalama karakteri ise doğru, diğer ğ tüm hallerde yanlış ş değer ğ döndürür. int toupper(int c) Verilen karakterin büyük harf karşılığını döndürür. İnt isprint(int c) Verilen karakter boşluk dahil yazılabiliyor ise doğru, diğer tüm hallerde yanlış değer döndürür. int isspace(int c) Verilen karakter boşluk (, \n, \r, \t, \v )ise doğru, diğer tüm hallerde yanlış değer döndürür. İnt isgraph(int c) Verilen karakter ekrana yazılabiliyor ise doğru, diğer tüm hallerde yanlış değer döndürür. Karakter fonksiyonları # include <ctype.h> printf( %c %s\n, 9, isdigit( 9 )? rakamdır : rakam değildir ); printf( %c %s\n, A, isdigit( A )? rakamdır : rakam değildir ); printf( %c %s\n, A, isalpha( A )? harftir : harf değildir ); printf( %c %s\n, +, isdigit( + )? harfdir : harf değildir ); printf( %c %s\n, A, isalnum( A )? harf, rakamdır : harf,rakam değildir ); printf( %c %s\n, *, isalnum( * )? harf,rakamdır : harf,rakam değildir ); printf( %c %s\n, F, isxdigit( F )? hex rakamdır : hex rakam değildir ); printf( %c %s\n, H, isxdigit( H )? hex rakamdır : hex rakam değildir ); printf( %c büyüğü=%c\n, F, toupper( F )); printf( %c küçüğü=%c\n, F, tolower( F )); Klavyeden girilen en fazla 25 karakter uzunluğundaki kelimenin büyük harflerini küçüğe, küçük harflerini büyüğe dönüştüren programı kodlayınız. Örnek çalışma(en fazla 25 karakter): AhMeT Dönüştürülmüş hali: ahmet ENF-102 Jeoloji 2010 8
Büyük harf küçük harf dönüştürme # include <ctype.h> char s[25]; int i; printf( kelimeyi giriniz ); scanf( %s,s); for(i=0;s[i]!= \0 ;i++) if(isupper(s[i])) s[i]=tolower(s[i]); else if (islower(s[i])) s[i]=toupper(s[i]); printf( dönüştürülmüş hali %s,s); ENF-102 Jeoloji 2010 9