반응형

안녕하세요, 츄르 사려고 코딩하는 집사! 코집사입니다.

 

C# WPF 프로그래밍 계산기(Calculator) 프로그램 만들기 - 연산자 다중 계산

저번 글에서는 연산자 1개를 이용한 계산을 했다면, 이번 글은 연산자를 여러 개 사용을 해서 계산하는 방법입니다.

다음 글에서는 연산자의 우선순위에 따른 계산에 대한 글을 쓰겠습니다.

 

 

 

1. XAML 코드

XAML 구성

<Window x:Class="cal.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:local="clr-namespace:cal"

    mc:Ignorable="d"

    Title="MainWindow" Height="704.93" Width="700">

    <Grid HorizontalAlignment="Left" Width="700" Margin="0,0,-5,-1">

        <Grid.RowDefinitions>

            <RowDefinition Height="200"/>

            <RowDefinition Height="75"/>

            <RowDefinition Height="75"/>

            <RowDefinition Height="75"/>

            <RowDefinition Height="75"/>

            <RowDefinition Height="75"/>

            <RowDefinition Height="75"/>

        </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>

            <ColumnDefinition Width="100"/>

            <ColumnDefinition Width="100"/>

            <ColumnDefinition Width="100"/>

            <ColumnDefinition Width="100"/>

            <ColumnDefinition Width="390"/>

    </Grid.ColumnDefinitions>

    <ListView x:Name="liststate"

        BorderBrush="Gray"

        Grid.Column="4"

        Grid.RowSpan="7" Margin="0,0,110,-8">

    </ListView>

    <Label x:Name="result2"

        Grid.ColumnSpan="4"

        Grid.Row="0"

        HorizontalContentAlignment="Right"

        VerticalContentAlignment="Top"

        FontSize="30"

        Foreground="Gray"/>

    <Label x:Name="resultLabel"

        Content="0"

        Grid.ColumnSpan="4"

        Grid.Row="0"

        HorizontalContentAlignment="Right"

        VerticalContentAlignment="Bottom"

        FontSize="100"/>

 

 

<!-- 숫자 버튼 0 -->

<Button x:Name="ZeroButton"

Grid.Column="0"

Grid.Row="6"

Content="0"

Margin="5,5,5,-13"

Grid.ColumnSpan="2"

Foreground="white"

Background="Gray"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 1 -->

<Button x:Name="OneButton"

Grid.Column="0"

Grid.Row="5"

Content="1"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 2 -->

<Button x:Name="TwoButton"

Grid.Column="1"

Grid.Row="5"

Content="2"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 3 -->

<Button x:Name="ThreeButton"

Grid.Column="2"

Grid.Row="5"

Content="3"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 4 -->

<Button x:Name="FourButton"

Grid.Column="0"

Grid.Row="4"

Content="4"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 5 -->

<Button x:Name="FiveButton"

Grid.Column="1"

Grid.Row="4"

Content="5"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

 

<!-- 숫자 버튼 6 -->

<Button x:Name="SixButton"

Grid.Column="2"

Grid.Row="4"

Content="6"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 7 -->

<Button x:Name="SevenButton"

Grid.Column="0"

Grid.Row="3"

Content="7"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 8 -->

<Button x:Name="EightButton"

Grid.Column="1"

Grid.Row="3"

Content="8"

Foreground="white"

Background="Gray"

FontSize="30"

Margin="5,5,5,5"

Click="numberButton_Click"/>

 

<!-- 숫자 버튼 9 -->

<Button x:Name="NineButton"

Grid.Column="2"

Grid.Row="3"

Content="9"

Foreground="white"

Background="Gray"

Margin="5,5,5,5"

FontSize="30"

Click="numberButton_Click"/>

 

<!--연산버튼 AC-->

<Button x:Name="AcButton"

Grid.Column="0"

Grid.Row="2"

Content="AC"

FontSize="30"

Margin="5,5,5,5"

Click="AcButton_Click"/>

 

<!-- 연산버튼 Plus/Minus -->

<Button x:Name="PlusMinusButton"

Grid.Column="1"

Grid.Row="2"

Content="+/-"

FontSize="30"

Margin="5,5,5,5"

Click="PlusMinusButton_Click"/>

 

<!-- 연산버튼 Percent -->

<Button x:Name="PercentButton"

Grid.Column="2"

Grid.Row="2"

Content="%"

FontSize="30"

Margin="5,5,5,5"

Click="PercentButton_Click"/>

 

<!-- 연산버튼 Divide -->

<Button x:Name="DivideButton"

Grid.Column="3"

Grid.Row="2"

Content="/"

Background="Green"

Margin="5,5,5,5"

