diziler etiketine sahip kayıtlar gösteriliyor.
diziler etiketine sahip kayıtlar gösteriliyor.

C Programlama Gösterge (Pointer) Kavramı

Değişkenlerin kapladıkları hücrelerin adreslerini saklamak için başka değişkenler de kullanabiliriz. Bu değişkenlere gösterge adı verilir. Göstergeler, diğer değişkenler gibi, sayısal bir değişkenlerdir. Bu sebeple kullanılmadan önce program içinde bildirilmelidir. 

Sözdizimi :   tip_adı *gösterge_adı;

int *bayraktar;
float *x, *y, *z

Gösterge Operatörleri ( & ve *) : "&" değer atama operatörüdür. Örneğin bayraktar = &y; ifadesinde y değişkenini gösteren bayraktar göstergesidir. "*"  yönlendirme operatörünün göstergeyi tanımlamanın dışında bir görevi daha vardır. Örneğin *bayraktar ifadesi, bayraktar'ın gösterdiği hücrenin içeriğine ulaşmak içinde kullanılabilir. *bayraktar = 66; gibi…

Bir göstergenin bellekte herhangi bir hücreyi göstermesini istemediğimiz zaman NULL isimli sabit kullanılır. NULL göstergenin bellekte hiç bir yeri göstermediğini belirten 0 değeridir.
int *bozok = NULL;

Dinamik Bellek Kullanımı: Programın çalışması esnasında özel komutlar kullanarak bellekten yer alınıp kullanılmasına dinamik bellek kullanımı adı verilir. Dinamik değişkenler için bellekte ayrılan yere yığın (heap) adı verilir. Dinamik bellek kullanımını new ve delete komutları ile gerçekleştiririz..

new komutu ile bellekten istediğimiz veri Npi boyutunda bir yer alabiliriz.
int *ornek; //ornek adlı tamsayı gösterecek bir gösterge tanımlıyoruz.
ornek = new int; //bellekten tamsayı kadar yer ayrılır, bu yerin adresi burada ornek'e aktarılır.
*ornek = 9; //bellekten alınan yeni yere 9 atanır.

int *bozok=new int(9); //değişken tanımlanması esnasındada ilk ataması yapılabilir.

Dinamik bir Dizi Oluşturalım ve tekrar bellekten Silelim :
int *ornekdizi; //ornekdizimiz tamsayı gösterecek şekilde tanımlanır.
ornekdizi=new int[10]; //bellekten 10 tamsayı dizisi için yer tahsis edilir ve dizinin adresi ornekdizi'ye atanır.
ornekdizi[2]=16; //bellekten alınan dizinin 1.indeksteki elemanına 15 atanır.
Bellekten new ile aldığımız yerler, kullanımları sona erdiğinde yeniden kullanılamazlar. Bu nedenle bellekten aldığımız hücreleri program bitmeden delete komutu ile silmemiz gerekir.

int *bozok=new int; //bozok göstergesine tamsayı boyutunda yerin adresi atanır.
*bozok=16; //bozok göstergesinin gösterdiği yere 16 atanır.
cout<<*bozok; //atanan 16 değeri yazdırılır.
delete bozok; //ayrılan yer belleğe geri döndürülür.

int *ornekdizi; //ornekdizi adında tamsayı gösterecek bir gösterge tanımlanır.
ornekdizi=new int[8]; //bellekten 8 tamsayı dizisi için yer ayrılır ve dizinin adresi ornekdizi'e atanır.

ornekdizi[1]= 13; //bellekten alınan dizinin 1.indeksteki elemanına 13 atanır.
delete [] ornekdizi; //oluşturulan dizinin tüm elemanları belleğe geri döndürülür.

Örnek:
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

