26 Mart 2016 Cumartesi

Nesne Yönelimli Programlama (Object Oriented Programming)

C#, Java gibi bir Nesne Yönelimli Programlama (OOP) dilidir. OOP 1960’lardan bugüne yazılım dünyasını etkisine almış bir metodolojidir. 1970 yılından bugüne kadar geliştirilen birçok dil OOP desteğine sahiptir.

OOP temel olarak, ortaya çıktığı güne kadar süregelen programlama mantığını kökten değiştirmiştir. OOP’den önce kullanılan yazılım metodolojisi, Prosedürel Programlama adı ile anılır. Bu metodoloji, belirli bir yönde ilerleyen kodlar ve iş yükünü hafifletmek için ortak işlerin yüklendiği fonksiyonların çağırılması esasına dayalıydı.
Bu metodoloji, yazılım dünyasının uzun süre işini görse de, bazı sıkıntıları da içinde barındırıyordu:

Geliştirilen uygulama parçalanamayan bir bütün halindeydi. Bu yüzden, uygulama üzerinde çalışan her geliştirici; uygulamanın hemen her yapısına hakim olmalıydı.
Bu durum nedeniyle, projelere yeni yazılımcıların katılması önemli bir adaptasyon süreci gerektiriyordu.
Uygulama tek bir bütün halinde olduğu için, ufak değişiklikler uygulamanın farklı noktalarında büyük sorunlara yol açabiliyordu.
Yıllarla birlikte müşteri ihtiyaçları ve donanım kabiliyetleri arttı. Bunun getirisi olarak da, geliştirilen uygulamaların kapsamları ve boyutları büyüdü. Bu aşamada, yukarıda bahsedilen problemler gittikçe artmaya başladı. Başlanan projelerin çoğu istenen sürelerde yetiştirilememeye ve geliştirme zorluklarından ötürü iptal olmaya başladı.
Uygulama maliyetleri giderek artmaya başladı.
Yazılım dünyasında bu çıkmazın aşılması OOP ile sağlanmıştır. OOP ile tüm yazılım anlayışı kökten değişmiştir. 1960’larda OOP fikrini ilk ortaya atan Alan Kay, önerdiği metodolojiyi şu şekilde ifade etmiştir:

Uygulama, nesneler ve onların ilişkileri çerçevesinde belirli bir iş yapmak için geliştirilebilmelidir.
Her nesnenin bir sınıfı olmalıdır ve sınıflar nesnelerin ortak davranışlarını ifade etmelidir.
Nesneler birbirleri ile iletişime geçebilmelidir.
Bunu basitçe, prosedürel programlamada bulunan soyut program geliştirme mantığını rafa kaldırıp, gerçek dünya modellemesi ile program geliştirme çabası olarak da düşünebiliriz. Gerçek dünya modellemesiyle anlatılmak istenen şudur: Bir fabrika örneğini ele alalım. Bu fabrikada işçiler, makineler gibi birçok nesne bulunur ve bu nesnelerin ilişkisi çerçevesinde fabrika çeşitli işler yapıp çıktılar üretebilir. OOP ile programlama mantığında da, bu örnektekine benzer şekilde program kurgulanır. Çeşitli nesneler geliştirilip birbirleriyle ilişkilendirilerek, belirli amaçlara hizmet eden uygulamalar geliştirilir.

Bu yapının önemli getirileri şunlardır: Yazacağınız sınıflar birbirinden bağımsız olarak geliştirilebilir. Bu sayede program böl, parçala, fethet mantığı çerçevesinde çok kolay bir şekilde parçalanır ve her parça ayrı ayrı ele alınabilir. OOP mantığında gerçek dünya algılayışı temel alındığı için bu, anlaşılması çok daha kolay bir yapıdır.

OOP, yapısı gereği kod tekrarlarının önüne geçer (doğru bir şekilde kullanılırsa) ve bu durum, özellikle ilk dönemlerde yazılımcıların hızlı bir şekilde OOP yapılarına geçmesinin temel nedenlerinden biri olmuştur.

Yukarıda değinilen getiriler, projelerin yönetilebilirliğini büyük miktarda artırdığı için daha büyük projeler çok daha az çaba ile yönetilebilir hale gelmiştir. Yine aynı getiriler sayesinde, projeler rahat bir şekilde büyütülebilmiştir. Alttaki grafikte noktalı çizgilerle gösterilen bölümler OOP’nin etkileridir. Yani, OOP ile yazılım kalitesi artmış, bunun yanısıra yazılım maliyetleri düşmüştür.






Sınıflar (Classes)

OOP temelde nesneler ve onların ilişkisi üzerine kurulu bir metodoloji olarak tanımlanmıştır. Ancak öncelikli olarak sınıf mantığının iyi anlaşılması gerekir. Nesneler sınıflardan türetilir ve yetenekleriyle yapabilecekleri sınıflarla belirtilir. Nesne-Sınıf ilişkisi için şöyle bir örnek verilebilir: İnsan bir sınıftır, ama her bir kişi, insan sınıfının bir nesnesidir. Örneğin, günlük kullanımda Ali bir insandır diyebiliyor olsak da, şu denklem yanlıştır: İnsan=Ali. Eğer sözlükte insan maddesinin yanında tanım olarak Ali’den bahsedilmiyorsa, bu eşitlik hiçbir zaman doğru olamaz. İnsan sınıfı bize Ali gibi her insanın yapabileceklerini, yeteneklerini ve özelliklerini belirtir. İnsan konuşabilir, el sallayabilir, koşabilir v.s. dediğimiz her seferinde, bu işlerin Ali için de geçerli olduğunu kabul etmiş oluruz. Her insanın bir göz rengi vardır dersek, Ali’nin de bir göz renginden bahsedebiliriz.


Programlarda da bu mantıktan hareket edilir. Bir düğme yapıp bunu kullanmak istiyorsanız, önce düğme sınıfını tanımlarsınız. Daha sonra da istediğiniz yerde düğme sınıfından örnekler alırsınız (instance almak). .NET Framework içinde tanımlanmış bir Button sınıfı bulunur. İsterseniz, tanım yapmak yerine, doğrudan kütüphane içindeki sınıftan da nesne türetebilirsiniz (instance alabilirsiniz). Alttaki örnekte, önce instance alınmış ve daha sonra, Text özelliğinin değeri belirtilmiştir. Sonra da, Click olayı olduğunda yapılacak işleri belirtmek için yenibuton.Click metodu oluşturulmuş ve işaret edilmiştir.

Button yenibuton = new Button();

yenibuton.Text = "Click me";
yenibuton.Click += yenibuton_Click;

private void yenibuton_Click(object sender, EventArgs e)
{
Console.WriteLine("Merhaba");
}


Birinci satırda, Button sınıfından bir örnek alınmıştır. İkinci satırda, oluşturulan yenibuton isimli Button nesnesinin Text özelliğine “Click me” yazısı atanır. Üçüncü satırda, yenibuton.Click += yazılır ve klavyeden Tab tuşuna basıldığında eşittirin karşısına yenibuton_Click yazılır. Bir kere daha Tab tuşuna basıldığında aşağıdaki butona Click edildiğinde çalışacak kod bloğunu oluşturacaktır.

Bu kod bloğunda parametre buton object, click işleminin argümanları EventArgs'e olarak taşınır.

