Volkan Atasever

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve daha bir çok yazılarım...

Sayı tahmin oyunu

clock Ocak 22, 2010 02:39 by author Volkan Atasever

 

 

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;

classProgram

{

             staticvoid Main(string[] args)

            {

                  Random rnd = newRandom();

                  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);

 

       }

       staticstring 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 by author Volkan Atasever

 

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;

classProgram

{

        staticvoid 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");

      }

      privatestaticbool 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 by author Volkan Atasever

 

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.

classProgram

{

       staticvoid 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);

       }

       staticdouble fakt(double f)

      {

           if (f == 0)

          {

               return 1;

          }

          else

         {

                return f * fakt(f - 1);

         }

     }

}

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

 



C, Algoritmalar ve Çözümlemeler

clock Mart 20, 2005 08:05 by author Volkan Atasever

Hayatımızın her alanında problemlerle karşılaşıyoruz ve bildiğimiz gibi bu konuları çözümleme üstüne odaklanıyoruz. Bilgisayar alanındaki programlama dilleri de aslında bizim ürettiğimiz belli bir mantık içinde görevini yerine getirmek üzere tasarlanmıştır. Yemek, içmek gibi her an farkında olmadan çözmeye çalıştığımız problemlerin karşılıklarını C algoritmaları içerisinde de buluyoruz. Ürettiğimiz çözüm algoritmalarının kaynak kodunu derlemek ve çalışır bir program haline getirmek de, bir mantık çerçevesi içinde, başlama ve bitiş sürecinin arasında kalmış bir evreden ibaret. İlk önce isterseniz basit birkaç algoritma ve çözüm yolları düşünelim ve bunların hangi evrelerden en iyi çözüme gittiğini görelim. Örneğin, çalışan bir saat yapmak istesek, gün, saat, dakika ve saniye cinsinden 4 adet döngüyle kontrol sağlamamız gerekecekti. Fakat bu algoritmayı sadece 1 adet döngü kullanarak da nasıl çözüme ulaşabileceğimizi göstermeye çalışacağım. Çalışan saat örneğimiz ;

int main()
{
     int i,j= 0,x= 0,z=0;
     for(i = 0;i < 61; i++) {
         delay(500);
         if(i > 59) { 
             j++;
             i=0;
             delay(1000);
         }
         if(j > 59){
              x++; 
              j=0;
             delay(1000);
         }
         if(x > 23){
             z++;
             z=0;
             delay(1000);
        }
         printf("%d gun %d saat %d dakika %d saniye\r",z,x,j,i); 
    }
    return 0;
}

Örneğimizde de gördüğünüz gibi; iç içe döngülerle uğraşmak yerine bir adet for döngüsüyle çözüme ulaştık. Bu uygulamamızı, programınızın ne kadar zamandır çalıştığını öğrenmek içinde kullanabilirsiniz. Küçük örneklerle size algoritmaları anlatmaya çalışacağım. Gördüğünüz gibi algoritma kurulamazsa programdan bahsedemeyiz. Kod yazmak bir sanattır ama şu da unutulmaması gerekir ki algoritma yani çözücülük sanatı kod yazma sanatının lokomotifidir. Karmaşık yollardan çözüme ulaşan bir algoritmanın kodu da karmaşık olacaktır. Unutmayalım ki, programlama sanatı hem algoritmayı hem de kodu kapsayan bir birlikteliktir. Bunun da en önemli amacı programın anlaşılabilir ve taşınabilir olmasıdır. Girişimizi yaptıktan sonra ana konumuza yavaş yavaş değinelim bir problem düşünelim ve bunun yapım aşamalarını ortaya çıkartalım. Problemimiz şu olsun: Bir satranç tahtasında aletlerimizi (şah , at, fil vb.), nereye koyarsak koyalım yapabileceği bütün hamleleri bize gösterebilen bir o kadarda yararlı bir uygulama geliştirelim. Bu uygulamamızın adı (programımızın bir adı olmalı değil mi?), hamle v0.9 olsun.İlk öncelikle include’larımızı ve global değişkenlerimizi koyalım;#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define alet tahtagor(tahta)int satir, sutun;
int tahta[8][8]={0};Burada tahta dizimiz, satranç tahtamızı temsil etmektedir(8x8’liktir lakin dizilerin 0’ıncı indis’den başladığını unutmayalım). Satir ve sutun ise tahtamızın bizim oluşturduğumuz, sanal olarak x ve y koordinatlarına böldüğümüz matrisimizin istediğimiz alanına ulaşmakta kullandığımız değişkenlerimizdir.Burada bütün taşların mantığı belli bir kalıba oturduğu için her taşımızı çözümlemek yerine önce at aletimizi çözümlemeyi uygun bulduk yazımızın altında uygulamanın çalıştırılabilir programını bulabilirsiniz.At fonksiyonumu;