void oku(int[],int);
int main(int argc, char *argv[])
{
   int mevcut, toplam=0;
   int max=0;
   int *notlar;
   cout<<"Sinif mevcudunu Giriniz: ";
   cin>>mevcut; //Sınıf mevcudunu okuyoruz
   notlar=new int[mevcut]; //Sınıf mevcudu kadar dinamik dizi yaratıyoruz
   oku(notlar,mevcut);

   for(int i=0; i<mevcut;i++)
   {
           toplam+=notlar[i];
           if (notlar[i]>max)
           max=notlar[i];
   }
   cout<<"Sinif Ortalamasi= "<<toplam/mevcut<<endl;
   cout<<"En yuksek not = "<<max<<endl;
   delete [] notlar;
   getch();
}
void oku(int notDizi[], int boyut) //Notları okuduğumuz fonksiyon
{
     cout<<"Notlari Giriniz:";
     for(int i=0; i<boyut;i++)
             cin>>notDizi[i];
}

C Programlama Yapılar (Structures)

Herkese selamlar bu makalemde C Programlama Dilinde önemli bir yeri olan Yapılar (Structures) hakkında bildiklerimi paylaşmak istiyorum. 

Yapılar (structures) içinde aynı veya farklı veri tipinde birden fazla eleman saklayabildiğimiz bileşik veri tipidir. Programlarımızda değişkenleri kullandığımız için büyük önemleri vardır. Örneğin dizilerde hafızada bir takım yerler açılır, bu hafıza kısımlarını doldururken belirlemiş olduğunuz değişken tipinin dışına çıkamayız…işte yapılar saysesinde farklı veri tiplerinde birden fazla eleman saklayabiliriz.

struct insan{
       string isim;
       float boy;
       int kilo;
}insan birey; //birey nesnesi

Eğer veri tipi tanımlamayıp sadece değişken tanımlamak istiyorsak bunu şu şekilde gerçekleştirebiliriz;

struct {
       string isim;
       float boy;
       int kilo;
}birey;

Yapılara İlk Değer Atama : Tüm değişkenlere yapabildiğimiz gibi yapı değişkenlerine de tanımları sırasında ilk değer ataması yapabiliriz.
insan birey={"ibrahim bayraktar",1,74,100}; //birey yapı değişkeni

Yapı Elemanlarına Erişim: Yapıda yer alan elemanlara, nokta (.) operatörü ile erişebiliriz.
yapıDegiskeni.elemanAdı

Örnek :
cout<<kitap1.isim;
kitap1.yayinyili+=5;
if(kitap1.baski>35)…

kitaplar kitap1,kitap2;
cin>>kitap1.isim>>kitap1.yayinyili>>kitap1.baski;
kitap2=kitap1;

Yapı Elemanlarına Erişim Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
struct rasyonel_erisim //yapiyi tanımliyoruz.
{
int pay, payda;
};
int main(int argc, char *argv[])
{
    rasyonel_erisim sayi1,sayi2,sonuc;
    cout<<"1.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi1.pay>>sayi1.payda;  //burada sayilar okunuyor
    cout<<"2.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi2.pay>>sayi2.payda;
    sonuc.pay=sayi1.pay * sayi2.pay;
    sonuc.payda=sayi1.payda*sayi2.payda; //pay ve paydaları carpiyoruz
    cout<< sayi1.pay<<"/"<<sayi1.payda<<" x ";
    cout<< sayi2.pay<<"/"<<sayi2.payda<<" = ";
    cout<<sonuc.pay<<"/"<<sonuc.payda<<endl; //sonucu yazdiriyoruz
    getch();
}

İç İçe Structures: Bir yapının elemanı başka bir yapı olabilir. Bu durumdaki yapılara iç içe yapı (nested structures) adı verilir.

struct tarih {
       string ay;
       int yil,gun;
};
struct insan {
       string isim;
       float boy;
       int  kilo;
       struct tarih dogumTarihi;
};
insan icice;
icice.dogumtarihi.gun=17;

İç İçe Structures Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

struct personelBilgi {
    char * isim;
    char * soyisim;
    char * Egitim;

  };