Bu sayede düğmenin geliştirilmesine olan gereksinim ve bu geliştirmenin uygulama üzerindeki etkileri ortadan kaldırılmış, projenin daha rahat bir şekilde yönetilmesi sağlanmıştır.


Erişim Belirleyiciler(Access Modifiers)

Kendi sınıfınızı yazacaksanız, öncelikle C# dilinde nesnelerin birbirleriyle ilişki kurarken hangi erişim kontrolleri ile çalıştığını bilmeniz önemlidir. Erişim belirleyiciler (access modifiers), sınıflara nerelerden ve ne şekilde erişileceğini belirtir.

Public: Her yerden erişilebilir.
Private: Sadece tanımlandığı sınıf içerisinden erişilebilir.
Internal: Sadece bulunduğu projede erişilebilir.
Protected: Sadece tanımlandığı sınıfta ya da o sınıfı miras alan sınıflardan erişilebilir.
Protected Internal: Sadece tanımlandığı sınıfta ya da o sınıfı miras alan sınıflardan erişilebilir. Ayrıca tanımlamanın aynı proje içerisinde olma şartı yoktur. Protected'dan farkı budur.
Eğer erişim belirleyici belirtilmemişse, sınıflar internal’dır.

Sınıf İçindeki Yapılar

FIELDS:


  • Genellikle, nesnenin özellikleri (property) için değer saklama alanıdır. Varsayılan durumda private yapılardır.
  • Field, global alanda tanımlanmış bir değişken olarak da düşünülebilir. Yani class içerisindeki tüm metotlardan erişilebilecek bir değerdir.
public class Insan
{
private string _isim;
}


PROPERTIES:

Nesnenin özellikleridir.
Kendi içinde iki metot barındırabilir:
Set metodu: Bir property’ye yeni bir değer atamak için kullanılır. Set metodu olmayan property’ler read-only durumundadır.
Get metodu: Bir property’nin değerini okumak için kullanılır
Genelde bir field’da bulunan değeri değiştirmek / okumak için kullanılır.

private string _isim;
public string Isim
{
get
{
return _isim;
}
set
{
isim = value;
}
}



METHODS:

Nesnenin yapabildiği işlerdir.
Virtual, override, abstract metotlar oluşturulabilir. Bu sayede, miras alan sınıfın bu metot ile yapabileceği işler belirlenebilir.
Static olarak oluşturulabilir. Bu sayede, metot nesnenin değil sınıfın metotu haline gelir.

public void kos()
{
}

public static void aya_ayak_bas ()
{
}
Static metotlar o metoda başka sınıflardan instance alınmadan ulaşılmasına olanak sağlar.



CONSTRUCTOR

Constructor ismi, class’ın ismi ile aynı olmak zorundadır.
Nesne ortaya çıkartılırken yapılacak işlemleri barındırır. Sadece içine yazıldığı sınıftan bir nesne instance alınır bir defaya mahsus olarak çağrılır. Geriye değer döndürmez.
Farklı parametreleri alarak aşırı yüklenebilir (overload).

public Insan ()
{
This.Isim = “Doe”;
}

// Burada kullanılan This, işlem yapılan sınıfı ya da sayfayı temsil etmektedir.

public Insan(string adi)
{
This.Isim = adi;
}

EVENTS

Nesnelerin tepkileridir. Delegate’ler ile birlikte kullanılır. Düğmenin tıklanması bir event’tir. Daha önce düğmeyi tıklayınca bir tepki vereceği öngörülmüştür. Aşağıdaki örnekte, Kettle sınıfına SuKaynama Eventi eklenmiş ve su derecesi 100’ü geçerse bu event’in tetikleneceği belirtilmiştir. Artık Kettle nesnesi ile çalışırken su kaynayınca ne iş yapması gerektiğini söyleyebiliriz:

public delegate void SuKaynamaDelege();
public class Kettle
{
public event SuKaynamaDelege SuKaynamaEventi;
private byte _susicakligi;
public byte Susicakligi
{
get
{
return _susicakligi;
}
set
{
_susicakligi = value;
if (this._susicakligi >=100)
{
if (SuKaynamaEventi != null)
{
SuKaynamaEventi();
}
}
}
}
}
OOP sadece sınıf ve nesne ilişkisi değildir. Bunun dışında da kendine özgü bazı özellikleri bulunur. Bu özellikler OOP desteği veren dillerde tamamen veya kısmen dile eklemlenmiştir. Bu özellikler encapsulation (sarmalama/paketleme), inheritance (miras alma) ve polymorphism’dir (çok biçimlilik).

Const Kullanımı: Const program akışı içerisinde her hangi bir noktada değerinin sabit kalacağını ifade eder.

private const double pi = 3.14; // pi sabit sayısı gibi.

Enum

Bu tip, değişkenin alabileceği değerlerin belli (sabit) olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır. Genel yazım biçimi şu şekildedir:

enum TipAdı{değer1,değer2,...,değerN} DeğişkenAdı;
TipAdı programcı tarafından verilen tip ismidir. DeğişkenAdı ise program içinde kullanılacak olan değişkenin adıdır. Eğer kullanılmazsa program içinde daha sonra enum ile birlikte kullanılır. Örneğin:

enum bolumler{programcilik, donanim, muhasebe, motor};
Tanımı ile derleyici programcilik için 0, donanim için 1, muhasebe için 2 ve motor için 3 değerini kabul ederek atamaları buna göre yapar. Değişken adı bildirilirse daha sonra enum kullanmaya gerek kalmaz.

enum renkler{kirmizi,mavi,sari} renk;
enum günler
{
pazartesi,sali,carsamba,persembe,cuma,cumartesi,Pazar
};
Şimdi istenirse tanımlanan bu tipler program içinde kullanılabilir.

enum bolumler bolum;
enum gunler gun;
bolum = muhasebe // bolum = 2 anlaminda
gun = cuma; // gun = 4 anlaminda
renk = kirmizi; // renk = 0 anlaminda


Sarmalama / Paketleme (Encapsulation)

Sarmalama / Paketleme (Encapsulation), bir nesnenin özelliklerinin dışarıdan kullanılmasını sınırlamak için kullanılır. Bir insanı örnek verelim. Vücudumuzun yaptığı işler sarmalanmıştır ve biz buna müdahale edemeyiz. Örneğin, biz sadece solumakla ilgileniriz; ciğeri şişirmek, kana oksijen karıştırmak, kirli kanı temizlemek gibi işlemler içeride yapılıyor olsa da, bizim için durum sadece solumaktan ibarettir. Diğer işlemler sarmalanmıştır. Aynı mantıkla, nesnelerimizin de bazı işleri kendi içinde yapması ve bu sayede daha kolay kullanılabilmesi sağlanır böylece veri güvenliği de sağlanmış olur.

Bu işlem yapılırken esasen access modifier’larla işlemlere ne şekillerde erişileceğini belirlemeniz yeterlidir.

İnsan örneğini kod halinde ifade edelim:

public class Insan
{
private void KirlikandakiKarbondioksitiAl()
{
//.......
}
private void OksijenikanaVer()
{
//.......
}
private void CigeriSisir()
{
//.......
}
private void CigeriDaralt()
{
//.......
}
public void NefesAl()
{
CigeriSisir();
OksijenikanaVer();
KirlikandakiKarbondioksitiAl();
CigeriDaralt();
}
}
Bu örnekte de görüldüğü gibi, Insan sınıfının sadece NefesAl metodu public olduğu için dışarıya açıktır. Bu nesneyi kullanan yapılar asla diğer metodlara erişemez, istese de değişikliğe sebebiyet veremez.