void at(int n, int m)
{
    int ilk,son,z;
    int kadir[8][2]={{-2,-1},{-2,1},{2,-1},{2,1},{1,-2},{1,2},{-1,-2},{-1,2}};
   
    for(z=0;z<8;z++){
        ilk = kadir[z][0];
        son = kadir[z][1];
        kolaylik(n,m,ilk,son);
    }
}   

Gördüğünüz gibi bir at fonksiyonu yazdık burada dikkat edilmesi gereken yer kadir dizimiz olacaktır. Kadir dizimizde bir atın gidebileceği yerleri tanımlamış bulunuyoruz. Bir at aleti L şeklinde gideceği için 2 ve 1 rakamları bizim sihirli sayılarımızdır. Bunların oluşturduğu kombinasyonlar, kadir dizinini çok değerli bir hale getirmektedir. Sizde bir satranç tahtasında bu rakamları kullanarak gidebileceği bütün yerleri görebilirsiniz(algoritmanın burada işi nasıl bitirdiğini görebilirsiniz acaba beynimizde 0 ve 1’lerdenmi oluşuyor ;) ). Unutulmaması gereken bir diğer husus ise döngümüzün 8 defa döndüğüdür. At’ımızın gidebileceği maksimum yer sayısı 8’dir. Aynı anda ilk ve son değişkenlerimize x ve y koordinatlarını bildiriyoruz. At fonksiyonumuzun aldığı iki tamsayı parametre ise geldiği gibi fonksiyonun içinden kolaylik fonksiyonumuza geçiyor. İsterseniz kolaylik fonksiyonumuzu inceleyelim(nede olsa C bir fonksiyonlar dili bunu sonuna kadar kullanabiliriz).

void kolaylik(int re, int ke, int z, int l)
{
    int x,y;
   
    system("cls");
    re += z;
    ke += l;
    for(x= 0,y = 0;x < 8, y < 8; x++,y++) {
        if(re > x || ke > y || re < 0 || ke < 0) { }
        else{
            gecerli(re, ke);
        }
    }
}

Kolaylik fonksiyonumuz, 4 parametre almaktadır. Unutmayalım At fonksiyonundan aldığı n,m ve ilk,son değişkenleri ile işlem yapmaktadır. Dizimizin taşmaması ve saçmalamasını önlemek için for döngümüzü işe getirdik eğer taşıyorsa veya saçmalıyorsa da hiçbir şey yapmadan o pozisyonu if deyimimizde pas geçiyor. Eğer bir sorun yoksa gecerli() fonksiyonumuz işletiliyor. Unutulmaması gereken at fonksiyonumuzun aldığı iki parametre değişkeni, at fonksiyonumuz içindeki ve kadir değişkeninden aldığımız değerle toplanıyor.İsterseniz şimdide gecerli() fonksiyonumuzu inceleyelim (fonksiyonların bizi nereye götüreceği belli olmuyor ).İşte geçerli fonksiyonumuz;

void gecerli(int x, int y)
{
    tahta[x][y]=2;
}

