Jak zrobić dodawanie w kalkulatorze?

0

Witam.
Programuje w C#, Wpf
Zrobiłem kalkultor, ale nie działa mi dodawanie :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace StanKonta
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public delegate void RoutedEventHandler(
    object sender,
    RoutedEventArgs e
);
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
        }
        int screen;
        double a;
        double result = 0;
        private void Odejmowanie_Click(object sender, RoutedEventArgs e)
        {
            a = double.Parse(TXB_2.Text);
            textbox.Text = (result.ToString());
            result -= a;
            TXB_2.Text = "";
        }

        private void Usuwanie_Click(object sender, RoutedEventArgs e)
        {
            textbox.Text = "";
        }

        private void B_1_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "1";
        }

        private void B_2_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "2";
        }

        private void B3_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "3";
        }

        private void B4_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "4";
        }
        private void B5_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "5";
        }

        private void B6_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "6";
        }

        private void B7_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "7";
        }

        private void B8_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "8";
        }

        private void B9_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "9";
        }

        private void B0_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "0";
        }

        private void ALEK_Click(object sender, EventArgs e)
        {
            Properties.Settings.Default.textbox = textbox.Text;
            Properties.Settings.Default.Save();
        }

        private void AlEKL_Load(object sender, RoutedEventArgs e)
        {
            textbox.Text = Properties.Settings.Default.textbox;
        }


        private void Przeci_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + ",";
        }

        private void Dodawanie_Click(object sender, RoutedEventArgs e)
        {
            var originalNumber = double.Parse(textbox.Text);
            var numberToAdd = double.Parse(a.ToString()); //a to liczba którą wpiszemy do TXB_2
            var sumOfNumbers = originalNumber + numberToAdd;
            textbox.Text = sumOfNumbers.ToString();
            TXB_2.Text = "";
        }
    }
}
 

Odejmowanie jest zrobione inną metodą, ale ona nie odejmuje tylko pisze wybranąliczbę z minusem.
Co mam zrobić?

0

Sprawdziłeś już w którym miejscu leci jaki exception czy dalej ci się nie chciało?

0

Przecież napisałem Ci już w http://4programmers.net/Forum/C_i_C++/279784-jak_zrobic_dodawanie_w_kalkulatorze?p=1305674#id1305674:

xfin napisał(a):

Nie masz nigdzie (w przypadku dodawania) wpisania wartości do zmiennej a:

a = double.Parse(TXB_2.Text); //<- to się pojawia tylko jeśli chcesz odejmować. przy dodawaniu też by się przydało.

Swoją drogą - zacznij porządnie nazywać zmienne, bo bardzo źle się to czyta.

Robisz coś takiego:

        private void Dodawanie_Click(object sender, RoutedEventArgs e)
        {
            var originalNumber = double.Parse(textbox.Text);
            var numberToAdd = double.Parse(a.ToString()); //a to liczba którą wpiszemy do TXB_2
            var sumOfNumbers = originalNumber + numberToAdd;
            textbox.Text = sumOfNumbers.ToString();
            TXB_2.Text = "";
        }

AWięc jeszcze raz - gdzie w funkcji dodawania wpisujesz wartość z TXB_2 do zmiennej a?

0

Jak to zrobić?

0
alekplus napisał(a):

Jak to zrobić?

Nie obraź się, ale jak nie wiesz jak ustawić breakpointa, to powinieneś wrócić do nauki C# i podstaw VS, bo WPF wymaga już tej znajomości.

Obawiam się, że porwałeś się trochę z motylą nogą na księżyc.

Breakpointa ustawia się klikając na samym brzegu okienka z kodem z lewej strony, przy tej linijce, która ma być zatrzymana. Pojawi się czerwone kółeczko oznaczające breakpoint.

https://msdn.microsoft.com/pl-pl/library/k80ex6de(v=vs.90).aspx

0
var originalNumber = double.Parse(textbox.Text); 

Błąd: System.FormatException: „Nieprawidłowy format ciągu wejściowego.”