Aynı durumu daha gerçekçi bir örnekle inceleyelim:

public class TarihBilgisi
{
private DateTime tarih;
public string Gecerlitarih;
{
set { tarih = Convert.ToDateTime(value) }
}

private double GunOlaraktarihFarki(DateTime farkAlinacaktarih)
{
return (farkAlinacaktarih - tarih).TotalDays;
}

// Yukarıda yapılan işlemi incelediğimizde Gecerlitarih isimli property’e atılan değer dönüştürülerek DateTime tipindeki tarih isimli değişkene atılmaktadır. GunOlaraktarihFarki isimli metod parametre olarak almış olduğu farkAlinacaktarih isimli değişkenden tarih isimli değişkeni çıkarmaktadır. Kullanılan TotalDays özelliği çıkarılan iki tarih arasındaki farkı gün olarak hesaplamaktadır.

public string GunFarki(string Yenitarih)
{
return GunOlaraktarihFarki(Convert.ToDateTime(Yenitarih)).ToString() + " gün fark var";
}
}
Bu örnekte de görüldüğü gibi, tarih alanı (field) ve GunOlaraktarihFarki metodu private yapılarak dışarıdan gizlenmiştir. TarihBilgisi nesnesi ile çalışan bir uygulama bu alandan ve metottan haberdar olmayacak ve sadece bizim izin verdiğimiz yapılara erişerek işlerini görecektir. Kısıtlama kötü gibi görünse de, aslında bu sayede gereksiz alanlarla uğraşmasına gerek kalmamış ve değiştirmemesi gereken yerleri değiştirme şansı kalmamıştır.

Miras Alma / Kalıtım (Inheritance)

Inheritance (miras alma, kalıtım), bir nesnenin özelliklerinin farklı nesneler tarafından da kullanılabilmesine olanak sağlayan OOP özelliğidir. Yazılan bir sınıf bir başka sınıf tarafından miras alınabilir. Bu işlem yapıldığı zaman temel alınan sınıfın tüm özellikleri yeni sınıfa aktarılır.

İnsan – memeli ilişkisinde, insanın memeli sınıfını miras aldığı söylenebilir. Bu sayede insan sınıfını yazarken memelilerin özelliklerini tekrar yazmamıza gerek kalmaz. Elinizde bir taşıt sınıfı varsa; otomobil, kamyon, motosiklet gibi alt sınıfları üretmek çok daha az çaba gerektirir.

C# dilinde sadece tek bir sınıftan miras alabilirsiniz.

Örnek:


public class Canli
{

public int ayak; // Canlının kaç ayağı olduğunu tutan field
public int el; // Canlının kaç eli olduğunu tutan field
public string tur; // Ne tür bir canlı olduğunu belirleyeceğimiz field.
}


Şimdi iki adet daha sınıf oluşturarak Canli sınıfından türetelim:



class Insan : Canli
{
public void Konus()
{
Console.WriteLine(“Selam benim {0} adet elim ve {1} adet ayağım vardır.”,el,ayak);
Console.ReadLine();

}
}


Yukarıda farklı kullanılan bir yapı gözükmektedir. Console.WriteLine metodunun daha öncelerde farklı kullanımını görmüştük. Bu kullanımda ise indeks mantığı ile değişkenler atanmıştır. Yani “{0}” Console.WriteLine metoduna girilecek metnin ardından gelen parametrelerin ilkini yani index’i sıfır olanı ifade etmektedir. Bu da metodun kullanımında el isimli değişkene denk gelmektedir. Diğeri olan “{1}” ise bir sonraki indeksteki ayak isimli değişkene denk gelmektedir.



class Kopek : Canli
​{
public void Havla()
{
Console.WriteLine(“Hav”);
Console.ReadLine();
}
}


Bu sınıfların kullanım örneği aşağıda verilmiştir:



class CanliDemo
{
public static void Main()
{
Insan ins=new Insan();
Kopek kop=new Kopek();

ins.el=2;
ins.ayak=2;
kop.ayak=4;
ins.Konus();
kop.Havla();

}
}


Bu uygulamayı çalıştırdığınızda ekranda aşağıdaki çıktı görülür:

Selam benim 2 adet elim ve 2 adet ayağım vardır.

Hav

Görüldüğü gibi el ve ayak gibi özellikler canlıyı kalıtım alan sınıflarda bir daha yazılmamıştır. Insan ve Kopek sınıfları CanliDemo sınıfından türediği için bu özellikleri doğrudan edinmiştir.

Arayüz (Interface)

Arayüz (interface), OOP'nin en önemli yapılarındandır ve temelde sınıflara sunabileceğiniz, sınıfın hangi isimde ve hangi tipte parametreleri alan bir metoda sahip olacağını söylemenizi sağlayan yapıdır.

Bir sınıfa istediğiniz kadar arayüz uygulayabilir / giydirebilirsiniz (implement). Arayüz içine yazılan metotların işlemleri kesinlikle yazılmaz. Arayüzler hangi işin yapılması gerektiğini belirtir ama nasıl yapılacağına karışmaz. Bu metotların işlemleri, arayüzün uygulandığı sınıfta yazılır. Arayüzün access modifier'ı olsa da, içine yazılanların olmaz.

Arayüzler esas gücünü ve önemini çokbiçimlilikten (polymorphism) alır, çünkü çokbiçimlilik normal bir sınıfla yapılabildiği gibi, aynı arayüz giydirilmiş nesneler arasında da kullanılabilir. Arayüzler .NET Framework içinde de sıklıkla kullanılır.

Arayüzler sınıflara kural getirmek için kullanıldığı gibi, ortak kullanım alanları da oluştururlar. Örneğin; kayıt özelliği kazandırmak istediğimiz birtakım sınıfımız elimizde olsun (örn: Öğrenci, Öğretmen ve Ders). Bu sınıfların kayıt işlemleri için kullanacağı belli başlı metotlar olacaktır. (Örn: Kaydet, Sil, Düzenle ve VeriGetir gibi.) Bu kalıbı bir interface içerisine yerleştirdiğimizde ve kullanacak sınıflara giydirdiğimizde aslında bu sınıflar için kural koymuş oluruz.

Örnek olarak, foreach'in çalışabilmesi için nesne IEnumerable, listbox'ta bir nesneyi gösterebilmek için IList arayüzünü uygulamış nesneleri kullanır ve IList birçok dizi tabanlı yapının temelinde bulunur (listboxt.items, arraylist vb.).

Örnek:

interface KayitIslemleri
{
void Kaydet();
void Guncelle();
void Sil();
}

class Ogrenci:KayitIslemleri
{
public void Kaydet()
{
throw new NotImplementedException();
}
public void Guncelle()
{
throw new NotImplementedException();
}
public void Sil()
{
throw new NotImplementedException();
}
}

class Ogretmen : KayitIslemleri
{
public void Kaydet()
{
throw new NotImplementedException();
}
public void Guncelle()
{
throw new NotImplementedException();
}
public void Sil()
{
throw new NotImplementedException();
}}

