14 Şubat 2014 Cuma

C STRUCT (Yapılar)


C STRUCT' LAR

Struct'lar C'den başlayarak C++, C#, Java gibi oop dillere de girebilmiş bir kavramdır. struct'lar için class'tan türemiş denemez, en fazla class'lar struct'lardan türemiştir.Çünkü struct, class'a göre daha primitif(ilkel) ancak belli başlı farklarıyla çoğu zaman kullanılması daha faydalı yapılardır.

Aralarında mantıksal bir ilişki bulunan farklı türden veriler “struct” lar içerisinde bir bütün olarak tanımlanabilirler. Bir örnek verecek olursak: Öğrencilere ait ad, soyad, vize notu, final notu gibi değişkenleri her öğrenci için ayrı ayrı tanımlaycağımızı düşünürsek iş, içinden çıkılmaz bir hal alır. C dilinde struct anahtar kelimesi ile programcılar kendi değişken tiplerini oluşturabilirler. Bunun için de struct vardır “Struct” lar diziler gibi bellekte sürekli kalırlar fakat dizilerin aksine değer tipindedirler ve

struct yapı-adı
{
tip adı değişken adı;
tip adı değişken adı;
};

şeklinde tanımlanırlar.

Kelime olarak Tükrçe karşılığı yapı anlamına gelen structler tek bir ad altında toplanmış bilgiyi bir arada tutmak için yol sunan bir koleksiyondur.

Yapıyı oluşturan öğelere member(üye) adı verilir.Örneği inceleyelim:

struct kisi{
char adi[15];
int yas;
};

struct kisi ahmet;
ahmet.yas=2;

Yukarıdaki şekilde bir yapı tanıtıldı ve bu yapıya ahmet adında bir değişken atandı.Bu değişkenin özellikleri yani yaş v.s gibi özelliklerine ise yani yapı üyelerine ise "."operatörü ile erişebiliriz.ahmet.yas=2; de olduğu gibi.Bu yapı üyelerinin ekrana yazdırılması ise şu şekilde yapılabilir:

printf("%d",ahmet.yas );

Yapılarda onemli bir husuta yapıların atanmasıdır.Aşağıdaki örneğimizi inceleyecek olursak bunu daha net bi şekilde görebiliriz.

strcut num{
int a;
int b;
}x,y ;
x.a=4; x.y=3;
y=x;
printf("%d %d",y.a,y.b );

Programın çıktısı sırası ile 4 ve 3 olacaktır.Bu gibi şekillderde yapıların tüm üyelerini birbirine eşitleyebilirsiniz.Aynı üeyelere sahip birden çok yapı değişkeni tanıtmak istediğinizde ise şu yontemi kullabilirsiniz:

struct kisi ahmet[100]; //Bu şeklilde 100 tane ahmet adında değişken tanımlanmış oldu.

printf("%d",ahmet[1].yas );//Bu şekilde ise yapıların üyelerine erişim sağlanabilir.

Bu konuda öenmli bir hususta tüm dizi değişkenleri gibi ,yapılarda 0 dan indexlemey başar.Yani ahmet[0] ile başlar.

10 kisilik bir hasta defteri hazırlanması:

#include <stdio.h>

int i,k;
int main(void ){
struct hasta{
char adi[];
int hastano;
char bolum[];
};
struct hasta kisi[10];

for(i=0; i<10; i++ ){
printf("Hastanin adi:" );
gets(kisi.adi );
printf(" Hasta numarasi:" );
scanf("%d",&kisi.hastano );
printf(" Hastanin Bolumu:" );
gets(kisi.bolum; );
printf(" Kayit islemi tamamlandi. " );
}
}

Bu örnekte basit bir hasta kayıt programı yaptık ama siz dilerseniz bu örneği dahada geliştirebilirsiniz.Kayıtları dosyaya yazan ve oradan alıp listeleyen programı yazabilirsiniz.







C++ Class


C++ CLASS(Sınıflar)

C++ OOP yani nesne yönelimli programlama dili olduğu için C++ ile program yazılırken nesne oluşturabileceğimiz class' lar kullanılır.Fonksiyonel dillerde örneğin C de nasıl fonksiyonlar ana yapıyı oluşturuyorsa C++ gibi nesne tabanlı dillerde de classlar(sınıflar) ana yapıyı oluşturmaktadır.

C++'da gerçek nesnelerin oluşturulması işlemi class ile olur.Sınıf nesneler, oluşturmak için kullanılan yöntemdir. Class ile şu şekilde bildirim yapılır;


Örnek:

classsınıf_adı {

private:

private veri ve fonksiyonlar;

public:

public veri ve fonksiyonlar;

protected:

protectedveri ve fonksiyonlar;

}nesne listesi;

-Nesne nedir?

Nesne, oluşturduğumuz sınıfın ürünüdür.

