Bu makalemizde ASP.NET ve C# ile SMTP server üzerinden mail gönderme kodlarınız yazacağız.
Öncelikle yeni bir ASP sayfası açıyoruz istediğiniz dizaynı yaptıktan sonra forma 3 tane textBox, 1 tane Label ve 1 tane de buton oluşturuyoruz,  TextBox’ un adları : ” txtKonu, txtMesaj ve txtEmail”. Label’in  adını txtSonuc yapıyoruz. txtKonu’ya oluşturulan formadan konuyu giriyoruz, txtMesaj’ a  gönderilecek mesajı yazıyoruz, txtEmail’ e ise gönderen kişinin mail adresi yazılacak. txtSonuc label’ine de maili gönder butonuna bastıktan sonra hata var ise  catch yapısından dönen sonuç görüntülenecek. Aşağıdaki kodu oluşturduğunuz butonun click event’ ine yapıştıryoruz. Bu kodlar % 100 çalışmaktadır.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Net;
using System.Net.Mail;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnGonder_Click(object sender, EventArgs e)
{
try
{
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(“smtp mail sunucunuz”);
smtp.UseDefaultCredentials = true;
smtp.EnableSsl = false;
smtp.Port = 587;
System.Net.NetworkCredential cred = new System.Net.NetworkCredential(“mail nereye gidecek”, “gidecek mail şifresi”);
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
smtp.Credentials = cred;
mail.Priority = MailPriority.High;
mail.To.Add(“mail gidecek diğer adres”);//isteğe bağlı
mail.To.Add(“mail gidecek diğer adres 2″);//isteğe bağlı
mail.From = new System.Net.Mail.MailAddress(“mail nereye gidecek”);
mail.Subject = txtKonu.Text;
mail.Body = (txtMesaj.Text + ” gönderen kişinin e-maili:” + txtEmail.Text);
mail.IsBodyHtml = false;
smtp.Send(mail);
}
catch (Exception ex)
{
txtSonuc.Text = ex.Message;
}
}
}
Kolay Gelsin.
Mansur İşçel

Strateji tasarım deseni geliştirdiğimiz uygulama içinde algoritmaları sınıflandırmamızı ve çalışma anında kullanacağımız algoritmayı seçmemizi sağlar. Bu algoritmalar kendi içinde kapsüllenerek (encapsulate) programın geri kalanından soyutlanır ve uygulamamızın loosely coupled bir yapıda olmasına yardım eder. Örneğin bir maliyet hesabında LIFO mu yoksa FIFO mu kullanacağımızı çalışma anında belirlemek istiyorsak strateji tasarım desenini kullanarak bunu nesne yönelimli programlama ilkeleri doğrultusunda yapabiliriz.

Algoritmaların seçim işlemini if else blogları ile yapabilirdik. Ancak küçük bir değişiklikte uygulamamızın içine müdahale etmek zorunda kalırdık. Ayrıca yeni algoritmalar ekledikçe bu if else bloglarımız gittikçe uzayacaktı. Ya da işlemi kalıtım yolu ile de gerçekleştirebilirdik. Bir metodu üst bir sınıfta tanımlayıp, alt sınıflarda bu metodu override edebilirdik. Ancak bu durumda da bir değişiklik durumunda bütün alt sınıflarda kodu tekrar düzenlememiz gerekecekti. Ya da eklediğimiz her yeni sınıf için yeniden metodu override etmemiz gerekecekti. Bu durumda kodların yeniden kullanılabilirliği konusunda başarısız olacaktık.

Bu deseni nasıl uygulayabileceğimizi bir örnekle daha iyi gösterebiliriz. Ben nesne yönelimli programlama ile ilgili örnekler verirken daha anlaşılır ve daha uygulanabilir olması nedeniyle mümkün olduğunca şekiller üzerinden gitmeyi tercih ediyorum. Yine vereceğim bu örnekte Strateji tasarım desenini kullanarak Şekil sınıfından türeyen daire ve kare sınıflarının çevrelerini hesaplayan basit bir uygulama yazacağım.

Öncelikle çevre hesaplama algoritmalarını bir araya toplamam gerekiyor. Kapsülleme işlemini gerçekleştirmek ve çevre hesaplama algoritmalarını belli bir formatta tutmak için öncelikle bir interface yazıyorum.

public interface ICevre
{
int hesapla(Dictionary<string, int> degerler);
}