Gördüğünüz gibi, üstteki örnekte Ogrenci ve Ogretmen sınıfı, Kayitislemleri arayüzünü uygular. Bu arayüzün uygulandığı sınıf, kaydet, güncelle, sil metoduna sahip olmak zorundadır. Arayüzler sayesinde yukarıda oluşturduğumuz yapıda ortak noktalar belirledik. Örneğini aldığımız sınıfın türünü bilmeden (Öğrenci veya Öğretmen) içerisinde Kaydet, Guncelle ve Sil metotlarının olduğunu bilmekteyiz. Bu sayede toplu işlemler yapmak istediğimiz zaman arayüzün bize getirdiği bu avantajdan faydalanabiliriz. Aşağıdaki örnekte toplu şekilde silme işlemi gerçekleştirilmektedir.

//örneği alınacak öğretmen ve öğrenci sınıfları bu dizinin içinde toplanacaktır.
KayitIslemleri[] ogrencilerveogretmenler = new KayitIslemleri[2];

Ogrenci ogrenci = new Ogrenci();
//bir üst satırda örneği alınmış Ogrenci sınıfı dizinin ilk sırasına yerleştiriliyor.
ogrencilerveogretmenler[0] = ogrenci;
Ogretmen ogretmen = new Ogretmen();
//bir üst satırda örneği alınmış Ogretmen sınıfı dizinin ikinci sırasına yerleştiriliyor.
ogrencilerveogretmenler[1] = ogretmen;

//dizi içerisinde gezilerek ilgili sıradaki nesnenin ne olduğu bilinmeden silme işlemi gerçekleştiriliyor.
for (int i = 0; i < ogrencilerveogretmenler.Length; i++)
{
ogrencilerveogretmenler[i].Sil();
}

Tanımları inceledikten sonra artık yavaş yavaş örneklerimize geçebiliriz.


30 Ocak 2016 Cumartesi

C# Giriş ve Uygulama

Merhabalar C# giriş niteliğindeki eğitimlerimize console uygulamaları ile giriş yaparak form application olarak devam edeceğiz.
C#, geliştiricilerin .NET Framework üzerinde çalışan, güvenli ve sağlam çeşitli uygulamalar oluşturmasına olanak tanıyan seçkin, tür kullanımı uyumlu, nesne yönelimli bir dildir.Windows istemci uygulamaları, XML Web Hizmetleri, dağıtılmış bileşenler, istemci-sunucu uygulamaları, veritabanı uygulamaları ve çok daha fazlasını oluşturmak için C# kullanabilirsiniz.Visual C#, C# dili ve .NET Framework tabanlı uygulamaları daha kolay hale getirmek için gelişmiş kod düzenleyici, uygun kullanıcı ara birimi tasarımcıları, tümleşik hata ayıklayıcı ve birçok diğer araç sağlar.Çok uzatmadan eğitimlere başlamak istiyorum.
Dediğimiz gibi giriş olarak console application ile çalışma yapıcaz.



ÖRNEK-1 ) 

Her uygulamada olduğu gibi bizimde ilk uygulamamız "MERHABA DÜNYA" ifadesini yazdırmak olsun . Kaynak kodu yazma ihtiyacı duymadım kod parçacığı kısa olduğu için.



Console.WriteLine();  Birçok yazdırma komutundan en çok tercih edilenidir. Satırın tamamını yazdırır.
Burada Console.ReadLine(); ifadesi siyah console ekranının kapanmasının her hangi bir tuşa basıldıktan sonra aktif olmasını ifade eder.


ÖRNEK-2 ) 

Şimdiki uygulamamız string ve int değerlerini yazdırmak olsun.



burada \n ifadesi bir alt satıra geç demek oluyor bu JAVA içinde aynı ifade şekliyle ifade edilir.



ÖRNEK-3 )

Adımız ve Soyadımızı klavyeden alarak yazdıralım.



burada klavyede girdiğimiz karakterleri Console.ReadLine(); ile string' ile adsoyad değişkenine atayıp Console.WriteLine(); ile yazdırdık.


ÖRNEK-4 )

Ufak bir aritmetik işlem yapalım.


işlem önceliği söz konusu olduğundan 15*5=75  , 75+3=78 olur.

ÖRNEK-5 )

string  int dönüşümü ile ilgili alıştırma yapalım. Bu arada klavyeden girilen her değer daima string olarak algılanır şayet girilen ifade değer ise biz bunu string > int, float vb ile dönüşümünü yaparız.





Convert.ToInt32(degisken); string bir ifadeyi integer ifadeye dönüşümünü sağlar.
degisken.ToString(); integer bir ifadeyi string bir ifadeye dönüştürür.


ÖRNEK-6 )

Klavyeden iki değer girelim ve değerlerin toplamını görelim.



console ekranından alınan değerler daima string şeklinde ifade edilmelidir. Şayet girmiş olduğumuz değer interger ise burada dönüşüm ifadesini uygulayarak işlemlerimizi gerçekleştireceğiz.
bu örnek için birincideger ve ikincideger bizim için geçici değişkenlerdir diyebiliriz. Çünkü bu değişkenleri biz integera dönüştürmek için veri tutma yeri olarak kullanıyoruz.


ÖRNEK-7 )

Programlama için en önemli kod parçacıklarından biri olan switch case kullanımı ile ilgili bir uygulama yapalım. Bu uygulamada kullanıcıya haftanın kaçıncı günü diye sorulduğunda girilen değere göre günü yazdıralım.


burada girilen değer 1 ile 7 dışında olursa Girilen Değeri Kontrol Ediniz diye uyarı çıkar.



KOD PARÇACIĞI:

int gun;
            string deger;
            Console.WriteLine("Haftanın Kaçıncı Gününü Söylememi İstersin...");
            deger = Console.ReadLine();

            gun = Convert.ToInt32(deger);

            switch (gun)
            {
                case 1: Console.WriteLine("Pazartesi");    break;
                case 2: Console.WriteLine("Salı");            break;
                case 3: Console.WriteLine("Çarşamba");  break;
                case 4: Console.WriteLine("Perşembe");  break;
                case 5: Console.WriteLine("Cuma");        break;
                case 6: Console.WriteLine("Cumartesi"); break;
                case 7: Console.WriteLine("Pazar");       break;
                default: Console.WriteLine("Girilen Değeri Kontrol Ediniz...");  break;
            }



            Console.ReadLine();



ÖRNEK-8 )

switch - case ile ilgili bir uygulama daha yapalım  bu uygulama 4 işlem olsun. console ile iki değer alalım ve verilen iki değerin toplanması, çıkarılması, çarpılması, bölünmesi hangisini istersiniz diye soralım ve verilen ifadeye göre istenilen işlemi switch - case ile  gerçekleştirelim.




