C#

037_Calculator

iwannabebackendexpert 2022. 4. 27. 11:33

 

<Window x:Class="_037_Calculator.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:_037_Calculator"
        mc:Ignorable="d"
        Title="윈도우계산기" Height="650" Width="400"
        Background="WhiteSmoke" MinHeight="500" MinWidth="300">
    <DockPanel Margin="5">
        <!--수식창과 계산결과-->
        <Grid DockPanel.Dock="Top" Height="100">
            <TextBox x:Name="txtExp" HorizontalContentAlignment="Right" 
                     FontSize="20"
                     Background="WhiteSmoke"
                     BorderThickness="0"></TextBox>
            <TextBox x:Name="txtResult" HorizontalContentAlignment="Right"
                     VerticalAlignment="Bottom"
                     FontSize="40"
                     FontWeight="Bold"
                     Margin="15"
                     Background="WhiteSmoke"
                     BorderThickness="0"></TextBox>
        </Grid>

        <!--메모리버튼-->
        <Grid DockPanel.Dock="Top" Height="60">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Button x:Name="btnMC" 
                    Click="btnMC_Click"
                    Grid.Column="0"
                    Background="WhiteSmoke"
                    BorderThickness="0"
                    FontSize="20"
                    FontWeight="Bold" HorizontalAlignment="Left" Width="78">MC</Button>
            <Button x:Name="btnMR"
                   Click="btnMR_Click"
                    Grid.Column="1"
                    Background="WhiteSmoke"
                    BorderThickness="0"
                    FontSize="20"
                    FontWeight="Bold">MR</Button>
            <Button x:Name="btnMPlus"
                    Click="btnMPlus_Click"
                    Grid.Column="2"
                    Background="WhiteSmoke"
                    BorderThickness="0"
                    FontSize="20"
                    FontWeight="Bold">M+</Button>
            <Button x:Name="btnMMinus"
                    Click="btnMMinus_Click"
                    Grid.Column="3"
                    Background="WhiteSmoke"
                    BorderThickness="0"
                    FontSize="20"
                    FontWeight="Bold" >M-</Button>
            <Button x:Name="btnMS"
                    Click="btnMS_Click"
                    Grid.Column="4"
                    Background="WhiteSmoke"
                    BorderThickness="0"
                    FontSize="20"
                    FontWeight="Bold">MS</Button>
        </Grid>

        <!--숫자및 연산자-->
        <Grid Background="Black">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Button x:Name="btnPercent"
                    Click="btnPercent_Click"
                    Grid.Column="0" Grid.Row="0"
                    Margin="1" FontSize="20"
                    BorderThickness="0">%</Button>
            <Button x:Name="btnSqrt"
                    Click="btnSqrt_Click"
                    Grid.Column="1" Grid.Row="0"
                    Margin="1" FontSize="20"
                    BorderThickness="0">√</Button>
            <Button x:Name="btnSqr" 
                    Click="btnSqr_Click"
                    Grid.Column="2" Grid.Row="0"
                    Margin="1" FontSize="20"
                    BorderThickness="0">x²</Button>
            <Button x:Name="btnRecip" 
                    Click="btnRecip_Click"
                    Grid.Column="3" Grid.Row="0"
                    Margin="1" FontSize="20"
                    BorderThickness="0">1/x</Button>

            <Button x:Name="btnCE" 
                    Click="btnCE_Click"
                    Grid.Column="0" Grid.Row="1"
                    Margin="1" FontSize="20"
                    BorderThickness="0">CE</Button>
            <Button x:Name="btnC" 
                    Click="btnC_Click"
                    Grid.Column="1" Grid.Row="1"
                    Margin="1" FontSize="20"
                    BorderThickness="0">C</Button>
            <Button x:Name="btnDelete"
                    Click="btnDelete_Click"
                    Grid.Column="2" Grid.Row="1"
                    Margin="1" FontSize="20"
                    BorderThickness="0">Del</Button>
            <Button x:Name="btnDivide" 
                    Click="op_Click"
                    Grid.Column="3" Grid.Row="1"
                    Margin="1" FontSize="20"
                    BorderThickness="0">÷</Button>

            <Button x:Name="btn7" 
                    Click="btn_Click"
                    Grid.Column="0" Grid.Row="2"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">7</Button>
            <Button x:Name="btn8" 
                    Click="btn_Click"
                    Grid.Column="1" Grid.Row="2"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">8</Button>
            <Button x:Name="btn9" 
                    Click="btn_Click"
                    Grid.Column="2" Grid.Row="2"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">9</Button>
            <Button x:Name="btnx" 
                    Click="op_Click"
                    Grid.Column="3" Grid.Row="2"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    >x</Button>

            <Button x:Name="btn4" 
                    Click="btn_Click"
                    Grid.Column="0" Grid.Row="3"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">4</Button>
            <Button x:Name="btn5" 
                    Click="btn_Click"
                    Grid.Column="1" Grid.Row="3"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">5</Button>
            <Button x:Name="btn6"
                    Click="btn_Click"
                    Grid.Column="2" Grid.Row="3"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">6</Button>
            <Button x:Name="btnMiuns"
                    Click="op_Click"
                    Grid.Column="3" Grid.Row="3"
                    Margin="1" FontSize="20"
                    BorderThickness="0">-</Button>

            <Button x:Name="btn1" 
                    Click="btn_Click"
                    Grid.Column="0" Grid.Row="4"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">1</Button>
            <Button x:Name="btn2" 
                    Click="btn_Click"
                    Grid.Column="1" Grid.Row="4"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">2</Button>
            <Button x:Name="btn3" 
                    Click="btn_Click"
                    Grid.Column="2" Grid.Row="4"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">3</Button>
            <Button x:Name="btnPlus" 
                    Click="op_Click"
                    Grid.Column="3" Grid.Row="4"
                    Margin="1" FontSize="20"
                    BorderThickness="0" HorizontalAlignment="Left" Width="95">+</Button>

            <Button x:Name="btnPM" 
                    Click="btnPM_Click"
                    Grid.Column="0" Grid.Row="5"
                    Margin="1" FontSize="20"
                    BorderThickness="0">±</Button>
            <Button x:Name="btn0"
                    Click="btn_Click"
                    Grid.Column="1" Grid.Row="5"
                    Margin="1" FontSize="24"
                    BorderThickness="0"
                    FontWeight="Bold"
                    Background="WhiteSmoke">0</Button>
            <Button x:Name="btnDot"
                    Click="btnDot_Click"
                    Grid.Column="2" Grid.Row="5"
                    Margin="1,1,0,1" FontSize="20"
                    BorderThickness="0" HorizontalAlignment="Left" Width="96"
                    >.</Button>
            <Button x:Name="btnEqul" 
                    Click="btnEqul_Click"
                    Grid.Column="3" Grid.Row="5"
                    Margin="1" FontSize="20"
                    BorderThickness="0">=</Button>
        </Grid>

    </DockPanel>
