İlk C# Uygulamam ( Sayı Kapmaca - Konsol Uygulaması )
-
Selamlar :)
Sıfırdan başladım desem yeridir. Geçenki konu üzerinde @Reskam arkadaşımızın teamviewer/telefon ile verdiği ödev desteği haricinde pek bişey bilmiyordum.
Farklı bir bölüme ödev vermiş hoca, gözüme çarptı, hoşuma gitti bi deneyeyim dedim.
3-5 Saat uğraştım bişeyler yaptım karman çorman oldu bir iki sıkıntıyı çözemedim. Sıfırdan proje açtım. Kağıt kalemi aldım, algoritmayı çıkardım :D Sonra biraz google biraz if else biraz for while bişeyler karaladım.
Oyun şöyle,
Tabi oynamak için kodları alıp debug a geçmeniz lazım. Compile kısmına hiç girmedim bilemiyorum nasıl olur :)
- Bi sayı giriyorsunuz
Girdiğiniz sayıdan rastgele 1 veya 2 düşüyor pc. Sıra size geçiyor. Siz düşüyorsunuz. Falan filan en son sıfıra ilk inen kazanıyor.
Sayı X'e inene kadar ( bu Xi rastgele belirliyor ) rastgele düşürüyor pc. O Xten sonra algoritma değişiyor, bu sefer kazanmak için oynamaya başlıyor.
Tam o algoritma değiştiği noktada bir iki sıkıntı var, tam çıkamadım işin içinden, fazla vakit de yok daha fazla uğraşamayacağım. Çözen düzelten olursa paylaşırsa ben de öğrenmiş olurum :)
Bazen üst üste 2 kere tahmin falan yapıyor bize sormadan. Bazen de sayı 33 mesela 32ye düşüyorsun ben kazandım demeye başlıyor. O kısımda kafası iyice karışık yani :D
Düzeltebilen çıkarsa internet yokken oynanır fena oyun olmadı :p
Kodlar şöyle,
edit
Yanlış kopyalamışım düzelttim ( 16:02 )
using System; namespace sayibulma { class Program { static void Main(string[] args) { int S = 0, Y = 0; Random rast = new Random(); Console.WriteLine("Sayı kapmacaya hoşgeldin :-) Başlangıç değerini ver bakalım."); gir: S = Convert.ToInt32(Console.ReadLine()); System.Threading.Thread.Sleep(500); Console.WriteLine("\n Girdiğin Sayı: " + S); if (S <= 49) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Şş, sayının 50 veya daha büyük olması lazım! \n"); System.Threading.Thread.Sleep(250); goto gir; } int eshik = rast.Next(13, (S - 10)); System.Threading.Thread.Sleep(500); Console.WriteLine("\n Algoritma değişme eşiği: " + eshik); azalt: while (S >= eshik) { int R = rast.Next(1, 3); S = S - R; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + S + "\n"); yenisayi: System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni tahminini alalım : "); Y = Convert.ToInt32(Console.ReadLine()); if (Y <= (S - 3)) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yalnızca 1 veya 2 birim düşebilirsin.!"); goto yenisayi; } else if (Y >= S) { System.Threading.Thread.Sleep(500); Console.WriteLine("\nSayıyı düşürmen lazım!"); goto yenisayi; } S = Y; goto azalt; } while( S <= eshik ) // eshik ) { sonadogru: int R = rast.Next(1, 3); S = S - R; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + S); System.Threading.Thread.Sleep(500); if (S == 0) ; { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(125); } Environment.Exit(0); } yenisayi: System.Threading.Thread.Sleep(500); Console.WriteLine("Yeni tahminini gir: "); Y = Convert.ToInt32(Console.ReadLine()); if (Y <= (S - 3)) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yalnızca 1 veya 2 birim düşebilirsin.!"); goto yenisayi; } else if (Y >= S) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Sayıyı düşürmen lazım!"); goto yenisayi; } S = (S - Y); if ( S == 0 ) { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Tebrikler! Kazandın! :-)"); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } if (S % 3 == 1) { S = S - 1; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Sayı Tahminim: " + S); if (S == 0) ; { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } goto yenisayi; } else if (S % 3 == 2) { S = S - 2; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Sayı Tahminim: " + S); if (S == 0) ; { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } goto yenisayi; } else if (S % 3 == 0) { int Rx = rast.Next(1, 3); S = S - Rx; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + S); System.Threading.Thread.Sleep(500); goto yenisayi; } } System.Threading.Thread.Sleep(3000); } } }
-
Öncelikle başarılı buldum bir çok validasyon yapılmış gibi 100 filan girince sayı düşür diyor ama 9999999999999999 girince sapıtıyor. Ona da bi kısıt koy bence.
-
Düzelttim be.
bazı if () lerin sonuna ; koyuyorsun hata da vermiyor kafasına esen yerden devam ediyor :D
bir de klavyeden girilen sayıyı öncekine yazacağıma aradaki farkı aldırmışım. Neysem...
ilk proje için gayet eğlenceliydi, umarım devamı da böyle olur. Örnek şeyleriniz var mı? Şunu dene, bunu dene falan, basit şeyler yazmaya çalışayım. Sanırım ders takip etmekten daha kolay böyle öğrenmek :))
Yeni kodlar :
using System; namespace sayibulma { class Program { static void Main(string[] args) { int S = 0, Y = 0; Random rast = new Random(); Console.WriteLine("Sayı kapmacaya hoşgeldin :-) Başlangıç değerini ver bakalım."); gir: S = Convert.ToInt32(Console.ReadLine()); System.Threading.Thread.Sleep(500); Console.WriteLine("\n Girdiğin Sayı: " + S); if (S <= 49) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Şş, sayının 50 veya daha büyük olması lazım! \n"); System.Threading.Thread.Sleep(250); goto gir; } int eshik = rast.Next(13, (S - 10)); System.Threading.Thread.Sleep(500); Console.WriteLine("\n Algoritma değişme eşiği: " + eshik); azalt: while (S >= eshik) { int R = rast.Next(1, 3); S = S - R; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + S + "\n"); yenisayi: System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni tahminini alalım : "); Y = Convert.ToInt32(Console.ReadLine()); if (Y <= (S - 3)) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yalnızca 1 veya 2 birim düşebilirsin.!"); goto yenisayi; } else if (Y >= S) { System.Threading.Thread.Sleep(500); Console.WriteLine("\nSayıyı düşürmen lazım!"); goto yenisayi; } S = Y; goto azalt; } while( S <= eshik ) // eshik ) { int R = rast.Next(1, 3); S = S - R; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + (S+R) +" - " + R + " = " + S ); System.Threading.Thread.Sleep(500); if (S == 0) { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(125); } Environment.Exit(0); } yenisayi: System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni tahminini gir: "); Y = Convert.ToInt32(Console.ReadLine()); if (Y <= (S - 3)) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yalnızca 1 veya 2 birim düşebilirsin.!"); goto yenisayi; } else if (Y >= S) { System.Threading.Thread.Sleep(500); Console.WriteLine("\n Sayıyı düşürmen lazım!"); goto yenisayi; } S = Y; if ( S == 0 ) { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Tebrikler! Kazandın! :-)"); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } if (S % 3 == 1) { S = S - 1; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + (S + 1) + " - 1 = " + S); if (S == 0) { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } else goto yenisayi; } else if (S % 3 == 2) { S = S - 2; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + (S + 2) + " - 2 = " + S); if (S == 0) { for (int i = 0; i < 10; i++) { Console.WriteLine("\n Ben Kazandım! :-) "); System.Threading.Thread.Sleep(500); } Environment.Exit(0); } else goto yenisayi; } else if (S % 3 == 0) { int Rx = rast.Next(1, 3); S = S - Rx; System.Threading.Thread.Sleep(500); Console.WriteLine("\n Yeni Tahminim : " + (S + Rx) + " - " + Rx + " = " + S); System.Threading.Thread.Sleep(500); goto yenisayi; } } System.Threading.Thread.Sleep(3000); } } }
-
zeybekustasi bunu yazdı
Öncelikle başarılı buldum bir çok validasyon yapılmış gibi 100 filan girince sayı düşür diyor ama 9999999999999999 girince sapıtıyor. Ona da bi kısıt koy bence.
Denedim şimdi. Sanırsam int32 ( değişkeni öyle tanımladıydım ) nin alabileceği max değer
2,147,483,647
şöyle de bir anekdot geçelim,
http://www.bbc.com/news/world-asia-30288542
başarılı bulduğun için teşekkürler ^^
valla başlarken ne for ne while hiç birini bilmiyordum. Bir kaç defa if görmüştüm sadece :)
edit,
tahmin ettiğim gibi, o değeri kontrol eden bir if döngüsü eklesem dahi hata veriyor, çünkü o değeri int e yazamadığı için hata veriyor. Yazabilse, if ile kontrol edip hatayı önleyecek ama yazamadığı için kilit :D
if (S >= 2147483647)
{
System.Threading.Thread.Sleep(500);Console.WriteLine("\n Değer çok büyük! \n");
System.Threading.Thread.Sleep(250);
goto gir;
}nasıl yaparız?
-
noname bunu yazdızeybekustasi bunu yazdı
Öncelikle başarılı buldum bir çok validasyon yapılmış gibi 100 filan girince sayı düşür diyor ama 9999999999999999 girince sapıtıyor. Ona da bi kısıt koy bence.
Denedim şimdi. Sanırsam int32 ( değişkeni öyle tanımladıydım ) nin alabileceği max değer
2,147,483,647
şöyle de bir anekdot geçelim,
http://www.bbc.com/news/world-asia-30288542
başarılı bulduğun için teşekkürler ^^
valla başlarken ne for ne while hiç birini bilmiyordum. Bir kaç defa if görmüştüm sadece :)
edit,
tahmin ettiğim gibi, o değeri kontrol eden bir if döngüsü eklesem dahi hata veriyor, çünkü o değeri int e yazamadığı için hata veriyor. Yazabilse, if ile kontrol edip hatayı önleyecek ama yazamadığı için kilit :D
if (S >= 2147483647)
{
System.Threading.Thread.Sleep(500);Console.WriteLine("\n Değer çok büyük! \n");
System.Threading.Thread.Sleep(250);
goto gir;
}nasıl yaparız?
girilen değer str olarak eline gelmiyor mu hocam başta çevirmeyi kapat str olarak gelen değeri max int değeriyle karşılaştır eğer büyükse değer çok büyük yazsın değilse int e çevirsin
-
Elindeki goto'ları yavaşya yere bırak. Sorun istemiyoruz.
Şaka bir yana, her ne yapıyorsan ve içinde goto geçiyorsa sıkıntı vardır/oluşturabilir. C değil C# kullanıyorsun.
-
Hacı kontakt bilgilerm var mı bilmiyorum hala ama yardıma ihtiyacın olduğunda arayabilirsin programlama konusunda.
-
YeniHarman bunu yazdı
Elindeki goto'ları yavaşya yere bırak. Sorun istemiyoruz.
Şaka bir yana, her ne yapıyorsan ve içinde goto geçiyorsa sıkıntı vardır/oluşturabilir. C değil C# kullanıyorsun.
Niçün? Alternatif ne önerirsin? İşlemden sonra loop var ve kaç defa tekrarlanacağı belirsiz... For veya while mı kullanalım, nasıl oturtabilirim? Bi örnek gösterebilir misin benim gotolar yerine?
Bir de, komut var ki kullanıyoruz :D nasıl sıkıntı çıkarabilir
-
YeniHarman bunu yazdı
Elindeki goto'ları yavaşya yere bırak. Sorun istemiyoruz.
Şaka bir yana, her ne yapıyorsan ve içinde goto geçiyorsa sıkıntı vardır/oluşturabilir. C değil C# kullanıyorsun.
Ben koda bakmamıştım sadece test ettim harbi goto var kodda. Noname acilen goto yu unutman lazım.
-
noname bunu yazdıYeniHarman bunu yazdı
Elindeki goto'ları yavaşya yere bırak. Sorun istemiyoruz.
Şaka bir yana, her ne yapıyorsan ve içinde goto geçiyorsa sıkıntı vardır/oluşturabilir. C değil C# kullanıyorsun.
Niçün? Alternatif ne önerirsin? İşlemden sonra loop var ve kaç defa tekrarlanacağı belirsiz... For veya while mı kullanalım, nasıl oturtabilirim? Bi örnek gösterebilir misin benim gotolar yerine?
Bir de, komut var ki kullanıyoruz :D nasıl sıkıntı çıkarabilir
Sanıyorum case atlamaları için bırakmışlardı goto'yu.
İç içe loopların içinden çıkmak için mantıklı olabilir (ve belki de bu tek geçerli kullanımdır). Yalnız ve yalnız talep ettiğin sistem kaynaklarının hepsini atladığın etikette geri vereceksen. Senin kodda gördüğüm kadarıyla dinamik kaynak kullanımı yok. Ya olsaydı?
https://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto
http://www.drdobbs.com/jvm/programming-with-reason-why-is-goto-bad/228200966?pgno=1
Java'da goto yoktur. Çünkü yazılımcıları yapısal programlamadan önceki spagetti kod alışkanlığına yönelteceği düşünülmüştür.
Sendeki goto'nun zararını anlamak için bu koda 1 ay sonra bak. Bakalım çözebilecek misin? Ben senin kodu hiç çözemedim mesela. Aynı durum 80'li yılların sonunda basic ile yazılmış bir mühendislik yazılımının kaynak kodlarını incelerken de başıma gelmişti.
-
iç içe döngülerden çıkmanın en güzel yolu goto goto kullanmadan bayrak değişken kullanım bu değişkenin durumunu her döngüde kontrol edip döngü veya döngülerden çıkılabilir ama gereksiz yere kullanmak kodun bakımını zorlaştırır goto denmiş ora gitmiş bura gitmiş karman çorman olabilir. çok gerekliyse ki öyle durumlar olabiliyor rahatlıkla kullanılabilir.