KOD PARÇACIĞI :

            int sayi1,sayi2;
            string deger1,deger2;

            Console.WriteLine("İlk değeri giriniz");
            deger1 = Console.ReadLine();
            Console.WriteLine("İkinci değeri giriniz");
            deger2 = Console.ReadLine();

            sayi1 = Convert.ToInt32(deger1);
            sayi2 = Convert.ToInt32(deger2);

            Console.WriteLine("İşlem Seçimi Kodunu Giriniz. \n1-TOPLAMA\n
                                              2-ÇIKARMA\n3-          ÇARPMA\n4-BÖLME");
            string islemsecimi = Console.ReadLine();
            int islemkodu = Convert.ToInt32(islemsecimi);


            switch (islemkodu)
            {
                case 1: Console.WriteLine("TOPLAM = "+(sayi1 + sayi2));   break;
                case 2: Console.WriteLine("FARK = "+(sayi1-sayi2));        break;
                case 3: Console.WriteLine("ÇARPMA = "+(sayi1*sayi2));    break;
                case 4: Console.WriteLine("BÖLME = "+(sayi1/sayi2));    break;
           
                default: Console.WriteLine("Girilen Değeri Kontrol Ediniz...");  break;
            }



            Console.ReadLine();


ÖRNEK-9 )

C# Faktoriyel hesaplama yapalım. (  f(n) = f(n-1)*n  )

0 ! ve 1 ! in değerinin 1 olduğunu bilmemiz gerekiyor.





if içerisinde yer alan ||  karakter veya olarak ifade edilir. 0 veya 1 ise sonuc 1 'dir oluyor.




KOD PARÇAÇICI :

 Console.WriteLine("Faktoriyeli alınacak değeri giriniz...");
            string degerstring = Console.ReadLine();

            int deger = Convert.ToInt32(degerstring);//string i int e çevirdik

            int sonuc = 1;

            if (deger==1 || deger==0)
            {
                sonuc = 1;
                Console.WriteLine(deger+ " Faktoriyel Sonucumuz = "+ sonuc);
           
            }
            else
            {
                for (int i = 1; i <= deger; i++)
                {
                    sonuc = sonuc * i;
             
                }
                Console.WriteLine(deger + " Faktoriyel Sonucumuz = " + sonuc);
            }

            Console.ReadLine();


ÖRNEK-10 )

                                       *                                                             
                                       **
                                       ***
                                       ****
                                       *****  
şeklinde bir uygulama yazalım. Hatta biz alt tabanı sayısını kullanıcıdan alıp daha geniş bir uygulama yapalım.

burada  Console.Write("*");  ifadesinde WriteLine tercih etmememizin nedeni alt satıra atladığı içindşr.  Console.Write(); ifadesi yazılanları alta geçmeden yan yana yazdırır. 

KOD PARÇACIĞI:

Console.WriteLine("Alt tabandaki * kaç karakterden oluşsun...");
            string degerstring = Console.ReadLine();
            int deger = Convert.ToInt32(degerstring);

            for (int i = 1; i <= deger; i++)
            {
                for (int j = 1; j <= i; j++)
                {
                    Console.Write("*");
               
                }
                Console.WriteLine(" ");
            }

       

            Console.ReadLine();

ÖRNEK-11 ) 
Quicksort sıralaması hakkında örnek gösterelim.


static void Main(string[] args)
        {

            string[] harfler = { "g", "a", "f", "c", "e", "d", "b" };

            // sıralanmamış verileri yazdır
            Console.Write("Sıralanmamış Dizi  ");
            for (int i = 0; i < harfler.Length; i++)
            {
                Console.Write(harfler[i] + " ");
            }

            Console.WriteLine();

            // Diziyi sıralama
            Quicksort(harfler, 0, harfler.Length - 1);

            // Sıralanmış diziyi yazdır
            Console.Write("Sıralanmış Dizi    ");
            for (int i = 0; i < harfler.Length; i++)
            {
                Console.Write(harfler[i] + " ");
            }

            Console.WriteLine();

            Console.ReadLine();
        }

        public static void Quicksort(IComparable[] elements, int left, int right)
        {
            int i = left, j = right;
            IComparable pivot = elements[(left + right) / 2];

            while (i <= j)
            {
                while (elements[i].CompareTo(pivot) < 0)
                {
                    i++;
                }

                while (elements[j].CompareTo(pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // değiştirmek
                    IComparable tmp = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }

            // Recursive aramalar
            if (left < j)
            {
                Quicksort(elements, left, j);
            }

            if (i < right)
            {
                Quicksort(elements, i, right);
            }

        }


Örnek 12 )
* karakterleri ile isim yazdıralım.




Buradaki mantık matris yapısı ile oluşturulan alanın hangi alana ne geleceği yazılır.yani Matris[i,j]
ile hangi alanlara hangi karakterlerin geleceğini belirleyip yazdıralım.


for (int a = 0; a < 50; a++)
            {
                if (a==2 ||a==5 ||a==7 ||a==9 ||a==10 ||a==11 ||a==13 ||a==14 ||a==15 ||a==17 ||a==19)
                {
                   
                    Console.Write("*");
                }
                else
                {
                    Console.Write(" ");
                }
            }

            Console.WriteLine(" ");

            for (int b = 0; b < 50; b++)
            {
                if (b == 1 || b == 3 || b == 5 || b == 6 || b == 10 || b == 13 || b == 15 || b == 17 || b == 19 )
                {

                    Console.Write("*");
                }
                else
                {
                    Console.Write(" ");
                }
            }

            Console.WriteLine(" ");


            for (int c = 0; c < 50; c++)
            {
                if (c == 1 || c == 3 || c == 5 || c == 10 || c == 14 || c == 13 || c == 15 || c == 18)
                {

                    Console.Write("*");
                }
                else
                {
                    Console.Write(" ");
                }
            }

            Console.WriteLine(" ");

            for (int d = 0; d < 50; d++)
            {
                if (d == 1 || d == 3 || d == 5 || d == 6 || d == 10 || d == 13 || d == 15 || d == 18)
                {

                    Console.Write("*");
                }
                else
                {
                    Console.Write(" ");
                }
            }

            Console.WriteLine(" ");


            for (int e = 0; e< 50; e++)
            {
                if (e == 2 || e == 5 || e== 7 || e == 10 || e == 13 || e== 15 || e == 18 )
                {

                    Console.Write("*");
                }
                else
                {
                    Console.Write(" ");
                }
            }

            Console.WriteLine(" ");






console uygulamaları için daha farklı ve aklınıza gelen örnekleri yapabilirsiniz. Şimdi Form uygulamalarına giriş yapalım.

New Project > C#>Windows> Windows Form Application

Şimdi form application örneklerine geçelim.


ÖRNEK-1 )

console application'da olduğu gibi buradaki ilk uygulamamızda butona basıldığında "MERHABA DÜNYA" yazısı olsun.


BUTTON 'nun Text ine BAS Name alanına ise btnbutton yazdık Form1 ekranından BAS buttonuna 2 kez tıklayarak .cs alanına yani arka plana kod alanına geçiş yapıyoruz.
burada button'a basıldığında ne olacak şeklindeki ifademiz yer alıyor . Biz MERHABA DÜNYA yazdıracağımız için bunun gösterilmesini istiyoruz.

MessageBox.Show(); çıktılarımız gösterilir.
Ekranımızın Sol üst tarafında Form1 yazısını ve daha bir çok alanı özellikler alanından düzenleyebiliriz. Bunları zamanla ihtiyaç doğrultusunda inceleyeceğiz.


ÖRNEK-2 )

2 değer alalım TexBox'lardan ve butona bastığımızda sayıların toplamını hesaplayalım.



textbox alanından alınan değer string ifadedir toplama için alınan string ifadeleri int a çevirip toplamını hesaplarız. Hesaplanılan toplam sonucunu MessageBox ile yazdırmak için bu ifadeyi string 'e dönüştürmemiz gerekiyor.
Bunların fark, çarpma,bölme gibi ifadeleri yine aynı mantıkla yapılabilir.



