20 Haziran 2016 Pazartesi

-C++ Template Kavramı,Kullanımı-

Merhaba,
Eksik gördüğüm ve/veya bana yöneltilen sorulara bağlı kalarak makale hazırlamaya çalışıyorum.
Bu makalede işleyeceğimiz konu da bunlardan biridir.

Cpp'nin en önemli özelliklerinden biri  de Template kavramıdır.
Template kelime anlamı taslak-şablon dur. Cpp'da Template kavram "Java Generics" ile aynıdır.
Class ve fonksiyon tasarlarken,farklı nesneler ve/veya farklı veri türlerinden oluşan birden fazla 
Class ve fonksiyon tasarlamak yerine Template yapısı kullanılır.
Böylece tek bir kalıp üzerinden farklı nesne ve veri türü/tipi işletmek mümkün hale gelir.
Cpp'da kullanılan şablonlar ikiye ayrılır.
1.Fonksiyon şablonları(Function Templates)
2.Class Şablonları(Class Template)
Tanımlama şekilleri aşağıdaki gibidir.
Fonksiyon için:
template<typename Tip>
CCpp'de tip tanımlamaya aşinaysanız bu kalıb size yabancı gelmeyecektir.
Sonuç olarak burada bir tip tanımlaması var. Dolayısıyla dinamik değişen bir tip tanımlaması yapmış oluyoruz.

Class için:
template<class CTip>

Aşağıda tanımlı ve mutlak değerleri belli olan fonksiyonları inceleyelim:

#include <iostream>
using namespace std;
void func_int(int _iv)
{
cout << "func_int:" << _iv << "\n";
}
void func_double(double _dv)
{
cout << "func_double:" << _dv << "\n";
}
void func_bool(bool _bv)
{
cout << "func_bool:" << _bv << "\n";
}
int main()
{
func_int(44);
func_double(44.4);
func_bool(true);
return 0;
}

Yukarıda farklı veri türlerinden parametre alan birkaç fonksiyon geliştirilmiştir.
Dolayısıyla veri türü arttıkça fonksiyon sayıları da artacaktır.Bu da bir bakıma uygulama boyutunu ve
okunabilirliği ve hata denetlemeyi zorlaştıracaktır.
Buna karşın aşağıda verilen örneği inceleyelim:

template<typename T>/*template uygulanacak fonksiyon ve/veya class,template ile arsında boş satır bulunamaz.*/
void func_template(T _t)
{
cout << "func_template:" << _t << "\n";
}
//geri değer döndüren template fonksiyon:
template<typename T>
T func_return(T _t)
{
return _t;
}

int main()
{
func_template(44);
func_template(44.4);
func_template(true);
func_template('A');
func_template("merhaba");
//
cout << "func_return:" << func_return("kerim firat\n");
cout << "func_return:" << func_return(1225555);

return 0;
}
Yukarıda verilen örnekte beş farklı veri tip için ortak kullanılan bir template oluşturulmuştur.
Dolayısıyla hangi veri tipi giderse gitsin,anında dinamik olarak template konum alacaktır.
Aşağıda template dizi örneğine yer verilmiştir.
template<typename T>
void func_template(T tarray[])
{
  for(int i=0;i<5;i++)
  {
 cout <<tarray[i] << "\n";
  }
  cout << "\n";

}

int main()
{
    int int_array[] = {10,30,20,50,90};
    char chr_array[] = {'A','a','B','b','C','c'};
    func_template(int_array);
    func_template(chr_array);
return 0;
}


Template yapısını Class ile kullanmak pek farklı değildir. 
Aşağıda verilen ilk örnekte standart bir Class yapısı verilmiştir.İkinci örnekte ise 
template kullanılmıştır.
1.Örnek:
Bu örnek uygulamada tasarlanmış Item Class'ı sadece int türden veri kabul ediyor.
Şayet daha fazla veri tipleriyle çalışmak istersek,bu durumda ilgili veri tipleri için fonksiyon geliştirmek
gerekir.
class Item
{
private:
int value;

public:
Item():value(0)
{
}
void setItem(int _value)
{
value = _value;
}
int getItem() const
{
return value;
}
};
  
int main()
{
   Item item;
   item.setItem(44);
   int value  = item.getItem();
   cout << value;

return 0;
}

2.Örnek:

#include <iostream>
#include <string>
using namespace std;
template<class T>
class Item
{
private:
T value;

public:
Item():value(T())
{
}
void setItem(T _value)
{
value = _value;
}
T getItem() const
{
return value;
}
};
  
