• Forum vBulletin altyapısından Xenforo altyapısına geçirildi, bu sebeple eski şifreleriniz ile foruma giriş yapamayacaksınız, parolamı unuttum adımından mailiniz ile şifre sıfırlayarak giriş yapabilirsiniz.

    Üyeliklerinde geçerli bir mail adresi olmadığı için sıfırlama yapamayacak kullanıcılar forum kullanıcı adlarını ve yeni şifrelerini yazarak info@maxigame.org adresine şifre sıfırlamak istediklerine dair bir mail göndersinler şifrelerini sıfırlayıp mail adreslerini güncelleyeceğiz. Şifreniz sıfırlandıktan sonra foruma giriş yapıp tekrar istediğiniz gibi değiştirebilirsiniz.

C# Hesap Makinesi Örneği

CottonCandy

Atlas Evren
Aileden
Aktiflik
K.Tarihi
26 Tem 2009
Mesajlar
1,087
Puanı
472
Konum
M.K.ATATÜRK
Programlama ile ilgilenen herkesin ekrana “Hello word” yazdırmasının ardından yaptığı ve yapması da gereken uygulamalardan bir tanesi.

1vbY21.png



Daha sonra ise Rakam tuşlarından devam edebiliriz. Burada ben tek bir fonksiyon yazıp 10 rakamın da event’ini bu fonksiyona yönlendirmeyi seçtim. Bunun için öncelikle gerekli fonksiyonu yazmalıyız. Bu fonksiyonda object türündeki senderımızı öncelikle button nesnesine dönüştürüyoruz daha sonra ise textbox’ımıza butonun üzerindeki rakamı metin olarak ekliyoruz

9ozVG5.png



Daha sonra ise Tüm rakamları seçtikten sonra Proparties penceresinde Event listesini açıp orana Click eventi olarak, yazdığımız fonksiyonu seçmek.

v5Ggb4.png



Artık rakam tuşlarımız çalışıyor. Şİmdi sıra geldi İşlem tuşlarına. Bunun için de aynı yolu izleyebliriz yani önce bir fonksiyon yazmak ve ardından 4 işlem tuşunun Click eventine de aynı fonksiyonu atamak.
İşlem tuşlarımızın içinde ise işlem devamlılığını sağlamak için birkaç küçük ayrıntı var. Örneğin 5+3*5 işlemini hesaplarken artı tuşuna bastığımızda 5 rakamını bir değişkende tutmalıyız fakat * tuşuna bastığımızda ise değişkende tuttuğumuz sayı olan 5 ile yeni girdiğimiz sayı olan 3′ ü bir önceki işlem olan + ile hesap ettirmeli ve çıkan sonucu da hafızada tutulan 3′ ün yerine yazmalıyız. Bu sayede *5 dediğimizde (Bir önceki işlemin sonusu)*5 olmalı. Bunu için de hesap isimli bool tipinde bir değişken tuttum bu değişken sayesinde işlem tuşlarına 1. basışımda sadece sayıyı alır 2. basışımda hesap yapar ve hesap değişkenimi tekrar false yaparım 3. basışımda ise tekrar sayıyı alırım ve hesap değişkenini true yaparım. Böylece sonsuz kere işlemi ard arda yapmış olurum.


Pkd5Od.png


Hesap makinemizden ilk sonuçları almamış için son adıma geldik. Şimdi de işlemlerin gerçekleştiği fonksiyonu yazacağız. Bunu fonksiyon olarak yapmamın sebebi ile hem eşittir tuşunun hemde işlem tuşlarının buradaki kodları kullanacak olması.
Fonksiyon oldukça basit sayi1 isimli değişkendeki sayımız ile ekranda yazan sayıyı islem isimli değişkende belirtilen işlem türüne göre işleme sokup sonucu geri döndürecek.

y5WPqn.png


Artık hesap makinemiz tıkır tıkır çalışmakta fakat biz göremiyoruz tabiki çünkü sonucu ekrana yazmadık henüz Bunun için ise eşittir butonumuza diyeceğiz ki en son hesabı da yap ve sonucu ekrana yaz. Çünkü işlem butonlarımız her seferinde bir önceki işlemi yapar ve sonunda son işlem yapılmadan bekler bu yüzden sadece sonuncuyu da yapmasını istiyoruz.

g8gkrN.png


