Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Piszemy prosty kalkulator w C#.NET - moja wersja

Po przeczytaniu wpisu użytkownika Description_1 postanowiłem zrobić to samo, ale lepiej.

Wykorzystam Microsoft Visual C# 2010 Express. W porównaniu z programem Descriptiona, mój nie będzie przezroczysty (nie wiem po co to było) oraz będzie napisany z użyciem XAMLa.

Zaczynamy

Tworzymy pusty projekt „WPF Application". Chwilowo zostawiamy główną klasę w spokoju i dodajemy klasę liczenie (w okienku „solution explorer” klikamy ppm na nazwę naszego projektu i wybieramy Add›Class...)
Dostaniemy coś w stylu:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Kalkulator { class liczenie { } } Na górze zaimportowano nam cztery podstawowe przestrzenie nazw z bibliotek .NET. Nam wystarczy sam using System, ale dodatkowe przestrzenie nie powinny nam przeszkadzać. Cały nasz kod będzie znajdował się wewnątrz class liczenie {...}. Dopiszmy public przed class. Po co dowiemy się na końcu.

Będą nam potrzebne jakieś zmienne:public double a = 0; public double b = 0; public char działanie;a oraz b to liczby, które będziemy ze sobą dodawać, odejmować itp. działanie zawierać będzie znak informujący o tym, jakie działanie chcemy wykonać np. * albo /.

Double i char to typy zmiennych. Public oznacza, że możemy dostać się do zmiennej z zewnątrz naszej klasy.