FontSize="30"

Click="operationButton_Click"/>

 

 

<!-- 연산버튼 Multiple -->

<Button x:Name="MultipleButton"

Grid.Column="3"

Grid.Row="3"

Content="*"

Background="Green"

Margin="5,5,5,5"

FontSize="30"

Click="operationButton_Click"/>

 

<!-- 연산버튼 Minus -->

<Button x:Name="MinusButton"

Grid.Column="3"

Grid.Row="4"

Content="-"

Background="Green"

Margin="5,5,5,5"

FontSize="30"

Click="operationButton_Click"/>

 

<!-- 연산버튼 Plus -->

<Button x:Name="PlusButton"

Grid.Column="3"

Grid.Row="5"

Content="+"

Background="Green"

Margin="5,5,5,5"

FontSize="30"

Click="operationButton_Click"/>

 

<!-- 연산버튼 Dot -->

<Button x:Name="DotButton"

Grid.Column="2"

Grid.Row="6"

Content="."

Foreground="white"

Background="Gray"

FontSize="30"

Margin="5,5,5,-13"

Click="DotButton_Click"/>

 

<!-- 연산버튼 Equl -->

<Button x:Name="EqulButton"

Grid.Column="3"

Grid.Row="6"

Content="="

Background="Green"

Margin="5,5,5,-13"

FontSize="30"

Click="EqulButton_Click"/>

 

<!-- 연산버튼 Delete -->

<Button x:Name="DelButton"

Grid.Column="0"

Grid.Row="1"

Content="Del"

Margin="5,5,5,5"

FontSize="30"

Click="ExtraFunction_Click"/>

 

 

<!-- 연산버튼 Sqrt -->

<Button x:Name="SqrtButton"

Grid.Column="1"

Grid.Row="1"

Content="Sqrt"

Margin="5,5,5,5"

FontSize="30"

Click="ExtraFunction_Click"/>

 

<!-- 연산버튼 X^2 -->

<Button x:Name="XXButton"

Grid.Column="2"

Grid.Row="1"

Content="X^2"

Margin="5,5,5,5"

FontSize="30"

Click="ExtraFunction_Click"/>

 

<!-- 연산버튼 1/x -->

<Button x:Name="reverseXButton"

Grid.Column="3"

Grid.Row="1"

Content="1/x"

Margin="5,5,5,5"

FontSize="30"

Click="ExtraFunction_Click"/>

</Grid>

</Window>

 

 

 

 

2. Behind Code (이벤트 함수)

 

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 cal

