using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; namespace calc { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); // stan początkowy state = State.start; } // stany kalkulatora enum State { start, numberPressed, operatorPressed, operatorPressedAgain, getResultPressed, equelPressedAgain, resetPressed } // stan private State state; // poprzedni stan private State previousState; // liczby private double pierwszaLiczba = double.NaN; private double drugaLiczba = double.NaN; // rezulatat obliczeń private double result = double.NaN; // wybrany operator private string op = ""; // wklepana liczba private string pressedNumber = ""; // metoda licząca wynik private double count() { double wynik = 0; switch (op) { case "+": wynik = pierwszaLiczba + drugaLiczba; break; case "-": wynik = pierwszaLiczba - drugaLiczba; break; case "*": wynik = pierwszaLiczba * drugaLiczba; break; case "/": wynik = pierwszaLiczba / drugaLiczba; break; } return wynik; } private void Button_Number_Clicked(object sender, EventArgs e) { Button button = (Button)sender; // start if (state == State.start || previousState == State.start && state == State.numberPressed) { previousState = State.start; state = State.numberPressed; pressedNumber += button.Text; labelResult.Text = pressedNumber; } // po wybraniu operatora (jest tylko jedna liczba) else if(previousState == State.start && state == State.operatorPressed || previousState == State.numberPressed && state == State.operatorPressed || previousState == State.getResultPressed && state == State.operatorPressed || previousState == State.operatorPressed && state == State.numberPressed) { previousState = State.operatorPressed; state = State.numberPressed; pressedNumber += button.Text; labelResult.Text = pressedNumber; } } private void Button_Percent_Clicked(object sender, EventArgs e) { } private void Button_Operator_Clicked(object sender, EventArgs e) { Button buttonOperator = (Button)sender; // skan pierwszej liczby // 1 + if (previousState == State.start && state == State.numberPressed) { previousState = State.start; //zachowujemy w celu rozpoznania, że mamy tylko jedną liczbę state = State.operatorPressed; Double.TryParse(pressedNumber, out pierwszaLiczba); result = pierwszaLiczba; // w celu wyeliminowania błędu gdy pierwszaLiczba = result labelResult.Text = pierwszaLiczba.ToString(); pressedNumber = ""; // reset zmiennej trzymającej nacisniętą liczbe op = buttonOperator.Text; // wybrany operator } // powtórne przycisniecie operatora, gdy jest tylko jedna liczba // lub są już 2 liczby // 1 + + * - // 1 + 2 * / - else if(previousState == State.start && state == State.operatorPressed || previousState == State.numberPressed && state == State.operatorPressed || previousState == State.getResultPressed && state == State.operatorPressed) { // nie zmieniamy stanu, żeby nie komplikować // mamy jedną liczbę i zmieniamy tylko operator op = buttonOperator.Text; // powtornie wybrany operator pressedNumber = ""; // reset zmiennej trzymającej nacisniętą liczbe } // mamy 1 liczbe zeskanowana i operatora // 1 + 2 + if (previousState == State.operatorPressed && state == State.numberPressed) { previousState = State.numberPressed; state = State.operatorPressed; Double.TryParse(pressedNumber, out drugaLiczba); // zapamiętujemy drugą liczbę pierwszaLiczba = result; result = count(); labelResult.Text = result.ToString(); pressedNumber = ""; // reset zmiennej trzymającej nacisniętą liczbe op = buttonOperator.Text; // wybrany operator } // 1 + 2 = 4 + else if(previousState == State.numberPressed && state == State.getResultPressed) { previousState = State.getResultPressed; state = State.operatorPressed; pierwszaLiczba = result; labelResult.Text = pierwszaLiczba.ToString(); pressedNumber = ""; // reset zmiennej trzymającej nacisniętą liczbe op = buttonOperator.Text; // wybrany operator } } // 1/x private void Button_Reciprocal_Clicked(object sender, EventArgs e) { } // = private void Button_GetResult_Clicked(object sender, EventArgs e) { // 1 + 2 = // 1 + 2 + 3 = if(previousState == State.operatorPressed && state == State.numberPressed) { previousState = State.numberPressed; state = State.getResultPressed; Double.TryParse(pressedNumber, out drugaLiczba); // zapamiętujemy drugą liczbę pierwszaLiczba = result; result = count(); labelResult.Text = result.ToString(); } // 1 + 2 = = = else if(previousState == State.numberPressed && state == State.getResultPressed) { pierwszaLiczba = result; result = count(); labelResult.Text = result.ToString(); } } // clear private void Button_Clear_Clicked(object sender, EventArgs e) { state = State.start; labelResult.Text = ""; op = ""; pierwszaLiczba = double.NaN; drugaLiczba = double.NaN; result = double.NaN; pressedNumber = ""; labelOperation.Text = ""; } } }