C++

Nesneye yönelik programlama nedir c++ örneklerle anlatım

bu makalemi İstanbul yolunda yazıyorum o yüzden fazla açıklama şu an eklemiyeceğim daha sonra makaleye ek yaparım

Öncelikle basit örneklerden başlayacağım;

basit bir class kullanarak çevre bulalım;

#include<iostream>

#include<conio.h>
using namespace std;
class cevre
{
      int x,y;
      public:
             void degerler(int,int);
             int alan()
             {
                 return x*y;                
                 }
                 };
     void cevre::degerler(int a,int b)
     {
          x=a;
          y=b;
          } 
          main()
          {
                cevre yeni;
                yeni.degerler(12,12);
                cout<<yeni.alan();
                getch();
                }

Uygulamada classımız ve fonksiyomuz ayrı dosyalarda main.cpp de fonksiyon ve kesir dosyalarını include ediyoruz fakat fonksiyon dosyası içerisinde kesir dosyasını kullandığımız için main de derlerken recompile hatası verecektir bunun önüne geçmek için classımızın başına;


#ifndef KESIR
#define KESIR
.
.//class tanım blogu
.
.
#endif

Koyuyoruz eğer bu dosya önceden derlenmişse derleme derlenmemişse derle demek;
Böylecİfndef ile classımız önceden derlenmiş mi diye kontrol ediyoruz derlenmemişse derleyecek;
Fonksiyonlarımızın prototiplerini oluşturduk;
Toplam operatörü tanımlıyoruz
Sinif operator +(sinif a,sinif b) bu tanımın başına friend koyduk çünkü parametre olarak iki sinif nesnesi gönderdik ve bu sınıfların private alanlarına ulaşmamız gerektiği için;

friend kesir operator-(kesir k1,kesir k2)
      {
      return kesir(k1.pay-k2.pay,k1.payda-k2.payda);
      }

Geri dönüş değerimiz bir kesir nesnesi bu aslında kurucu fonksiyon diyebiliriz aldığı parametlerle pay ve paydaya bu işlemden çıkan sonuclar atanıyor.
Yazdırma fonksiyonu ile diyerek degeri yazdırıyoruz;
cout< Şimdi bir yazdırma operatörü tanımlayalım ve işlerimiz daha kolaylaşsın