struct personelKayit{
  char * kayitYapanPersonel;
  char * kayitTarihi;
  struct personelBilgi personel;
};

int main(){

  struct personelKayit pk001;

  pk001.kayitYapanPersonel="Ibrahim BAYRAKTAR";
  pk001.kayitTarihi="12.01.2015";
  pk001.personel.isim="FISTIKCI";
  pk001.personel.soyisim="SAHAP";
  pk001.personel.Egitim="Lisans";

  printf("Kayit Islemini Yapan Personel: %s\n", pk001.kayitYapanPersonel);
  printf("Kayit Tarihi: %s\n", pk001.kayitTarihi);

  printf("Personel Isim: %s\n", pk001.personel.isim);
  printf("Personel Soyisim: %s\n", pk001.personel.soyisim);
  printf("Personel Egitim Duzeyi: %s\n", pk001.personel.Egitim);

  getch();
}

C Programlama Diziler (Arrays)

C Programlama

Dizi (array) Nedir? 
Dizi, aynı tip verilerin birbiri arkasına tanımlanmasıdır. Dizi bir kümedir. Aynı tipte verilere tek bir isimle erişmek için kullanılır. Bir dizinin bütün elemanları bellekte peşpeşe saklanırlar. Diziler kullanılarak, aynı isimle birden fazla değişkene erişilebilir ve işlem yapılabilir. Diziler tek ya da çok boyutlu olarak tanımlanabilir ve dizi boyutu ihtiyaca göre ayarlanabilir.char, int, float ve double olarak tanımlanabilen dizilerde sadece aynı veri türünden değişken değerleri yer alabilir.

Dizileri tek boyutlu ve çok boyutlu olarak iki kısma ayırabiliriz. Tek boyutlu dizilere sayı dizilerini ve vektörleri örnek verebiliriz. Çok boyutlu dizilere ise matrisleri örnek verebiliriz..

Tek Boyutlu Diziler (one-dimensional array) : C Programlama Dilinde aynı veri tipinden olan değişkenler tek bir isim altında toplanarak tek boyutlu diziler oluşturulur. Aynı veri türünden ve farklı isimlere sahip çok fazla sayıda değişken tanımlamak yerine, dizi bildirimi yapıp tek isim kullanarak aynı sayıda değişken tanımlamak daha kolaydır.

Tek boyutlu dizilerin bildirimi için kullanılan genel yapı :  veritipi diziAdı [boyut];

Veri Tipi : Dizi elemanlarının tipini belirtir. dizi kaç elemandan oluşur ise oluşsun tipleri aynı olmak zorundadır.
Dizi Adı : Diziye programcının verecegi özerk ismi ifade eder.
Boyut : Dizilerin mutlaka bir boyutu olmak zorundadır. Dizi boyutları "[ … ]" içeriğinde tanımlanır. 

Örnek :
// Örnek Dizi Tanımlama
// 100 elemanlı ve dizi adlı bir double dizisi
double dizi[100];

Örneğimizde 100 elemandan oluşan dizi adlı bir double dizisi oluşturuluyor. Köşeli parantezle içerisindeki 100 sayısı, dizimizin 100 elemanlı olduğunu ifade etmektedir. Tek bir köşeli parantez olduğu için dizimizin tek boyutlu bir dizi olduğunu söyleyebiliriz. 

Tek Boyutlu Dizilerde Atama : Bir dizinin tanımlaması yapıldıktan sonra, atama işlemcisini kullanarak bu diziye değerler atanabilir. C Programlama Dilinde de bir dizinin ilk elemanına 0 değeri ile erişim sağlanır.

Örnek :
int dizi[30];   // 30 elemanlı dizi isimli bir dizi oluşturur. //
dizi[0] = 15;   // Dizinin ilk elemanına 15 değerini atar. //
dizi[16] = 42;  // Dizinin 17. elemanına 42 değerini atar. //