상세 컨텐츠

본문 제목

1-7 1차나 상수식을 검증하는 프로그램

과제

by 근성 2021. 7. 12. 13:53

본문

1차나 상수식을 검증하는 프로그램을 작성해야합니다.

식을 입력받고 주어진 규칙을 만족해야합니다.

1. 괄호의 갯수가 짝수여야 합니다.

2. 곱하기 기호'*'를 거르면 안됩니다.

3. 연산기호인 +, -, *, / 양쪽에는 항상 숫자혹은 미지수'x' 또는 유효한 괄호가 있어야 합니다.

 

문제 설명을 보고 정말 쉽다고 생각했지만 이 문제가 1차과제중에서 제일 어려웠던것 같습니다.

 

이 문제를 풀때 저는 어떤 생각을했냐면

1. 상수식이나 일차식만 검증하면 되므로 2차식이 나오면 faulty를 적용해야하나?

2. 계산기처럼 만들고 값에 따라 faulty를 적용해야하나?

3. 그냥 노가다로 해야하나?

이정도 였는데, 1번 2번을 해도 괄호마다 식을 최소화 시켜야하는 과정을 보여줘야해서

1번2번 과정에서 1.5일을 쓰고 다시 3번과정으로 갈아탔습니다.

 

3번과정에는 크게 4가지 경우를 생각했습니다.

 

1. 괄호갯수가 홀수 일때(괄호가 짝이 안맞는다는 뜻)

ex) (x+2*(25+x) 는 fualty

2. 부호다음에 부호가 올때

ex) 4+- fualty

3. 닫는 부호다음에 바로 여는부호가 올때

ex) )( fulaty

4. 숫자다음에 '*'없이 x가 올때

ex) 5x

 

인 경우를 생각해서 문자열 배열을 통해 if문으로 나눴습니다.

#include<iostream>

using namespace std;

int main()
{
	bool result = true;
	string formula;
	int pa_count = 0;

	int index[sizeof(formula)];//괄호위치 index배열
	int seq = 0;
	int half;

	cout << "formula:";
	cin >> formula;

	for (int i = 0; formula[i] != 0; i++)
	{
		if (formula[i] == '(' || formula[i] == ')')//부호갯수
		{
			++pa_count;
			index[seq] = i;//괄호위치입력
			++seq;
		}

		half = seq / 2;
	}
	for (int i = 0; formula[i] != 0; i++)
	{
		if ((formula[i] == '+' || formula[i] == '-' || formula[i] == '*' || formula[i] == '/') && (formula[i + 1] == '+' || formula[i + 1] == '-' || formula[i + 1] == '*' || formula[i + 1] == '/'))
		{
			result = false;
		}//부호 다음에 부호가 올때

		else if (formula[i] == ')' && formula[i + 1] == '(')//닫는 부호다음에 바로 여는부호가 나올때
		{
			result = false;
		}

	}
	if (pa_count % 2 == 1)//괄호갯수가 홀수일때
		result = false;

	if (seq % 2 == 1)
	{
		for (int i = 1; i < half + 1; i++)
		{
			for (int j = index[half + 1 - i] + 1; j < index[half + i]; j++)
			{
				cout << formula[j];
			}
			cout << "\n";
		}
		cout << formula << endl;
		cout << '(' << formula << ')' << endl;
	}
	else
	{
		for (int i = 1; i < half + 1; i++)
		{
			for (int j = index[half - i] + 1; j < index[half + i - 1]; j++)
			{
				cout << formula[j];
			}
			cout << "\n";
		}
		cout << formula << endl;
		cout << '(' << formula << ')' << endl;


	}
	if (result == false)
		cout << "fualty" << endl;
	else
		cout << "integrity" << endl;
}

 

 

 

올바른 예시 두개

제가 짠 코드에는 예외가 여러개가 있을 수 있습니다.

코드에 대해서 만점을 받은것도 아니라서 부족한점이 있을것입니다.

 

이번문제는 노가다 문제라고 생각이 되었고, 다른 동기친구들도 그렇게 말하더라구요

퀄리티가 좀...

 

#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향프로그래밍 과제문제입니다.

관련글 더보기

댓글 영역