Bir örnekle nesne ile sınıf arasındaki farkı inceleyelim.

 
Yolcu Sınıfı
Müşterinin Adı
Gideceği yer
Sefer numarası
Sefer saati
Yolcu olan ahmet Nesnesi
Müşterinin Adı
Gideceği yer
Sefer numarası
Sefer saati
…Otobüs biletini oluştur…


Programın diğer bölümleri tarafından erişilebilir hale getirmek söz konusu ise, public anahtar kelimesi mutlaka belirtilmelidir.

Herhangi bir tanım yapılmaz ise, sınıf içinde belirtilen tüm bölgelerin özel bölge olduğu, yani privatekabul edildiği varsayılır.

Bu durumda söz konusu bu bölgelerin tümüyle sınıfın üyesi bir fonksiyon tarafından kullanılabileceği anlaşılır.

Bir sınıf nesnesi yoluyla dışarıdan nokta operatörünü kullanarak sınıfın yalnızca publicbölümünde bildirilen veri elemanlarına veya fonksiyonlarına erişilebilir. Private veya protected bölümlerine erişilemez.

Bu olay NYP(Nesne Yönelimli Programlama)’da kapsülleme(encapsulation) olarak bilinir.

-Kapsülleme

Kapsülleme nesnenin verilerini,metodlarını(metod kelimesi C++ çok sık kullanılır metod diyerek kastedilen tanımladığımız fonksiyonlardır diyebiliriz) ve değişkenlerini diğer değişkenlerden saklayarak ve bunlara erişimi sınırlandırarak yanlış kullanımlardan koruyan bir konseptir.

Çoğu programlama dilleri kapsüllemeyi aşağıda sıraladığımız üç bilgi erişim belirteçleri ile desteklerler.

  • Public(halka açık, kamu)

  • Private(özel, gizli)

  • Protected(korumalı)

Şimdi bu bilgi erişim belirteçleri nedir bunlara biraz değinelim.

  • Public(halka açık, kamu) erişim kuralı ile tanımladığımız metodlara ve verilere her nesneden erişebiliriz.

  • Private(özel, gizli) erişim kuralı ile tanımladığımız bir metoda sadece bu metodun tanımlandığı sınıftan örneklendirilmiş nesnelerin içinden erişim hakkına sahip oluruz.
  • Protected(korumalı) erişim kuralı ile tanımladığımız bir metoda ise bu metodun tanımlandığı sınıftan örneklendirilmiş nesnelerin içinden ve bu sınıftan türetilmiş olan alt nesnelerden erişebiliriz.

Not:Eğer erişim belirteçlerini tanımlamazsanız tüm üyeler varsayılan olarak Private tanımlanır.


Sınıf içinde genel Fonksiyonların Tanımlanması


Gerek duyulduğunda, fonksiyon tanımları sınıfın bildiriminin dışına taşınarak genel fonksiyonlar biçimine dönüştürülebilir.

Bu durumda, sınıf tanımı içinde ilgili fonksiyonların prototiplerine yer vermek gerekecektir. Üye fonksiyonların, sınıf dışında tanımlanması durumunda, bu fonksiyonun hangi sınıfın bir üyesi olduğunu da belirtmek gerekmektedir.

Bunun için (::) işlevinden yararlanılır.Örneğin; sınıf_adı :: fonksiyon_adı.


Sınıf içinde fonksiyonların tanımlanması ve sınıf ile ilişkilendirilmesini daha iyi anlayabilmemiz için aşağıdaki örneği inceleyelim.


Örnek:


#include <iostream>

using namespace std;

const float PI = 3.14159;

// Bir küre sınıfı oluşturalım

class Kure {

//erişim belirtecini public olarak kullandık bu verilere herhangi bir erişim sınırlaması getirmediğimiz anlamına gelir.

public:

float r;

float x, y, z;

float alan();

float hacim();

}k;

// Kürenin hacmini hesaplayan fonksiyonu yazalım

float Kure::hacim()

{ return (r*r*r*4*PI / 3); }

// Kürenin alanını hesaplayan fonksiyon

float Kure::alan()

{ return (r * r * 4 * PI); }

//Şimdi main(ana) fonksiyonumuz da değerleri atayalım ve sınıfa gönderelim

int main()

{ //Kure sınıfında ki "k" nesnesine değerleri gönderelim

k.r=1.0;

k.x=2.0;

k.y=3.0;

k.z=4.0;

cout << "X = " << k.x

<< ", Y = " << k.y

<< ", Z = " << k.z

<< ", R = " << k.r

<< "\n" << "Alan =" << k.alan()

<< "\n" << "Hacim=" << k.hacim()

<< "\n";

return 0;

}


Programımızın çıktısı aşağıdaki gibi olacaktır.

X=2 ,Y=3, Z=4, R=1

Alan=12.5664

Hacim=4.18879