Проблема :: Арифметическое выражение с помощью строковой операции в C - PullRequest
0 голосов
/ 01 июня 2011

Цель: здесь коды должны читать любое произвольное длинное арифметическое выражение, например 233 + 200Затем он должен распечатать в формате постфикса и префикса и рассчитать его, т.е.

Ответы [ 4 ]

0 голосов
/ 31 июля 2013

Я не уверен, какова цель задачи 0 и задачи 1, но вы вообще не используете оператор + или - на входе. Что вы должны делать, это что-то вроде этого:

#include<stdio.h>

int fix(char* s) {
  int v=0;
  for(int i=0;s[i]!='\0';i++) {
    char op=s[i];
    switch (op) {
    case '+':
    case '-':
      // We encountered a math operator.  
      s[i]='\0';
      if      (op=='+') return fix(s) + fix(s+i+1);
      else if (op=='-') return fix(s) - fix(s+i+1);
      break;
    case '1': case '2': case '3': case '4': case '5': 
    case '6': case '7': case '8': case '9': case '0':
      // This is part of the value.
      v*=10;
      v+=s[i]-'0';
      break;
    default:
      // Ignore non-operators and non values.
      break;
    }
  }
  // Return the value
  return v;
}

int main(){
    char s[80];
    int i;
    for(i=0;(s[i]=getchar())!='\n';i++);
    s[i]='\0';
    printf("%d\n",fix(s));
    return 0;
}
0 голосов
/ 01 июня 2011

В функции copy, где находится ending null character после того, как содержимое s было скопировано в t?Завершение строки ac с \n вместо \0 неверно.Все строки c заканчиваются нулевым символом в конце.

0 голосов
/ 01 июня 2011

Вы пробовали пройти через этот код в отладчике?Я думаю, это сделало бы намного более ясным, что ваша программа не выполняет то, что вы думаете.

Одна потенциальная проблема заключается в том, что код, следующий за блоком if(task==2) { ... } else { ... } в функции fix, никогда не будетбыть казненным.И в случаях if, и в else содержатся return статистики, поэтому выполнение никогда не дойдет до этого кода.

Кроме того, ваш цикл for(i=0;(s[i]=getchar())!='\n';i++); в main не защищен от записи послеконец массива s.Эта строка кода, по сути, такая же, как стандартная библиотечная функция gets, которая имеет ту же проблему.

Какой компилятор вы используете?Какие параметры компилятора вы используете?

0 голосов
/ 01 июня 2011

Ну да, в коде есть несколько проблем. Обычно мы не запускаем здесь бесплатный сервис отладки, но для начала, что:

(s,i,0);

должен делать?

...