ÖRNEK-3 )

Kullanıcı Girişi ekranı yapmaya çalışalım. Şayet kullanıcı Adı ve şifre doğru değilse hata versin doğruysa HOŞGELDİNİZ... Yazsın.
Burada şifre alanının görünmemesi için texbox2 textinde passwordchar ı * ile doldurarak girilen karakterlerin * şeklinde görünmesini sağlayacağız.

Girişe iki defa tıklayarak .cs alanına geçelim .

kullanıcı adı ve şifre doğruysa if içerisinde belirtilenler yapılacaktır. Şartımız sağlandığı için if içerisindeki durum gerçekleşti.


ÖRNEK-4 )

Bu uygulamamız ise vize ve final notu belirtilerek öğrenci ortalamasının hesaplanması ve hangi harf notu ile geçtiğini hesaplayalım. (finalin %60 ı vizenin %40 alınacak ve öğrencinin geçebilmesi için final minimum 50 ve ortalama min 36 olması gerekiyor.)





KOD PARÇACIĞI:

        private void btnbutton_Click(object sender, EventArgs e)
        {
            string vizedeger = textBox1.Text;
            string finaldeger =textBox2.Text;

            int vize = Convert.ToInt32(vizedeger);
            int final = Convert.ToInt32(finaldeger);
            float ortalama=(((vize*4)+(final*6))/10) ;

            textBox3.Text = Convert.ToString(ortalama);

            if (final >=50 && ortalama>=36)
            {
                if (100>=ortalama && ortalama>84)
                {
                    MessageBox.Show("Tebrikler AA ile geçtiniz...");
                }
                else if (84 >= ortalama && ortalama > 69)
                {
                    MessageBox.Show("Tebrikler BB ile geçtiniz...");
                }
                else
                {
                    MessageBox.Show("GEÇTİNİZ...");
                }
            }

            else
            {
                MessageBox.Show("NE YAZIKKİ BU DERSTEN KALDINIZ...");
            }
       
        }


ÖRNEK-5 ) C# metot kullanımı ile ilgili basit bir örnek yapalım.



int.Parse yerine daha önceki örneklerdeki gibi convert.toint32 yide kullanabiliriz.


ÖRNEK-6 )

Şimdiki örneğimiz taban aritmetik olsun onluk tabanındaki bir değeri binary yani ikilik tabanına çevirelim.



KOD PARÇACIĞI :

            int sayi, kalan;
            string yaziKalan = "";
            sayi = Convert.ToInt32(textBox1.Text);
            while (sayi != 0)
            {
                kalan = sayi % 2;
                sayi = sayi / 2;
                yaziKalan = kalan.ToString() + yaziKalan;
            }
            textBox2.Text = yaziKalan;










30 Kasım 2015 Pazartesi

Angular JS ' ye Giriş

Merhabalar bugün Angular JS hakkında bildiklerimi paylaşmak istiyorum.  Angular JS ye başlangıcım araştırma ve ufak bir proje vesilesi ile gerçekleşti. İyi ki araştırma yapmışım böylesine muazzam bir konu hakkında bilgimin olmaması ve getirmiş olduğu kolaylıkların farkında olmamak kötü bir his uyandırırdı.  Angular JS, basit tabirle google standartlarına uygun ve desteklediği, javascript tabanlı bir MVC kütüphanesidir. MVC (Modal View Controller) verideki , görünümün ve kontrollerinin farklı tutulmasına dayanır.
Html etiketlerine (tag) çeşitli özellikler (attribute) ekleyerek, Html’i genişleterek hızlı bir şekilde ve kolayca dinamik web aplikasyonları oluşturmamızı sağlar
Angular JS çalışmak için jQuery gibi kütüphanelere ihtiyaç duymamıza gerek yoktur. Karmaşıklık yok denilebilecek kadar az olup az kod ile çok iş yapmakta mümkündür ki bana göre en güzel tarafı budur yani çift taraflı çalışması (two way binding). Mesela bir inputtaki değeri değiştirdiğinizde anlık olarak belirlenmiş olan span içeriğindeki veride değişir .
Angular JS yaklaşık 100KB dır ve resmi sitesi https://angularjs.org/ dır.
Kod yapısında  <head> tagları arasına
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
Scripti eklendiği takdirde Angular JS yi indirmeden direk sitesindeki kütüphaneyide kullanabilirsiniz.
Angular JS çeşitli bileşenleri içeren modüller halinde düzenlenmiştir. Bu bileşenler Direktifler (directives), hizmetler (services), sağlayıcılar (providers), Tipler (types), genel apiler dir.

Angular kütüphaneleri.
ng : angularJS nin temel modüllerini içerir. Bir angularJS uygulaması başlatıldığında bu modül varsayılan olarak yüklenir.
ngRoute : Uygulamada url yönetimi yapılmasını sağlamak için kullanılır. (angular-route.js)
ngAnimate: Uygulamada animasyon özellikleri için kullanılır. (angular-animate.js)
ngResource : Rest api veri yönetimi için kullanılır. (angular-resource.js)
ngCookies: Cookie yönetimini sağlar. (angular-cookies.js)
ngTouch: Mobil tarayıcılar için geliştirilen uygulamalarda kullanılır. (angular-touch.js)
ngSanitize: HTML verilerini güvenli bir şekilde ayrıştırmak ve işlemek için kullanılır. (angular-sanitize.js)
ngMock: Test modülleri için kullanılır. (angular-mock.js)

Ayrıca Angular, hiç js kodu yazmadan, template kısmında koşullu ifadeler ve deyimlerle çalışma olanağı sağlar ki işin en güzel tarafı budur diyebiliriz . Şimdi yavaştan örneklerimize geçelim. Örneklerimiz ile  Neden Angular JS  ?
Sorusuna cevabı kendiniz vereceksiniz.


Uygulama-1: İlk uygulamamız bir text içerisindeki yazıyı span içerisine uygulamak olsun.
İlk olarak html bir sayfa oluşturalım ve head kısmında angularJS kütüphanesini sayfamıza tanımlayalım.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>

<html> olarak oluşan sayfamızda Angular JS uygulamasını kullanabilmek için  
<html> tagları arasına ng-app  ekleyerek <html ng-app>  yapıyoruz. Buradaki amaç kodların bir nevi Angular JS ile taranması demek oluyor. Sonra input tanımlayarak ng-model ile bir değişken adı tanımlayalım.
ng-model  directive scope’unuzda bir değişken tanımlanızı sağlar ve bu değişkenin binding’ini ilgili elementin value’usu veya text’i olarak ayarlar. Burada two way binding (çift taraflı bağlama) kurulur.
- {{isminiz}}: çift süslü parantezler arasına scope içerisinde tanımlanan değişkenleri kullanarak bunları ekranda gösterebilir veya çeşitli işlemlere sokabiliriz.
 

Ekranda göründüğü gibi text alanına Dünya yazarak hiçbir  javascript kodu yazmadan anlık “Merhaba Dünya” yazısı yazıldı.
KAYNAK KODLARI
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ng-app>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<title>Oktay ALTAN - Angular JS</title>
</head>
<body>
 <input type="text" ng-model="isminiz" placeholder="Adınızı Giriniz"> <br/>
