괄호 검사 프로그램 응용
조회수 1314회
c언어로 괄호 검사 프로그램에서 오류가 났을 때 그 오류에 대한 설명을 좀 더 자세히 출력하도록 하는 부분을 코딩을 잘 못 하겠습니다 포인터를 써야 되는 것 같은데 포인터가 너무 어려워서 시작을 못하겠습니다.
교재의 프로그램은 에러코드를 반환 받아 최종 결과를 main에서 '에러 type만을' 출력해 준다. 이를 개선해서 가능한 상세한 에러메시지를 출력하게 하라. 예를 들면
"8번째 문자에서 에러: ')' 를 만났는데 stack의 open_ch는 '[' 임"
"수식은 끝났는데, 스택에 남아있는 요소들은 ... 임" (print_stack() 호출해서)
*힌트: 이를 위해서는 main()은 수정하지 않고, check_matching()함수안에서 "return 1" 과 같이 에러 리턴하는 곳에서 상세 에러내용을 출력하면 됨
코드를 읽기 위해 필요한 항목
조건 1 :왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.
조건 2:같은 타입의 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다. 조건 3:서로 다른 타입의 괄호 쌍이 서로를 교차하면 안 된다.
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
#define _CRT_SECURE_NO_WARNINGS
typedef int Element;
Element data[MAX_STACK_SIZE];
int top;
void error(char str[])
{
printf("%s\n", str);
exit(1);
}
void init_stack() { top = -1; }
int is_empty() { return top == -1; }
int is_full() { return top == MAX_STACK_SIZE - 1; }
int size() { return top + 1; }
void push(Element e)
{
if (is_full())
error("스택 포화 에러");
data[++top] = e;
}
Element pop()
{
if (is_empty())
error("스택 공백 에러");
return data[top--];
}
Element peek()
{
if (is_empty())
error("스택 공백 에러");
return data[top];
}
void print_stack(char msg[]) {
int i;
printf("%s[%2d개]=", msg, size());
for (i = 0; i < size();i++)
printf("%2d ", data[i]);
printf("\n");
}
int check_matching(char expr[])
{
int i = 0, prev;
char ch;
init_stack();
while (expr[i] != '\0') {
ch = expr[i++];
if (ch == '[' || ch == '(' || ch == '{')
push(ch);
else if (ch == ']' || ch == ')' || ch == '}') {
if (is_empty())
return 2;
prev = pop();
if((ch == ']'&& prev !='[')
|| (ch == ')' && prev != '(')
|| (ch == '}' && prev != '{')){
return 3;
}
}
}
if (is_empty() == 0) return 1;
return 0;
}
void main()
{
char expr[4][80] = { "{A[(i+1)]=0;}", "if((i==0) && (j==0)", "A[(i+1])=0;", "A[i] =f)(;" };
int errCode, i;
for (i = 0; i < 4;i++) {
errCode = check_matching(expr[i]);
if (errCode == 0)
printf("정상: %s\n", expr[i]);
else
printf("오류: %s(조건%d 위반)\n", expr[i], errCode);
}
}
댓글 입력