int main()
{
   //nesne tanımlarken veri tipi/türü belirleniyor:
   Item<int> item; //int
   item.setItem(44);
   cout << item.getItem() << "\n";
   //
   Item<string> item2; //string
   item2.setItem("Merhaba");
   cout << item2.getItem() << "\n";

return 0;
}

İyi Çalışmalar.


12 Haziran 2016 Pazar

-Java SE(Standart Edition) Eğitim Seti-

Java SE eğitim setime(85 saat) dijibil.com üzerinden şuan itibariyle 600 kişi erişmiş ve istifade etmiştir.
Daha nice mühendis ve adayların istifade etmesi dileğiyle...
Link:
 http://www.dijibil.com/course/java-se-programlama

3 Haziran 2016 Cuma

-C++ Vektör(vector) Kullanımı-


Merhabalar,

C++'da dinamik dizi kullanımı için "vector" sınıfı tercih edilebilir.
Bu sınıf her türden veri ya da nesne tutabilir. Ayrıca dinamik yapısı itibariyle
eleman eklendikçe otomatik olarak dizi boyutu büyür. Dolayısıyla C stili eski tip 
diziler yerine vector kullanmak iyi bir seçim olacaktır.
vector sınıfı içerisinde yer alan bazı fonksiyonlara aşağıda yer verilmişir.

-push_back() 
Veriyi dizinin sonuna ekler.

-pop_back()
Vektörün sahip olduğu son elemanı çıkarır.

-back()
vektörün son elemanını döndürür.

-swap()
Tüm vektör içeriğini başka bir vektöre aktarır.

-insert()
Vektör içine belirtilen bir konuma eleman ekler veya çıkarır.

-erase()
Vektör içinde belirtilen bir konumda bulunan elemanı çıkarır.

-size()
Vektör boyutunu döndürür.

-begin()
Vektör başlangıcını gösterir.

-end()
Vektör sonunu gösterir.

-clear()
Vektör içeriğini siler.


Vector sınıfını kullanabilmek için "using namespace std;" tanımlanmalıdır.
int türden bir vector dizi kullanımına aşağıda yer verilmiştir.

#include<bits/stdc++.h>
using namespace std;

int main() 
{
   vector<int> vect_array(10);//default olarak 10 eleman kapasiteli.
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
      std::cout << " " << vect_array[i];
    } 
    return 0;
}
Çıktı:
 0 0 0 0 0 0 0 0 0 0


Vektör içeriğine tanımlama esnasında eleman ekleme:
int main() 
{
   vector<int> vect_array(10,5); //10 elemanlı dizi boyutu ve her eleman için 5 değeri.
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
      std::cout << " " << vect_array[i];
    } 
    return 0;
}
Çıktı:
 5 5 5 5 5 5 5 5 5 5


Vektör içeriğine eleman ekle,çıkar ve swap kullanımı:
int main() 
{
   vector<int> vect_array(10,5);  
   
   //belirtilen bir konuma eleman ekle:
   vector<int>::iterator it = vect_array.begin() + 2;//başlangıçtan itibaren iki ileri.
   vect_array.insert(it,66);//ekle.
   
   //dizi sonuna eleman ekle:
   vect_array.push_back(21);
   vect_array.push_back(22);
   vect_array.push_back(23);
   
    //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array[i];
    } 
    cout << "\n";
    //dizi içerisinden eleman çıkar:
    it = vect_array.begin() + 2;
    vect_array.erase(it);
  
   //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array[i];
    } 
       cout << "\n";
    //swap kullanımı:
    vector<int> vect_array2(13,0);
    vect_array.swap(vect_array2);
        //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array2[i];
    } 
        
    return 0;
}
Çıktı:
 5 5 66 5 5 5 5 5 5 5 5 21 22 23
 5 5 5 5 5 5 5 5 5 5 21 22 23
 5 5 5 5 5 5 5 5 5 5 21 22 23


vector ile "fill" fonksiyonu kullanımı.
int main() 
{
   vector<int> vect_array(10,0);
   //dizi başından itibaren 4 adet 8 değerinde eleman ekle:  
   fill_n(vect_array.begin(),4,8);
   for(unsigned i=0; i<vect_array.size();i++)
   {
cout << " " << vect_array[i];
   }
    cout << "\n";
    
    //dizinin ilk 3 elemanından sonra 2 adet 7 değeri eleman ekle:
    fill_n(vect_array.begin() + 3,2,7);
    for(unsigned i=0; i<vect_array.size();i++)
    {
 cout << " " << vect_array[i];
    }
        
    return 0;
}

Çıktı:
 8 8 8 8 0 0 0 0 0 0
 8 8 8 7 7 0 0 0 0 0

İyi çalışmalar.