Dodajmy metodę odpowiedzialną za liczenie:public double licz() { if (działanie == '+') return a + b; if (działanie == '-') return a - b; if (działanie == '*') return a * b; if (działanie == '/') return a / b; if (działanie == '^') return Math.Pow(a,b);//znaku ^ nie można zastosować między dwiema liczbami typu double if (działanie == '!') { long s = 1; for (int i = 1; i <= a; ++i) s *= i; return (double)s; } else return 0; }W przypadku liczenia potęgi korzystamy z metody/funkcji Math.Pow, ponieważ zwykły zapis a^b nie zadziała dla liczb typu double. Dla obliczania silni wykorzystałem kod z wpisu użytkownika Description_1.

Tworzymy GUI

Przechodzimy do naszego pliku MainWindows.xaml. Dodajemy tam metodą przeciągnij i puść kontrolkę TextBox, w okienku „properties” we właściwości name wpisujemy pasekWyniku (nazwa ta będzie wiele razy używana w kodzie), i ustawiamy własność HorizontalContentAlignment na Right, przez co zawartość będzie wyrównana do prawej strony. Dodajemy kilka buttonów, rozmieszczamy i nazywamy je jakoś sensownie.

Do każdego butonu dodajemy zdarzenie click (dla wszystkich przycisków z liczbami możemy zrobić jedną wspólną metodę, tak samo dla wszystkich przycisków z działaniami matematycznymi jak np. dodawanie i odejmowanie; każdy inny przycisk musi mieć swoją własną)

Ostatecznie w okienku z kodem otrzymamy coś takiego:<Window x:Class="Kalkulator.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Mój program" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Height="260" Width="265" MinWidth="265" MinHeight="260" MaxWidth="265" MaxHeight="260"> <Grid> <TextBox Height="23" Name="pasekWyniku" VerticalAlignment="Top" TextChanged="pasekWyniku_TextChanged" HorizontalContentAlignment="Right" /> <Button Content="0" Height="40" Margin="12,167,0,0" Name="liczba0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="1" Height="40" Margin="12,121,0,0" Name="liczba1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="2" Height="40" Margin="104,121,0,0" Name="liczba2" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="3" Height="40" Margin="58,121,0,0" Name="liczba3" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="4" Height="40" Margin="12,75,0,0" Name="liczba4" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="5" Height="40" Margin="104,75,0,0" Name="liczba5" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="6" Height="40" Margin="58,75,0,0" Name="liczba6" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="7" Height="40" Margin="12,29,0,0" Name="liczba7" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="8" Height="40" Margin="105,30,0,0" Name="liczba8" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="9" Height="40" Margin="58,29,0,0" Name="liczba9" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="liczba_Click" /> <Button Content="=" Height="40" Margin="104,167,0,0" Name="wynik" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="wynik_Click" /> <Button Content="," Height="40" Margin="58,167,0,0" Name="przecinek" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="przecinek_Click" /> <Button Content="*" Height="40" Margin="151,30,0,0" Name="mnożenie" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="działanie_Click" /> <Button Content="/" Height="40" Margin="198,30,0,0" Name="dzielenie" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="działanie_Click" /> <Button Content="+" Height="40" Margin="151,121,0,0" Name="dodawanie" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="działanie_Click" /> <Button Content="-" Height="40" Margin="151,75,0,0" Name="odejmowanie" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="działanie_Click" /> <Button Content="^" Height="40" Margin="198,75,0,0" Name="potęga" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="działanie_Click" /> <Button Content="N!" Height="40" Margin="198,121,0,0" Name="silnia" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="silnia_Click" /> <Button Content="bin" Height="40" Margin="151,167,0,0" Name="systemBinarny" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Click="systemBinarny_Click" /> <Button Content="cls" Height="40" HorizontalAlignment="Left" Margin="198,167,0,0" Name="czyszczenie" VerticalAlignment="Top" Width="40" Click="czyszczenie_Click" /> </Grid> </Window>

przechodzimy do pliku MainWindow.xaml.cs. Zaraz po deklaracji klasy (public partial class MainWindow : Window) tworzymy sobie nowy obiekt typu liczenie liczenie liczenie = new liczenie();Poniewarz chcemy (przynajmniej ja chcę) naśladować kalkulator windowsowy, potrzebne będą nam dwie zmienne: bool gdzieWpisać=true; bool czyWyczyścićPasekWyniku = false;gdzieWpisać zawiera informację, która liczba (a czy b) z obiektu liczenie będzie zmieniana przy wpisaniu jakiejś liczby w pole tekstowe.

czyWyczyścićPasekWyniku informuje, czy po kliknięciu w jakąś cyfrę zostanie ona dopisana na koniec obecnie wyświetlanej liczby czy pole to zostanie wyczyszczone.

Zabierzmy się więc za poszczególne zdarzenia. Jeśli utworzyliśmy zdarzenie podczas edycji pliku MainWindow.xaml to powinniśmy mieć już puste metody dla każdego przycisku.

Dla wszystkich przycisków z cyframi użyjmy takiej oto metodyprivate void liczba_Click(object sender, RoutedEventArgs e) { if (czyWyczyścićPasekWyniku) pasekWyniku.Text = (sender as Button).Content.ToString(); else pasekWyniku.Text += (sender as Button).Content.ToString(); czyWyczyścićPasekWyniku = false; }Wykorzystałem tutaj pomysł użytkownika Jim1961 na wykorzystanie własności Content.ToString(). Jeśli czyWyczyścićPasekWyniku jest równe true, to wartość pola tekstowego „pasekWyniku” będzie równa tekstowi na naszym przycisku, a jeśli false to zostanie dopisany na końcu.

Dla przecinka: private void przecinek_Click(object sender, RoutedEventArgs e) { if (czyWyczyścićPasekWyniku) pasekWyniku.Text = "0,"; else pasekWyniku.Text += ","; czyWyczyścićPasekWyniku = false; }Tu jest podobnie, z tym że jeśli czyścimy pole tekstowe to dodajemy 0 na początku, by jakoś to wyglądało.

Przycisk z działaniami typu dodawanie czy mnożenie:private void działanie_Click(object sender, RoutedEventArgs e) { liczenie.działanie = (sender as Button).Content.ToString()[0]. czyWyczyścićPasekWyniku=true;//czyścimy pasek tekstowy gdzieWpisać = false; }zmiennej działanie w obiekcie liczenie przymisujemy znak odpowiedniego działania. Korzystam tu z metody first() aby wyciągnąć typ char z typu string.

private void silnia_Click(object sender, RoutedEventArgs e) { liczenie.działanie = '!'; gdzieWpisać = true; liczenie.a = liczenie.licz(); pasekWyniku.Text = liczenie.a.ToString();//wyświetlamy wynik czyWyczyścićPasekWyniku = true; }Dla obliczenia silni nie potrzeba drugiej liczby, więc od razu wyliczamy wynik.

private void pasekWyniku_TextChanged(object sender, TextChangedEventArgs e) { try{ if (gdzieWpisać) liczenie.a = double.Parse(pasekWyniku.Text); else liczenie.b = double.Parse(pasekWyniku.Text); } catch(FormatException wyjątek)//jeśli wprowadzono błędnie liczbę wykonuje poniższy kod {if(pasekWyniku.Text!="") MessageBox.Show("Nie wpisano prawidłowo liczby", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);//komunikat o błędzie, ale tylko, jeśli pole nie jest puste } }Kiedy zmienia się treść w polu tekstowym zmieniamy także liczbę w obiekcie liczenie. Jeżeli użytkownik wpisze w pole nieprawidłową liczbę zostanie zwrócony wyjątek FormatException i wyświetlony będzie komunikat o błędzie.

Naciskając przycisk cls czyścimy podstawowe zmienne: private void czyszczenie_Click(object sender, RoutedEventArgs e) { liczenie.a = liczenie.b = 0; liczenie.działanie = ' '; pasekWyniku.Text = ""; czyWyczyścićPasekWyniku = false; gdzieWpisać = true; }

Dla przycisku bin zamieniamy liczbę zmiennoprzecinkową double na całkowitą int i konwertujemy na format dwójkowy. private void systemBinarny_Click(object sender, RoutedEventArgs e) { pasekWyniku.Text = Convert.ToString((int)liczenie.a, 2); }

Kompilujemy (przycisk F5)! W ten oto sposób mamy gotowy kalkulator.

Bonus - szybkie portowanie

Pokażę teraz jak szybko przerobić nasz projekt np. na wersję konsolową albo Windows Phone.

Konsola Windows

Ponieważ nasza klasa liczenie jest publiczna, możemy dostać się do niej nawet z innych projektów Visual Studio.

Stwórzmy sobie nowy projekt, tym razem aplikację konsolową. W okienku „Solution Explorer” klikamy ppm na „references” i wybieramy „Add reference”. W karcie „Browse” wybieramy nasz plik exe stworzony przed chwilą.

Przejdźmy do pliku program.cs. Na początku dopiszmy nazwę naszej przestrzeni nazw z poprzedniego projektu (w moim przypadku był to „Kalkulator”, można ją poszukać w Object Browserze) i już mamy dostęp do naszej klasy:using System; using System.Collections.Generic; using System.Linq; using System.Text; using Kalkulator; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { if (args.Length > 2) { liczenie liczenie = new liczenie(); liczenie.a = double.Parse(args[0]); liczenie.b = double.Parse(args[2]); liczenie.działanie = args[1].Last(); Console.WriteLine(liczenie.licz().ToString()); } else Console.WriteLine("Za mało parametrów"); } } }

I oto mamy kalkulator uruchamiany z wiersza polecenia. W ten sposób wykorzystaliśmy klasę bez użycia kodu źródłowego, mając dostęp tylko do pliku exe. Oczywiście plik ten musi być w tym samym folderze co aplikacja konsolowa aby się uruchomił.

Windows Phone

Tutaj sprawa wygląda trochę inaczej. Nie możemy zaimportować pliku exe, ale też nie powinno sprawić żadnych problemów. Korzystamy tutaj z Visual Studio Express 2012 for Windows Phone.

Najpierw tworzymy nowy projekt:

Następnie metodą przeciągnij i puść (drag and drop) kopiujemy plik liczenie.cs:
Otwieramy plik MainPage.xaml.cs i dopisujemy na początku linię:using Kalkulator;następnie do wewnątrz klasy (po public partial class MainPage : PhoneApplicationPage {) kopiujemy całą zawartość klasy z pliku MainWindow.xaml.cs z projektu aplikacji okienkowej. Kasujemy fragmentpublic MainWindow() { InitializeComponent(); }Zmienaimy też linięMessageBox.Show("Nie wpisano prawidłowo liczby", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);naMessageBox.Show("Nie wpisano prawidłowo liczby", "Błąd", MessageBoxButton.OK);

Przechodzimy do pliku MainPage.xaml. Z kodu pliku MainWindow.xaml projektu aplikacji pulpitowej kopiujemy wszystko między <Grid> a </Grid> a następnie wklejamy po <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> do projektu Windows Phone. Na razie nie będzie to wyglądało za dobrze. W TextBoxie i wszystkich Buttonach zmieniamy wartości Width i Height lub po prostu rozciągamy je w widoku graficznym. Na koniec układamy jakoś sensownie nasze kontrolki.
Dostaniemy coś w stylu:<phone:PhoneApplicationPage x:Class="KalkulatorWindowsPhone.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <!--LayoutRoot is the root grid where all page content is placed--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="PageTitle" Text="Kalkulator" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="10,0,14,0"> <TextBox Name="pasekWyniku" VerticalAlignment="Top" TextChanged="pasekWyniku_TextChanged" HorizontalContentAlignment="Right" /> <Button Width="80" Height="70" Content="0" Margin="10,287,0,0" Name="liczba0" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="1" Margin="9,217,0,0" Name="liczba1" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="2" Margin="90,217,0,0" Name="liczba2" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="3" Margin="170,217,0,0" Name="liczba3" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="4" Margin="9,147,0,0" Name="liczba4" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="5" Margin="90,147,0,0" Name="liczba5" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="6" Margin="170,147,0,0" Name="liczba6" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="7" Margin="10,79,0,0" Name="liczba7" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="8" Margin="95,79,0,0" Name="liczba8" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="9" Margin="170,79,0,0" Name="liczba9" VerticalAlignment="Top" HorizontalAlignment="Left" Click="liczba_Click" /> <Button Width="80" Height="70" Content="=" Margin="170,287,0,0" Name="wynik" VerticalAlignment="Top" HorizontalAlignment="Left" Click="wynik_Click" /> <Button Width="80" Height="70" Content="," Margin="90,287,0,0" Name="przecinek" VerticalAlignment="Top" HorizontalAlignment="Left" Click="przecinek_Click" /> <Button Width="80" Height="70" Content="*" Margin="250,79,0,0" Name="mnożenie" VerticalAlignment="Top" HorizontalAlignment="Left" Click="działanie_Click" /> <Button Width="80" Height="70" Content="/" Margin="330,79,0,0" Name="dzielenie" VerticalAlignment="Top" HorizontalAlignment="Left" Click="działanie_Click" /> <Button Width="80" Height="70" Content="+" Margin="250,217,0,0" Name="dodawanie" VerticalAlignment="Top" HorizontalAlignment="Left" Click="działanie_Click" /> <Button Width="80" Height="70" Content="-" Margin="250,147,0,0" Name="odejmowanie" VerticalAlignment="Top" HorizontalAlignment="Left" Click="działanie_Click" /> <Button Width="80" Height="70" Content="^" Margin="330,147,0,0" Name="potęga" VerticalAlignment="Top" HorizontalAlignment="Left" Click="działanie_Click" /> <Button Width="80" Height="70" Content="N!" Margin="330,217,0,0" Name="silnia" VerticalAlignment="Top" HorizontalAlignment="Left" Click="silnia_Click" /> <Button Width="80" Height="70" Content="bin" Margin="250,287,0,0" Name="systemBinarny" VerticalAlignment="Top" HorizontalAlignment="Left" Click="systemBinarny_Click" /> <Button Width="80" Height="70" Content="cls" HorizontalAlignment="Left" Margin="330,287,0,0" Name="czyszczenie" VerticalAlignment="Top" Click="czyszczenie_Click" /> </Grid> </Grid> </phone:PhoneApplicationPage> Kompilujemy i nasz kalkulator działa na Windows Phone!

Windows 8

Sprawa Windows 8 wygląda analogicznie jak Windows Phone, z tym że kasujemy:if (pasekWyniku.Text != "") MessageBox.Show("Nie wpisano prawidłowo liczby", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);a do pliku MainPage.xaml wklejamy po:<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">

tl;dr

Link do pobrania
 

oprogramowanie programowanie

Komentarze

0 nowych
_qaz7   6 #1 16.02.2013 15:17

Jeszcze dorzuć jako metro app

Druedain   13 #2 16.02.2013 15:34

Pobieżnie sobie „popaczyłem” i myślę, że można by ciąg ifów przy sprawdzaniu operatora zamienić switchem.

double ąę = 0;
zastąpiłbym
double ąę = 0.0; (nie wiem jak to w c#, ale w Javie to od razu dla pełnej jednoznaczności (0.0d)

Nie wiedziałem, że klasy można z małej litery tworzyć :o



Sam program nie jest prosty, tylko niedorobiony. Albo robić na całkowitych, albo dodać obsługę kropki. (A jak kiedyś wskazał Ryan, pewnie lepiej w ogóle decimal)



PS namespace to złoooOOOooo…

Autor edytował komentarz.
CoroDaNem   6 #3 16.02.2013 15:40

A ja myślałem, że przenoszenie aplikacji z Windows 8 na Windows Phone 8 przy pomocy małych zmian w kodzie to bajka ;)

Frankfurterium   9 #4 16.02.2013 16:57

@Druedain
"Nie wiedziałem, że klasy można z małej litery tworzyć :o"

Praktycznie wszędzie (w każdym języku) można. Konwencja nazewnicza to nie to samo co wymóg techniczny.

biomen   8 #5 16.02.2013 17:40

@Druedain

Czy mógłbyś mi wyjaśnić dlaczego: "PS namespace to złoooOOOooo…" ? ;>

Druedain   13 #6 16.02.2013 18:10

@biomen
To było pół żartem. namespace to nie zło, ale sposób w jaki je domyślnie traktuje Visual już tak. Niektóre IDE nie mają ustawionego domyślnie bezużytecznego wcięcia na namespace, tyle że w zamian dostajesz kawałek kodu, który wygląda jak pół d**py zza krzaka. I może niech to będzie to drugiem pół obok żartu…

@Frankfurterium
Spoko, doszedłem do tego niedługo po zobaczeniu tego kodu. Po prostu nigdy nie spotkałem się z czymś podobnym i stąd było moje zdziwienie.

Autor edytował komentarz.
Jim1961   7 #7 16.02.2013 18:55

Już nie jeden "polsko-angielski" kod widziałem, ale żeby polskie znaki używać ... tragedia ... i VS to łyka ... szok *o*

@Drudain
dotNETowcy wszystko na namespace'y dzielą, i po pięć kropek czasem :]

kwpolska   5 #8 16.02.2013 19:01

@Jim1961

czemu miałby nie łykać? Unicode FTW.

Druedain   13 #9 16.02.2013 19:15

@kwpolska
Może dlatego, że Unicode Unicodem, a MS i tak woli CP1250.

@Jim1961
Nie chodziło mi o samo zastosowanie.

Jim1961   7 #10 16.02.2013 19:32

@kwpolska
jakoś mi nigdy przez myśl nie przeszło użyć "ogonków" w kodzie, dlatego szok :]

_qaz7   6 #11 16.02.2013 19:33

@CoroDaNem - to jest przenoszenie z WPF Win8 na WinPhone8 który NIE MA WPF. Żeby kod był przenośny pomiędzy Win8,WinRT i WP8 trzeba korzystać z WindowsRuntime, wtedy przenosisz prawie 1:1.

  #12 16.02.2013 22:06

Fajny temat dla początkujących, jednak radziłbym wszystkim zainsteresowanym o zapoznanie się z konwencjami nazw w C#. Klasy z dużej litery i metody też, itd.

kostek135   8 #13 16.02.2013 23:40

Lepszy?
-> Nadal bin 2,6 zwraca mi 10 - naprawdę, jeśli już zdecydowałeś się na typ double (co uważam za porażkę jeśli chodzi o kalkulator), nie może to zwracać postaci binarnej zgodnej z IEEE_754?
-> (1,000000000000000000000000000001 / 1,000000000000000000000000000000) * 1,000000000000000000000000000000
zgodnie z regułami matematyki powinienem dostać pierwszą liczbę występującą w tym równaniu, u ciebie dostaje 1
-> Silnia z np. -3/2 jest obliczona błędnie
-> Parafrazując MS (It's not a bug...) ten kalkulator liczy nawet granice, 6/0 = +nieskończoność.

matrix012345   4 #14 17.02.2013 00:40

@ Jim1961: robiłem ten kod na pokaz, więc chciałem ładnie ponazywać zmienne, a VS nie robi żadnych problemów.
@kostek135: mój błąd z tym bin 2,6, nie chciało mi się kombinować to zadowoliłem się tym, co było we wpisie descriptiona. Tak samo z silnią (kopiuj&wklej z jego kodu). O dzieleniu przez 0 zapomniałem. O typie decimal nie pomyślałem.

alucosoftware   7 #15 17.02.2013 14:11

Zarówno ten, jak i poprzedni przykład wykonania kalkulatora zawierają błędy. Nie ma co drwić z czyjejś wiedzy i pokazywać kto tu jest lepszy.

Gratuluję Description_1 za przyjęcie uwag i nie stracenie cierpliwości i życzę owocnej nauki w przyszłości. Pomysł napisania kalkulatora był pomysłem dobrym i powinieneś spróbować ponownie, ale od zupełnych podstaw. W jednym wpisie zbierz całą teorię, w drugim zaproponuj wykonanie (z podziałem na klasy, metody, obsługę błędów itp.)

Kolega, który "poprawia kolegę" powinien wykazać się odpowiednio większą wiedzą, aby z lektury wyszedł jakiś pożytek. Tu tego zabrakło, w efekcie mamy kalkulator "nawet dla WP", który działa tak samo źle jak w wersji desktopowej.

Programowanie to nie tylko rozmieszczanie kontrolek... Tak przy okazji, w przypadku kalkulatora, powinno to zostać zrobione za pomocą dodatkowej metody, a nie ręcznie.

Autor edytował komentarz.
bolivar   8 #16 17.02.2013 16:51

@matrix012345 i Description_1:
jak najwięcej takich wpisów i nie przejmujcie się "znawcami". Robicie naprawdę coś dobrego - pokazujecie młodym użytkownikom DP jak łatwo jest napisać kawałek kodu. Mam nadzieję, że będę miał okazję zobaczyć więcej waszych wpisów.

Zawsze łatwo jest krytykować mając doświadczenie... jeszcze łatwiej samemu nic przy tym nie robić. Nie raz osoba pisząca komentarz na prośbę: czy możesz poprowadzić kurs/bloga odpowiada "nie mam czasu"/"tak za darmo"/"nie zrobię tego bo nie" itp. Chłopaki chcą coś robić i niech to robią.

BTW. dwa lata temu na virtualstudy.pl był prowadzony kurs on-line z C#. Mimo słabej reklamy kilkaset osób brało w nim udział:
http://virtualstudy.pl/pl/component/content/article/805-kurs-programowania-w-c-w...

alucosoftware   7 #17 17.02.2013 17:19

@bolivar
Łatwość pisania kodu przychodzi razem z doświadczeniem, nie odwrotnie.

Wzajemna adoracja do niczego dobrego nie prowadzi, a ukazywanie błędów tkwiących w zaprezentowanym kodzie jest tu pożytkiem. Kwestia sporna to "jak takie ukazywanie następuje?".

Mówienie o łatwości bycia programistą sprawia tylko, że coraz więcej osób korzysta z narzędzi, których nie rozumie i używa terminów, których nie rozumie. Każdy chce stworzyć coś więcej niż aplikację w konsoli, ale osoby bardziej doświadczone wiedzą, że nie tędy droga. Same przecież przez to przechodziły.

matrix012345   4 #18 17.02.2013 21:39

Zdaję sobie sprawę, że mój wpis nie jest idealny. Próbowałem coś poprawić, ale przy okazji coś zepsułem. Chciałem też, żeby był to program prosty. Wyszło jak wyszło.

bolivar   8 #19 17.02.2013 22:51

@alucosoftware:
wiem, że wzajemna adoracja do niczego nie prowadzi, ale warto by zapał nie znikał. Programowanie to super zabawa i nie należy zniechęcą. Zauważ też jak mało jest tutaj wpisów tego typu. Przyznam, że wolę przedstawienie prostego kalkulatora w C# niż kolejny wpis o tym jaki W8 jest wspaniały.


Mogę zostać rozstrzelany za to co napiszę: większość softu pisanego przez pojedyncze osoby to dość małe programy - tutaj nie ważne do końca jak jest to napisane - ma po prostu działać. W dużych projektach masz review kodu i architekta, który kieruje wszystkim.


@matrix012345:
mi twój wpis podoba się. Wiadomo, że nie jest doskonały - jednak jest i chcesz dalej się rozwijać. Czekam na kolejny.

alucosoftware   7 #20 18.02.2013 00:00

@bolivar
Dlaczego miałbyś zostać rozstrzelany? Ale nie jest to do końca prawda. Na pewnym etapie przestajesz cieszyć się z tego, że fragment programu działa i zaczynasz patrzeć perspektywicznie. Zastanawiasz się co w przypadku, gdy jutro będziesz chciał coś w tym fragmencie zmienić? Nie każdy może sobie pozwolić na przeglądanie i poprawianie tej samej idei w kółko. W końcu nadchodzi taki moment, że zanim dotkniesz klawiaturę, zaprojektujesz już całą aplikację przy kubku kawy. Przy drugim kubku pukniesz się w głowę i poprawisz ewidentne błędy myślowe, przy trzecim zaś pomyślisz o ewentualnym wcieleniu w życie swoich przemyśleń.

Przykład kalkulatora jest świetnym przykładem na zabawę z nauką programowania. Ludzie zabierają się za wszystko inne, ale nie za takie "prozaiczne" aplikacje. A to właśnie w takich przypadkach można pokazać się z najlepszej strony. Wyrażając pewne idee w zgrabny, przemyślany i czytelny sposób. W takim zadaniu można wykorzystać większość cech języka C# i takie też zadania powinny być tematem rozmów kwalifikacyjnych.

Tylko należy zrobić to jak należy. Więc Panowie niech przemyślą komentarze z jednego i drugiego wpisu i napiszą wersję drugą, lepszą. Nie ma co się załamywać, nawet jeżeli ktoś napisze, że "łeee... tragedia i g.", bo pewnie sam niewiele potrafi. A jeśli nie macie punktu zaczepnego, to po prostu zapytajcie: co mogę zrobić, aby wyglądało to lepiej?

  #21 22.03.2015 00:39

cześć a mógłbyś podać kod dla przycisku = ?

  #22 23.12.2015 23:07

Niby wszystko ok tylko jest jeden problem. Pobrałem Twój program i:
-przyciski z liczbami działają
-kiedy kliknę na jakąś liczbę -> na jakiś znak (+, -; obojętnie) to nic się nie dzieje... Czemu?