Bundan sonra çevre hesaplama algoritmalarımı tutacak bütün sınıfları bu interface’den türeteceğim. Bu interface’imiz bir adet hesapla metodu içeriyor. Interface’imizden sonra ise çevre hesaplayacak sınıflarımızı oluşturacağız.

public class DaireCevre : ICevre
{
private int cevresi = 0;
public int hesapla(Dictionary<string, int> degerler)
{
cevresi = 2*degerler["Pi"]*degerler["r"];
return cevresi;
}
}

DaireCevre sınıfımız ICevre interface’inden aldığı hesapla metodunu implemente ediyor. Aynı şekilde KareCevre sınıfını da yazıyoruz. Bu sınıf da kendine özgü algoritmasıyla çevre hesaplamasını yapıyor.

public class KareCevre : ICevre
{
private int cevresi = 0;
public int hesapla(Dictionary<string, int> degerler)
{
cevresi = degerler["BirKenar"]*4;
return cevresi;
}
}

Artık çevre ile ilgili hesaplamalarımızı yaptığımıza göre kullanacağımız sınıfları yazmaya geçebiliriz. İlk olarak şekillerimi türeteceğim bir Sekil sınıfı yazıyorum.

public class Sekil
{
public ICevre _cevre;
public Dictionary<string, int> _degerler;

public int cevreHesapla(Dictionary<string, int> degerler)
{
return _cevre.hesapla(degerler);
}
}

Bu sınıfımızda bütün algoritma sınıflarımızı kapsayabilmesi için bir adet ICevre interface’i nesnesi oluşturuyoruz. Böylece loosely coupled özelliğini de sağlamış oluyoruz. Yeni ekleyeceğimiz, çıkaracağımız ya da değiştireceğimiz algoritmalar uygulamanın geri kalanını etkilemiyor. Ayrıca parametreler için bir adet Dictionary nesnesi tanımladım. Burada gördüğümüz cevreHesapla metodu bizim dışarıdan erişeceğimiz ve hesaplama işlemlerini yaptıracağımız metod. Kendi içinde hangi şeklinde çevresi hesaplanacak ise ona ait metodu çağırıyor.

Artık kullanacağımız sınıfları yazabiliriz.

public class Kare : Sekil
{
public Kare(Dictionary<string, int> degerler)
{
_cevre = new KareCevre();
_degerler = degerler;
}
}

public class Daire : Sekil
{
public Daire(Dictionary<string, int> degerler)
{
_cevre = new DaireCevre();
_degerler = degerler;
}
}

Bu sınıflarımız da constructor metod çağrıldığında ICevre türünden olan nesnemize ilgili cevre sınıfı nesnesi(DaireCevre, KAreCevre) oluşturularak atanıyor. Böylece doğru hesapla fonksiyonunun çağrılması sağlanıyor.

Son olarak uygulamamızı deneyeceğimiz kısmı yazabiliriz.

static void Main(string[] args)
{
Dictionary<string,int> dd = new Dictionary<string,int>();
dd.Add(“BirKenar”,4);
Sekil sk = new Kare(dd);
Console.WriteLine(sk.cevreHesapla(dd).ToString());
Console.ReadLine();
}

Böyle bir denemede ekrana 16 yazacaktır.

www.mehmetkordaci.com

Genişlik öncelikli arama algoritması ağaç yapılarında kullanılır. Arama algoritmasının genel özelliği ulaştığı derinliği tamamen bitirdikten sonra bir sonraki derinliğe ulaşmasıdır. Ağaçta yukarıdan başlayarak soldan sağa doğru ilerler.


Arama algoritması yukarıdaki şekilde görüldüğü gibi rakam sırası ile aranmaktadır.

Derinlik Öncelikli Arama  (Depth-First Search)

 

Ağaç yapılarında kullanılan algoritmalarından bir tanesidir. Elimizde var olan bir ağaç yapısı içerisinde istenilen bir değeri aramakta kullanılan ve özelliği öncelik olarak ağacın derinliğini tamamlamasıdır. Yani ağacın başlangıcından başlayarak sol taraftan inebildiği kadar derinliğe ulaşır ve arama ağaç tamamlanıncaya kadar hep idikey olarak devam eder.

Elimizdeki ağaca göre arama sırasına ve ilerleme metodumuza bakacak olursak :

 

ilk olarak 7 daha sonra soldaki ilk eleman 5 , daha sonra 4 daha sonrada 3 ve 3 e geldiğimizde en derin noktaya ulaştığımız için geri ilerliyoruz 4 ün sağ çocuğu olmadığı için 5 e dönüyoruz 5 in sağ çocuğu var 6 ile karşılaştırma yapıyoruz. sonra geri geliyoruz başlangıç noktamız 7 nin tüm sol çocukları gezildiği için 8 , 8 n sol çocuğu olmadığı için 10, daha sonra sol çocuk olan  9 ve son olarak 11 i ziyaret ederek arama işlemimizi tamamlıyoruz.

 

7 – 5 – 4 – 3 – 6 – 8 – 10 – 9 – 11 şelinde bir sıra ile ağacımızı dolaşmış olduk.

 

 

Doğrusal Arama (Linear Search)

Doğrusal arama, arama algoritmalarında temel teşkil etmektedir. Herhangi bir mantık karmaşası yoktur. Elimizde var olan dizi içerisinde aradığımız değeri dizinin başlangıcından itibaren sonuna doğru arama işlemini gerçekleştirir. Eğer aradığımız değer 8. değer ise işlemimiz 8 adımda sonlanır, eğer ilk elemansa hemen sonlanır. Küçük bir örnek ile özetleyecek olursak :

Örnek Uygulama :

   

int dogrusalArama(int gelenDizi,int diziBoyu,int arananDeger)
{
   int sonuc=-1;
    for(int konum=0;konum<diziBoyu;konum++)
    if(gelenDizi[konum]==arananDeger)
    {
      sonuc=konum ;
     break;
    }
    return sonuc;
}

dogrusalArama fonksiyonu doğru parametreler ile çalıştırıldığında,  eğer dizi içierisinde aranan değer var ise sonuc değişkenine doğru değerin bulunduğu konum atanır, eğer hiç bulunamaz ise -1 değeri sonuç olarak döner.

                        İkili Arama (Binary Search)

İkili arama , sıralı dizilier için kullanılan bir algoritmadır. Algoritmanın amacı bu sıralı dizi içinde istenilen değeri bulmaktır. Çalışmaya başladığı anda dizinin ortasındaki eleman ile aranan sayı karşılaştırılır, eğer aranan değerden küçükse orta elemanın sağ tarafa doğru , eğer büyük ise orta elemanın sol tarafından devam edilir. Bu şekilde aranılan değer bulununcaya dek bu işlem devam eder. Küçük bir sayı dizisinde adım adım ilerleyecek olursal

1 – 3 – 5 – 7 – 9 – 11 – 13  aranan değer 13 olsun. ilk olarak ortaki eleman olan 7 ele alınır. 13 den küçük olduğu için sağa doğru ilerleme yapılır

9 – 11 – 13 bu sefer ortadaki eleman ile karşılaştırdığımızda aranan değerden küçük olduğu için . sağa doğru ilerleriz.

13 elimizdeki yeni bölümdür. 13 ile karşılaştırdığımızda da aradığımız değeri 3. adımda bulmuş olduk.

Örnek uygulama :

   

int dizi[7] = {1, 3, 5, 7, 9, 11, 13};
int arananDeger = 13;
 
int baslangic = 0;
int bitis = 6;
int i;

while ( baslangic  != bitis )
{
  i = ( baslangic  + bitis )/2;
  if (dizi[i] == arananDeger )
    break;
  else if (dizi[i] > arananDeger )
    bitis = i;
  else
    baslangic = i;
  i++;
}

 

Selection Sort ( Seçmeli Sıralama )

 

Yazması kolay ve basit bir yapıya sahip olan seçmeli sıralama algoritması , elemeli sıralama ya (Bubble Sort) göre daha iyi bir performansa sahip olsada, diğer gelişmiş algoritmalara göre yavaş çalışmaktadır.

Genel olarak çalışma prensibine değinecek olursak , elimizde ki sıralanacak olan dizi ilk elemandan başlanarak okunur ve en küçük deger ilk deger ile yer değiştirir. Bu işlemden sonra ikinci elemadan başlayarak diğer elemanlar arasındaki en küçük değerler karşılaştırılarak son elemana kadar gidilir ve elimizdeki dizi sıralanmış olur.

Küçük bir örnek ile inceleyecek olursak :

 

Elimizdeki dizinin elemanları sırası ile 47 – 36 – 19 – 27 – 9 olsun

47 – 36 – 19 – 27 – 9

9 – 36 – 19 – 27 – 47  // dizideki en küçük eleman olan 9 ile ilk eleman 47 yer değiştirdi

9 – 19 – 36 – 27 – 47  // ikinci sıradaki eleman ile geri kalanların enküçüğü 19 yer değiştirdi

9 – 19 – 27 – 36 – 47  // üçüncü ile geri kalan en küçük değer 27 yer değiştirdi

9 – 19 – 27 – 36 – 47  // 36 zaten 47 den küçük olduğu için herhangi bir değişiklik gerçekleşmedi

                Ve böylelikle dizimiz sıralanmış oldu. Tanımında da bahsettiğimziz gibi basit bir yapıya sahip olduğu için geliştirilmesi basit gerçekleşiyor. Fakat büyük veri dizilerinde çok yavaş kalmaktadır.

                Bir sonraki daha hızlı algoritmada görüşmek üzere.

 

Tahir MUTLU

www.tahirmutlu.com

Algoritma

 

                Bilgisayarı ilk zamanlarında günümüze kadar incelediğimizde, karmaşık olan problemlerin çözüm zamanlarını kısaltmak ve orada harcanacak olan zamanı daha farklı problemlere yoğunlaşmak üzere bizlerin işlerini kolaylaştırmak adına tasarlanmış diyebiliriz.

Bilgisayar üzerinde herangi bir problemi tanımlarken neyi nezaman hangi veriler ile yapacağını tanımlamış oluruz.  Bir nevi bir öğretmenin okulda öğrenciye bir fizik problemini çözerken izlemesi gerektiği yolları tanımlaması gibidir. Diyelimki minimum üç bilinen ile iki bilinmeyen değere ulaşabileceğmiz bir problem ise bu üç bilinen değişiklik gösterebilir bun bağlı olarakta bizim uygulayacağımız çözüm yöntemimiz farklılık gösterir. Biz bu çözüm yöntemlerini bir algoritma yada akış şeması olarak tanımladığımızda problemi daha net ve basit bir şekilde çözebiliriz.

Bilgisyar ortamında da çözecek olduğumuz problemin akış şemasını  yüklediğimiz de bilgisayarda kullanıcıdan gelen verilere göre belirlemiş olduğumuz yöntemi uygulayarak bizlere birer çözüm üretir. Burada dikkat edilmesi gereken algoritmada problemin çözüm basamakları mantıksal bir sıra ile düzgün bir şekilde belirlenmesidir. Bunu belirler iken istersek şekillerden yararlanarak,istersek sözde kodlama olarak bahsettiğimiz pseudo code lamadan yararlanarak yada herhangi bir geliştirme dilinde algoritmamızın tasarımını gerçekleştirip bir yol belirlemiş oluruz.

Algoritma genel manası ile bir takım kısımlardan oluşmaktadır.  Problem,veriler,fonksiyonlar ve sonuç. Bunu bir sıraya koyabiliriz ama veriler belki zaman içerisinde farklı konumlarda alınabilir. Algoritmanın bu yapısında bizim için önem teşkil eden noktalardan biriside karar mekanizmalarıdır. Örneğin bu değer bundan büyük ise işlemi tamamla küçük ise başa dön gibi . Bunun kararının alındığı karşılaştırma noktası algoritmanın dallanmasında rol almaktadır.

Kendimizi küçük ve gerçek bir problem belirleyecek olursak, ve bilgisayar ile bağdaştıracak olursak bilgisayarımızın soğutma mekanizmasını ele alabiliriz. Burada ilk olarak problemimizi tanımlayacak olursak bilgisayarımızın çalıştığında çalışmaya başlayan soğutma mekanizması işlemci sıcaklığının 55 dereceye ulaştıktan sonra daha hızlı çalışmasını sağlamamız ve eğer 70 derece ise bilgisayarı otomatik olarak kapatmasını sağlayacak olan bir sistem olarak tanımlayabiliriz. Buradaki verilere bakacak olursak işlemcinin sıcaklığıdır. Sıcaklık değeri  55 dereceden küçük ise başa dön,55 den büyük ise 70 den küçükse daha hızlı çalıştır,70 derece ve üstünde ise bilgisayarı kapat. Şimdide belirli bir sıraya yerleştirelim

 