<span>Merhaba {{isminiz}}</span>
</body>
</html>
Uygulama-2 : deger adlı değişken; bir, iki ve üç butonlarına tıklandığında sırasıyla birinci,ikinci ve ucuncu değerlerini alıyor. ng-show ile true false kontrolü yapılır. Eger true ise span içerisindeki içerik veya yazılar yazılır.

KAYNAK KODLARI
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ng-app>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<title>Oktay ALTAN - Angular JS</title>
</head>
<body>
<section ng-app ng-init="deger = 1">
  <h2>Hangi butona basıldığı kontrolü</h2>
  <div>
    <button ng-click="deger = '1'">bir</button>
    <button ng-click="deger = '2'">iki</button>
    <button ng-click="deger = '3'">uc</button>
  </div> 
  <div>
    <span ng-show="deger == '1'">birinci</span>
    <span ng-show="deger == '2'">ikinci</span>
    <span ng-show="deger == '3'">ucuncu</span>   
  </div>
</section>
</body>
</html>

Uygulama-3: Angula JS  ile matematiksel işlemlerin nasıl yapıldığına dair ufak bir uygulama yapalım .
Bu örnekte ng-model ile tanımlamış olduğumuz iki değişkeni <div> ler içerisinde işlemlere tabi tutarak sonuç elde edeceğiz.
ng-init değişken içerisindeki ilk değer anlamına geliyor. 


KAYNAK KODLARI
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ng-app>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<title>Oktay ALTAN - Angular JS</title>
</head>
<body>
<section ng-app ng-init="sayi_2 = 3; sayi_1 = 25">
  <section>
    <h2>Oktay İle Angular matematiksel işlemler</h2>
    Birinci sayı: <input type="text" ng-model="sayi_1"/>
    İkinci sayı: <input type="text" ng-model="sayi_2"/>
    <hr />  
    <div>
      {{ sayi_1 }} - {{ sayi_2 }} =  {{ sayi_1 - sayi_2 }}
    </div>
    <div>
      {{ sayi_1 }} * {{ sayi_2 }} =  {{ sayi_1 * sayi_2 }}
    </div>
    <div>
      {{ sayi_1 }} / {{ sayi_2 }} =  {{ sayi_1 / sayi_2 }}
    </div>
    <div>
      {{ sayi_1 }} % {{ sayi_2 }} =  {{ sayi_1 % sayi_2 }}
    </div> 
  </section>
</section>
</body>
</html>




Uygulama-4: Bu uygulamamızda 12 sayı verip girilen rakamlara göre filtreleme yapalım. ng-repeat ng-modul e ait bir directive dir. Array içindeki nesnelere sıralı erişim sağlar.


 KAYNAK KODLARI
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ng-app>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<title>Oktay ALTAN - Angular JS</title></head>
<body>
<section ng-app ng-init="sayilar = [45, 658, 548, 358, 154, 69, 48, 87, 451, 35, 680, 15]">
  <h2>AngularJS ng-repepat ve filter</h2>
  Sayıları içerdiği rakama göre filtreleyin: <input ng-model="rakam" />
  Bulunan öğe sayısı: {{ (sayilar | filter: rakam ).length }}
  <hr />
  <div>
    <span class="oge" ng-repeat="sayi in sayilar | filter: rakam">
      {{sayi}}
    </span>
  </div>
</section>
</section>
</body>
</html>
Uygulama-5: Uygulamamız not ekleme ve silme işlemi yapıyor olsun. Burada not ekleme ve silme adımları için 2 satırlık javascript kodu kodlandık. 



<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>
       
        <script type="text/javascript">

            function notcontroller($scope) {
                $scope.notlar = [];

                $scope.notekle = function () {
                    $scope.notlar.push({ ad: $scope.notadi });
                    $scope.notadi = "";
                }

                $scope.notsil = function (ind) {
                    $scope.notlar.splice(ind, 1);
                };
            }

        </script>
    </head>
    <body ng-app>
        <div ng-controller="notcontroller">

            <input type="text" name="not" id="not" ng-model="notadi"/>
            <a href="javascript:void(0);" ng-click="notekle()">Ekle</a>


            <ul ng-repeat="not in notlar">
                <li>{{$index}} - {{not.ad}} <a href="#" ng-click="notsil($index)">sil</a> </li>
            </ul>

        </div>
    </body>
</html>











Uygulama-6: Kisiler listemiz olsun ve bu listeyi ng-repeat ile ekrana yazalım. Filtre için ve order by için de inputlar ekleyelim ve ister ad a göre istersede yaş a göre filtrelere yapıldın.

KAYNAK KODLARI
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>      
        <script type="text/javascript">
          function listecontroller($scope){
    $scope.kisiler = [
      {ad:'Bilge', yas:32, cinsiyet:'K'}
      ,{ad:'Okan', yas:12, cinsiyet:'E'}
      ,{ad:'Ahmet', yas:18, cinsiyet:'E'}
      ,{ad:'Mehmet', yas:25, cinsiyet:'E'}

    ];   
    $scope.order_cols = [{v:'ad',t:"Ad"},{v:'yas',t:"Yaş"},{v:'cinsiyet',t:'Cinsiyet'}];
    $scope.order_types = [{v:true,t:"Azalan"},{v:false,t:'Artan'}];
   
    $scope.order_col=$scope.order_cols[0];
    $scope.order_typ=$scope.order_types[0];
   
    $scope.format = function(k){
        //k.cinsiyet setlenirse kisiler nesnedeki değer güncellenmiş olur.
        if(k.cinsiyet == "E")
            k.cinsiyetformat = "Bay"
        else
            k.cinsiyetformat = "Bayan"
    }
}

        </script>
    </head>
    <body ng-app>
<div ng-app>
    <div ng-controller="listecontroller">
        <input type="ara" ng-model="k.$" placeholder="ara..." />
        <input type="ara" ng-model="k.ad" placeholder="ad..." />
        <input type="ara" ng-model="k.yas" placeholder="yas..." />
       
        <select ng-model="order_col" ng-options="i.t for i in order_cols">
        </select>

        <select ng-model="order_typ" ng-options="i.t for i in order_types">
        </select>
       
        <div ng-repeat="k in kisiler | filter:k | orderBy:order_col.v:order_typ.v"  ng-init="format(k);">
            <div ng-show="$first">Kişiler</div>
            <div class="even{{$even}}">{{$index+1}} -> {{k.ad}} - {{k.yas}} - {{k.cinsiyetformat}}</div>
            <div ng-show="$last">Toplam {{kisiler.length}} kayıt</div>
        </div>
    </div></div>
    </body>
</html>
Uygulama-7: İşin içine birazda CSS karıştırıp Kişi ekleyip silebileceğimiz bir arama uygulaması yapalım.