friend ostream& operator<<(ostream& os,kesir k)
      {
      os<<"["<

Bu işlem ile << operatörü gördüğü yerde 3/5 olan sonucu [3/5] şeklinde yazacaktır.
Ostream de bir nesnedir.
Diger fonksiyonlarda cout kullandık köşeli parantez içerisine yazmadı çünkü o fonksiyon altından gelen parametreler bizim operatöre uygun değil

sadelestir(c);
cout<<"sadelestir c="<

Bu iki fonksiyonun birbirinden farklarını göstermek için yazdık bunların ikiside sadeleştirme yapıyor fakat fonksiyonların işi bittikten sonra çalıştırdığımızda ise birinci fonksiyonun asıl nesneyi değiştirmediği anlaşılıyor.
Çünkü argümanı kopyalayıp alıyor, ikinci fonksiyon ise asıl nesnenin referansını adreseni aldığı için direk sadeleştirmeyi yapıyor;
Referans olan değişkenlerde const ifadesini kullanın çünkü direk adrese müdahele edilebilidği için fonksiyon içeriği de değiştirileblir bunu önlemek için arguman tanımına const koymak gerekir.
Örnek verecek olursak;

Friend zaman operator *(const zaman& z1,int n)
{
Zaman z3;
Z1.saniye*=n;
Return z3;
}
burada

Zaman operatörü
Main den bir kurucu fonksiyon çagırıyoruz 3 parametreli bu parqametreler zamanın saniyesi dakikası ve saat değişkenleri;
İlk degerleri veriliyor zaman(int sa,int dk,int sn) kurucu fonksiyonunda
Kopyalayıcı kurucu fonksiyon;
Argüman olarak kurucu olduğu sınıf türünden bir referans alır.
zaman(const zaman& z)
{
}

sınıflar ve işaretçiler;

int *p;
int i=6;
p=&i;
*p=12;
cout<

bu şekildeki bir tanım da
bir değişkenin adresini yazdırmak için & operatörü adresteki değeri yazdırmak için * operatörü kullanılır.
eleman a,b,c;
eleman *p;
p=&a;
*p.Adi()="serdar";
*p.odeme(200);
Elaman sınıfımız var ve eleman türünden bir işaretçi tanımlamak için eleman *p; yazdık .
P=&a; dememizdeki amaç a da bir sınıf olduğu için tek bir değer içermez dolayısıyla * işretçisinin yaptıgı gibi o adresteki değeri değil o adresteki nesneye erişir. Bu örnek te sinifin fonksiyonlarına erişmek için & ve * operatörlerini birlikte kullandığımız için öncelik sırasında bir sorun yaşayabiliriz.
Bu sorunu çözebilmek için -> üye işlemcisi kullanılabilir. Yani şu şekilde yazabiliriz kodu:

p->Adi()=”serdar”;
p->Odeme(200);
işaretçilerin kullanımı dizilerde işe yarar.
Eleman personel[10];
Eleman *p;
For(p=personel;p->personel<10;p++)
{
p->Odeme(200);
}

Bu kodda p işaretçisiyle dizinin başlangıç adresini p ye atıyoruz. Ve adresi arttırarak diger elemanlara erişmiş oluyoruz.
Bunu klasik yöntem le yapalım;

İnt i;
Eleman dizi[10];
For(i=0;i<10;i++)
{
personel[i].odeme(100);
}
Şekilnde de tanımlayabilirdik.
New komutu;
İnt *pi;kesir *pk; zaman *pz,*pzc;
Pi=new  int ;
Pk=new kesir(2,4); //başlangıç degerleri atanmış kurucu fonksiyon oluşturdu.
Pz=new zaman[50];//zaman türünden 50 nesne içeren bir dizi oluşturdu.
Şimdi bu işlemleri yapıp yapmadığını kontrol edelim;
İf(pz!=NULL)
{
for(pzc=pz;pzc-pz<50;pzc++)
{
pzc->saat=1;
Pzc->dakika=0;
Pzc->saniye=0;
}
}

Burada ise 50 elemanlı nesneyi oluşturmadı ise dizinin başlangıç adresini bir değişkende(pz de) tutuluyor pzc değişkenine adres atanıp adres arttırılıyor pz de dizimizin adresini saklıyoruz unutmamak için.
New ile işaretçi kullanarak tanımladığımız dizide ise adresin değişmemesi için adresi sabitlemek doğru bir seçim olur.
Const zaman *pz=new zaman[50];
Delete işlemi
Kesir *pk=new kesir(2,5);
..
.

.
Delete pk;
Zaman *pz=new zaman[50];
.
.
.
.delete pz;
Dediğimizde ilk elemanı siler diğer dizi elemanlarını görmezden gelir.
Bunun için şu şekilde yazmalıyız
Delete []pz;

C++ Grafik oluşturma GDI+

C++ dili ile yazılmış mükemmel bir grafik oluşturma editörü bu programla 3 boyutlu grafiler oluşturabilirsiniz. More >

C-C++ İşaretçiler (Pointers) Nedir?

İşaretçi bellek alanındaki bir gözün adresinin saklandığı değişkendir. Yani işaretçilere veriler değilde o verilerin bellekte saklı oldugu gözlerin adresleri atanır. Bu C dilini güçlü kılan nedenlerin başında gelir aslında bütün programlama dilleri işaretçiler vardır (c# vb..) ve bazı programlarda işaretçi kullanmak zorunlu olabilir. Özellikle string bir ifadeye ulaşmak için adresleri kullanmak gerekecektir.

C dilinde bir fonksiyon return ile bir sonuç döndürürdü fakat bazı uygulamalarda birden fazla sonuç döndürmesini isteyebiliriz bu durumda da fonksiyona parametre olarak adres göndermemiz gerekecektir.

İşaretçi Tanımı:

İşaretcinin adının önüne  ’*’ işareti konulur;

int *p;

İşlemcimizin adresleme biti belirli oldugu için hangi tipte olursa olsun bellekte aynı uzunlukta yer işgal eder
Yani aşağıdaki işaretçilerin hepsi aynı uzunluktadır

int *p;
float *q
char *r

Aralarında fark vardır ama p bir tamsayının q gerçel bir sayının r ise karakterin adresini tutar
Gelelim işaretçiye değer atamaya ;
Hatırlayalım scanf ile bir değişkene nasıl değer atıyorduk

int p;
scanf("%d",&p); // p değişkenine & operatörü ile atama yaptık

İşaretçilere değer atamak içinde & operatörü kullanılır.

int *p,*m,j,k;
k=100;   //k ya 100 atadık
p=&k; //K nın adresini p işaretçisine atadık
m=&j; //m işaretcisine atadık
*m=555; //işaretçinin önüne * konulursa değer atanır 555 atanmıştır

İşaretçi aritmetiği
Adreslerde elimizdeki adres taban alınıp önceki veya sonraki adreslere erişmek istenebilir.Döngülerde ki gibi toplama çıkartma operatörlerimizi kullanıyoruz.

int * p,*q;
p++;
q--;

İşareçilerin Karşılaştırılması

int strlen(char *p)
{
char *q=p;
while(*q!=NULL)
q++;
return q-p;
}

Fonkiyona parametre olarak kelimenin adresini gönderiyoruz (karşılaştırmk istediğimiz işaretçiler aynı tipte olmak zorunda :) ) bir işaretçi tanımlayıp p nin değerini atıyoruz kelimenin sonuna gelineye kadar q arttırıyoruz return le kelimenin başı ile sonunun farkını döndürüyoruz bu da bize kelime katarının uzunluğunu veriyor ;)

