DİZİLER
Dizi Nedir? Tek isim altında gruplandırılmış değişkenler (aynı tipteki) toplamıdır. Daha özel olarak, aynı tipte ve aynı isimle belirtilmiş değişkenler için bir grup hafıza yerleşimidir. Dizilerin oluşturulmasında kullanımında olduğu gibi kabul edilmiş özel düzenler vardır, fakat birbiriyle ilişkili değişkenlerle çalışmayı daha kolaylaştırır. 04.04.2019
Tam olarak ne hakkında konuşuyoruz?! On öğrenciniz olduğunu ve herbiri için notları kaydederek programınız boyunca kullanmak istediğinizi varsayalım (yalnızca döngüyü değil her bir notu hatırlamamız ve saymamız veya ortalamasını almamız vb. gerekir) Zor yolla yapılabilir: iStudentOneGrade olarak on değişken belirleyin iStudentTwoGrade, iStudentThreeGrade, etc. Kullanması ve amaçlarımız doğrultusunda yönetilmesi oldukça zor Bunun yerine bunu kolay yoldan yapmak için bir dizi kullanılabilir. 04.04.2019
Bir dizi değişkenini kullanmak arrStudentGrades[10] isimli bir dizi değişkeni oluşturun Aşağıdaki gibi bildirin: int arrStudentGrades[ 10 ]; Bu, hafızada, # ‘in bakmak istediğiniz belirli bir öğrenciyi temsil ettiği arrStudentGrades[#] olarak başvurulabilecek 10 tamsayılık bir bölge tesis eder. “arr” öneki bir Hungarian gösterimidir (gerekli değil) 04.04.2019
Dizi İsimlendirme Hususları Dizi değişkeni isimleri seçerken değişken isimlendirme kuralları uygulanır. Harf, rakam ve alt çizgi karakterlerinin birleşimidir Bir rakamla başlayamaz Değişken isimleri için önerilen tüm iyi programlama ipuçlarını takip edin isimlendirirken yalnızca sıradan bir değişkenmiş gibi düşünün Hungarian gösterimini kullanıyorsanız, iStudentGrades[10]yerine arrStudentGrades[10] kullanın 04.04.2019
Dizinin Bölümleri Dizinin henüz görmediğimiz bir terminolojisi vardır Elemanlar Gösterge (veya yerleşim numarası) İndis Sıfırıncı eleman 04.04.2019
Elemanlar Dizi tarafından temsil edilen bağımsız parçaların numaralarına işaret eder. 10 tamsayılı bir dizinin 10 elemanı olduğunu söylenir 15 gerçel sayılı dizinin 15 elemanı olduğu söylenir 5 karakterli bir dizinin 5 elemanı olduğunu söylenir ve saire... 04.04.2019
Gösterge (Yerleşim Numarası veya İndis) Dizi içindeki belirli bir elemana işaret eder Aynı zamanda yerleşim numarası veya daha resmi şekilde indis olarak da bilinir. Dizideki ilk eleman 0 (sıfır) göstergesi veya indisi ile temsil edilir. Örneğin; arrStudentGrades[ 0 ] İlk yerleşim sıfırıncı eleman olarak bilinir. İkinci yerleşim şu şekilde temsil edilir arrStudentGrades[ 1 ] 04.04.2019
Dizi yerleşimlerini hesaplamak C’de dizilerin elemanları 0 indisi ile başlar ve artarak devam eder (eleman sayısı - 1’e kadar) Örneğin, 10 öğrencinin notları ile doldurulmuş dizimiz aşağıdaki gibi görünecektir: 88 82 90 89 98 78 38 99 76 85 Value 9 8 7 6 5 4 3 2 1 Index 04.04.2019
Dizi yerleşimleri (devam) Bunlara dizi isimlerini takiben köşeli parantez içindeki indis numaralarını belirterek erişebiliriz. Örneğin; printf (“The third student’s grade is %d\n”, arrStudentGrades[ 2 ] ); Dizi içindeki yalnızca üçüncü tamsayı yerini yazar (0’ın ilk, 1’in ikinci, ve 2’nin üçüncü gösterge / indis elemanı olduğunu hatırlayın) Çıktı şöyle görünecektir: The third student’s grade is 99 04.04.2019
Dizi yerleşimleri (devam) İndis yerleşiminin 0’dan başlaması başlangıçta kafa karıştırıcı olabilir Bu pek çok off-by-one hatalarının sebebidir bu yüzden bu kavrama dikkatlice çalışın 04.04.2019
Kitap terminolojisiyle konu Kitap açıklamaları: “Her dizinin ilk elemanı sıfırıncı elemandır. Bu nedenle c dizisinin ilk elemanına c[0] , c dizisinin ikinci elemanına c[1] ... olarak ve, genellikle c dizisinin i’ninci elemanına c[i-1] olarak başvurulur.” “dizinin yedinci elemanı” ve “dizi elemanı yedi” arasındaki farka dikkat etmek önemlidir. Çünkü dizi indisleri 0 ile başlar, “dizinin yedinci elemanı” indis olarak 6’ya sahip olduğu gibi “dizi elemanı yedi” indis olarak 7 ’ye sahiptir ve aslında dizinin sekizinci elemanıdır. Eğer sayfa 197 eleman 0 deseydi daha az kafa karıştırıcı olabilirdi. 04.04.2019
indis terminolojisi Bu noktadan itibaren, bu ders için, dizi elemanlarının tüm referansları dizinin indisini işaret edecektir. Dizideki bir elemanın yeri ile ilgili tartışmak istediğimiz olayda, onun yerini işaret edeceğiz. Bir başka deyişle, sıfırıncı elemanı işaret etmediğimiz sürece i’ninci elemanı veya eleman i gösterimini kullanmayacağız. 04.04.2019
Dizilerin bazı güçlü özellikleri İfadeleri indis olarak kullanabilme Ör: eğer değişken a = 1 ve b = 2 ise arrStudentGrades[ a+b ] yazmak, arrStudentGrades[3] yazmak ile aynı olacaktır. İfadelerde dizi elemanlarını kullanabilme E.g. int iGradeTotal = 0 ; iGradeTotal = arrStudentGrades[ 0 ] + arrStudentGrades[ 1 ] + arrStudentGrades[ 2 ] + … arrStudentGrades[ 9 ] ; Bütün dizi elemanlarını toplayıp bunu iGradeTotal’da depolayacaktır. 04.04.2019
Güçlü özellikler (devam) Dizi elemanlarını başka değerlere veya ifadelere eşitleyebilme. Örneğin: arrStudentGrades[ 1 ] = 100 ; Bu, dizi elemanını 1 indisi ile 100 notuna eşitler. Böylece 2. öğrenci 100 notunu alacaktır. 04.04.2019
Öyleyse dizileri nasıl kullanıyoruz? Başka değişkenlere uygulanan benzer kavramlar Dizi bildirilmeli Dizi başlangıç durumuna getirilmeli Sıradan değişkenlerin kullanımına benzer şekilde dizileri ifadelerde ve fonksiyonlarda kullanabilme, elemanlarının değerini belirleyebilme veya değerlerini kullanabilme 04.04.2019
Bir diziyi bildirmek #define GRID_ROWS_MAX 8 Dizideki elemanların tipi, dizinin ismi ve dizideki eleman sayısı belirtilmelidir, böylece bilgisayar dizi için yeterli hafızayı bir yana ayırır. Bildirim, diğer değişkenlerin bildirimi ile benzerdir (parantezler ve elemanların numaraları hariç): int iMyFirstArray[ 15 ] ; or int iMyFirstArray[ 15 ], iMySecondArray[ 20 ]; Dizinin büyüklüğünü belirlemek için #define sabitini kullanabilirsiniz #define GRID_ROWS_MAX 8 int arrGridRows[ GRID_ROWS_MAX ] ; 04.04.2019
Bir diziyi başlangıç durumuna getirmek Diğer değişkenlerde yaptığınız gibi bir diziyi bildirdiğiniz zaman başlangıç durumuna getirebilirsiniz Yazım tamamen farklı, şimdi aynı anda birden fazla elemanı başlangıç durumuna getiriyorsunuz Bildirimin bir yolu, başlatıcılar kullanılarak: int iMyFirstArray[ 5 ] = { 0, 0, 0, 0, 0 } ; Birbirlerinden virgüllerle ayrılan başlangıç sıfırlarının etrafındaki parantezlere dikkat edin 04.04.2019
Bir diziyi başlangıç durumuna getirmek (devam) Sahip olduğunuz elemanlardan daha az sayıda başlangıç değerini belirtecekseniz, kalanların tümü 0 değeriyle başlangıç durumuna getirilecektir! Örneğin: int iMyFirstArray[ 5 ] = { 0 }; bütün elemanları 0 olarak ayarlar. int iMyFirstArray[ 5 ] = { 4 }; int iMyFirstArray[ 5 ] = { 4 }; 0’ıncı elemanı 4 ve kalanları 0 olarak ayarlar. 04.04.2019
Bir diziyi büyüklük belirtmeden başlangıç durumuna getirmek Aynı zamanda eleman sayısını ve başlangıç değerlerini aynı adımda belirleyebirsiniz: int iMyFirstArray[ ] = { 0, 0, 0, 0, 0 } ; Dikkat: HİÇBİR büyüklük yoktur; C diziyi beş başlangıç değeri verdiğinizde otomatik olarak 5 elemanlı yapar. 04.04.2019
Diziyi bir for döngüsüyle başlangıç durumuna getirmek Bir diziyi bildirdikten sonra, programınızın gövdesi içinde onu başlangıç durumuna bir for döngüsü kullanarak getirebilirsiniz. int i = 0, iMyFirstArray[ 5 ] ; /* size is 5*/ /* büyüklük 5*/ for ( i = 0 ; i <= 4 ; i++ ) { iMyFirstArray[ i ] = 0 ; } /* end for i */ /*i for’unun sonu */ Üst sınırın 5 değil 4 olduğuna dikkat edin! Böylece, 5 elemanlı bir dizi için 0’dan 4’e kadar döneceksiniz. 04.04.2019
Elemanlara for döngüsü ile erişmek Bir dizinin elemanlarını yazdırmak için bir for döngüsü kullanılabilir #define SIZE 5 int i = 0, iMyFirstArray[ SIZE ] ; /* go through all element index */ /* göstergedeki tüm elemanlar boyunca ilerle */ for ( i = 0 ; i <= SIZE - 1 ; i++ ) { printf( “%d”, iMyFirstArray[ i ]) ; } /* end for i */ /* i for’unun sonu */ 04.04.2019
int myFirstArray[SIZE], i; for (i=0; i<=SIZE-1; i++) #define SIZE 10 int main() { int myFirstArray[SIZE], i; for (i=0; i<=SIZE-1; i++) myFirstArray[i] = i * 2; printf("myFirstArray with subscript of %d holds the value %d\n", i, myFirstArray[i]); return 0; } 04.04.2019
Diziler devamı
Dizilerin yeniden incelenmesi Elemanlar: Dizi tarafından temsil edilen bağımsız parçaların numaralarına işaret eder Gösterge (veya daha resmi şekilde, İndis) Dizi içindeki belirli bir elemana işaret eder Dizideki ilk eleman 0 (sıfır) göstergesi veya indisi ile temsil edilir. Örneğin, arrStudentGrades[ 0 ] İkinci yerleşim şu şekilde temsil edilir arrStudentGrades[ 1 ] 04.04.2019
Dizi yerleşimler (tekrar inceleme) C’de dizilerin elemanları 0 indisi ile başlar ve artarak devam eder (eleman sayısı - 1’e kadar) Örneğin, 10 öğrencinin notları ile doldurulmuş dizimiz aşağıdaki gibi görünebilir: 88 82 90 89 98 78 38 99 76 85 Value 9 8 7 6 5 4 3 2 1 Index 04.04.2019
Dizi hakkında (devam) İndis yerleşiminin 0’dan başlaması başlangıçta kafa karıştırıcı olabilir 04.04.2019
Dizileri daha az karmaşık hale getirmek Bu off-by-one hatalarından kurtulmayı nasıl deneyebiliriz? İlk bileşenimize indis sıfır olarak başvurmayı nasıl engelleyebiliriz? Son bileşenimize indis “eleman sayısı - 1” olarak başvurmayı nasıl engelleyebiliriz? 04.04.2019
Daha çok sezgisel kullanım için dizileri nasıl yapılandırmalıyız İhtiyaç duyduğunuzdan bir fazla elemanı olan bir dizi oluşturun indis 0 ile temsil edilen bileşene öylesine bir değer yerleştirin Geçerli verileri indis 1 ile yerleştirmeye başlayın Bu yolla, “asıl” ilk bileşeniniz indis 0 değerine değil indis 1 değerine sahip olacaktır ve son geçerli bileşeninizin indis değeri dizinin büyüklüğü değerine eşit olacaktır (büyüklük - 1 değil) 04.04.2019
Örnek On öğrenciniz olduğunu ve herbiri için notları kaydederek programınız boyunca kullanmak istediğinizi varsayalım (yalnızca döngüyü değil her bir notu bunları bir kez saymak yada ortalamalarını almak için hatırlamamız gerekir) 04.04.2019
Dizi yerleşimlerini hesaplamak, eski örnek, yeni yöntem On öğrenciyi ve notlarını tutan dizimizi hatırlıyor musunuz? Onbir elemanlı bir dizi oluşturun 10 öğrencinin notları ile doldurulmuş dizimiz aşağıdaki gibi görünecektir: 88 82 90 89 98 78 38 99 76 85 Değer 10 9 8 7 6 5 4 3 2 1 İndis 04.04.2019
Eski örnek, yeni yöntem devam Bu yolla, 1. Öğrenci ile ilgilenmeye ihtiyaç duyduğunuzda, indis 0’a değil indis 1’e başvuruyorsunuz. Şimdi, bir for döngüsünde 1 ile başlayabilirsiniz ve eleman sayısı kadar tekraralayabilirsiniz (eleman sayısı - 1 değil) Bazen anlaşılırlık fazladan hafıza kullanımına ağır basar Eğer pek çok dizisi bulunan büyük programlara sahipseniz hafızaya değmeyebilir. Gerçek şu ki, böyle ucuz ve bol hafıza ile, pek çok durumda muhtemelen büyük bir çalışma olmayacaktır. 04.04.2019
Uyarı Programınızda bu çalışmayı anlaşılır biçimde açıklayın Bunu kullanırsanız, BÜTÜN program boyunca İSTİKRARLI olun. Bunu bir dizi için kullanıp diğerleri için kullanmamak daha fazla karışıklık oluşturacaktır. 04.04.2019
C’nin dizi sınırı kontrolü yoktur Programınızın bir dizinin sınırları dışındaki bir elemana erişmediğinden emin olmak sizin sorumluluğunuzdadır. Örneğin, eğer 10 büyüklüğünde bir dizi bildirmişseniz, ve indis 10’a erişmeye çalışıyorsanız (hatırlayın, en yüksek geçerli indis 9’dur), var olmayan bir elemana erişmeye kalkışıyorsunuz. 04.04.2019
Dizilerde tamsayılarla sınırlandırılmıyorsunuz. Başka tipteki diziler Dizilerde tamsayılarla sınırlandırılmıyorsunuz. Gerçel tipleri (float, double) ve hatta karakterleri içeren pek çok farklı tipte diziler oluşturabilirsiniz. Bir karakter dizisi, bir string(karakter diziyi)’i depolamak için kullanılabilir. 04.04.2019
Strings (Karakter) Diziler Karakter dizileri daha önce görmüştük: printf kullanırken, tırnak işaretleri arasındaki «malzeme» bir karakter dizidir. printf(“Hi, I am a string!\n”); Parçalara ayırdığınızda, bunun gibi bir karakter dizi gerçekte karakterlerden oluşmuş bir dizidir. Öyleyse bu karakter dizileri nasıl bildiriyoruz? 04.04.2019
Karakter dizileri bildirmek char cMyFirstString[ ] = “Hello”; Bu bir dizi oluşturur ve dizinin elemanlarını karakter dizi içindeki her biri ayrı karakter olarak başlangıç durumuna getirir. Hatırlayın, dizi için bir boyut belirlemediğimiz sürece, başlangıç değeri boyutu belirler. Karakter diziler en sonunda diziye de eklenen gizli bir karakter içerirler. Yani “Hello” dizisinin büyüklüğü, karakter dizi sonlandırma karakteri - boş karakter olarak bilinir - eklendiğinden beş değil altıdır. 04.04.2019
Null (Boş) karakter Karakter diziler, karakter dizinin sonunu belirten özel bir sonlandırma karakterine sahiptir. Boş karakter ters kesme imini takip eden bir sıfırdan oluşur. Bunun şöyle bir görüntüsü vardır: ‘\0’ C’deki bütün karakter diziler bununla biter. Bir karakter dizisi bulunduran bütün diziler bütün karakterleri olduğu gibi boşluk karakterini de barındıracak kadar büyük olarak bildirilmelidir. 04.04.2019
Bir başka şekilde bildirmek ve başlangıç durumuna getirmek Bir tamsayı dizisini başlatıcılarla nasıl başlangıç durumuna getirdiğimizi hatırlıyor musunuz? int iMyFirstArray[ 5 ] = { 0, 0, 0, 0, 0 } ; Karakter dizi için benzeri bir şeyler başlatıcılarla yapılabilir char cMyFirstString[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘\0’}; Bu bir dizi oluşturur ve dizinin elemanlarını birbirinden farklı karakterlerle başlatır (en sondaki boşluk karakterine dikkat edin) 04.04.2019
Bildirmek ve Başlangıç Durumuna Getirmek (devam) Tamsayılarda olduğu gibi, sahip olduğunuz eleman sayısından daha az başlangıç değeri belirtirseniz, geriye kalanların tümü 0 değeriyle başlar. Örneğin, char cMyFirstString[ 5 ] = { ‘A’ }; sıfırıncı elemanı ‘A’ ve geriye kalanları 0 olarak belirler. Karakter dizi “A” olacaktır “A0000” değil. karakterden sonraki ilk 0 boşluk karakteri olarak okunur. 04.04.2019
Bir dizideki karakterlere erişmek Madem ki bir karakter dizi karakterlerden oluşan bir dizidir, her bir elemana tamsayı dizilerinde olduğu gibi erişilebilir. Örneğin, char cMyFirstString[ ] = “Hello”; cMyFirstString[ 0 ] /* ‘H’ karakteridir …. cMyFirstString[ 2 ] /* ‘l’ dir. 04.04.2019
Karakter dizileri yazdırmak Zor yolda yazdırabilirsiniz... for ( i = 0; sMyFirstString[ i ] != ‘\0’ ; i++ ) { printf( “%c”, sMyFirstString[ i ] ) ; } ... Yada daha kolay bir yol: printf (“%s\n”, sMyFirstString ); Yeni dönüşüm karakterinin karakter diziyi belirten %s olduğuna dikkat edin. 04.04.2019
Girdileri Karakter Diziler olarak Okumak Klavyeden girdiğiniz bir stringi bir karakter diziye okuyabilirsiniz. İlk önce, beklenen girdiyi tutabileccek kadar büyük bir dizi oluşturmalısınız. char sInput[ 20 ] ; Daha sonra scanf’i %s belirteci ile kullanın scanf( “%s”, sInput ); Scanf’deki DİZİ İSMİNİN ÖNÜNDE & BULUNMADIĞINA DİKKAT EDİN! Diziler için buna gerek duyulmaz! 04.04.2019
Girdiyi Okumak devam Siz bir whitespace karakteri girene kadar scanf diziyi doldurmaya devam eder. Dizinizin girdi için yeterli uzunlukta olması SİZİN sorumluluğunuzdadır. Eğer dizi girdi için çok küçükse, scanf dizi uzunluğunun sınırları dışında yazmaya devam eder. muhtemelen bir çalışma-anı hatasıyla sonuçlanacaktır. Hatırlayın, boşluk karakteri için bir yer bırakmalısınız! 04.04.2019