hesap makinemiz bitti diyebiliriz. Her şey çalışıyor. Fakat durun. Ben de dahil olmak üzere çoğu kullanıcı hesap makinesini klavyedeki tuşlar ile kullanır. Bu sebepten bizim de bu özelliği eklememiz yerinde bir karar olacaktır. bunu için ise ekranda hesap makinesi aktif iken bir tuşa basılıp basılmadığını kontrol etmemiz ve tuşa basıldığında programın bize haber vermesi gerek. İşte bu olayı sağlaması için form nesnemizin evetları arasında tam da bize uygun bir grup var KeyDown(tuşa basıldığında), KeyPress(KeyDown’dan sonra) ve KeyUp(parmak tuştan çelikdiğinde). İşte bu evetlardan KeyPress’i kullanarak ihtiyacımız olan tuşa basıldı çağrısını da alabilir ve gerekli kodu o kısımda çalıştırabiliriz.
Form’un key evetlarını kullanabilmemiz için öncelikle form özelliklerinden KeyPreview özelliğini True yapmalıyız ki tuşları dinleyebilelim. daha sonra ise formumuzun evetlarından KeyPress’ e çift tıklayarak kodumuzu yazacağımız fonksiyonu oluşturalım.

Zk6Ljk.png


Burada kodumuzu yazacağız ama hangi tuşa basıldığını nereden öğreneceğiz ? Diye bir soru oluşacak. İşte bu noktada da şimdiye kadar hep gördüğümüz ama hiç kullanmadığımız fonksiyonların üzerinde parametre olarak tanımlanan e nesnesi bize yardım edecek. Bu nesne eventlar tarafından çağrılan fonksiyonlarda fonksiyonun çağrılmasına sebep olan olayları kayıt altına tutar. Mesela farenin tıklanması, hareket etmesi veya klavyeden bir tuşa basılması. İşte biz de e nesnesini kullanarak hangi tuşun bu fonksiyonun çağrılmasında vesile olduğunu öğreneceğiz. Bunu için e.KeyChar’ı kullanacağız böylelikle basılan tuşun ASCİİ koduna erişebiliyoruz.
Bu fonksiyonun içini doldururken dikkat etmemiz gereken şeyler ise ekrana sadece sayı girişine izin vermek ve işlem tuşları ve ENTER tuşunu özel olarak kontrol ettirmek.

3L593j.png


Yazdığınız bu kodlar sayesinde artık hesap makineniz klavyeden de kullanılabiliyor. Her şey bitti geçmiş olsun.
Fakat o da ne!!!
Enter’ a bastığımızda eşittir görevi görmüyor onun yerine saçma sapan işlemler veya sayılar yazıyor. İşte bu bir problem.
Öncelikle sakin olmalı ve debug yapmalıyız. Bu bir davranış ve bir özellik ile kodlamada çözülemeyecek problem yoktur.
Fakat bu problemi debug ile bile zor farkedebilirsiniz. Çünkü KeyPress ten debug yaptığınızda göreceksiniz ki Enter basıldığında progrem hiçnir tuş basılmamış gibi davranıyor. Enterasann !
İşte bunun sebebi ise enter basıldığında enter değilde o an seçili olan butonun tıklanmış olması. Bu problemi çözmek ise çok basit eğer buton seçili olsun istemiyorsanız başka bir nesneyi seçtirirsiniz. Mesela benim seçtiğim nesne üstteki label. Bu seçtirme işlemini de sürekli tekrarlansın ve buton asla seçili kalmaın diye kodumu textbox’ın TextChanged eventına yazıyorum ki ben sayı girdikçe odak labelde kalsın. bunu için gerekli tek satır kod ise: lblIslem.Focus();
Ve artık bu problemimiz de çözüldüğüne göre hesap makinemiz kullanıma hazır bir hale geldi. Kendi yaptığınız hesap makenesini güle güle kullanın.



Genel Görüntü

57080M.png
 
Best "hesap makinesi rehberi" ever ? Çok güzel anlatım olmuş abi, eline sağlık. Gördüğüm en iyi hesap makinesi rehberi. :D

Benim de belki işe yarayacak birkaç önerim var ;

Öneri 1

Swtich-Case kullanırken "break" yerine "return" kullanmak, "unreachable code" uyarısı verebilir, her compilerde sağlıklı derlenmeyebilir. Bu yüzden "break" öneriyorum.

Öneri 2

Hesapla() kısmında hatayı bilmek isteyen arkadaşlar "ArithmeticException" kullanabilir, veya ondan türemiş olan "OverflowException" kullanabilir.
 
Best "hesap makinesi rehberi" ever ? Çok güzel anlatım olmuş abi, eline sağlık. Gördüğüm en iyi hesap makinesi rehberi. :D

Benim de belki işe yarayacak birkaç önerim var ;

Öneri 1

Swtich-Case kullanırken "break" yerine "return" kullanmak, "unreachable code" uyarısı verebilir, her compilerde sağlıklı derlenmeyebilir. Bu yüzden "break" öneriyorum.

