외로운 Nova의 작업실

c# 계산기프로그램만들기 - 6 본문

Programming/C#

c# 계산기프로그램만들기 - 6

Nova_ 2022. 3. 22. 11:36

이번에는 실수도 계산이 가능하게 만들어볼 생각이다.

일단 아래는 계산기 모양이다.

원래는 실수+정수, 정수+실수,실수-정수.... 경우의수를 나눠서 해야할것같았는데 너무 복잡한 코드가 나올것같았다.

간단하게 코드를 작성하기위해 계속 고민했는데, 답을 얻었다. 바로 속으로는 다 실수형으로 계산하고 겉으로는 정수값이면 정수형으로 표시하는것이다.

그러면 한가지 함수가 필요한데, 해당 숫자가 정수형인지 실수형인지 판단하는 함수가 필요하다.

그 함수구현은 10.0-10 = 0 인점을 이용해서 구현했다. 아래는 관련 함수이다.

 private int IsIntOnNumber(Double Db)//실수형 자료가 정수인지 판단해서 정수형이면 1반한 실수면 -1반환
        {
            if(Db - ((int)Db) == 0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }

이 함수를 이용해서 SubResultLabel이나 Report나 Screen에 정수형일대 .빼고 출력 실수형일때 그대로 출력하도록했다. 아래는 관련 코드이다.

private void ResultButton_Click(object sender, EventArgs e)//=버튼 누르면 동작됨
        {

            PreResultProcessing();

            WriteReport();

            ChangeGear(5);
            ShowSubResult();

            if(IsIntOnNumber(result) == 1)
            {
                int temp = (int)result;
                Screen.Text = temp.ToString();
            }
            else
            {
                Screen.Text = result.ToString();
            }

            ReadReport();

            FocusOnLabel.Focus();
        }

        private void ShowSubResult()//subresult레이블에 직전에 했던 내용 표시
        {
            if (IsIntOnNumber(result) == 1)
            {
                int temp = (int)result;
                SubResultLabel.Text = temp.ToString();
            }
            else
            {
                SubResultLabel.Text = result.ToString();
            }
            if(gear == 1)
            {
                SubResultLabel.Text += "+";
            }
            else if(gear == 2)
            {
                SubResultLabel.Text += "-";
            }
            else if (gear == 3)
            {
                SubResultLabel.Text += "/";
            }
            else if(gear == 4)
            {
                SubResultLabel.Text += "*";
            }
            else if(gear == 5)
            {
                SubResultLabel.Text = "";
            }
            else if(gear == 0)
            {
                SubResultLabel.Text = "";
            }
        }

또한 . 버튼도 만들고 keydown이벤트에 등록햇다.

"."버튼 keycode는 keys.decimal이다.

아래는 관련 코드이다.

 private void Form1_KeyDown(object sender, KeyEventArgs e)

        {
            switch (e.KeyCode)
            {
                case Keys.Enter:
                    ResultButton_Click(sender, e);
                    break;
                case Keys.NumPad0:
                    NumberButton0_Click(sender, e);
                    break;
                case Keys.NumPad1:
                    NumberButton1_Click(sender, e);
                    break;
                case Keys.NumPad2:
                    NumberButton2_Click(sender, e);
                    break;
                case Keys.NumPad3:
                    NumberButton3_Click(sender, e);
                    break;
                case Keys.NumPad4:
                    NumberButton4_Click(sender, e);
                    break;
                case Keys.NumPad5:
                    NumberButton5_Click(sender, e);
                    break;
                case Keys.NumPad6:
                    NumberButton6_Click(sender, e);
                    break;
                case Keys.NumPad7:
                    NumberButton7_Click(sender, e);
                    break;
                case Keys.NumPad8:
                    NumberButton8_Click(sender, e);
                    break;
                case Keys.NumPad9:
                    NumberButton9_Click(sender, e);
                    break;
                case Keys.Add:
                    PlusButton_Click(sender, e);
                    break;
                case Keys.Subtract:
                    MinusButton_Click(sender, e);
                    break;
                case Keys.Multiply:
                    MultipleButton_Click(sender, e);
                    break;
                case Keys.Divide:
                    DivisionButton_Click(sender, e);
                    break;
                case Keys.Back:
                    RemoveButton_Click(sender, e);
                    break;
                case Keys.Decimal:
                    DotButton_Click(sender, e);
                    break;
                default:
                    break;
            }
        }

이로써 계산기 만들기 프로젝트는 끝이났다.

이제 예외처리나 다양한것들을 발전시킬 수 있는데, 사용하는 사람이 없으니 그건 생략하도록 하겠다.

간단하게 계산기 프로그램을 만들어보았다.

다음에는 소켓프로그래밍으로 채팅방 form을 만들어볼 생각이다.

아래는 최종 코드이다.

using System.IO;

namespace CalCulator
{
    public partial class Form1 : Form
    {

        double result = 0.0;
        int gear = 0;// 빼기엿는지 더하기 엿는지 확인하는 변수 1-더하기 2-빼기 3-결과보기 result버튼 클릭시 이 변수를 확인해서 연산함public Form1()
        {
            InitializeComponent();
        }
//여기서부터는 파일 입출력 관련 함수 정의private void WriteReport()//연산을 하는 식을 텍스트 파일에 쓰고 닫음
        {
            StreamWriter wr = new StreamWriter("Report.txt", append : true);
            wr.WriteLine(SubResultLabel.Text + Screen.Text);
            wr.WriteLine("=" + result);

            wr.Close();
        }

        private void ReadReport()//report에 써있는 것들을 reportlabel에 전달
        {
            StreamReader rd = new StreamReader("Report.txt");

            String S = rd.ReadToEnd();

            ReportLabel.Text = S;

            rd.Close();

        }
//여기서부터는 내장 함수 정의private void WriteNumber(String Number)//숫자를 문자열로 넣으면 스크린에 문자를 넣어주는 함수,반환값은 없다
        {
            if (Screen.Text == "0")
            {
                Screen.Text = Number;
            }
            else if (gear == 5)
            {
                Screen.Text = Number;
                ChangeGear(0);
                result = 0;
            }
            else
            {
                Screen.Text += Number;
            }

            return;

        }

        private void Add()//스크린 숫자를 result변수에 더해줌
        {
            result = result + Convert.ToDouble(Screen.Text);

            return;
        }
        private void Sub()//스크린 숫자를 result변수에서 빼줌
        {
            result = result - Convert.ToDouble(Screen.Text);

            return;
        }
        private void Div()//스크린 숫자를 result변수에서 나눠줌
        {
            result = result / Convert.ToDouble(Screen.Text);

            return;
        }
        private void Multi()//스크린 숫자를 result변수에 곱해줌
        {
            result = result * Convert.ToDouble(Screen.Text);
        }
        private void ChangeGear(int Temp)
        {
            gear = Temp;
        }

        private void ShowSubResult()//subresult레이블에 직전에 했던 내용 표시
        {
            if (IsIntOnNumber(result) == 1)
            {
                int temp = (int)result;
                SubResultLabel.Text = temp.ToString();
            }
            else
            {
                SubResultLabel.Text = result.ToString();
            }
            if(gear == 1)
            {
                SubResultLabel.Text += "+";
            }
            else if(gear == 2)
            {
                SubResultLabel.Text += "-";
            }
            else if (gear == 3)
            {
                SubResultLabel.Text += "/";
            }
            else if(gear == 4)
            {
                SubResultLabel.Text += "*";
            }
            else if(gear == 5)
            {
                SubResultLabel.Text = "";
            }
            else if(gear == 0)
            {
                SubResultLabel.Text = "";
            }
        }

        private void PreResultProcessing()
        {
            if (gear == 0)
            {
                Add();
            }
            else if (gear == 1)
            {
                Add();
            }
            else if (gear == 2)
            {
                Sub();
            }
            else if (gear == 3)
            {
                Div();
            }
            else if (gear == 4)
            {
                Multi();
            }

            return;
        }

//여기서부터는 숫자버튼 이벤트 함수 정의private void NumberButton1_Click(object sender, EventArgs e)
        {
            WriteNumber("1");
            FocusOnLabel.Focus();
        }

        private void NumberButton2_Click(object sender, EventArgs e)
        {
            WriteNumber("2");
            FocusOnLabel.Focus();
        }

        private void NumberButton3_Click(object sender, EventArgs e)
        {
            WriteNumber("3");
            FocusOnLabel.Focus();
        }

        private void NumberButton4_Click(object sender, EventArgs e)
        {
            WriteNumber("4");
            FocusOnLabel.Focus();

        }

        private void NumberButton5_Click(object sender, EventArgs e)
        {
            WriteNumber("5");
            FocusOnLabel.Focus();
        }

        private void NumberButton6_Click(object sender, EventArgs e)
        {
            WriteNumber("6");
            FocusOnLabel.Focus();
        }

        private void NumberButton7_Click(object sender, EventArgs e)
        {
            WriteNumber("7");
            FocusOnLabel.Focus();
        }

        private void NumberButton8_Click(object sender, EventArgs e)
        {
            WriteNumber("8");
            FocusOnLabel.Focus();
        }

        private void NumberButton9_Click(object sender, EventArgs e)
        {
            WriteNumber("9");
            FocusOnLabel.Focus();
        }

        private void NumberButton0_Click(object sender, EventArgs e)
        {
            WriteNumber("0");
            FocusOnLabel.Focus();
        }

//기호버튼 이벤트 함수 정의private void PlusButton_Click(object sender, EventArgs e)
        {
            PreResultProcessing();
            ChangeGear(1);
            ShowSubResult();

            Screen.Text = "0";

            FocusOnLabel.Focus();
        }

        private void MinusButton_Click(object sender, EventArgs e)
        {
            PreResultProcessing();
            ChangeGear(2);
            ShowSubResult();

            Screen.Text = "0";

            FocusOnLabel.Focus();
        }

        private void DivisionButton_Click(object sender, EventArgs e)
        {
            PreResultProcessing();

            ChangeGear(3);
            ShowSubResult();

            Screen.Text = "0";

            FocusOnLabel.Focus();
        }

        private void MultipleButton_Click(object sender, EventArgs e)
        {
            PreResultProcessing();

            ChangeGear(4);
            ShowSubResult();

            Screen.Text = "0";

            FocusOnLabel.Focus();
        }
        private void ResultButton_Click(object sender, EventArgs e)
        {

            PreResultProcessing();

            WriteReport();

            ChangeGear(5);
            ShowSubResult();

            if(IsIntOnNumber(result) == 1)
            {
                int temp = (int)result;
                Screen.Text = temp.ToString();
            }
            else
            {
                Screen.Text = result.ToString();
            }

            ReadReport();

            FocusOnLabel.Focus();
        }

        private void CancelButton_Click(object sender, EventArgs e)
        {
            result = 0.0;
            gear = 0;
            Screen.Text = "0";

            MessageBox.Show("계산기가 초기화 되었습니다");
            ShowSubResult();
            DeleteTextFile();
            ReportLabel.Text = "";

            FocusOnLabel.Focus();
        }

//여기서부터는 키보드랑 버튼 연동 함수private void Form1_KeyDown(object sender, KeyEventArgs e)

        {
            switch (e.KeyCode)
            {
                case Keys.Enter:
                    ResultButton_Click(sender, e);
                    break;
                case Keys.NumPad0:
                    NumberButton0_Click(sender, e);
                    break;
                case Keys.NumPad1:
                    NumberButton1_Click(sender, e);
                    break;
                case Keys.NumPad2:
                    NumberButton2_Click(sender, e);
                    break;
                case Keys.NumPad3:
                    NumberButton3_Click(sender, e);
                    break;
                case Keys.NumPad4:
                    NumberButton4_Click(sender, e);
                    break;
                case Keys.NumPad5:
                    NumberButton5_Click(sender, e);
                    break;
                case Keys.NumPad6:
                    NumberButton6_Click(sender, e);
                    break;
                case Keys.NumPad7:
                    NumberButton7_Click(sender, e);
                    break;
                case Keys.NumPad8:
                    NumberButton8_Click(sender, e);
                    break;
                case Keys.NumPad9:
                    NumberButton9_Click(sender, e);
                    break;
                case Keys.Add:
                    PlusButton_Click(sender, e);
                    break;
                case Keys.Subtract:
                    MinusButton_Click(sender, e);
                    break;
                case Keys.Multiply:
                    MultipleButton_Click(sender, e);
                    break;
                case Keys.Divide:
                    DivisionButton_Click(sender, e);
                    break;
                case Keys.Back:
                    RemoveButton_Click(sender, e);
                    break;
                case Keys.Decimal:
                    DotButton_Click(sender, e);
                    break;
                default:
                    break;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)//종료버튼 누르면 리포트 텍스트상자 없애는 함수
        {
            DeleteTextFile();
        }

        private void DeleteTextFile()//파일삭제 함수
        {
            if (File.Exists("Report.txt"))
            {
                File.Delete("Report.txt");
            }
        }

        private string RemoveEndChar(String s)//s의 문자열에서 마지막 문자만 빼고 남은 문자열을 반환해줌
        {
            int length = s.Length;

            return s.Substring(0, length - 1);

        }

        private void RemoveButton_Click(object sender, EventArgs e)//remove버튼 클릭 함수
        {
            Screen.Text = RemoveEndChar(Screen.Text);

        }

        private int IsIntOnNumber(Double Db)//실수형 자료가 정수인지 판단해서 정수형이면 1반한 실수면 -1반환
        {
            if(Db - ((int)Db) == 0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }

        private void DotButton_Click(object sender, EventArgs e)
        {
            Screen.Text = Screen.Text + ".";
            FocusOnLabel.Focus();
        }
    }
}

 

 

Comments