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;
}
}
04d61f6d-3d10-41b1-aeb5-ddad42094ac6|10|4.6
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;
}
}
4c87beba-869c-4311-add6-ced5e5ac828f|6|5.0
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
36b7aee3-74fb-4b1e-b8fc-5d37809ba0e3|8|5.0
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!
}
}
2d13b66b-0b86-4e84-93cb-d9bed65b5eda|9|4.6
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.
e89a5afd-1671-4e80-9617-12d6e2258f7b|12|4.7