0

No to chyba wiele wyjaśnia.
Co masz w tym textbox.Text?

0

Dalej crash :c

0

:c

Jakbyś w końcu napisał co się znajduje w momencie crasha w textbox.Text, to problem byśmy rozwiązali już 3 dni temu.

0

trochę zgaduję ale moim zdaniem program wywala się na tej linii
var originalNumber = double.Parse(textbox.Text);

a dzieje się tak dlatego , że wcześniej czyścisz pole textbox wywołując

    private void Usuwanie_Click(object sender, RoutedEventArgs e)
    {
        textbox.Text = "";
    }

w rezultacie w polu texbox.Text masz pusty ciąg znaków, który próbujesz konwertować na typ double.
Spróbuj
var originalNumber = double.Parse( string.IsNullOrEmpty( textbox.Text)?"0":textbox.Text);

0

no i nie wiem po co ci ta konstrukcja :

var numberToAdd = double.Parse(a.ToString());

przecież zmienną a masz typu double więc numberToAdd też możesz zadeklarować jako double.
No i nazwy zmiennych... ale o tym wspominali już koledzy.

Poza tym nie ma potrzeby robić osobnej metody pod przycisk liczby. Wystarczy ta sama od każdym przyciskiem w a niej

TXB_2.Text = TXB_2.Text + ((TextBox)sender).Text;

lub coś w ten deseń

0

Wpisałem ten kod i działa ale wyskakuje wynik 0 zamiast moja liczba

0

Poniewaz w dodawaniu uzywasz zmiennej a lecz nie ustawiasz jej wartosci. Ona zawsze wynosi 0. Pole textbox jest puste wiec jego konwersja na double tez daje 0. Wykonujesz dzialanie 0+0

0

napisałeś w komentarzu "zmienna a to liczba którą wpisuję"
No więc ok, gdzie ją wpisujesz ? nie masz przypisania jej wartości pod żadnym przyciskiem z cyfrą

np.

 
private void B_1_Click(object sender, RoutedEventArgs e)
        {
            TXB_2.Text = TXB_2.Text + "1";
        }

Naciskasz klawisz dowolnej cyfry ale zmienna a ma wartość 0
Potem naciskasz klawisz dodawania ale w nim zmienna a ma wartość 0 bo nigdy nie została ustawiona. No chyba że wcześniej naciśniesz przycisk odejmowania ma tam rzeczywiście zmiennej a przypisujesz wartość z pola TXB_2.Text


        private void Dodawanie_Click(object sender, RoutedEventArgs e)
        {
            var originalNumber = double.Parse(textbox.Text);
            var numberToAdd = double.Parse(a.ToString()); //a to liczba którą wpiszemy do TXB_2
            var sumOfNumbers = originalNumber + numberToAdd;
            textbox.Text = sumOfNumbers.ToString();
            TXB_2.Text = "";
        }

 

Generalnie kalkulator ma jeszcze klawisz "=", którego u Ciebie nie ma
Proponował bym od rozpisania na kartce przypadków użycia np.
1.
-wciskam cyfrę np. "8",
-kalk. wyświetla cyfrę w polu TXb_2 "8"
-wciskam klawisz działania np. "+"

  • kalk wyświetla w polu textbox tekst z pola TXB_2 oraz symbol operacji "8+"
  • wciskam cyfrę np. "5"
  • kalkulator wyswietla wynik cyfrę w polu TXB_2
  • wciskam kolejną cyfrę np. "1", cyfra jest dopisana do pola TXB_2 (jest tam "51")
  • wciskam przycisk "="
  • kalkulatow wyswietla wynik działania w polu TXB_2 : 59
  • kalkulatow wyswietla treść działania w polu texbox "8+51"

itp....

0

Pozwolę sobie na mały offtop, ale @alekplus robisz straszny bałagan w tym wątku. Część rzeczy w temacie jest w postach. Potem odpowiedzi w komentarzach, a potem ponownie w postach. W efekcie posty tego samego użytkownika są jeden pod drugim. Komentarze są do tego, aby można było dyskutować na rzeczy nie związane ściśle z tematem. Na temat piszemy zawsze w postach.

