Задача:: Арифметическое выражение со строковой операцией в C

#c #math #expression

#c #математика #выражение

Вопрос:

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

 Problems: output shows anomalous data like 98, 101 etc. I think there
might be any mistake in the code.
please have a look and let me know it.
  
 #include<stdio.h>
void copy(char* t, char* s, int n)
{
    int i;
    for(i=0;i<n;i  )
        t[i]=s[i];
    t[n]='n';
}
int fix(char* s, int length, int task)
{
    int i;
    for( i=length-1;i>=0;i--)
    {
        if((s[i]==' ')||(s[i]=='-'))
        {
            char s1[i 1];
            char s2[length-i];
            copy(s1,s,i);
            copy(s2,s i 1,length-i-1);
            if(task==2)
            {
                return fix(s1,i,task) fix(s2,i,task);
            }
            else
            {
                return fix(s1,i,task)-fix(s2,length-1,task);
            }
            if(task==0)printf("%c",s[i]);;
            fix(s1,i,task);
            fix(s2,length-i-1,task);
            if(task==1)printf("%c",s[i]);
            return 0;
        }
    }
}
int main(){
    char s[80];
    int i;
    for(i=0;(s[i]=getchar())!='n';i  );
    fix(s,i,0);
    printf("n");
    fix(s,i,1);
    printf("n");
    printf("%dn",fix(s,i,2));
    return 0;
}
  

Комментарии:

1. Это домашнее задание? Можете ли вы предоставить нам несколько примеров точного вывода, который вы видите, и точного ввода, который вы использовали для его генерации?

Ответ №1:

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

 (s,i,0);
  

предполагается, что выполняется?

Комментарии:

1. извините, это было исправление (s, i, 0) .. просто ошибка копирования в блокнот.

2. @Gorge: Выполните копирование-вставку кода, а не копирование вручную. Если вы повторно введете в поле вопроса, вы, скорее всего, введете то, что подсознательно считаете правильным, а не то, что там есть. Мы видели много кода, который никак не мог выдать ошибочный вывод.

3. извините, я вас не понимаю??

Ответ №2:

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

Ответ №3:

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

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

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

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

Ответ №4:

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

 #include<stdio.h>

int fix(char* s) {
  int v=0;
  for(int i=0;s[i]!='';i  ) {
    char op=s[i];
    switch (op) {
    case ' ':
    case '-':
      // We encountered a math operator.  
      s[i]='';
      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]='';
    printf("%dn",fix(s));
    return 0;
}