İşaretçiler ve Diziler:
Dizinin adı aslında dizinin ilk elemanın adresini tutan bir değişkendir

p=&dizi[0];        //ilk elemanın adresi p ye atanıyor
p=dizi;             // başlangıç adresi p ye atanıyor
q=&tablo[9];    // 10. elemanın adresi q ya atanıyor (9 değil çünkü diziler 0 dan başlıyor )
q=&tablo[50];   // 51 elemanlı dizimiz dersek son elemanın adresini atıyoruz

Şimdi bir örnek yapalım ve işaretçi sayesinde dizinin elemanlarının toplamını bulalım

int toplam(int A[],int n)
{
int *p,toplam=0;
for(p=A;p<&A[n];p++)
{
toplam+=*p;
return toplam;
}
}

İki boyutlarda atama işlemi yapılabilir.
Malloc fonksiyonu kullanarak 20 elemanlık bir dizi oluşturalım

main()
{
int *p;
p=(int *)malloc(20*sizeof(int)); //işletim sisteminden 20 elemanlık yer açmasını istiyoruz
}

C++ Win32 Uygulaması Oluşturmak

Win32 Uygulaması Oluşturmak

Öncelikle söyleyeyim de sonradan kafanıza takılmasın; bu konuda herhangi bir hazır kütüphane (MFC, ATL veya .NET) kullanmadan Windows Penceresi nasıl oluşturulur bunu göreceğiz. Dil olarak C++ kullanıyoruz. More >

Java Script’e Giriş-Java Script kodları indir örnek uygulamalar

Javascript’le Tanışalım

Javascript programı yazmak için ihtiyacınız olan alet-edavat, bu kitapçığın yanı sıra, iyi bir bilgisayar ve bir düz yazı programıdır.

More >

Veri yapıları ve algoritmalar-Kuyruklar (queue) örnek uygulama

