Süleyman KAYA tarafından yazılmıştır.
Merhaba, ben Süleyman Kaya. Bilgisayar bilimleri araştırmacısıyım. Bilgisayar bilimleri için C/C++ öğrenirken edindiğim bilgileri paylaşmak üzere bu yayın serisini sizlerle paylaşıyorum. Kaynak olarak Fahrettin Erdinç’in “Mühendislik Öğrencileri İçin Temel Klavuz: C++/C” kitabını kullanacağım. Bu yazımda C dilinde dizilerden bahsedeceğim.
Bellekte art arda yer alan, aynı veri tipindinden değerler kümesine dizi denir.
Normal değişkenler tek bir belleğe sahipken dizi değişkenler çok sayıda belleğe sahiptir.
Dizilerin her bir değerine eleman denir. Örneğin 5 elemanlı bir dizi tanımlamak demek bu dizinin 5 adet belleği var demektir ve her belleğe aynı veri tipinden farklı değerler koyulabilir.
C dilinde dizi değişkenler aşağıda görüldüğü gibi iki farklı şekilde tanımlanabilir:
Eğer dizinin bir elemanını bir değişkene atayacaksanız aşağıdaki yapıyı kullanmalıyız:
Yukarıdaki operatörü kullanarak bir dizinin eleman sayısını bulabiliriz.
Örnek:
Bu örneğimizde iki dizi tanımlayacağız ve dizinin elemanlarını konsola alt alta yazdıracağız.
Not: diziadı[x] için dizi indeks numarası (indis), dizinin x+1. elemanını ifade eder.
Bu örneğimizde 4 elemanlı int tipinde sayi isimli bir dizi oluşturup dizi elemanlarını konsoldan okuyacağız. Daha sonra da dizi elemanlarının toplamını bulup konsola yazdıracağız.
Karakter izilerine konsoldan veri okuyup atama yapmak için scanf() ve gets() fonksiyonları kullanılır.
Karakter dizilerini konsola yazdırmak için printf() veya puts() fonksiyonları kullanılabilir.
Kullanımları:
puts() fonksiyonu printf() fonksiyonundan farklı olarak baskı yaptıktan hemen sonra otomatik olarak alt satıra geçer. Yani alt satıra geçmek için ‘\n’ karakteri kullanmamıza gerek kalmaz.
Tek boyutlu diziler belirli isimde listeler oluşturup bu listelerle ilgili işlem yapmak için kullanılırken iki boyutlu diziler daha çok satır ve sütundalardan oluşan yapılar oluşturmak için kullanılır.
Örneğin bir otel odası olduğunu düşünün. Bu otelin 3 katı olduğunu ve her katta 4 oda olduğunu varsayın. Bu durumda kat:0 oda:0, kat:0 oda:2 şeklinde iki boyutlu bir dizi elde etmiş oluruz.
Aşağıdaki şekilde iki boyutlu bir dizideki elemanları tanımlamaya yarayan indis numaralarını görebilirsiniz. Örneğin {0,0} ifadesi 0.satır ile 0. sütunu temsil etmektedir. {1,3} ifadesini ise 1. satır ile 3. sütunu temsil etmektedir.
Örnek:
Bu yöntemle iki boyutlu dizi tanımlandıktan sonra elemanlar atanmalıdır. Örneğin odalar dizisine müşteri no atanacaksa aşağıdaki gibi yapılmalıdır:
Eğer ikinci yöntemi kullanarak dizi değişkeni oluşturacaksak aşağıdaki örneklere benzer diziler olabilir. Bu yöntemde hem dizi değişkeni tanımlanıyor hem de değerler (elemanlar) atanıyor.
Not: Belirli sütun ve sayıdan oluşan iki boyutlu dizilere matris de denilmektedir ve matematikte önemli bir yer tutmaktadır.
Bu örneğimizde 3 satır 2 sütundan oluşan iki boyutlu bir dizi tanımlayıp değerlerini atayacağız. Daha sonra da dizi elemanlarını konsola yazdıracağız.
Dizi elemanlarını konsola yazmak için iç içe iki for döngüsü kullanacağız. Bu for döngüleriyle dizi indislerini kontrol edeceğiz. Sonuçta dizinin elemanlarını aşağıdaki gibi sıralayacağız:
indis00 indis01
indis10 indis11
indis20 indis21
//değişkenleri tanımlayalım
int satir_sutun;
//diziyi tanımlayalım
int dizi[3][2]={{1,2},{3,4},{5,6}};
//dizinin elemanlarını yazalım
for(satir=0; satir< 3; satir++){
for(sutun=0;sutun<2; sutun++){
printf(“%d%d:%d”, satir,sutun,dizi[satir][sutun]);
}
//her iki sutunda bir alta geç
if(sutun%2==0) printf(“\n”);
}
Önceki örneğimizde kullandığımız dizin elemanlarını bu örneğimizde konsoldan okuyacağız. Dizi elemanlarını konsoldan okumak için iç içe iki for döngüsü kullanacağız. Bu for döngüleriyle dizi indislerini kontrol edeceğiz. Sonuçta dizi elemanlarını satır ve sütun indislerine göre okuyacağız.
Bu örneğimizde iki farklı diziyi toplayacağız.
Bir sonraki yayınımda C dilinde pointer’lara değinmeyi planlıyorum. İyi günler dilerim.
[TR] C/C++ Öğreniyorum (#8)
Giriş
Merhaba, ben Süleyman Kaya. Bilgisayar bilimleri araştırmacısıyım. Bilgisayar bilimleri için C/C++ öğrenirken edindiğim bilgileri paylaşmak üzere bu yayın serisini sizlerle paylaşıyorum. Kaynak olarak Fahrettin Erdinç’in “Mühendislik Öğrencileri İçin Temel Klavuz: C++/C” kitabını kullanacağım. Bu yazımda C dilinde dizilerden bahsedeceğim.
Dizi Nedir?
Bellekte art arda yer alan, aynı veri tipindinden değerler kümesine dizi denir.
Normal değişkenler tek bir belleğe sahipken dizi değişkenler çok sayıda belleğe sahiptir.
Dizilerin her bir değerine eleman denir. Örneğin 5 elemanlı bir dizi tanımlamak demek bu dizinin 5 adet belleği var demektir ve her belleğe aynı veri tipinden farklı değerler koyulabilir.
Dizi Tanımlama
C dilinde dizi değişkenler aşağıda görüldüğü gibi iki farklı şekilde tanımlanabilir:
veritipi değişken[boyut];
veritipi değişken[]={değer1, değer2, değer3…değerN};
Birinci Yöntem
- Bu yöntemde veri tipi ile beraber dizinin eleman sayısı da belirtiliyor.
int x[5]; //5 elemanlı integer dizisi
double alan[10]; //10 elemanlı ondalıklı sayı dizisi
char suleyman[8]; //8 elemanlı char dizisi
İkinci Yöntem
- Bu yöntemde ise önce dizi değişkeni oluşturuluyor ve daha sonra dizi değişkenine elemanlar ekleniyor; C dili eklenen elemanların sayısını bizim için otomatik olarak hesaplıyor ve dolduruyor.
int tekerler[]={1,2,3,4}; //int tipinde 4 elemanlı tekerler dizisi
double cevre[]={3.22, 5.232, 6.1212}; //double tipinde 3 elemanlı cevre dizisi
char suleyman[]={“s”, “u”, “l”, “e”, “y”, “m”, “a”, “n”}; //char tipinde 8 elemanlı suleyman dizisi
Dizi Elemanını Değişkene Atama
Eğer dizinin bir elemanını bir değişkene atayacaksanız aşağıdaki yapıyı kullanmalıyız:
int x=dizi[y]; //dizinin y indisindeki elemanı x değişkenine ata
Dizi Değişkeni Oluşturulurken Dikkat Edilmesi Gereken Konular
- Dizi değişken adı normal değişken adları kurallarıyla aynıdır.
- Dizide aynı türde veriler olmalıdır; Örneğin bir diziyi int tipinde tanımladıysak o dizinin tüm elemanları int tipinde olmak zorundadır.
- Dizi elemanları sıfırdan başlar. Dizi elemanlarının numarasına “indis” denir. Örneğin x[2] ifadesi dizideki 2 numaralı indise sahip olan elemanı belirtir.
- Veri tipini ve değişkeni belirttikten hemen sonra köşeli parantez ([]) koyulmalıdır. Eğer iki boyutlu dizi tanımlanacaksa iki köşeli parantez yapılmalıdır.
- Eğer değerler atanacaksa ={d1, d2, d3} şeklinde atanmalıdır.
Dizinin Eleman Sayısı
eleman_sayisi = sizeof(dizi_adi)/sizeof(dizinin_veri_tipi);
Yukarıdaki operatörü kullanarak bir dizinin eleman sayısını bulabiliriz.
Örnek:
int elemanlar[]={1,2,3,4};
int elemanlarin_sayisi = sizeof(elemanlar)/sizeof(int);
printf(“elemanlar dizi degiskeninin eleman sayisi (dizi uzunlugu): %d\n”, elemanlarin_sayisi );
Tek Boyutlu Dizi Uygulamaları
Dizi Elemanlarının Konsola Yazılması
Bu örneğimizde iki dizi tanımlayacağız ve dizinin elemanlarını konsola alt alta yazdıracağız.
Not: diziadı[x] için dizi indeks numarası (indis), dizinin x+1. elemanını ifade eder.
sk[0]; //sk dizisinin 0 indisli elemanı; sk dizisinin ilk elemanı
sk[1]; //sk dizisinin 1 indisli elemanı; sk dizisinin ikinci elemanı
sk[2]; //sk dizisinin 2indisli elemanı; sk dizisinin üçüncü elemanı
#include <stdio.h>
int main(){
int dizi1[]={1,2,3,4,5,6,7,8,9}; //9 elemanlı birinci dizimizi tanımladık
char dizi2[]= {“s”, “k”, “a”, “y”, “a”}; //5 elemanlı ikinci dizimizi tanımladık
// şimdi ilk önce bu dizilerimizin eleman sayısını bulalım ve bunu limit olarak bir değişkene atayalım, daha sonra sayaçlar yardımıyla dizilerimizin indislerini arttırarak tek tek elemanları listeleyelim.
//dizi1’in elemanlarını sıralayalım
eleman_sayisi_1=sizeof(dizi1)/sizeof(int);
for(int indis=0; indis<eleman_sayisi_1; indis++){printf(“dizi1’in %d indisli elemanı: %d\n”, indis, dizi1[indis]);}
printf(“\n”); //boş satır
//dizi2’nin elemanlarını sıralayalım
eleman_sayisi_2=sizeof(dizi2)/sizeof(char);
for(int indis=0; indis<eleman_sayisi_2; indis++){printf(“dizi2’nin %d indisli elemanı: %d\n”, indis, dizi2[indis]);}
return 0;
}
Dizi Elemanlarının Konsoldan Okunması
Bu örneğimizde 4 elemanlı int tipinde sayi isimli bir dizi oluşturup dizi elemanlarını konsoldan okuyacağız. Daha sonra da dizi elemanlarının toplamını bulup konsola yazdıracağız.
int main(){
int sayi[4], sayac=0;
// elemanları konsoldan okuyalım ve kaydedelim
for(; sayac<4; sayac++){printf(“aralarında boşluk bırakarak dizinin 4 elemanını giriniz:\n”); scanf(“%d %d %d %d”, &sayi[0], &sayi[1], &sayi[2], &sayi[3]);}
// girilen elemanların toplamını yazdıralım
int toplam = sayi[0] + sayi[1] + sayi[2] + sayi[3];
printf(“girilen elemanlarin toplami: %d”, toplam);
return 0;
}
N Elemanlı Dizi Oluşturulması ve Eleman Atanması
//dizimizi oluşturalım
int dizi[];
//sayaç olarak kullanmak üzere varsayılan olarak 0 değerinde gelen indis isimli int değişkenimizi oluşturalım
int indis=0;
//dizimizin kaç elemanlı olduğunu tanımlayalım
int eleman_sayisi;
printf(“oluşturacağımız dizinin eleman sayısını giriniz: ”); scanf(“%d\n”, &eleman_sayisi);
//şimdi dizi elemanlarını kullanıcıdan çekelim
for(;indis<eleman_sayisi; indis++){printf(“dizinin %d indisli değişkeninin değerini (int tipinde) giriniz: ”, indis); scanf(“%d\n”, &dizi[indis]);}
//şimdi de elemanları yazdıralım
printf(“dizinin elemanları:\n”);
for(int i=0; i<eleman_sayisi; i++){printf(“%d\n”, dizi);}
Dizi Elemanlarının Tersten Sıralanması
// değişkenleri tanımlayalım
int indis, eleman_sayisi;
// dizimizi tanımlayalım
int dizi[]={1,2,3,4,5,6,7,8,9};
//dizmizi normal sırayla yazalım
for(indis=0; indis<eleman_sayisi; indisi++){printf(“%d\n”, dizi[indis]);}
//bir satır boşluk
printf(“\n”);
//dizimizi tersten yazdıralım
for(indis=eleman_sayisi-1; indis>eleman_sayisi; indis — ){printf(“%d\n”, dizi[indis]);}
Karakter Dizileri
- Önce biraz hatırlatma yapmakta fayda var. C dilinde tek bir karakteri saklamak için char veri tipi kullanılır.
char harf = ‘a’;
char k=’k’;
- C dilinde metinler çift tırnak içine koyulur ve bu verilere “string” denir.
- Aslında string veriler char veri tipi ile tanımlanan dizilerde saklanır. Örneğin “süleyman” metnini saklamak için aşağıdaki dizi kullanılabilir:
char ad[]={‘s’, ‘u’, ‘l’, ‘e’, ‘y’, ‘m’, ‘a’, ‘n’};
char ad[] = “suleyman”;
- String tipindeki verilerin her karakteri ayrı bir belleğe yerleştirilir.
- Derleyici karakter dizilerinin en sonuna dizinin bittiğini söyleyen, sonlandırıcı adı verilen bir karakter koyar.
- Bu karakterin ASCII kodu 0 oldupu için ‘\0’ olarak gösterilir. Ayrıca NULL Sabiti olarak da bilinir.
Karakter Dizilerinde Veri Girişi
Karakter izilerine konsoldan veri okuyup atama yapmak için scanf() ve gets() fonksiyonları kullanılır.
- scanf() fonksiyonu girilen verilerde boşluk veya ENTER karakteri görünceye kadar veri almaya devam eder.
- Bu durumda scanf() komutu ile en fazla bir kelime okuyabilirsiniz çünkü boşluk bırakıp ikinci kelimeye geçtiğinizde asıl veri okuma sonlanacaktır. Bu fonksiyonun yapısı şu şekildedir:
scanf(“%yer_tutucu”, °isken_ismi);
- gets() fonksiyonu bir kelimeden fazla cümle ve paragraf benzeri merinleri okurken kullanılır. Bu fonksiyon ENTER karakterini görünceye kadar veri okumaya devam eder. Bu fonksiyonun yapısı şu şekildedir:
gets(dizi_adi);
Karakter Dizilerde Veri Çıkışı
Karakter dizilerini konsola yazdırmak için printf() veya puts() fonksiyonları kullanılabilir.
Kullanımları:
printf(“%xs”, dizi_adi); //x ifadesi string veri için ayrılacak bellek sayısını ifade eder.
puts(dizi_adi);
puts() fonksiyonu printf() fonksiyonundan farklı olarak baskı yaptıktan hemen sonra otomatik olarak alt satıra geçer. Yani alt satıra geçmek için ‘\n’ karakteri kullanmamıza gerek kalmaz.
İki Boyutlu Diziler
Tek boyutlu diziler belirli isimde listeler oluşturup bu listelerle ilgili işlem yapmak için kullanılırken iki boyutlu diziler daha çok satır ve sütundalardan oluşan yapılar oluşturmak için kullanılır.
Örneğin bir otel odası olduğunu düşünün. Bu otelin 3 katı olduğunu ve her katta 4 oda olduğunu varsayın. Bu durumda kat:0 oda:0, kat:0 oda:2 şeklinde iki boyutlu bir dizi elde etmiş oluruz.
Aşağıdaki şekilde iki boyutlu bir dizideki elemanları tanımlamaya yarayan indis numaralarını görebilirsiniz. Örneğin {0,0} ifadesi 0.satır ile 0. sütunu temsil etmektedir. {1,3} ifadesini ise 1. satır ile 3. sütunu temsil etmektedir.

İki Boyutlu Dizi tanımlama
veritipi degisken_ismi[satir_sayisi][sutun_sayisi];
veritipi degisken[2][2]={sa0-sü0, sa0-sü1, sa1-sü0, sa1-sü1};
Örnek:
int x[5][3]; //5 satır 3 sütunlu iki boyutlu x dizisi
double alan[2][2]; //2 satır 2 sütunlu iki boyutlu alan dizisi
Bu yöntemle iki boyutlu dizi tanımlandıktan sonra elemanlar atanmalıdır. Örneğin odalar dizisine müşteri no atanacaksa aşağıdaki gibi yapılmalıdır:
int odalar[1][2]; //dizi tanımlandı
odalar[0][0]=123; //0.kat 0. odada 123 nolu müşteri kalıyor
odalar[0][1]=124; //0.kat 1. odada 124 nolu müşteri kalıyor
odalar[1][0]=125; //1.kat 0. odada 125 nolu müşteri kalıyor
odalar[1][1]=126; //1.kat 1. odada 126 nolu müşteri kalıyor
Eğer ikinci yöntemi kullanarak dizi değişkeni oluşturacaksak aşağıdaki örneklere benzer diziler olabilir. Bu yöntemde hem dizi değişkeni tanımlanıyor hem de değerler (elemanlar) atanıyor.
int y[2][3]={{1,2,3},{4,5,6}}; //iki satır 3 sütunlu iki boyutlu dizi
int odalar[][]={{2,4},{6,8},{10,12}}; // 2 satırlı 3 sütunlu iki boyutlu dizi
int odev_notlari[][]={{100,100,90,85,95},{95,95,100,40,45},{10,20,30,40,50},{100,100,100,100,100}}; //4 sütunlu 5 satırlı iki boyutlu dizi
Not: Belirli sütun ve sayıdan oluşan iki boyutlu dizilere matris de denilmektedir ve matematikte önemli bir yer tutmaktadır.
İki Boyutlu Dizinin Elemanlarını Ekrana Yazdırma
Bu örneğimizde 3 satır 2 sütundan oluşan iki boyutlu bir dizi tanımlayıp değerlerini atayacağız. Daha sonra da dizi elemanlarını konsola yazdıracağız.
Dizi elemanlarını konsola yazmak için iç içe iki for döngüsü kullanacağız. Bu for döngüleriyle dizi indislerini kontrol edeceğiz. Sonuçta dizinin elemanlarını aşağıdaki gibi sıralayacağız:
indis00 indis01
indis10 indis11
indis20 indis21
//değişkenleri tanımlayalım
int satir_sutun;
//diziyi tanımlayalım
int dizi[3][2]={{1,2},{3,4},{5,6}};
//dizinin elemanlarını yazalım
for(satir=0; satir< 3; satir++){
for(sutun=0;sutun<2; sutun++){
printf(“%d%d:%d”, satir,sutun,dizi[satir][sutun]);
}
//her iki sutunda bir alta geç
if(sutun%2==0) printf(“\n”);
}
İki Boyutlu Dizinin Elemanlarını Okuma
Önceki örneğimizde kullandığımız dizin elemanlarını bu örneğimizde konsoldan okuyacağız. Dizi elemanlarını konsoldan okumak için iç içe iki for döngüsü kullanacağız. Bu for döngüleriyle dizi indislerini kontrol edeceğiz. Sonuçta dizi elemanlarını satır ve sütun indislerine göre okuyacağız.
int i,j; //i=satir, j=sutun
//3 satır 2 sütunlu iki boyutlu dizimizi tanımlayalım
int dizi[3][2];
//dizinin elemanlarını okuyalım.
for(i=0;i< 3;i++){
for(j=0;j<2;j++){
printf(“indeks [%d][%d] = ”, i,j);
scanf(“%d”, &dizi[j]);
}
}
[M][N] elamnlı Dizi Oluşturma Ve Eleman Okuma/Yazma
//değişkenlerimizi tanımlayalım
int j,k;
//dizimizin kaç elemanlı olacağını okuyalım
printf(“satir sayisi: “); scanf(“%d”, &j);
printf(“sutun sayisi: “); scanf(“%d”, &k);
//dizimizi oluşturalım
int dizi[j][k];
//dizimizin elemanlarını konsoldan çekelim
for(int indis_satir=0; indis_satir<j; indis_satir++){
for(int indis_sutun=0; indis_sutun<k; indis_sutun++){
printf(“dizinin %d.satir %d. sutununda saklamak istediginiz deger: “, indis_satir,indis_sutun);
scanf(“%d”, &dizi[indis_satir][indis_sutun]);
}
}
//oluşan dizimizi ekrana yazdıralım
for(int s=0; s<j; s++){
for(int i=0; i<k; i++){
printf(“%d\n”, dizi);
}
}
Matris İşlemleri
//istenirse matris değerleri konsoldan da okunabilir.
//bu örnekte doğrudan atama yapacağız.
int a[2][3]={1,2,3,4,5,6};
int b[2][3]={6,5,4,3,2,1};
int c[2][3];
//matrisleri toplayalım
int i,j;
for(i=0;i<2;i++){
for(j=0;k < 3; k++){
c[j]=a[j]+b[j];
}
}
Kapanış
Moderatör tarafında düzenlendi: