Volkan Atasever

Founder of inhoftec Solutions - Bilgisayar Mühendisi - Yazılım Uzmanı & Danışmanı - PCWorld Dergisi Yazarı - INETA User Group Lead - Technologist - Speaker - Technology Researcher

Sayı tahmin oyunu

clock Ocak 22, 2010 02:39 author Volkan Atasever tarafından yayınlanmıştır

 

Bu C# ile algoritmalar yazımda klasik bir sayı tahmin oyunu kodlayacağım. İtiraf etmek gerekirse en iyi algoritmayı kullandığım söylenemez. Daha fazla iyileştirilebilir. Sizin iyileştirilmiş kodlarınızı yazının altındaki yorum kısmına bekliyorum. Bilgisayarın tuttuğu sayı rakamları birbirinden farklı bir sayı olacak. 10 tahmin hakkımız var. Aynı zamanda eğer rakam doğru basamakta tahmin edildiyse + yanlış bir basamakta tahmin edildiyse - verilecek. Eğer hiç isabet etmemişse bir mesaj vermeyecek. Bunun için C# dili ile aşağıdaki algoritmayı uyguladım;

class Program

{

             static void Main(string[] args)

            {

                  Random rnd = new Random();

                  int belirli = 0; bool flag = false;

                 do{

                       belirli = rnd.Next(1000, 9999);

                       string ara=belirli.ToString();

                      int hata=0;

                      for (int i = 0; i < 3; ++i)

                           if (ara[i] == ara[i + 1])

                               hata++;

                     if (ara[0] == ara[2])

                              hata++;

                    if (ara[1] == ara[3])

                              hata++;

                    if (ara[0] == ara[3])

                             hata++;

 

                    if (hata == 0)

                          flag = true;

                   else

                        flag = false;

 

             }while(!flag);

             int tahmin = 0; int sayac = 0; string tah2;

 

            do{

                  Console.WriteLine("Say tahmin ediniz");

                  tah2 = Console.ReadLine();

                  tahmin =
Convert.ToInt32(tah2);

                  Console.WriteLine(belirli);

                  if (belirli == tahmin){

                      Console.WriteLine("Doru Tahmin bildiniz teekkrler");

                      break;

                 }

                Console.WriteLine(hesapla(tahmin, belirli));

 

            }
while(sayac<11);

 

       }

       static string hesapla(int sayi2,int tah){

             string sayi = sayi2.ToString();

             string tahmin = tah.ToString();

             string sonuc = ""; int say = 0;

             for (int i = 0; i < 4; ++i)               for(int j=say;j<4;++j)

               {

                     if (sayi[i] == tahmin[j])

                        if (i == j)

                             sonuc += "+";

                        else

                           sonuc += "-";

               }

                    return sonuc;

         }

}



3 kenarı belli olan üçgen çizilebilir mi?

clock Ocak 22, 2010 02:31 author Volkan Atasever tarafından yayınlanmıştır

 

Buradaki sorumuz ise 3 kenarı belli olan üçgen çizilebilir mi çizilemez mi bunu hesaplamak olacak. Bu algoritmayı oluşturabilmek için bilmemiz gereken üçgenin kenarları ile ilgili kural ve bağıntılardır. Buna göre bir üçgenin çizilebilmesi için;

1 ) Bir üçgende iki kenarın toplamı, üçüncü kenarından büyüktür.
2 ) Bir üçgende iki kenarın farkı üçüncü kenarından küçüktür.

Buna göre kodumuz aşağıdaki gibi olacaktır;

class Program

{

        static void Main(string[] args)

       {

              string a, b, c;

              Console.WriteLine("1. kenar uzunluunu girin");

             a =
Console.ReadLine();

             Console.WriteLine("2. kenar uzunluunu girin");

             b =
Console.ReadLine();

             Console.WriteLine("3. kenar uzunluunu girin");

             c =
Console.ReadLine();

            bool sonuc = is_trangle(Convert.ToInt32(a),Convert.ToInt32(b),Convert.ToInt32(c));

            if (sonuc)

                 Console.WriteLine("gen izilebilir");

            else

               Console.WriteLine("gen izilemez");

      }

      private static bool is_trangle(int a, int b, int c)

     {

           bool flag1=false; bool flag2=false;

           if ((a + b) > c && (a + c) > b && (b + c) > a)

              flag1 =
true;

           if ((a - b) < c && (a - c) < b && (b - c) < a)

              flag2 = true;

          return flag1 && flag2;

      }

}



Euler sayısını hesaplamak

clock Ocak 22, 2010 02:21 author Volkan Atasever tarafından yayınlanmıştır

 

e sayısı veya Euler sayısı, matematik, doğal bilimler ve mühendislikte önemli yeri olan sabit bir reel sayı, doğal logaritmanın tabanı. e sayısı aşkın bir sayıdır, dolayısıyla irrasyoneldir, ve tam değeri sonlu sayıda rakam kullanılarak yazılamaz. Yaklaşık değeri şöyledir:

e sayısı, aşağıdaki sonsuz toplama eşittir:

Buna göre C# ile e sayısını bulmak için aşağıdaki kod parçasını kullanmalıyız tabi normalde sonsuz bir toplama eşit olduğu için yaklaşık değeri elde etmek için hassasiyeti n sayısına vereceğimiz değerlere bulabiliriz.

class Program

{

       static void Main(string[] args)

      {

             double e = 0.0;

             int n = 20;

             for (int i = 0; i < n; i++)

             {

                   e = e + (1 / fakt(i));

             }

             Console.WriteLine(e);

       }

       static double fakt(double f)

      {

           if (f == 0)

          {

               return 1;

          }

          else

         {

                return f * fakt(f - 1);

         }

     }

}

Kaynaklar: Euler sayısı tanımı, wikipedia



C# ile Akrep ile yelkovan arasındaki açıyı bulma

clock Ocak 22, 2010 02:12 author Volkan Atasever tarafından yayınlanmıştır

 

Akrep ile yelkovan arasındaki açıyı bulmak için farklı algoritmalar ve yöntemler kullanabilirsiniz. Benim buradaki amacım en iyi algoritmayı kullanmak. Bu işi tek satırda çözebildim. Tabiki Kullanıcı arayüz kısmını değil ana işi yapan metoddaki algoritmik kısmı. Aşağıdaki kod Akrep ile yelkovan arasındaki açıyı en kısa şekilde bulmaktadır. En iyi kod işi en iyi şekilde ve en kısa yoldan çözen yani en iyi algoritmaya sahip koddur. Bunu unutmamanız gerekir.

class Program

{

       static void Main(string[] args)

      {

              string a, b;

              Console.WriteLine("saat giriniz");

              a =
Console.ReadLine();

              Console.WriteLine("dakika giriniz");

              b =
Console.ReadLine();

             int aci = get_angle(Convert.ToInt32(a), Convert.ToInt32(b));

             Console.WriteLine("Aci " + aci);

      }

      private static int get_angle(int saat, int dakika)

     {

                return Math.Abs((int)(saat * 30) - (int)(dakika * 5.5)); // tek satır kodla istediğimiz işlemin sonucunu elde ettik!

     }

}



Sağ kalan en son kişi!

clock Kasım 10, 2009 22:50 author Volkan Atasever tarafından yayınlanmıştır

Bu yazımda N sayıda kişiden oluşan bir toplulukta her kişinin kendinden bir sonraki kişiyi ekarte sorunun orjinalinde geçen tanımlamasıyla öldürmesinden oluşmakta. Bizim bu problemde yapmamız istenen ise en son sağ kalan kişiyi bulmamız. Bu döngü bir kişi kalana kadar devam etmektedir. Aşağıdaki grafikte bu probleme yönelik bir grafiği görebilirsiniz. Bu mantıkta oluşan kişileri çember şeklinde düşünmemiz problemin çözümü açısından bize bir avantaj sağlamaktadır. C# ile bu işlemi çözerkende en basit ve yalın çözüm yolunu kullanmayı tercih ettim.

Aşağıda problemi çözerken kullandığım kullanıcı arayüzünü uygulayabilirsiniz. Konsoldan çalışmak bazen hız ve zaman açısından verimliliği tartışılamaz fakat problemlere daha modern bir arayüz katmak benim her zaman kullandığım bir yöntem.

N sayıda kişi arasından kaç kişinin çember içinde sağ kaldığını öğrenmemiz için giriş olarak sadece çemberde kaç kişi olduğunu yazmamız yeterli.

Butonumuza tıkladığımız zaman bu problemin çözümünü yazdığımız kod bloğu çalışacak ve bize sonucu bir message box aracılığıyla verecektir.

Kod bloğumuz;

     int kisisayi = Convert.ToInt32(textBox1.Text);

     bool ol = false;

     int sag=0;     int[] kisi = new int[kisisayi];

 

     int hepsi = kisisayi;

     for (int i = 0; i < kisisayi; ++i)

           kisi[i] = 9;//initial deger

     do

     {

           for (int i = 0; i < kisisayi; ++i)

           {

                if (kisi[i] == 9 || kisi[i] == 0)              

               if (ol == false)

               {

                        ol = true;

                        kisi[i] = 0;//yasiyor

               }

               else

              {

                       ol =
false;

                       sag = kisisayi;

                       kisi[i] = 1;//olu

                       hepsi--;

              }

        }

      }
while (hepsi != 1);

      string sags="";

     for (int i = 0; i < kisisayi; ++i)

     {

            if (kisi[i] == 0)

               sags = (i+1).ToString();

     }

     MessageBox.Show(sags);

İlk kısımda dinamik olarak oluşturduğumuz dizide kimsenin herhangi bir işleme maruz kalmadığını 9 rakamıyla gösterdik. Ölü olan kişiyi 1 ve yaşayan kişiyide 0 la işaretledir. Ardından tek kişi kalana kadar döngümüzü devam ettirdik böylece hiç işleme girmemiş ve yaşayan kişiler arasında öldürmeye devam ettik.



Volkan Atasever Kimdir ?

E-Mail: volkan@volkanatasever.com

Founder of inhoftec Solutions
Bilgisayar Mühendisi
Yazılım Uzmanı&Danışmanı
PCWorld Dergisi Yazarı
DeveloperMania.Net Topluluk Lideri
Technology Speaker
Teknoloji Uzmanı&Danışmanı





Kitapları

Sosyal Ağlarım

    

 

Twitter

Calendar

<<  Mayıs 2012  >>
PaSaÇaPeCuCuPa
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar

Son Yorumlar

Comment RSS

Son Yazılar

Yasal Bilgi

Sitedeki yazıları,kodlar ve diğer materyaller Volkan Atasever'e aittir. Yazarı ve siteyi kaynak göstererek yazıları paylaşabilirsiniz.  Copyright(c)2008-2011

Giriş

Yazılım