Öneri 2

Hesapla() kısmında hatayı bilmek isteyen arkadaşlar "ArithmeticException" kullanabilir, veya ondan türemiş olan "OverflowException" kullanabilir.

He Furkan he herşeye maydanoz ol :D

Bir de ben maydanoz olayım. Kerim şu görsel olarak verdiğin kodlamaları text olarak code tagları arasında paylaş, millet elle yazmaya çalışmasın direk cp yapsın bari de rahat olsun :D
 
He Furkan he herşeye maydanoz ol :D

Bir de ben maydanoz olayım. Kerim şu görsel olarak verdiğin kodlamaları text olarak code tagları arasında paylaş, millet elle yazmaya çalışmasın direk cp yapsın bari de rahat olsun :D

abi öyle yaparsam hazırdan farkı kalmaz kendiler uğraşırlarsa en azından öğrenmiş olurlar elleri alışır en azından :)

- - - Güncellendi - - -

Best "hesap makinesi rehberi" ever ? Çok güzel anlatım olmuş abi, eline sağlık. Gördüğüm en iyi hesap makinesi rehberi. :D

Benim de belki işe yarayacak birkaç önerim var ;

Öneri 1

Swtich-Case kullanırken "break" yerine "return" kullanmak, "unreachable code" uyarısı verebilir, her compilerde sağlıklı derlenmeyebilir. Bu yüzden "break" öneriyorum.

Öneri 2

Hesapla() kısmında hatayı bilmek isteyen arkadaşlar "ArithmeticException" kullanabilir, veya ondan türemiş olan "OverflowException" kullanabilir.


furkanım düzeltirsin bir yanlışım olursa el atarsın uyarırsın beni :)
 
abi öyle yaparsam hazırdan farkı kalmaz kendiler uğraşırlarsa en azından öğrenmiş olurlar elleri alışır en azından :)

- - - Güncellendi - - -




furkanım düzeltirsin bir yanlışım olursa el atarsın uyarırsın beni :)

