Diziler Temel Bilgisayar Programlama Final Sınavı Çalışma Notları (Dr. Övünç ÖZTÜRK, Dr. Tahir Emre KALAYCI) (İnşaat Mühendisliği ve Gıda Mühendisliği Grupları İçin) Diziler aynı türden bilgileri saklamak için kullanılan veri yapılarıdır. Belirli sayıda aynı türden veriyi bellekte saklamak için kullanılan değişkenler listesidir. C programlama dilinde dizileri tanımlamak için köşeli parantezlerden yararlanılır. int a[5]; ifadesi 5 adet tamsayı değer içeren a ismindeki tamsayı dizisini tanımlama ifadesidir. Dizilerin içerdiği değerlere elemanlara yine köşeli parantezlerle erişiriz. Köşeli parantezler içerisinde verdiğimiz sayı indistir. İlk eleman saymaya sıfırdan başladığımız için a[0], ikinci eleman a[1] ve son eleman boyuttan bir eksik indis değerine sahip a[4]'tür. Tek boyutlu diziler yukarıda tanımladığımız a dizisi gibi olan mutlaka boyut bilgisi, dizi türü ve dizi adı verilerek tanımlanmalıdır. Dizilere başlangıç (ilk) değer ataması küme parantezleri ile yapılabilir: int a[5] = {1,2,3,4,5; yukarıdaki şekilde tanımlanmış bir dizinin ilk elemanı (a[0]) 1 değerine, son elemanı da (a[4]) 5 değerine sahiptir. Birden fazla boyuta sahip olan dizilere çok boyutlu diziler denilmektedir. Çok boyutlu diziyi tek boyutlu dizilerde olduğu gibi köşeli parantezlerle her bir boyut için eleman sayısı vererek tanımlıyoruz. Örnek olarak 2 boyutlu bir diziyi ki bu dizi bir matristir aşağıdaki şekilde tanımlayabiliriz: int matris[3][3]; yukarıdaki şekilde tanımlanan matris ismindeki iki boyutlu tamsayı dizisinin 3 satır ve 3 sütundan oluşan bir tablo yapısı vardır. İlk değer ataması yine küme parantezleriyle yapılır: int matris[2][2] = {{1,1,{2,2; görüldüğü gibi her bir boyut için bir dizi tanımlanıyormuş gibi ek küme parantezleri kullanılabilmektedir. Bu dizinin görünümü şu şekilde olacaktır: 1 1 2 2 Çok boyutlu dizilerde de indislerden yararlanılarak elemanlara erişim sağlanır (saymaya yine sıfırdan başlıyoruz). printf( %d, matris[1][1]); ifadesi ekranda 2 (2. satırın 2. sütundaki elemanı sayma sıfırdan başlıyor) yazılmasını sağlayacaktır. Dizilerde Arama ve Sıralama Kullanıcının girdiği verilerle oluşturulmuş bir dizide yine kullanıcının girdiği bir değerin aranması örnek kodu aşağıdadır. //Basit bir dizi arama ornegi
main(){ int boyut; //dizinin eleman sayisini kullanicidan alalim scanf("%d", &boyut); int dizi[boyut]; int i; //diziye elemanlari okuyalim scanf("%d",&dizi[i]); //simdi aranacak olan degeri isteyelim int aranan; scanf("%d", &aranan); //dizide arayalim //diziyi dolasarak karsilastirma yoluyla ariyoruz if(dizi[i]==aranan){ printf("bulundu:%d",i); //buldugumuz icin dongunun devam etmesine gerek yok break; Kullanıcının girdiği verilerle oluşturulmuş bir dizinin küçükten büyüğe sıralanması örnek kodu aşağıdadır. //Basit bir dizi siralama ornegi main(){ int boyut,i,j,temp; //dizinin eleman sayisini kullanicidan alalim scanf("%d", &boyut); int dizi[boyut];
//diziye elemanlari okuyalim scanf("%d",&dizi[i]); //simdi diziyi kucukten buyuge siralayalim for(j=i+1;j<boyut;j++) //> yerine < kullanirsak buyukten kucuge siralar if(dizi[i]>dizi[j]){ //yer degistirelim temp = dizi[i]; dizi[i] = dizi[j]; dizi[j] = temp; //siralanmis diziyi goruntuleyelim printf("%d\n",dizi[i]); Karakter Dizileri Özel bir dizi türü olarak karakter dizileri önemli bir yer tutar. Karakter dizileri metinsel ifadelerin kolay bir şekilde sistemde saklanması için kullanılır. Belirli sayıda karakteri bellekte saklamak için kullanılan özel dizilerdir. Tanımlarken dizi tanımlamadaki aynı yöntemden yararlanılır: char karakterler[15]; Karakter dizilerine katarlar, stringler vb. isimler de verilmektedir. Karakter dizilerinin son elemanı her zaman için \0 (NULL) karakteridir. Karakter dizisinin tanımlarken verdiğimiz uzunluk miktarı o dizinin üst sınırını belirlerken atama yaptığımızda dizinin asıl karakter sayısı uzunluğu ortaya çıkacaktır. Tanımlamaları çift tırnak ile gerçekleştirebiliriz: char dizi[10] = Deneme ; Karakter dizilerini kullanıcıdan almak için gets ve ekranda görüntülemek için puts hazır fonksiyonlarından yararlanılır. Bu fonksiyonlar parametre olarak karakter dizisi alırlar: gets(dizi); puts(dizi); Karakter dizilerinde kullanılmak üzere hazır fonksiyonlar vardır. Bu hazır fonksiyonlar için string.h dosyasının içe aktarılması gerekmektedir (#include <string.h>). Bu fonksiyonlar ve işlevleri şöyledir: strcpy(dizi1, dizi2): dizi2 karakter dizisindeki karakterleri dizi1 karakter dizisine kopyalar strcat(dizi, Deneme ): dizi karakter dizisine ikinci parametrede verilen karakterleri ekler
strcmp(dizi1, dizi2): dizi1 ve dizi2 karakter dizilerini karşılaştırır. Eğer ikisi eşitse 0 tamsayı değerini döndürür. strlen(dizi): karakter dizisinin uzunluğunu içerdiği karakter sayısını - bulur Dosya İşlemleri Bilgisayar tarafından işlenen tüm veriler en alt seviyede yalnızca 1 ve 0 lardan oluşur. Bilginin bu en küçük parçasına bit adı verilir. Bit ler birleşerek karakterleri oluştururlar. Bir karakter 8 bit tir. Sahalar karakterlerin birleşmesiyle oluşurlar. Örneğin bir kişinin ismi bir sahadır. Bir kayıt birden fazla saha dan oluşur. Örneğin bir kişinin kimlik bilgileri bir kaydı oluşturur (numarası adı soyadı sahalarından oluşur). Kayıtların saklanabilmesi için dosyalar kullanılır. Her kayıt için o kaydı tanımlayan bir kayıt anahtarı bulunur. Kayıt anahtarına göre sıralı olarak düzenlenen dosyalara sıralı dosyalar denir. C dili her dosyayı bir sıralı byte akımı olarak görür. Her dosyanın sonunda özel bir sonlandırıcı karakter bulunur. Açılan her dosya bir akım la ilişkilendirilir. Akımlar dosya ve programlar arasında iletişim kanalı görevi görürler. Ekrana özel tanımlanmış akımlar stdin ve stdout tur. Sıralı erişimli dosyalar dosyanın başından bitimine kadar kayıtları sırayla okuduğumuz dosyalardır. Bu dosyalara erişim ve okuma-yazma işlemleri için tanımlanmış hazır fonksiyonlar vardır: fopen(dosya_adi, acma_amaci): Dosyayı açmak için kullandığımız fonksiyondur. Açma amacı r okuma amaçlı, w yazma amaçlı ve a ekleme amaçlı olabilir. Bu fonksiyon dosyayı başarılı bir şekilde açarsa geri dönüş değeri olarak FILE* tipinde bir değer döndürür (Kullanım: FILE *dosya=fopen( yeni.txt, r );). feof(dosya): Dosya sonunu kontrol eden fonksiyondur. fgets(karakter_dizisi, karakter_sayisi,dosya): Dosyadan karakter_sayisi kadar karakteri karakter_dizisi değişkenine okuyan-kopyalayan fonksiyondur. fprintf(dosya,"dosyaya eklenecek metin ): Dosyaya eklenecek-yazılacak olan metni eklemeye-yazmaya yarayan fonksiyondur. Bu fonksiyon ilk parametresi dışında printf şeklinde kullanılmaktadır. Eğer w amacıyla açtıysak dosya eğer varsa yeniden yaratılıp içerisindeki bilgileri silinmektedir. a amacıyla açtıysak dosya varsa eklediklerimiz sonuna eklenmektedir. fclose(dosya): Dosya ile işimiz bittiğinde dosyanın mutlaka kapatılması gerekir. Bu durumda dosya kapatma fonksiyonu olan fclose kullanılmalıdır. Dosya Okuma Örneği: /** Bir metin dosyasini acma, ve satir satir okuma */ void main() { FILE *dosya; //dosyayi okuma amacli acalim
dosya = fopen("ogrenciler.txt", "r"); //dosya var ve duzgun acildiysa if(dosya){ char satir[80]; while (!feof(dosya)) { fgets(satir, 80, dosya); printf(satir); else { printf("dosya bulunamadi.\n"); //isimiz bitti kapatalim fclose(dosya); Dosya Yazma Örneği: /** Bir metin dosyasini acma, ve satir satir yazma */ void main() { FILE *dosya; //dosyayi yazma amacli acalim dosya = fopen("yenidosya.txt", "w"); int i; for(i=0;i<10;i++){ fprintf(dosya,"yeni Satır:%i\n", i); //isimiz bitti kapatalim fclose(dosya); Dosyaya Ekleme Örneği: /** Bir metin dosyasini acma, ve sonuna ekleme yapma
*/ void main() { FILE *dosya; //dosyayi ekleme amacli acalim dosya = fopen("yeniogrenciler.txt", "a"); int i; for(i=0;i<10;i++){ fprintf(dosya,"%d\tali Veli\tİnşaat\n",i); //isimiz bitti kapatalim fclose(dosya); Kaynakça: Deitel & Deitel, C ve C++, Sistem Yayıncılık, 2010. Y. Özkan, C ile Programlama, Alfa Yayınları, 2003. M. Veine, C Programming for the Absolute Beginner, Thomson, 2008. A. Bingül, C Programlama Dili'ne Giriş, http://www1.gantep.edu.tr/~bingul/c/ Ç. Çebi, C Programlama Dersleri, http://www.cagataycebi.com/programming/c_programming/ F. Kadifeli, A. C. C. Say, M. U. Çağlayan, C Programlama Dili, 2007, http://www.kadifeli.com/fedon/stdcprtr.php