C/C++ Öğreniyorum (#9)

  • Konbuyu başlatan PwnLab.Me
  • Başlangıç tarihi
P

PwnLab.Me

Admin
Katılım
21 Ocak 2024
Mesajlar
202
Tepkime puanı
9
Puanları
18
Süleyman KAYA tarafından yazılmıştır.

[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”, &degisken_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:

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.

0*ne1N7-wOElJ7OKat.png


İ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


Bu örneğimizde iki farklı diziyi toplayacağız.

//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ış


Bir sonraki yayınımda C dilinde pointer’lara değinmeyi planlıyorum. İyi günler dilerim.
 
Moderatör tarafında düzenlendi:
Geri
Üst