C#/C#200제

[C#] 22일차 - 160. WPF 간단한 계산기

반나무 2021. 3. 5. 19:17

<Window x:Class="A160_WPF_SimpleCalc.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:A160_WPF_SimpleCalc"
        mc:Ignorable="d"
        Title="간단한 계산기" Height="380" Width="320">
    <StackPanel Margin="10">
        <TextBox Margin="5" Height="60" Name="txtResult" FontSize="30" HorizontalContentAlignment="Right" VerticalContentAlignment="Bottom">0</TextBox>
        <Grid Height="260">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Button Grid.Row="0" Grid.Column="0" Margin="5" FontSize="16" Click="btn_Click">7</Button>
            <Button Grid.Row="0" Grid.Column="1" Margin="5" FontSize="16" Click="btn_Click">8</Button>
            <Button Grid.Row="0" Grid.Column="2" Margin="5" FontSize="16" Click="btn_Click">9</Button>
            <Button Grid.Row="0" Grid.Column="3" Margin="5" FontSize="16" Click="btnOp_Click">+</Button>

            <Button Grid.Row="1" Grid.Column="0" Margin="5" FontSize="16" Click="btn_Click">4</Button>
            <Button Grid.Row="1" Grid.Column="1" Margin="5" FontSize="16" Click="btn_Click">5</Button>
            <Button Grid.Row="1" Grid.Column="2" Margin="5" FontSize="16" Click="btn_Click">6</Button>
            <Button Grid.Row="1" Grid.Column="3" Margin="5" FontSize="16" Click="btnOp_Click">-</Button>

            <Button Grid.Row="2" Grid.Column="0" Margin="5" FontSize="16" Click="btn_Click">1</Button>
            <Button Grid.Row="2" Grid.Column="1" Margin="5" FontSize="16" Click="btn_Click">2</Button>
            <Button Grid.Row="2" Grid.Column="2" Margin="5" FontSize="16" Click="btn_Click">3</Button>
            <Button Grid.Row="2" Grid.Column="3" Margin="5" FontSize="16" Click="btnOp_Click">x</Button>

            <Button Grid.Row="3" Grid.Column="0" Margin="5" FontSize="16" Click="Dot_Click">.</Button>
            <Button Grid.Row="3" Grid.Column="1" Margin="5" FontSize="16" Click="btn_Click">0</Button>
            <Button Grid.Row="3" Grid.Column="2" Margin="5" FontSize="16" Click="Equal_Click">=</Button>
            <Button Grid.Row="3" Grid.Column="3" Margin="5" FontSize="16" Click="btnOp_Click">/</Button>
        </Grid>
    </StackPanel>
    
</Window>
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 A160_WPF_SimpleCalc
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        private bool newButton;     // 연산자 버튼을 누른 후 새로 숫자가 시작되어야 함을 의미
        private double savedValue;   // 연산자 버튼을 누를 때 현재 txtResult에 있는 값을 저장하는 필드
        private char myOperator;    // 현재 계산할 연산자를 저장하는 char형 변수

        public MainWindow()
        {
            InitializeComponent();
        }

        // 숫자 버튼의 처리
        private void btn_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            string number = btn.Content.ToString();
            // 지금 0이거나 새로시작했을경우 값을 바로 적어줌.
            if(txtResult.Text=="0" || newButton == true)
            {
                txtResult.Text = number;
                newButton = false;
            } else // 그렇지 않을경우 숫자를 뒤에 계속 붙임 -> char기때문에 가능
            {
                txtResult.Text = txtResult.Text + number;
            }
        }

        // 연산자 처리
        private void btnOp_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;

            savedValue = double.Parse(txtResult.Text); // 원래 있던 값을 savedValue에 저장
            myOperator = btn.Content.ToString()[0];    // 연산자를 저장
            newButton = true;   // 계산 완료시 새로시작
        }

        // 소수점의 처리
        private void Dot_Click(object sender, RoutedEventArgs e)
        {
            if (txtResult.Text.Contains(".") == false)
                txtResult.Text += ".";
        }

        // = 버튼의 처리
        private void Equal_Click(object sender, RoutedEventArgs e)
        {
            if (myOperator == '+')
                txtResult.Text = (savedValue + double.Parse(txtResult.Text)).ToString();
            else if (myOperator == '-')
                txtResult.Text = (savedValue - double.Parse(txtResult.Text)).ToString();
            else if (myOperator == '*')
                txtResult.Text = (savedValue * double.Parse(txtResult.Text)).ToString();   
            else if (myOperator == '/')
                txtResult.Text = (savedValue / double.Parse(txtResult.Text)).ToString();
        }
    }
}

 

반응형