0

To ja może wytłumaczę jak chce żeby mój kalkulator działał.
Kiedy wpiszę jakąś liczbę i klikne przycisk dodac, wpisna liczba dodaje się do puli. Pula ta wyświetla się w textbox.Text
tak samo z odejmowaniem.
Zależy mi na tym żeby program zapisywał stan textbox'a , co przestało działać. Jak to naprawić?

0

Mniej więcej to napisałem w przykładowym przypadku uzycia. W swoim poscie nie napisałeś kiedy kalkulator ma wyświetlić wynik

0

kalkulator ma wyświetlać wynik wraz z wciśnięciem klawisza dodawania bądź odejmowania

0

Ok dodawanie działa (dodałem

a = double.Parse(TXB_2.Text); 

)
Tylko teraz mam problem, bo przestało zapisywać stan textbox.Text

0

Wrzuc tresc obecnej metody dodawanie_click

0
a = double.Parse(TXB_2.Text);
            var originalNumber = double.Parse( string.IsNullOrEmpty(textbox.Text)?"0":textbox.Text);
            var numberToAdd = double.Parse(a.ToString()); //a to liczba którą wpiszemy do TXB_2
            var sumOfNumbers = originalNumber + numberToAdd;
            textbox.Text = sumOfNumbers.ToString();
            TXB_2.Text = ""; 
0
  1. w zasadzie nie wiem po co ci te zmienne
 
        int screen;
        double a;
        double result = 0;

tylko zaciemniają kod, zamiast je używać, możesz dodawanie (i analogicznie odejmowanie) zrobić jak niżej :

 
     double numberToAdd = double.Parse(string.IsNullOrEmpty(TXB_2.Text)?"0": TXB_2.Text);
     double originalNumber = double.Parse(string.IsNullOrEmpty(textbox.Text) ? "0" : textbox.Text);
     double result = originalNumber + numberToAdd;
     textbox.Text = result.ToString();
     TXB_2.Text = "";
  1. napisałeś "Tylko teraz mam problem, bo przestało zapisywać stan textbox.Text" masz na myśli to, że wywołujesz "private void ALEK_Click(object sender, EventArgs e)" i wartość z "textbox" nie jest zapisana w propertisach ?
0

2.tak

0

nie zapisuje zupełnie nic (textbox jest pusty) ?

a to masz bez zmian ?

 
 private void ALEK_Click(object sender, EventArgs e)
        {
            Properties.Settings.Default.textbox = textbox.Text;
            Properties.Settings.Default.Save();
        }

Spróbuj do dowdawania użyć kodu z mojego poprzedniego posta

0

Nie zapisuje zupełnie nic! Nawet wtedy gdy użyłem twojego kodu.

 private void ALEK_Click(object sender, EventArgs e)
        {
            Properties.Settings.Default.textbox = textbox.Text;
            Properties.Settings.Default.Save();
        } 

Bez zmian

0

W takim razie wrzuc projekt na githuba albo wyslij mi mailem. Napisz na priv to ci go podam

0

i jak?

0

zwróć uwagę, że wywołanie ALEK_Click(object sender, EventArgs e) nie masz podpięte do żadnego przycisku a tylko w tej metodzie wykonujesz

 
Properties.Settings.Default.textbox = textbox.Text;
            Properties.Settings.Default.Save();

Stan pola textbox możesz zapisać w zdarzeniach okna, np.

 
   private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            textbox.Text = Properties.Settings.Default.textbox;
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            Properties.Settings.Default.textbox = textbox.Text;
            Properties.Settings.Default.Save();
        }

wysłałem ci to mailem, mam nadzieję, że o to ci chodziło

0

Ok wielkie dzięki za pomoc efekt jest lepszy niż chciałem!!!!
teraz tylko photoshop

1 użytkowników online, w tym zalogowanych: 0, gości: 1