#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;
}