文本文件中的行被多次评估?

时间:2014-01-28 04:34:28

标签: c postfix-notation infix-notation

我需要将中缀转换为后缀并评估后缀表达式。从文件中读取时,我应该能够一次评估多个表达式。但是当我运行它并遇到一个表达式时,由于有更多的闭括号而不是开放的括号,它的形式不是很好,它会对该表达式进行2或3次计算。

代码:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000


typedef struct stack
{
    int data[MAX];
    int top;
} stack;



int priority(char);
void init(stack*);
int empty(stack*);
int full(stack*);
char pop(stack*);
void push(stack*, char);
char top(stack*);
void add(char*, char, int);
void keyboard();
void read_file();
int change(char);
void pushYO(double);
double popYO();


stack s;
char x;
int i, token, topYO = -1;
double result[MAX];

char filepath[MAX];

int main()
{
    char choice;
    init(&s);
    system("CLS");
    printf("[1] Keyboard \n[2] Read from text file \n[3] Exit \n");
    scanf("%c", &choice);
    if(choice != '1' && choice != '2' && choice != '3')
    {
        main();
    }
    else if(choice == '1')
    {
        keyboard();
    }
    else if(choice == '2')
    {
        read_file();
    }
    else if(choice == '3')
    {
        printf("\nThank you for using Kei Shirabe's \ninfix to postfix converter and evaluator! :)\n");
        exit(0);
    }
}


void keyboard() //the keyboard input version. this works fine
{
//code here
}


void read_file()
{
    int z, count, form, paren;
    double one, two, three = 1;
    char infx[MAX];
    char pofx[MAX];
    char choice;
    FILE *text = fopen("text.txt", "a");
    printf("Enter path of file:");
    scanf("%s",&filepath);
    FILE *textYO = fopen(filepath, "r");
    if((textYO) == NULL)
    {
        printf("\nError! Unable to open %s\n\n", filepath);
    }
    else
    {

        while((fgets(infx, MAX, textYO))!= NULL)
        {
            form = -1, paren = 0, count = 0, z = 0;
            infx[
            strlen(infx)-1] = '\0';


        for (i=0; i<strlen(infx); i++)
        {
            if((token = infx[i]) != '\n')
            {
                if(isalnum(token))
                {
                    form++;
                }
                else
                {

                    if(token == '(')
                    {
                        paren++;

                    }
                    else if(token == ')')
                    {
                        paren--;
                    }
                    else
                    {
                        form--;
                    }

                }

                if (paren < 0)
                {
                    printf("%s", infx);
                    fprintf(text, "%s", infx);
                    printf("\n\nError! Not well formed :( \n-----------------\n");
                    fprintf(text, "\n\nError! Not well formed :( \n-----------------\n");
                }
                else
                if(isalnum(token))
                {
                    add(pofx, token, count);
                    count++;
                }
                else
                if(token == '(')
                   {
                        push(&s, '(');
                   }
                   else
                   {
                       if(token == ')')
                       while((x = pop(&s)) != '(')
                             {
                                 add(pofx, x, count);
                                 count++;
                             }

                             else
                             if(token == '^')
                             {
                                 push(&s, token);
                             }
                             else

                             {
                                 while(priority(token) <= priority(top(&s)) && !empty(&s))
                                 {
                                     x = pop(&s);
                                     add(pofx, x, count);
                                     count++;
                                 }
                                 push(&s, token);
                             }
                    }
            }
            else
            {
            while(!empty(&s))
            {
                x = pop(&s);
                add(pofx, x, count);
                count++;
            }
            }
        }

        if(form != 0 || paren != 0)
        {
            printf("%s", infx);
            fprintf(text, "%s", infx);
            printf("\n\nError! Not well formed :( \n-----------------\n");
            fprintf(text, "\n\nError! Not well formed :( \n-----------------\n");
        }
        else
        {
            form = -1, paren = 0;
            printf("%s", infx);
            fprintf(text, "%s", infx);
            printf("\n\nPostfix: %s \n\n", pofx);
            fprintf(text, "\n\nPostfix: %s\n\n", pofx);

            while((token = pofx[z++]) != '\0')
            {
                three = 1;
                if(!isdigit(token) && !isalpha(token))
                {
                    two = popYO();
                    one = popYO();

                    switch(token)
                    {
                        case '+':
                        pushYO(one+two); break;
                        case '-':
                        pushYO(one-two); break;
                        case '*':
                        pushYO(one*two); break;
                        case '/':
                        pushYO(one/two); break;
                        case '^':
                        if (two > 0)
                        {
                        for(i=0;i<two;i++)
                        {
                            three = three * one;
                        }
                        pushYO(three);
                        three = 1; break;
                        }
                        else
                        {
                        for(i=0;i<(two-(2*two));i++)
                        {
                            three = three * one;
                        }
                        pushYO((1/three));
                        three = 1; break;
                        }
                        }
                    }


                else if(isalpha(token))
                {
                    if(isupper(token))
                    {
                        pushYO(token - '@');
                    }

                    if(islower(token))
                    {
                        pushYO(token - change(token));
                    }
                }
                else
                {
                    pushYO(token - '0');
                }
            }

            printf("Result: %lf\n-----------------\n", result[topYO]);
            fprintf(text, "Result: %lf\n-----------------\n", result[topYO]);

        }


    }

        }

        fclose(text);
        fclose(textYO);
        printf("\nRun again? \n[1] Yes \n[any other key] No\n");
        scanf("%c", &choice);
        scanf("%c", &choice);
        if(choice == '1')
        {
            main();
        }
        else
        {
            printf("\nThank you for using Kei Shirabe's \ninfix to postfix converter and evaluator! :)\n");
            exit(0);
        }
}


//other functions down here, not important

示例文本文件(是的,最后有一个额外的空格):

(1+2)) 
(1+2*3) 

对于此文本文件,表达式(1+2))被评估三次,每个结果都是“格式不正确”。最后一个表达式按预期工作。

请帮忙吗?

0 个答案:

没有答案