KUYRUK
Kuyrukların Özellikleri
·         Giriş Sırası = Çıkış Sırası
Tek bir kasanın hizmet verdiği bir süpermarkette ödeme yapmak için bekleyen insanların oluşturduğu sıra gibi bir diziye “kuyruk” (queue) adı verilir. Bu ödeme kuyruğuna ilk giren kişi sonra girenlerden önce ödemesini yapıp gider (ilk-gir, ilk-çık, yani first-in, first-out, ya da kısaca FIFO). En son giren işi ise en son ödeme yapacak olan kişidir (son-gir, son-çık, yani last-in, last-out ya da kısaca LILO). Bu FIFO ve LILO özellikleri beraberce “giriş sırasıyla çıkış sırasıyla aynıdır” diye ifade edilebilirler.
·         Sırayla erişim
Bir kuyruk oluşturacak bir veri grubundaki elemanlar birbirleriyle bağlantılı olmalıdır ki kuyruktaki her eleman kuyruğa girdiği sırayla işlem görebilsin. Bağlantılı bir listede olduğu gibi bir kuyrukta da her eleman bir sonraki elemanın yerini bildiren bir adres değişkenine sahip olmalıdır, veya kuyruk elemanlarının adresleri ayrı bir adres değişkenleri dizisinde saklanmalıdır.
Kuyruklarla İlgili Özel İşlemler
·         Sona Ekleme
Bir süpermarket kasası önündeki ödeme kuyruğuna aradaki bir noktadan girilmez. Fiziksel bariyerler yoksa bile etik prensipler veya toplum baskısı bunu engeller. Aynı şey kuyruk oluşturacak şekilde sıralanıp bağlanmış değişkenler için de doğrudur. Bir kuyruğa ancak en son konumdan yeni bir eleman eklenebilir.
Eğer kuyruğun son elemanının adresi pSON gibi bir değikleme için tek gereken şey yeni elemanı son elemandan sonraki eleman olarak tanıtmaktır. Bu işlemden sonra yeni eleman yeni son eleman olacaktır:
2‑8 Bir kuyruğun sona yeni bir eleman eklenmesi
pSON.pSonraki=pYeniEleman
pSON=pYeniEleman
·         Önden Çıkartma
Bir dizi veya listedeki elemanlar, eğer programcı belli bir andan sonra hiç ama hiç gerekli olmayacak elemanları silmek için komutlar yazmamışsa, program çalışıp bitinceye kadar var olmaya devam ederler. Halbuki bir kuyruktaki elemanlar, üzerlerinde gerekli işlemler yapıldığı zaman –tıpkı ödemesini yapmış süpermarket müşterileri gibi- kuyruktan ayrılmalıdırlar. Kural gereği olarak, kuyruğun ilk elemanı kuyruktan ilk ayrılan eleman olacaktır:
2‑9 Öndeki elemanın kuyruktan çıkartılıp silinmesi
pİLK.Değer = BOŞ
pİLK = pİLK.pSonraki
BOŞ değer atanması başlangıçta en önde yer alan elemanın hafızadan silinmesi içindir. Bu işlem yapılmayıp bu değişken hafızada bırakılsa bile ikinci komuttaki işlemle kuyruktan çıkartılmış olacaktır.
Yığınlar (Stacks)[1]
Yığınların Özellikleri
·         Son Giren İlk Çıkar
Aynı anda çok sayıda müşteriye hizmet veren büyük bir lokantada tabaklar bir yandan yıkanıp yığılırken bir yandan da yeni müşterilere servis yapmak için yığından çıkartılırlar. Bu tabak yığınının ilginç bir özelliği vardır: Yığına ilk giren tabak en altta kalmış olacağı için yığındaki diğer tabakları devirmeden yerinden kolayca alınamaz. Dolayısıyla servis yapacak bir garson çabucak işine dönmek için yığının en üstündeki tabağı, yani yığına en son eklenmiş tabağı alıp gidecektir. Kısacası bir yığını diğer veri yapılarından ayırt eden özellik son-gir, ilk-çık (last-in, first-out, kısaca LIFO) diye adlandırılır. Bir yığına ilk giren elemansa son çıkacak olan elemandır (first-in, last-out, kısaca FILO).
·         Bağlantılılık
Bir yığın oluşturacak bir veri grubundaki elemanlar da birbirleriyle bağlantılı olmalıdır. Üstteki eleman çıkartılırsa sıra onun altındakine gelecektir. Üstteki elemanın bir altındaki eleman zaman sırasında göre önceki elemandır, ama liste ve kuyruklarda yaptığımız gibi alttaki elemanı sonraki eleman olarak düşüneceğiz.
Yığınlarla İlgili Özel İşlemler
·         Üste Ekleme
Bir yığına da ancak en üst konumdan yeni bir eleman eklenebilir.
Eğer yığının en üst elemanının adresi pÜST gibi bir adres değişkeniyle belirlenmişse, tek gereken şey bu üst elemanı yeni eklenecek elemandan sonraki eleman olarak tanıtmaktır. Bu işlemden sonra yeni eleman üst eleman olacaktır:
Kod Örneği 2‑10 Bir yığının üstüne yeni bir eleman eklenmesi
pYeniEleman.pSonraki = pÜST
pÜST = pYeniEleman
·         Üstten Çıkartma
Yığındaki en üst eleman üzerinde gerekli işlemler yapıldığı zaman yığından çıkarılmalıdır. Bunun için yapılacak şey boş elemanı “silmek” için gereken işlem neyse onu yapmak ve ondan bir önceki elemanı yeni üst eleman olarak işaretlemektir.
Kod Örneği 2‑11 Yığının üst elemanının çıkartılması
pÜST.Değer = BOŞ
pÜST = pÜST.pSonraki
Nesneye Yönelik Programlama Dillerinde Veri Yapıları
Sınıf Değişkenleri
Bu bölümde kısaca gözden geçirdiğimiz en temel türden veri yapıları üzerinde yapılabilecek işlemler (yeni eleman sokma veya silme, önden çıkartma, sona ekleme, vb.) veri yapısını oluşturan elemanların türlerine bakmaksızın, belli adımlar atılarak gerçekleştirilirler. Dolayısıyla, programında bir bağlantılı liste, bir kuyruk vb. yarataıp kullanacak olan bir programcı belli işlemler için gereken belli adımları bilip o adımları gerçekleştirecek komutları programına eklemelidir. Yüzbinlerce programcı bu tür veri yapıları üzerinde çalışacak komut dizilerini tekrar tekrar yazmak zorunda kalmasınlar diye bu komut dizilerini önceden hazırlanmış fonksiyonlar halinde paketleyip programcıların kullanımına sunmak en mantıklı çözümdür. Yapısal programlama dillerine ait derleyicilerle birlikte gelen fonksiyon kütüphaneleri veri yapılarının kullanımını kolaylaştırabilirler. Nesneye yönelik programlama dilleri ise belli bir veri yapısı üzerinde belli işlemler yapabilecek fonksiyonları veri yapısının kendisiyle birlikte paketleyip sunarak programcıların işlerini daha da kolaylaştırırlar. Nesneye yönelik bir programlama dilinde, bir programcı belli bazı değişkenleri gruplandırarak bir karmaşık değişken veya bir veri yapısı tanımı yatattığında, o değişken grubu üzerinde gerekli işlemler yapacak belli fonksiyonları da değişken grubu tanımına ekleyebilir. Kendisiyle ilişkili fonksiyonları da tanımında barındıran bir veri grubuna “sınıf değişkeni” (class variable) denir.
Üye Fonksiyonlar
Bir sınıf değişkeninin tanımına dahil edilmiş fonksiyonlara “üye fonksiyonlar” (member functions) veya “metodlar” denir. Bir sınıf değişkeni olarak tanımlanmış bir veri yapısını bir programda kullanmak için sınıf değişkeninin üye fonksiyonlarını çağırmak yeterlidir. Örneğin, C++ dilinde bir bağlantılı liste list türü bir sınıf değişkeni ile temsil edilebilir. Tamsayı elemanlardan oluşan bir liste türü değişken
list tamsayi_liste;
şeklinde, ondalıklı sayılardan oluşan bir liste ise
list ondalikli_liste;
şeklinde tanımlanabilir. Aşağıdaki kod örneği bu türden bir tamsayı listesi yaratıp ona elemanlar ekleyip çıkartan bir C++ programının parçasını gösteriyor:
Kod Örneği 2‑12 Bir C++ programında bir bağlantılı liste tanımlanması ve eleman eklenmesi
list tamsayi_liste;
tamsayi_liste.push_back(1);
tamsayi_liste.push_front(2);
tamsayi_liste.push_back(3);
tamsayi_liste.pop_front();
tamsayi_liste.push_back(5);
tamsayi_liste.pop_back(6);
İngilizce bilmeyen okuyucularımız için açıklayalım: Bu örnekte kullanılan push_back() üye fonksiyonu liste sonuna, push_front() üye fonksiyonu ise liste önüne eleman eklemek için kullanılabilir. pop_back() liste sonundan, pop_front() liste başından eleman çıkartmak için kullanılırlar.
Listeler, kuyruklar veya daha karmaşık veri yapılarını temsil eden sınıf değişkenlerini kullanmak programcıların işlerini kolaylaştırdığı gibi, onlara kısa ve kolay anlaşılır programlar yazma imkanını da verir, ama veri yapıları üzerinde yapılacak işlemleri ortadan kaldırmaz veya kısaltmaz. N adım gerektiren bir arama işlemi veya N2 adım gerektiren bir sıralama işlemi, ilgili üye fonksiyonlarını çağıran birer komuttan ibaret bile olsalar aynı sayıda adım gerektirirler. Bu tür bir üye fonksiyon kullanan bir algoritmanın adım sayısını hesaplarken, her bir komutun gerektirdiği adım sayısını bilip ona göre hesap yapmalıyız. Biz bu ders notlarının metin kısmında gerçek program örnekleri vermeyeceğiz, ama bazı kod örneklerimizi daha kısa ve anlaşılır olsunlar diye nesneye yönelik bir programlama dilini kullanıyormuş gibi yazacağız.
[1] Bülent Sankur’un Bilişim Sözlüğü (1) stack terimi için “yığıt” karşılığını öneriyor. Bu kitapta kulağa daha tanıdık gelen bir karşılık seçtik.
ÖRNEK1
#include
#include
using namespace std;
int main ()
{
queue<int> myqueue;
int myint;
cout << “Tam sayi giriniz (enter 0 to end):n”;
do {
cin >> myint;
myqueue.push (myint);
} while (myint);
cout << “kuyrugun icerigi: “;
while (!myqueue.empty())
{
cout << ” ” << myqueue.front();
myqueue.pop();
}
return 0;
}
Örnek 2
// queue::empty
#include
#include
using namespace std;
int main ()
{
queue<int> myqueue;
int sum (0);
for (int i=1;i<=10;i++) myqueue.push(i);
while (!myqueue.empty())
{
sum += myqueue.front();
myqueue.pop();
}
cout << “total: ” << sum << endl;
return 0;
}
çıktı:
total: 55

KUYRUK

Kuyrukların Özellikleri

·         Giriş Sırası = Çıkış Sırası

More >

Veri yapıları ve algoritmalr Yığınlar (Stack) Yığın

Veri yapıları ve algoritmalr Yığınlar (Stack) Yığın örnek uygulama proje

// stack::push/pop

#include

#include

using namespace std;

int main ()

{

stack<int> mystack;

for (int i=0; i<5; ++i) mystack.push(i);

cout << ”Popping out elements…”;

while (!mystack.empty())

{

cout << ” “ << mystack.top();

mystack.pop();

}

cout << endl;

return 0;

}

çıktı:

Popping out elements… 4 3 2 1 0

Örnek 2

// stack::push/pop

#include

#include

using namespace std;

int main ()

{

stack<int> mystack;

for (int i=0; i<5; ++i) mystack.push(i);

cout << ”Popping out elements…”;

while (!mystack.empty())

{

cout << ” “ << mystack.top();

mystack.pop();

}

cout << endl;

return 0;

}

Output: Popping out elements… 4 3 2 1 0