Sadece tahtamızdaki hamleleri işliyor. Basit ama o kadarda işin özünü anlatan bir fonksiyon diyebiliriz.Ve uygulamamız da satranç tahtamızı görmek için yazdığım bir fonksiyon;

void tahtagor(int dizi[][8])
{
    int k,l;
    printf("\n\n");
    for(k=0;k<8;k++){
         for(l=0;l<8;l++){
             printf("\t%d",dizi[k][l]);
        }
        printf("\n\n\n\n");
    }
}

Bu kısmı anlatmama gerek yok sanıyorum basitçe dizinin her elemanını bir matris şeklinde yazdırıyor.Evet, işin zor kısmını atlattık bundan sonraki bölümler ince ve dikkat edilmesi gereken noktalar.

void warning()
{
    printf("Ornek 4 5 !!!");
    scanf("%d%d",&satir,&sutun);
    system("CLS");
    satir--;
    sutun--;
    tahta[satir][sutun]=1;
}

Burada satir ve sutun değişkenlerimizi okuyoruz ve 1 azaltıyoruz malum dizilerin güzelliklerinden dolayı.Algoritmalar daha çok bizim atı nasıl işletebileceğimiz kısmında ortaya çıkıyor. Benim yazdığım aletin bütün hamleleri, adlı uygulamanın bu konuda en iyi algoritma olduğunu savunmuyorum, çünkü daha çok çözüm yolları olabildiği gibi daha iyisi ve daha kötüsüde olabilir. main ve hikaye isimli son fonksiyonumuzu da verelim.

int main()
{
    int a;

    hikaye();
    scanf("%d",&a);
    if(a == 1) {
        printf("At’in Konumunu Giriniz");
        warning();
        at(satir, sutun);
    }
    else if(a == 2){
        printf("Fil’in Konumunu Giriniz");
        warning();
        fil(satir, sutun);
    }
    else if(a == 3){
        printf("Kale’nin Konumunu Giriniz");
        warning();
        kale(satir, sutun);
    }
    else if(a == 4){
        printf("Piyon’un Konumunu Giriniz");
        warning();
        piyon(satir, sutun);
    }
    else if(a == 5){
        printf("Sah’in Konumunu Giriniz");
        warning();
        sah(satir, sutun);
    }
    else if(a == 6){
        printf("Vezir’in Konumunu Giriniz");
        warning();
        vezir(satir, sutun);
    }
    alet;
    getch();
    return 0;
}

 

void hikaye()
{
     system("CLS");
     printf("\n\n\tLutfen Bir Alet Seciniz\n");
     printf("\t1-) At\n\t2-) Fil\n\t3-) Kale \n\t4-) Piyon\n\t5-) Sah\n\t6-) Vezir\n");
     printf("\twritten by Volkan Atasever\t inhoftec@gmail.com\n");
}

Evet, uygulamamız bitti sizde kalan diğer taşları programlarsanız bu uygulamanın bir anlamı olacağı kanısındayım.



Volkan Atasever Kimdir ?

E-Mail: volkan(et)volkanatasever.com

Kurucu&Genel Müdür/S4G
Bilgisayar Mühendisi
Eğitmen ve Danışman
Teknoloji Yazarı

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve bir çok kategoride yazılarım...

     

Yazılım Kitaplarım

   

Şiir Kitaplarım

Ulusal Yayınlar ve Programlar

 

Sosyal Ağlarım

 

 

 

 

Retro Bilgisayar Dergimiz

Türkçe Retro Bilgisayar dergimiz haziran 2016'da ilk sayısını çıkardı.  Sizde katkıda bulunmak isterseniz bana mail atmanız yeterli. Dergimiz PDF formatında ve tamamen ücretsizdir. Software4Galaxy imtiyaz sahibidir. S4G sitesinden veya facebook sayfasından dergilere ulaşabilirsiniz.

Üye Olduğum Dernek ve Organizasyonlar

 

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)2004-2019

Sign In

Yazılım