KAYNAK KODLARI
<!DOCTYPE html>
<html ng-app>
<head>
<script  src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function ctrl($scope){
  $scope.rows = ['Ali'];
  $scope.temp = false;
 
  $scope.addRow = function(){
    $scope.temp = false;
    $scope.addName="";
  };
 
  $scope.deleteRow = function(row){
    $scope.rows.splice($scope.rows.indexOf(row),1);
  };
 
  $scope.plural = function (tab){
    return tab.length > 1 ? 's': '';
  };
 
  $scope.addTemp = function(){
    if($scope.temp) $scope.rows.pop();
    else if($scope.addName) $scope.temp = true;
   
    if($scope.addName) $scope.rows.push($scope.addName);
    else $scope.temp = false;
  };
 
  $scope.isTemp = function(i){
    return i==$scope.rows.length-1 && $scope.temp;
  };
 
}
</script>
<meta charset=utf-8 />
<title>Oktay ALTAN - Angular JS</title>
</head>
<style>
body{
  padding:20px;
}
.search{
  margin-left:10px;
}
</style>
<body ng-controller="ctrl">
  <h2>{{rows.length}} Kişi <span ng-show="temp">?<small class="muted"><em > (Şuanda {{rows.length-1}} kişi bulunmakta....)</em></small></span></h2>
  <form class="form-horizontal">
  <span ng-class="{'input-append':addName}">
    <input id="add" type="text" placeholder="Eklenecek Kişiyi yazınız..." ng-model="addName" ng-change="addTemp()"/>
    <input type="submit" class="btn btn-primary" ng-click="addRow()" ng-show="addName" value="+ Ekle"/>
    </span>

    <span class="search input-prepend" ng-class="{'input-append':search}">
      <span class="add-on"><i class="icon-search"></i></span>
  <input type="text" class="span2"  placeholder="Kişi Ara..." ng-model="search">
    <button type="submit" class="btn btn-inverse" ng-click="search=''" ng-show="search" ><i class="icon-remove icon-white"></i></button>
</span>
  </form>
  <table  class="table table-striped">
    <tr ng-repeat="row in rows | filter : search"  ng-class="{'muted':isTemp($index)}">
      <td>{{$index+1}}</td>
      <td>{{row}}</td>
      <td>
        <button class="btn btn-danger btn-mini" ng-click="deleteRow(row)" ng-hide="isTemp($index)"><image src="images.png"/></button>
      </td>
    </tr>
  </table>
 
</body>
</html>



Uygulama-8: Basit bir  Search uygulaması.

KAYNAK KODLARI
<html>
<head>
<meta Charset = "utf-8"/>

<script  src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script>

<script>
var app = angular.module("icerikara", []);
app.filter('searchFor', function(){

                return function(arr, searchString){

                               if(!searchString){
                                               return arr;
                               }

                               var result = [];

                               searchString = searchString.toLowerCase();

                               angular.forEach(arr, function(item){

                                               if(item.title.toLowerCase().indexOf(searchString) !== -1){
                                                               result.push(item);
                                               }

                               });

                               return result;
                };

});



function InstantSearchController($scope){


                $scope.items = [
                               {
                                               url: 'http://vodafoninternet.com/',
                                               title: 'Vodafone Çağrı Merkezi',
                                               image: 'http://emrereklamcilik.com/_sn2/module/sa2_resize.aspx?f=/upload/image/logo/_vodafone.jpg&w=100&h=100'
                               },
                               {
                                               url: 'http://www.superonlinenet.net/',
                                               title: 'Turkcell Çağrı Merkezi',
                                               image: 'https://yt3.ggpht.com/-rD0D5bABe0A/AAAAAAAAAAI/AAAAAAAAAAA/CeNphd6R_Ig/s100-c-k-no/photo.jpg'
                               },
                               {
                                               url: 'http://ruyaavcisi.com/',
                                               title: 'Güzel Sanatlar Resim Kursu',
                                               image: 'https://yt3.ggpht.com/-s7xB-bzutE4/AAAAAAAAAAI/AAAAAAAAAAA/c_uYEUbOyQE/s100-c-k-no/photo.jpg'
                               },
                               {
                                               url: 'http://erdemins.com/',
                                               title: 'Erdem İnşaat Sitesi',
                                               image: 'http://www.bedava.biz.tr/css/images/reklam4.png'
                               },
                               {
                                               url: 'http://duvarressami.net/',
                                               title: 'Duvar Ressamı ',
                                               image: 'http://cdn.tutorialzine.com/wp-content/uploads/2013/05/featured-100x100.jpg'
                               },
                              
                ];

}
</script>
<style>
*{
                margin:0;
                padding:0;
}

body{
                font:15px/1.3 'Open Sans', sans-serif;
                color: #5e5b64;
                text-align:center;
}

a, a:visited {
                outline:none;
                color:#389dc1;
}

a:hover{
                text-decoration:none;
}

section, footer, header, aside, nav{
                display: block;
}



.bar{
                background-color:#5c9bb7;

                background-image:-webkit-linear-gradient(top, #5c9bb7, #5392ad);
                background-image:-moz-linear-gradient(top, #5c9bb7, #5392ad);
                background-image:linear-gradient(top, #5c9bb7, #5392ad);

                box-shadow: 0 1px 1px #ccc;
                border-radius: 2px;
                width: 400px;
                padding: 14px;
                margin: 45px auto 20px;
                position:relative;
}

.bar input{
                background:#fff no-repeat 13px 13px;
                background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU5NEY0RTlFMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU5NEY0RTlGMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTk0RjRFOUMxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTk0RjRFOUQxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4DjA/RAAABK0lEQVR42pTSQUdEURjG8dOY0TqmPkGmRcqYD9CmzZAWJRHVRIa0iFYtM6uofYaiEW2SRJtEi9YxIklp07ZkWswu0v/wnByve7vm5ee8M+85zz1jbt9Os+WiGkYdYxjCOx5wgFeXUHmtBSzpcCGa+5BJTCjEP+0nKWAT8xqe4ArPGEEVC1hHEbs2oBwdXkM7mj/JLZrad437sCGHOfUtcziutuYu2v8XUFF/4f6vMK/YgAH1HxkBYV60AR31gxkBYd6xAeF3VzMCwvzOBpypX8V4yuFRzX2d2gD/l5yjH4fYQEnzkj4fae5rJulF2sMXVrAsaTWttRFu4Osb+1jEDT71/ZveyhouTch2fINQL9hKefKjuYFfuznXWzXMTabyrvfyIV3M4vhXgAEAUMs7K0J9UJAAAAAASUVORK5CYII=);

                border: none;
                width: 100%;
                line-height: 19px;
                padding: 11px 0;

                border-radius: 2px;
                box-shadow: 0 2px 8px #c4c4c4 inset;
                text-align: left;
                font-size: 14px;
                font-family: inherit;
                color: #738289;
                font-weight: bold;
                outline: none;
                text-indent: 40px;
}

ul{
                list-style: none;
                width: 428px;
                margin: 0 auto;
                text-align: left;
}

ul li{
                border-bottom: 1px solid #ddd;
                padding: 10px;
                overflow: hidden;
}

ul li img{
                width:60px;
                height:60px;
                float:left;
                border:none;
}

ul li p{
                margin-left: 75px;
                font-weight: bold;
                padding-top: 12px;
                color:#6e7a7f;
}
</style>
</head>
<body>
<div ng-app="icerikara" ng-controller="InstantSearchController">

                <div class="bar">
                               <input type="text" ng-model="searchString" placeholder="Yapmış olduğum bazı siteler..." tabindex="1" autofocus/>
                </div>

                <ul>
                               <li ng-repeat="i in items | searchFor:searchString">
                                               <a href="{{i.url}}"><img ng-src="{{i.image}}" /></a>
                                               <p>{{i.title}}</p>
                               </li>
                </ul>
</div>
</body>
</html>