</Window>

 

큰 틀로써 설명하자면 Grid.RowDefinitions와 Grid.ColumnDefinitions로 계산기의 틀을 만들어주고

각각의 버튼에 이벤트와 이름을 지정해준다.

 

public partial class MainWindow : Window
    {
        private bool opFlag;
        private bool memFlag;
        private double saved;
        private string op;
        private bool afterCalc;
        private double memory;

        public MainWindow()
        {
            InitializeComponent();
            btnMC.IsEnabled = false;
            btnMR.IsEnabled = false;
        }

        private void btnMC_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = "0";
            memory = 0;
            btnMR.IsEnabled=false;
            btnMC.IsEnabled=false;
        }

        private void btnDot_Click(object sender, RoutedEventArgs e)
        {
            if (txtResult.Text.Contains("."))
                return;
            else
                txtResult.Text += ".";
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            string s = btn.Content.ToString();
            txtExp.Text = "";
            //출력창이 0이거나 연산자 버튼이 눌린 후, 메모리 버튼이 눌리거나, afterCalc가 눌리거나
            if (txtResult.Text == "0" || opFlag == true || memFlag == true||afterCalc == true) //aftercalc : 결과 버튼 누른후 새로운 계산위해서 s로 바꿈
            {
                
                if (afterCalc == true)
                    txtExp.Text = "";
                txtResult.Text = s; //s로 바꾸기
                afterCalc = false;
                opFlag = false;
                memFlag = false;
            }


            else
                txtResult.Text += s; //s뒤에 붙이기
        }

        //사칙연산자 클릭
        private void op_Click(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;

            saved = double.Parse(txtResult.Text);
            txtExp.Text = txtResult.Text + btn.Content.ToString();
            op = btn.Content.ToString();
            opFlag = true;



        }

        private void btnEqul_Click(object sender, RoutedEventArgs e)
        {
            double v = double.Parse(txtResult.Text);
            txtExp.Text += txtExp.Text + "=";
            switch (op)
            {
                case "+":
                    txtResult.Text = (saved + v).ToString();
                    break;
                case "-":
                    txtResult.Text = (saved - v).ToString();
                    break;
                case "x":
                    txtResult.Text = (saved * v).ToString();
                    break;
                case "%":
                    txtResult.Text = (saved / v).ToString();
                    break;
                

            }
            afterCalc = false;

        }

        private void btnPM_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = ((-1) * double.Parse(txtResult.Text)).ToString();
        }

        private void btnPercent_Click(object sender, RoutedEventArgs e)
        {
            double p = Double.Parse(txtResult.Text);
            p = saved * p / 100;
            txtResult.Text = p.ToString();
            //txtExp.Text += txtResult.Text;
        }

        private void btnSqrt_Click(object sender, RoutedEventArgs e)
        {
            if (txtExp.Text == "")
                txtExp.Text = "√(" + txtResult.Text + ")";
            else
                txtExp.Text = "√(" + txtExp.Text + ")";
            txtResult.Text=Math.Sqrt(double.Parse(txtResult.Text)).ToString();
        }

        private void btnSqr_Click(object sender, RoutedEventArgs e)
        {
            if (txtExp.Text == "")
                txtExp.Text = "sqr(" + txtResult.Text + ")";
            else
                txtExp.Text = "sqr(" + txtExp.Text + ")";

            double v = double.Parse(txtResult.Text);
            txtResult.Text = (v * v).ToString();
        }

        private void btnRecip_Click(object sender, RoutedEventArgs e)
        {
            if (txtExp.Text == "")
                txtExp.Text = "1/(" + txtResult.Text + ")";
            else
                txtExp.Text = "1/(" + txtExp.Text + ")";

            double v = double.Parse(txtResult.Text);
            txtResult.Text = (1/v).ToString();
        }

        private void btnCE_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = "0";
        }

        private void btnC_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = "0";
            txtExp.Text = "";
            saved = 0;
            op = "";
            opFlag = false;
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = txtResult.Text.Remove(txtResult.Text.Length - 1);
            if (txtResult.Text.Length == 0)
                txtResult.Text = "0";
            
        }

        private void btnMS_Click(object sender, RoutedEventArgs e)
        {
            memory = double.Parse(txtResult.Text);
            btnMC.IsEnabled = true;
            btnMR.IsEnabled = true;
            memFlag = true;
        }

        private void btnMR_Click(object sender, RoutedEventArgs e)
        {
            txtResult.Text = memory.ToString();
            memFlag = true;

        }

        private void btnMPlus_Click(object sender, RoutedEventArgs e)
        {
            memory += double.Parse(txtResult.Text);

        }

        private void btnMMinus_Click(object sender, RoutedEventArgs e)
        {
            memory -= double.Parse(txtResult.Text);
        }
    }

'C#' 카테고리의 다른 글

039_PhoneBook(Access DB예제)  (0) 2022.05.20
038_ListArray  (0) 2022.05.11
035_036_ChessBoard  (0) 2022.04.13
034_UserControl  (0) 2022.04.13
033_StackPanel  (0) 2022.04.12