편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.03.31

    괄호 검사 프로그램 응용


    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);
    
        }
    }
    
    
  • 프로필 박태윤님의 편집
    날짜2021.03.31

    괄호 검사 프로그램 응용


    c언어로 괄호 검사 프로그램에서 오류가 났을 때 그 오류에 대한 설명을 좀 더 자세히 출력하도록 하는 부분을 코딩을 잘 못 하겠습니다 포인터를 써야 되는 것 같은데 포인터가 너무 어려워서 시작을 못하겠습니다. 교재의 프로그램은 에러코드를 반환 받아 최종 결과를 main에서 '에러 type만을' 출력해 준다. 이를 개선해서 가능한 상세한 에러메시지를 출력하게 하라. 예를 들면

    "8번째 문자에서 에러: ')' 를 만났는데 stack의 open_ch는 '[' 임"

    "수식은 끝났는데, 스택에 남아있는 요소들은 ... 임" (print_stack() 호출해서)

    *힌트: 이를 위해서는 main()은 수정하지 않고, check_matching()함수안에서 "return 1" 과 같이 에러 리턴하는 곳에서 상세 에러내용을 출력하면 됨

    코드를 읽기 위해 필요한 항목

    조건 1 :왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.

    조건 2:같은 타입의 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다. 조건 3:서로 다른 타입의 괄호 쌍이 서로를 교차하면 안 된다.

    include

    include

    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);

    }

    }