2014-11-10 3 views
-1

в моей программе, когда у меня есть постфиксная или инфиксная нотация для преобразования и оценки, которая не включает знак «-», кажется, что он работает нормально с моим первым текстом ввода, но при попытке запустить его с моим вторым текстом ввода он делает некоторые забавные вещи, когда он встречает «-» и печатает мусор. любая помощь будет оценена. вот два текстовых файла, первые работы, а второй - ошибки. Спасибо тебе!, когда infix или postfix сталкиваются с знаком «-», он, кажется, дает мне случайные значения

Предполагается запустить до 0, если выбор 1, разрешить инфикс, если 2, решить постфикс. Первый входной файл (вывод правильный)

Я пытаюсь поместить свои входные файлы, но он продолжает говорить свой код ... , поэтому я помещаю его как заголовок кода. Любую другую информацию нужно просто спросить.

//1st input file, correct 


//1 (5 + 4) 
//2 3 4 + 
//1 2 * 2/(1+3) 
//0 

//second input file (incorrect) 


//2 7 5 - 2 + 
//1 3 * (5 – 2) 
//1 5/1 + 3 
//0 

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
#include<math.h> 
#include<stdlib.h> 

#define BLANK ' ' 
#define TAB '\t' 
#define MAX 50 

void push(long int symbol); 
long int pop(); 
void infix_to_postfix(); 
int priority(char symbol); 
int isEmpty(); 
int white_space(char); 
int eval_post(); 

char infix[MAX], postfix[MAX]; 
long int stack[MAX]; 
int top; 

int main(int argc, char *argv[]) 
{ 
    FILE* fp; 
    FILE* fpw; 

    fp = fopen("info.txt", "r"); 
    fpw = fopen("write.txt ", "w"); 

    int choice; 
    int ans; 

    fscanf(fp, "%d", &choice); 
    printf("first choice selected: %d \n", choice); 


    while(choice != 0) 
     { 

      if(choice ==1) 
      { 
      printf("selection was infix \n"); 
      fscanf(fp, "%[^\n]%*c", infix); 
      printf("%s \n", infix); 
      infix_to_postfix(); 
      fprintf(fpw," %s = ", postfix); 
      ans = eval_post(); 
      fprintf(fpw, " %d \n", ans); 


      fscanf(fp, "%d", &choice); 
      printf("next choice selection was: %d \n", choice); 
      } 
      else if(choice == 2) 
      { 
       printf("selection was postfix \n"); 
       fscanf(fp, "%[^\n]%*c", infix); 
       fprintf(fpw,"%s = ", infix); 
       ans = eval_post(); 
       fprintf(fpw,"%d \n", ans); 

       fscanf(fp, "%d", &choice); 
       printf("next choice selection was: %d \n", choice); 
      } 

     } 
    printf("Hello world!\n"); 
    return 0; 
} 

void infix_to_postfix() 
{ 
    unsigned int i,p=0; 
    char next; 
    char symbol; 
    for(i=0;i<strlen(infix);i++) 
    { 
     symbol=infix[i]; 
     if(!white_space(symbol)) 
     { 
      switch(symbol) 
      { 
      case '(': 
       push(symbol); 
       break; 
      case ')': 
       while((next=pop())!='(') 
        postfix[p++] = next; 
       break; 
      case '+': 
      case '-': 
      case '*': 
      case '/': 
      case '%': 
      case '^': 
       while(!isEmpty() && priority(stack[top])>= priority(symbol)) 
        postfix[p++]=pop(); 
       push(symbol); 
       break; 
      default: /*if an operand comes*/ 
       postfix[p++]=symbol; 
      } 
     } 
    } 
    while(!isEmpty()) 
     postfix[p++]=pop(); 
    postfix[p]='\0'; /*End postfix with'\0' to make it a string*/ 
} 

/*This function returns the priority of the operator*/ 
int priority(char symbol) 
{ 
    switch(symbol) 
    { 
    case '(': 
     return 0; 
    case '+': 
    case '-': 
     return 1; 
    case '*': 
    case '/': 
    case '%': 
     return 2; 
    case '^': 
     return 3; 
    default : 
     return 0; 
    } 
} 

void push(long int symbol) 
{ 
    if(top>MAX) 
    { 
     printf("Stack overflow\n"); 
     exit(1); 
    } 
    stack[++top]=symbol; 
} 

long int pop() 
{ 
    if(isEmpty()) 
    { 
     printf("Stack underflow\n"); 
     exit(1); 
    } 
    return (stack[top--]); 
} 
int isEmpty() 
{ 
    if(top==-1) 
     return 1; 
    else 
     return 0; 
} 

int white_space(char symbol) 
{ 
    if(symbol == BLANK || symbol == TAB) 
     return 1; 
    else 
     return 0; 
} 

int eval_post() 
{ 
    int a,b,temp,result; 
    unsigned int i; 

    for(i=0;i<strlen(postfix);i++) 
    { 
     if(postfix[i]<='9' && postfix[i]>='0') 
      push(postfix[i]-'0'); 
     else 
     { 
      a=pop(); 
      b=pop(); 
      switch(postfix[i]) 
      { 
      case '+': 
       temp=b+a; break; 
      case '-': 
       temp=b-a;break; 
      case '*': 
       temp=b*a;break; 
      case '/': 
       temp=b/a;break; 
      case '%': 
       temp=b%a;break; 
      case '^': 
       temp=pow(b,a); 
      } 
      push(temp); 
     } 
    } 
    result=pop(); 
    return result; 
} 
+0

' "% [^ \ п]% * с" '->' "% [^ \ п]% * с" '(Добавить пробел) – chux

+0

Я изменил его, но, к сожалению, он по-прежнему имеет такой же выход. Спасибо за вашу помощь, хотя :) – user3474281

ответ

0

У вас есть этот код для choice == 2:

printf("selection was postfix \n"); 
fscanf(fp, "%[^\n]%*c", infix); 
fprintf(fpw,"%s = ", infix); 
ans = eval_post(); 
... 

eval_post() и делает:

for(i = 0; i < strlen(postfix); i++) 

но postfix никогда не инициализирована ... вы скопировали строку в infix. ПРЕДПОЛОЖИТЕЛЬНО вы имели в виду сделать:

else if (choice == 2) 
{ 
    printf("selection was postfix \n"); 
    fscanf(fp, "%[^\n]%*c", postfix); 
    fprintf(fpw,"%s = ", postfix); 
    ans = eval_post(); 

Скорее всего, ваш первый набор входных данных на самом деле не работает должным образом или просто случается посмотреть, как это работает на удачу.

Edit: Как это, если вы просто передать postfix строку как "7 5 - 2 +" она не будет выполнена в eval_post() из-за пробелов в строке. Вы можете либо разобрать пространства вручную или просто игнорировать их в eval_post() как:

if (white_space(postfix[i])) 
    { // Do nothing 
    } 
    else if(postfix[i]<='9' && postfix[i]>='0') 
     push(postfix[i]-'0'); 
    ... 
+0

Когда я переключаюсь на вашу рекомендацию (на самом деле это то, что у меня было на первом месте), она запускает стеки под потоком в моей поп-функции :( – user3474281

+0

Да, вам придется анализировать ваш постфиксный ввод string, чтобы заполнить ваш стек в первую очередь. – uesp

+0

Как мне это сделать без обрезки моего кода? Я пробовал некоторые вещи безрезультатно. Спасибо за yuor time! – user3474281