hvor er fejlen i koden??

Tags:    c++

<< < 123 > >>
Skal lave et program, der evaluerer RPN udtryk. Operanderne er enkelt cifret heltal, og operatørerne der er brugt er følgende +,-,*,/ og =.

fx:
Enter an RPN expression: 1 2 3 * + =
Value of expression: 7
Enter an RPN expression: 5 8 * 4 9 - / =
Value of expression: -8

Jeg synes opgaven er lidt svært da et af kravene til opgaven er, at man skal bruge scanf("%ch", &ch).
____________________________________

#include <stdbool.h> // C99 only

#define STACK_SIZE 100

// external variables
int contents[STACK_SIZE];
int top = 0;
int stack_overflow (){return 0;}
int stack_underflow (){return 0;}

void make_empty(void)
{
top = 0;
}

bool is_empty(void)
{
return top == 0;
}

bool is_full(void)
{
return top == STACK_SIZE;
}

void push(int i)
{
if (is_full())
stack_overflow();
else
contents[top++] = i;
}

int pop(void)
{
if (is_empty())
stack_underflow();
else
return contents[--top];
}

int main (void)
{
char ch;

scanf(" %c", &ch);
while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch){
case '+': push(pop()+pop());break;

case '-': push(pop()+pop());break;

case '*': push(pop()*pop());break;

case '/': push(pop()/pop());break;

default :
{
printf("Expression is too complex %c",ch);
}
}

scanf(" %c", &ch);
}
return 0;
}




24 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
okay, men når jeg så taster følgende ind:

1234*+-=
4 * 3 = 12
12 + 2 = 14
1 - 14 = -13

skal svaret jo give 13 og ikke -13.

det gør den jo fordi vi lavede (-) om. men jeg kan ikke forstå hvordan man kan få det hele til at give op.



Min gamle HP lommeregner (der bruger RPN) får også 1234*+- til at blive -13, så jeg går ud fra at det er rigtigt...



Ej hvor sejt var ikke klar over at man kunne bruge en lommeregner til at beregne RPN udtryk.ved du man man kan bruge en TI -83 plus eller TI 84???? okay, så må vi gå fra at koden passer nu.

Ved du hvordan jeg får programmet til at komme med følgende sætning til at starte med:

printf("Enter an RPN expression:");

og

printf("Value of expression:");

har nemlig prøvet at sætte det ind i koden, men den gider stadigvæk ikke.



HP laver (/lavede) nogle lommeregnere der kun kan regne RPN, da jeg studerede i slutningen af 80'erne var de højeste mode.

Denne skal du have før dine scanf
printf("Enter an RPN expression:");

Den anden de steder hvor du skriver ud, f.eks:
printf("Value of expression: %d * %d = %d\n", n1, n2, n3);



når okay smart nok.
Så det eneste problem jeg har lige nu er, at når jeg skriver 1+1, giver den 2. og det samme gør den når jeg taster 1+1= samt 11++

men det programmet skal er at hvis stakken "overflows" skal programmet vise beskeden udtrykket er for kompleks og afslutte. Hvis stakken "underflows" (på grund af et udtryk som 12++), skal programmet vise beskeden ikke nok operander i udtrykket og afslutte.

jeg forstår ikkke hvorfor den gør det, når vi jo har angivet default:

int main (void)
{
char ch;
int n1, n2, n3;
printf("Value of RPN expression:\n");
scanf("%c", &ch);

while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
case '+':
n1 = pop();
n2 = pop();
n3 = n2 + n1;
printf("%d + %d = %d\n", n1, n2, n3);
push(n3);
break;
case '-':
n1 = pop();
n2 = pop();
n3 = n2 - n1;
printf("%d - %d = %d\n", n2, n1, n3);
push(n3);
break;
case '*':
n1 = pop();
n2 = pop();
n3 = n1 * n2;
printf("%d * %d = %d\n", n1, n2, n3);
push(n3);
break;
case '/':
n1 = pop();
n2 = pop();
n3 = n2 / n1;
printf("%d / %d = %d\n", n2, n1, n3);
push(n3);
break;
default: printf("Expression is too complex: %c",ch);
}
scanf("%c", &ch);
}
return 0;
}