{

/// <summary>

/// MainWindow.xaml에 대한 상호 작용 논리

/// </summary>

public partial class MainWindow : Window

{

double lastNumber;

SelectedOperator selectedOperator;

double result;

double temp = 0; // 중간 계산 값을 저장하기 위한 변수

 

public MainWindow()

{

InitializeComponent();

//각 버튼에 대한 이벤트 함수를 안만들고 아래와 같이 해도 상관 없음.

//AcButton.Click += AcButton_Click;

}

public enum SelectedOperator

{

Addition,

Subtraction,

Multiplication,

Division

}

 

public class SimpleMath

{

public static double Add(double n1, double n2)

{

return n1 + n2;

}

public static double Subtract(double n1, double n2)

{

return n1 - n2;

}

public static double Multiple(double n1, double n2)

{

return n1 * n2;

}

public static double Divide(double n1, double n2)

{

if(n2==0)

{

MessageBox.Show("0으로 나눌 수 없습니다.", "Wrong Operation",

MessageBoxButton.OK, MessageBoxImage.Error);

}

return n1 / n2;

}

}

 

 

// 숫자 버튼 이벤트 함수

private void numberButton_Click(object sender, RoutedEventArgs e)

{

int selectedValue = 0;

if (sender == ZeroButton)

{

selectedValue = 0;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == OneButton)

{

selectedValue = 1;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == TwoButton)

{

selectedValue = 2;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == ThreeButton)

{

selectedValue = 3;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == FourButton)

{

selectedValue = 4;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == FiveButton)

{

selectedValue = 5;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == SixButton)

{

selectedValue = 6;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == SevenButton)

{

selectedValue = 7;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == EightButton)

{

selectedValue = 8;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

if (sender == NineButton)

{

selectedValue = 9;

if (resultLabel.Content.ToString() == "0")

{

resultLabel.Content = selectedValue.ToString();

}

else

{

resultLabel.Content += selectedValue.ToString();

}

}

}

 

int flag = 0; // 처음 계산인지 아닌지를 구별하기 위한 flag

double a = 0;

int sig = 0; // 덧셈 flag : 1 뺄셈 flag : 2 곱하기 flag : 3 나누기 flag : 4

// Plus, Minus, Multiple, Divide 4개가 있는 이벤트 함수

private void operationButton_Click(object sender, RoutedEventArgs e)

{

lastNumber = double.Parse(resultLabel.Content.ToString());

resultLabel.Content = "0";

// Plusbutton을 눌렀을 때, 처음 계산이면 temp에 lastnumber를 넣고 flag를 1로 증가시켜 처음 계산이 아니라는 flag를 사용하고, sig를 1로 저장 시킴

if (sender == PlusButton)

{

if(flag==0)

{

selectedOperator = SelectedOperator.Addition;

result2.Content += lastNumber + " + ";

flag++;

a = lastNumber;

temp = lastNumber;

sig = 1;

}

// 처음 계산이 아닐 경우, 만약 처음 계산이 +를 사용한 계산이면, sig가 1이기 때문에 sig==1일 경우 temp 값과 현재 resultLabel에 저장되었던 값을 lastNumber에 저장시키고, SimpleMath.Add를 통하여 두 변수를 합하고, temp에 다시 저장
//나머지 연산도 똑같이 적용을 하게 되면, 앞에 있던 것을 계산하고, 지속적으로 temp에 저장을 시켜 다중 연산을 할 수 있음

else

{

if (sig == 1)

{

selectedOperator = SelectedOperator.Addition;

temp = SimpleMath.Add(temp, lastNumber);

result2.Content += lastNumber + " + ";

}

else if (sig == 2)

{

selectedOperator = SelectedOperator.Addition;

temp = SimpleMath.Subtract(temp, lastNumber);

result2.Content += lastNumber + " + ";

}

else if (sig == 3)

{

selectedOperator = SelectedOperator.Addition;

temp = SimpleMath.Multiple(temp, lastNumber);

result2.Content += lastNumber + " + ";

}

else

{

selectedOperator = SelectedOperator.Addition;

temp = SimpleMath.Divide(temp, lastNumber);

result2.Content += lastNumber + " + ";

}

}

sig = 1;

}

 

if (sender == MinusButton)

{

if(flag==0)

{

selectedOperator = SelectedOperator.Subtraction;

result2.Content += lastNumber + " - ";

flag++;

a = lastNumber;

temp = lastNumber;

sig = 2;

}

else

{

if(sig == 1)

{

selectedOperator = SelectedOperator.Subtraction;

temp = SimpleMath.Add(temp, lastNumber);

result2.Content += lastNumber + " - ";

}

else if(sig == 2)

{

selectedOperator = SelectedOperator.Subtraction;

temp = SimpleMath.Subtract(temp, lastNumber);

result2.Content += lastNumber + " - ";

}

else if (sig == 3)

{

selectedOperator = SelectedOperator.Subtraction;

temp = SimpleMath.Multiple(temp, lastNumber);

result2.Content += lastNumber + " - ";

}

else

{

selectedOperator = SelectedOperator.Subtraction;

temp = SimpleMath.Divide(temp, lastNumber);

result2.Content += lastNumber + " - ";

}

}

sig = 2;

}

 

if (sender == MultipleButton)

{

if (flag == 0)

{

selectedOperator = SelectedOperator.Multiplication;

result2.Content += lastNumber + " * ";

flag++;

a = lastNumber;

temp = lastNumber;

sig = 3;

}

else

{

if (sig == 1)

{

selectedOperator = SelectedOperator.Multiplication;

temp = SimpleMath.Add(temp, lastNumber);

result2.Content += lastNumber + " * ";

}

else if (sig == 2)

{

selectedOperator = SelectedOperator.Multiplication;

temp = SimpleMath.Subtract(temp, lastNumber);

result2.Content += lastNumber + " * ";

}

else if (sig == 3)

{

selectedOperator = SelectedOperator.Multiplication;

temp = SimpleMath.Multiple(temp, lastNumber);

result2.Content += lastNumber + " * ";

}

else

{

selectedOperator = SelectedOperator.Multiplication;

temp = SimpleMath.Divide(temp, lastNumber);

result2.Content += lastNumber + " * ";

}

}

sig = 3;

}

if (sender == DivideButton)

{

if (flag == 0)

{

selectedOperator = SelectedOperator.Division;

result2.Content += lastNumber + " / ";

flag++;

a = lastNumber;

temp = lastNumber;

sig = 4;

}

else

{

if (sig == 1)

{

selectedOperator = SelectedOperator.Division;

temp = SimpleMath.Add(temp, lastNumber);

result2.Content += lastNumber + " / ";

}

else if (sig == 2)

{

selectedOperator = SelectedOperator.Division;

temp = SimpleMath.Subtract(temp, lastNumber);

result2.Content += lastNumber + " / ";

}

else if (sig == 3)

{

selectedOperator = SelectedOperator.Division;

temp = SimpleMath.Multiple(temp, lastNumber);

result2.Content += lastNumber + " / ";

}

else

{

selectedOperator = SelectedOperator.Division;

temp = SimpleMath.Divide(temp, lastNumber);

result2.Content += lastNumber + " / ";

}

}

sig = 4;

}

}

 

private void ExtraFunction_Click(object sender, RoutedEventArgs e)

{

double lastNumber;

if (sender == DelButton)

{

if(resultLabel.Content.ToString().Length != 1)

{

resultLabel.Content = resultLabel.Content.ToString().Substring(0, resultLabel.Content.ToString().Length - 1);

}

else

{

resultLabel.Content = "0";

}

}

if (sender == SqrtButton)

{

if (double.TryParse(resultLabel.Content.ToString(), out lastNumber))

{

if (lastNumber < 0) return;

else

{

lastNumber = Math.Sqrt(lastNumber);

resultLabel.Content = lastNumber.ToString();

}

}

}

if (sender==XXButton)

{

if(double.TryParse(resultLabel.Content.ToString(), out lastNumber))

{

lastNumber = lastNumber * lastNumber;

resultLabel.Content = lastNumber.ToString();

}

}

if (sender==reverseXButton)

{

 

if (double.TryParse(resultLabel.Content.ToString(), out lastNumber))

{

lastNumber = 1 / lastNumber;

resultLabel.Content = lastNumber.ToString();

}

}

}

// AC 버튼 클릭

//lastNumber와 flag, temp, sig를 다 0으로 초기화 시켜줘야 그 후 계산에서 정확한 값을 출력함.

private void AcButton_Click(object sender, RoutedEventArgs e)

{

resultLabel.Content = "0";

a = 0;

lastNumber = 0;

flag = 0;

temp = 0;

sig = 0;

}

 

// PlusMinus 버튼 클릭

private void PlusMinusButton_Click(object sender, RoutedEventArgs e)

{

double lastNumber;

if(double.TryParse(resultLabel.Content.ToString(), out lastNumber))

{

lastNumber = lastNumber * -1;

resultLabel.Content = lastNumber.ToString();

}

}

 

// Percent 버튼 클릭

private void PercentButton_Click(object sender, RoutedEventArgs e)

{

double lastNumber;

if (double.TryParse(resultLabel.Content.ToString(), out lastNumber))

{

lastNumber = lastNumber * 0.01;

resultLabel.Content = lastNumber.ToString();

}

}

 

// Dot 버튼 클릭

private void DotButton_Click(object sender, RoutedEventArgs e)

{

Boolean a;

a = resultLabel.Content.ToString().Contains(".");

if (resultLabel.Content.ToString() == "0")

{

return;

}

else

{

if(a==false)

{

resultLabel.Content += ".";

}

}

}

// Equl 버튼 클릭

//계속적으로 계산을 하게 되면, temp에 결과값이 들어가는데, 이 temp와 = 버튼을 눌러 resultLabel에 입력됐던 값을 newNumber에 저장시켜 temp와 newNumber를 각 연산에 따른 계산을 함.

private void EqulButton_Click(object sender, RoutedEventArgs e)

{

double newNumber;

newNumber = double.Parse(resultLabel.Content.ToString()); // 연산자 후 숫자 저장

switch (selectedOperator)

{

case SelectedOperator.Addition:

result = SimpleMath.Add(temp, newNumber);

liststate.Items.Add(result2.Content.ToString() + newNumber + " = " + result.ToString());

result2.Content = "";

break;

 

case SelectedOperator.Subtraction:

result = SimpleMath.Subtract(temp, newNumber);

liststate.Items.Add(result2.Content.ToString() + newNumber + " = " + result.ToString());

result2.Content = "";

break;

 

case SelectedOperator.Multiplication:

result = SimpleMath.Multiple(temp, newNumber);

liststate.Items.Add(result2.Content.ToString() + newNumber + " = " + result.ToString());

result2.Content = "";

break;

 

case SelectedOperator.Division:

result = SimpleMath.Divide(temp, newNumber);

liststate.Items.Add(result2.Content.ToString() + newNumber + " = " + result.ToString());

result2.Content = "";

break;

}

resultLabel.Content = result.ToString();

lastNumber = 0;

temp = 0;

sig = 0;

a = 0;

flag = 0;

}

}

}

 

3. 결과

   - 아직 우선순위 계산을 추가하지 않았기 때문에 처음부터 순서대로 계산을 하면 아래의 값이 나옴.

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기