23.04.03 Day45

오윤범·2023년 4월 3일
0

C++ 프로그래밍 코딩테스트

계산기 프로그램 작성(Vector 사용)

Calculator.h

//작성자 : 오윤범
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include<string>
#include<vector>
using namespace std;
class Calculator
{
public:
	double Calculate(string str);
private:
	vector<double> number;
	vector<char> cper;
};
#endif

Calculator.cpp

//작성자 : 오윤범
#include "Calculator.h"
#include<iostream>
#include<sstream>
#include<vector>
#include<ctype.h>//isdigit() 사용하기 위해 필요함
using namespace std;
double Calculator::Calculate(string str)
{
	number.clear();//벡터 공간 초기화
	cper.clear();// 벡터 공간 초기화
	stringstream ss(str);//1+2 라고 입력한다고 가정
	double cal_number;//계산 시 사용되는 숫자들을 담는 변수
	char cal_cper;//계산 시 사용되는 연산자들을 담는 변수
	bool valid_input = true;//입력값이 유효한지 판단
	while (ss >> cal_number)//cal_number:1,2 
	{
		number.push_back(cal_number);//number[0]=1 , number[1]=2
		if (ss >> cal_cper)// cal_cper:+
		{
			cper.push_back(cal_cper);//cper[0]= +
		}
	}

	for (int i = 0; i < str.length(); i++)//입력된 문자열 길이만큼 돌면서
	{
		if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/')//!isdigit(str[i] -> str[i]가 숫자가 아니고, 사칙연산(+ - * /) 이 아닌 다른 입력이 들어오면 
		{
			valid_input = false;//valid_input을 false로 바꿔줌
			break;
		}
	}

	if (valid_input)//유효한 입력값이 들어왔을때만(유효한 입력인지는 25행~32행에서 판단) 정상적으로 수행
	{
		double result = number[0];//1+2 입력시에 처음에 result에는 1이 들어오고
		for (int i = 0; i < cper.size(); i++)
		{
			switch (cper[i])
			{
			case '+':
				result += number[i + 1];// 1+2 라고 입력이 들어오면 number[0] + num[1] 즉 1+2가 result값으로 저장됨
				cout << "= " << result << endl;
				break;
			case '-':
				result -= number[i + 1];//+와동일
				cout << "= " << result << endl;
				break;
			case '*':
				result *= number[i + 1];//*와 동일
				cout << "= " << result << endl;
				break;
			case '/':
				if (number[i + 1] != 0)//나누는수가 0이 아니면 정상 실행
				{
					result /= number[i + 1];
					cout << "= " << result << endl;
				}
				else
				{
					cout << "Attempted to divide by zero!" << endl;//나누는 수가 0인경우 오류 발생
				}
				break;
			default:
				break;
			}
		}
		return result;
	}
	else//정상적인 입력이 아닌 경우 즉 valid_input 이 false인 경우
	{
		cout << "정상적인 수식을 입력하세요!!" << endl;//오류발생
		return 0;
	}
}

CalculatorTutorial.cpp

//작성자 : 오윤범
#include<iostream>
#include<string>
#include "Calculator.h"
using namespace std;
int main()
{
	Calculator calculator;
	string str_input;//사용자가 입력하는 문자열
	cout << "Calculator Console Application" << endl << endl << "Please enter the operation to perform.Format: a + b | a - b | a * b | a / b" << endl << "Press \"ctrl + c\" to exit the program" << endl << endl;

	while (true)
	{
		cout << "input >> ";
		getline(cin, str_input);//사용자가 입력하는 문자열을 str_input으로 저장
		if (cin.eof())//ctrl+c 만나면 프로그램 종료
		{
			exit(0);
		}
		calculator.Calculate(str_input);
	}
}

1) Vector을 처음 사용해봐서 좀 어려웠음
2) Stringstream 이해하는데 어려웠음
3) 유효한 입력인지 확인할 때 사용하는 isdigit()함수 처음 알았음
4) c++에서는 Ctrl+c같은 특수 입력을 cin.eof()로 잡는지 처음 알았음

0개의 댓글