Estağfurullah abi, ben kim, uyarmak kim. (:
 
Best "hesap makinesi rehberi" ever ? Çok güzel anlatım olmuş abi, eline sağlık. Gördüğüm en iyi hesap makinesi rehberi. :D

Benim de belki işe yarayacak birkaç önerim var ;

Öneri 1

Swtich-Case kullanırken "break" yerine "return" kullanmak, "unreachable code" uyarısı verebilir, her compilerde sağlıklı derlenmeyebilir. Bu yüzden "break" öneriyorum.

Öneri 2

Hesapla() kısmında hatayı bilmek isteyen arkadaşlar "ArithmeticException" kullanabilir, veya ondan türemiş olan "OverflowException" kullanabilir.

break/return hiç bir c-like dilde fark etmez sadece program akışını keser return kullandığın zaman bu tarz durumlarda return daha kullanışlıdır bile.



Matematiksel işlemler CPU tarafından yapılıyor. 4 işlem önceliği için ektradan bir operatör kullanmaya gerek yok CPU bunu hallediyor, yani mantıksal bir hata değil. Sorunun da Hesapla() kısmında sayi1 önce double türüne cast edilmediği yüzünden oluğunu düşündüm şuan. :ent

bilgisayarda tüm işlemler cpu tarafından yapılır önemli olan cpuda nerde yapıldığı matematiksel ve mantıksal işlemler cpu nun alu kısmında yapılır ve işlem önceliğini alu değil program compile edilirken instructionların sırası ile ayarlanır
ayrıca tek bir sayının double olması yeterlidir double double::operator+(int, double) overloadını kullanır bu durumda

[MENTION=8301]top[/MENTION]ic: aritmatik işlemler genelde stringler ile sıra sıra parseleyip işlem yaparak değil stack kullanarak yapılır (bu sayede işlem önceliği vs daha rahat şekilde ele alınır) aşağıdaki linklerden nasıl yapıldığını öğrenebilirsin
http://faculty.cs.niu.edu/~hutchins/csci241/eval.htm
http://stackoverflow.com/questions/19443251/how-to-evaluate-arithmetic-expression-using-stack-c
http://www.geeksforgeeks.org/expression-evaluation/
 
Son düzenleme:
@Shine

Uzun bir aradan sonra tekrar hoşgeldin. ^^

-return atınca warning hatası dikkatimi dağıtıyor, her zaman temiz işi severim. ((:

-O verdiğin stack algoritmasını bilmiyordum, kayıt ettim boş zamanımda bakacağım, çok iyi anlatım. Şahsen bu tür işlemleri kendimizin yapması daha mantıklı. Konu ile alakalı olarak bu örneği vereceğim, derleyici 55*55*55*55*55*55 şeklinde bir veriyi (55*55)*(55*55)*(55*55) şeklinde optimize etmiyor. Bu programın daha geç işlem yapmasına neden oluyor. Testlerde çok bariz fark oluyor. Peki buradan bir soru geliyor, derleyici bunu neden optimize etmiyor ? Bu konu hakkında herhangi birkaynak biliyorsan paylaşırsan sevinirim.

Konuya dönünce 5+3*5-2 = 38 yazıyor. Bunun sorununu bulabildin mi ? Yoksa illuminati mi ? :D
 
@Shine

Uzun bir aradan sonra tekrar hoşgeldin. ^^

-return atınca warning hatası dikkatimi dağıtıyor, her zaman temiz işi severim. ((:

-O verdiğin stack algoritmasını bilmiyordum, kayıt ettim boş zamanımda bakacağım, çok iyi anlatım. Şahsen bu tür işlemleri kendimizin yapması daha mantıklı. Konu ile alakalı olarak bu örneği vereceğim, derleyici 55*55*55*55*55*55 şeklinde bir veriyi (55*55)*(55*55)*(55*55) şeklinde optimize etmiyor. Bu programın daha geç işlem yapmasına neden oluyor. Testlerde çok bariz fark oluyor. Peki buradan bir soru geliyor, derleyici bunu neden optimize etmiyor ? Bu konu hakkında herhangi birkaynak biliyorsan paylaşırsan sevinirim.

Konuya dönünce 5+3*5-2 = 38 yazıyor. Bunun sorununu bulabildin mi ? Yoksa illuminati mi ? :D


warningi görmek istemiyorsun functionun başına #pragma warning disable 162 sonuna da #pragma warning restore 162 yazabilirsin

55 * 55 * 55 * 55 .. ve (55 * 55) * (55 * 55) .. in cpu açısından farklı bir tanımı yok lexical analysing kısmında farklı türlü yapıyor olabilir, repating patterns olduğu için 55 * 55 i runtime olarak hesaplayıp instructionları belki yarıya indiriyor olabilir ancak en doğrusu sabit yazdığın bir sayı ise direk compile time hesaplaması runtime'a bırakmaması gerek.eğer 55ler float/double türündeyse optimizeli hali farklı sonuçlar verebilir o yüzden yapmıyor olabilir (float/double hesaplamalarında sonucun yaklaşık hesabı bulunur genellikle örneğin 55*55 = 3025.0012 tarzı)

işlem hatasının sebebi ise sırayla 2 sayı aldıkça işlem yapmasından dolayı yani 5+3 hesaplayıp sayı1 e 8 i atıyor sonraki sayı girildiginde çarpıyor yani ((5+3)*5) - 2 yapıyor zaten o yüzden stack ile hesaplama olayına değindim sıra sıra yapıldığında burda da olduğu gibi işlem önceliği değişir
 
@Shine

Aynen dediğin mantıklı aslında. Float yüzünden optime yapmıyor olabilir. (int)55 * (int)55 * ... şeklinde denemek lazım birde. Float'a değinmişken de dediğin 3025.0012 benzeri olay oluşturan bir sorum daha var. Saniyede 60 kez update yapan bir timestep olduğunu düşünüp her tick de float 1 arttırılsın. Belirli bir rastgele süre sonunda float test = 1,2,3,4.0000001,5.0000001,6.0000002 şeklinde saçmalamaya başlıyor. Bu sorunu herhangi bir yerde bulamadım, inglizcem yüzünden stack'a konuda açamıyorum direkt - basıyorlar. Bu sorunu nasıl araştırmam lazım ? Düzeltilebilir mi?
 
@Shine

Aynen dediğin mantıklı aslında. Float yüzünden optime yapmıyor olabilir. (int)55 * (int)55 * ... şeklinde denemek lazım birde. Float'a değinmişken de dediğin 3025.0012 benzeri olay oluşturan bir sorum daha var. Saniyede 60 kez update yapan bir timestep olduğunu düşünüp her tick de float 1 arttırılsın. Belirli bir rastgele süre sonunda float test = 1,2,3,4.0000001,5.0000001,6.0000002 şeklinde saçmalamaya başlıyor. Bu sorunu herhangi bir yerde bulamadım, inglizcem yüzünden stack'a konuda açamıyorum direkt - basıyorlar. Bu sorunu nasıl araştırmam lazım ? Düzeltilebilir mi?

bu olayın bir çözümü yok floating point tasarımından dolayı kaynaklı float tabanlı işlemler her zaman en yakın sonucu verirler
 
Geri
Üst