Problemet er at du ikke reagerer ordentligt på underflow (og overflow). Hvis det sker skal du skrive en fejlbesked og afslutte.
Heldigvis har du allerede en underflow funktion, den skal bare bringes til at lave noget brugbart, f.eks:
Fold kodeboks ind/udKode 

(Husk include af stdlib.h)



okay, men der er lige et par ting jeg ikke er med på:

Ved Underflow siger den:

12+
Value of RPN expression:2 + 1 = 3


12++
Value of RPN expression:2 + 1 = 3
Not enough operands in expression

1+2
Value of RPN expression:Not enough operands in expression

- problemet er at den skal tage højde for (=). Når (=) ikke er skrevet skal den komme med "Not enough operands in expression".


Ved Overflow siger den:

q
Value of RPN expression:Expression is too complex: q

- Dette er rigtig nok, men hvordan kan man fjerne "Value of RPN expression:", så der kun står "Expression is too complex:"


#include <stdbool.h> // C99 only
#include <stdlib.h>

#define STACK_SIZE 100

// external variables
int contents[STACK_SIZE];
int top = 0;
int stack_overflow (){return 0;}
int stack_underflow ()
{
printf("Not enough operands in expression\n");
exit(EXIT_FAILURE);
return 0;
}

void make_empty(void)
{
top = 0;
}

bool is_empty(void)
{
return top == 0;
}

bool is_full(void)
{
return top == STACK_SIZE;
}

void push(int i)
{
if (is_full())
stack_overflow();
else
contents[top++] = i;
}

int pop(void)
{
if (is_empty())
stack_underflow();
else
return contents[--top];
}

int main (void)
{
char ch;
int n1, n2, n3;
printf("Value of RPN expression:");
scanf("%c", &ch);

while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
case '+':
n1 = pop();
n2 = pop();
n3 = n2 + n1;
printf("%d + %d = %d\n", n1, n2, n3);
push(n3);
break;
case '-':
n1 = pop();
n2 = pop();
n3 = n2 - n1;
printf("%d - %d = %d\n", n2, n1, n3);
push(n3);
break;
case '*':
n1 = pop();
n2 = pop();
n3 = n1 * n2;
printf("%d * %d = %d\n", n1, n2, n3);
push(n3);
break;
case '/':
n1 = pop();
n2 = pop();
n3 = n2 / n1;
printf("%d / %d = %d\n", n2, n1, n3);
push(n3);
break;
default: printf("Expression is too complex: %c",ch);
}
scanf("%c", &ch);
}
return 0;
}



Ved "12++" vil den først evaluere "12+", som er et legalt udtryk, det giver 3 som bliver puttet på stakken. Derpå vil den evaluere det sidste "+", som ikke giver et validt udtryk, og den skriver derfor "Not enough operands in expression". Det er ret bøvlet at få den til at reagere anderledes.

Ved "1+2" vil den forsøge at evaluere "1+", som ganske rigtigt ikke er et legalt udtryk, derfor skriver den "Not enough operands in expression".

Hvordan vil du have den til at reagere i disse tilfælde?

Jeg ved ikke hvad du vil bruge "=" til? Min gamle RPN lommeregner har ingen = tast.



Ja kan godt se det vil blive for bøvlet. Den måde jeg vil have den til at reagere på er, at når jeg taster et ilegalt udtryk ind, skal den ikke regner på det , men istedet med det samme komme med "Not enough operands in expression".

Jeg tror bare det bliver for kompliceret hvis det overhoved kan lade sig gøre.

Jeg vil bruge "=" som en operatør ligesom +,-,* og /. Skal jeg så lave en case mere for "="???



Jeg tror ikke at det er realistisk at undersøge om alt det brugeren har tastet giver mening, inden du forsøger at regne på det.

+-*/ operatorene giver dig allerede resultatet, hvis du vil have = til at gøre noget (hvad?) skal du lave en case for den.



<< < 123 > >>
t