외로운 Nova의 작업실
c# 계산기프로그램만들기 - 6 본문
이번에는 실수도 계산이 가능하게 만들어볼 생각이다.
일단 아래는 계산기 모양이다.
원래는 실수+정수, 정수+실수,실수-정수.... 경우의수를 나눠서 해야할것같았는데 너무 복잡한 코드가 나올것같았다.
간단하게 코드를 작성하기위해 계속 고민했는데, 답을 얻었다. 바로 속으로는 다 실수형으로 계산하고 겉으로는 정수값이면 정수형으로 표시하는것이다.
그러면 한가지 함수가 필요한데, 해당 숫자가 정수형인지 실수형인지 판단하는 함수가 필요하다.
그 함수구현은 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();
}
}
}
'Programming > C#' 카테고리의 다른 글
c# 언어 공부 - 2(산술연산자, 코드흐름제어, 메소드) (0) | 2022.04.30 |
---|---|
c# 언어 공부 - 1(자료형) (0) | 2022.04.29 |
c# 계산기프로그램만들기 - 5 (0) | 2022.03.22 |
c# 계산기프로그램만들기 - 4 (0) | 2022.03.22 |
c# 계산기프로그램만들기 - 3 (0) | 2022.03.22 |
Comments