1 – Sıcaklık verisini al

2 – Sıcaklığı  55 ile karşılaştır

3 – Küçük ise 1 e geri dön büyük ise 4 e geç

4 –  Sıcaklık değerini 70 ile karşılaştır

5 – büyük ise 7. Kısma geç değil ise 6. Adıma geç

6  - İki kat soğutmayı başlat ve  1. Adıma geç

7 – Bilgisayarı Kapat

 

Bu örneğimizde herhangi bir dilin standardında olmayan fakat  herkesin anlayacağı şekilde algoritmamızı ifa etmiş olduk. Bu algoritmayı kullacağımız dile uygun olarak programladığımızda da artık bilgisayarın bu probleme bir çözüm üretmesini sağlamış oluyoruz.

Son olarak hernekadar karşı çıkanlar olsada algoritma mantığı yazılım geliştirmeye başlayanlar açısından ilk olarak öğrenilmesi, örnekler ile pekiştirilmesi gereken bir yapıdır. Yazılım geliştirmeye direk olarak herhangi bir dil ile başlamak ile sadece hızlı bir şekilide ekranda bir takım ifadeler göstererek birşeyler ifade etmeye çalışırız fakat esas olarak yazılım geliştirmede önemli olan problemi çözebilmektir. Bunun en güzel örneklerinide örneğin bir takım özelleşmiş arama algoritmaları üzerinde gözlemleyebiliriz. Duruma göre uygulanması gereken arama algoritmaları vardır. Eğe gerçekten algoritma önemli olmasaydı tek bir arama ifadesini tüm uygulamalarımzda kullanıyor olurduk.

 

Tahir MUTLU

www.tahirmutlu.com

25 temmuz 2008

 

Bubble Sort – Elemeli Sıralama

 

                Bundan önceki algoritma üzerine yazmış olduğum makalede algoritmlara neden ihtiyaç duyduğumuzdan ve genel olarak yapısından bahsetmeye çalışmıştım. Bu yazımda da uygulamalarımızda eğer sıralama işlemleri yapacaksak daha önceden geliştirilmiş ve içinde bulunduğumuz duruma ve yapıya göre kullancabileceğimiz farklı algoritmalardan biri olan ve en yavaşı olarak nitelendirilen Buble Sort (Elemeli Sıralamadan) bahsedeceğim.

 

                Sistemin genel olarak mantığındanbahsedecek olursak elimizde bulunan bir dizideki elemanları küçükten büyüğe doğru sıralamak için ilk elemandan başlarız ve birinci ile ikinci sayıyı karşılaştırırız eğer birinci ikinciden büyükse yer değiştirme işlemi yaparız değil ise bir sonraki eleman ile devam ederiz.  Bu işlem  son elemana kadar devam eder ve istenilen sıralam elde edilene kadar devam eder.

 

                Şimdi elimizdeki dizi {2,30,12,9,17} olsun adım adım sıralam yapacak olursak

1.       {2,30,12,9,17} – > {2,30,12,9,17}

2.       {2,30,12,9,17} – > {2,12,30,9,17}

3.       {2,12,30,9,17} – > {2,12,9,30,17}

4.       {2,12,9,30,17} – > {2,12,9,17,30}  // sonuncu elemana geldik ama dizimiz hala sıralı değil

5.       {2,12,9,17,30} – > {2,12,9,17,30}

6.       {2,12,9,17,30} – > {2,9,12,17,30}

7.       {2,9,12,17,30} – > {2,9,12,17,30}

8.       {2,9,12,17,30} – > {2,9,12,17,30} // sonuncu eleman ve artık dizimiz sıralı.

 

Burada dizimizdeki elemanları adım adım karşılatırdık ve eğer bir değer kendinen sonraki değerden büyük ise yer değiştirme işlemini gerçekleştirdik. Sonuncu elemana geldiğimizde tekrar baştan bi kontrol işlemi gerçekleştirdik. Burada eğer baştan sona bir değişim olmadı ise dizimiz sıralandı diyebiliriz. Sonraki makalemizde görüşmek üzere.

 

Tahir MUTLU

www.tahirmutlu.com

 

© 2010 bilyaz.com , Programlama Makaleleri, Yazılım Makaleleri , Örnek Kodlar , Eğitim Videoları , C#,ASP.NET,SQL,PHP Suffusion WordPress theme by Sayontan Sinha