Tags:
c++
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
0
Hvis du ændrer main til:
int main (void)
{
char ch;
int n1, n2, n3;
scanf(" %c", &ch);
while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
case '+':
n1 = pop();
n2 = pop();
n3 = n1 + n2;
printf("%d + %d = %d\n", n1, n2, n3);
push(n3);
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;
}
Så virker det for +, de andre operatorer skal laves på ca. samme måde.
Bemærk at du kun kan indtaste tal mellem 0 og 9. Når du har skrevet din operator skal du trykke på <enter>, f.eks.
12+<enter>
Så vil den skrive:
2 + 1 = 3
0
Hvis du ændrer main til:
int main (void)
{
char ch;
int n1, n2, n3;
scanf(" %c", &ch);
while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
case '+':
n1 = pop();
n2 = pop();
n3 = n1 + n2;
printf("%d + %d = %d\n", n1, n2, n3);
push(n3);
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;
}
Så virker det for +, de andre operatorer skal laves på ca. samme måde.
Bemærk at du kun kan indtaste tal mellem 0 og 9. Når du har skrevet din operator skal du trykke på <enter>, f.eks.
12+<enter>
Så vil den skrive:
2 + 1 = 3
Tænk også på, at den sidste værdi, du pusher, er den første, du popper, så:
case '/': push(pop()/pop()); break;
vil givet følgende: 82/
...blive fortolket som 2/8, og ikke 8/2.
0
Okay har rettet koden, men hcad var der egentlig galt med min. I min kode ænsker jeg nemlig ikke nogle mellemregninger.
Jeg har stadigvæk et par problemer med koden:
Jeg kan ikke få den til at vise:
printf("Enter an RPN expression:" );
og så har jeg selvfølgelig også det problem som Robert nævner. Når jeg taster følgende ind får jeg:
58*49-/=
8 * 5 = 40
9 - 4 = 5
5 / 40 = 0
men det skal derimod give -8. hvilket jo er et negativt tal. Hvordan får man koden til at acceptere negative tal.???
int main (void)
{
char ch;
int n1, n2, n3;
scanf(" %c", &ch);
while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
printf("Enter an RPN expression:" );
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 = n1 - n2;
printf("%d - %d = %d\n", n1, n2, 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 = n1 / n2;
printf("%d / %d = %d\n", n1, n2, n3);
push(n3);
break;
default :
printf("Expression is too complex %c",ch);
}
scanf(" %c", &ch);
}
return 0;
}
0
Problemet med din oprindelige kode var ;
1: Du skrev aldrig noget ud, en lommeregner der ikke viser resultatet er ikke så meget bevendt.
2: Rækkefølgen af dine operatorer var forkert.
0
når ja for fanden
jeg har jo ikke skrevet nogle printf sætninger for +,-,/,*.
Hvor kan man lave koden om så den accepterer et negativt resultat??
0
Der burde ikke være problemer med negativer resultater, men du kan ikke indtaste negative tal.
For at kunne indlæse negative tal, bliver du nødt til at checke om den næste karakter er '-', hvis den er det, sætter du et flag og læser det næste tal, som du så negerer.
0
Nej, undskyld fordi jeg ikke udtrykker mig bedre, men det jeg mener er at når jeg taster følgende ind:
58*49-/=
8 * 5 = 40
9 - 4 = 5
5 / 40 = 0
får jeg som man kan 0, men det skal give -8, da 5*8=40 , 4-9=-5 , 40/-5=-8
forstår du hvad jeg mener??
og når jeg så taster 1+1= regner den stykket ud, istedet for at printe følgende ud: Expression is too complex
0
Du skal bytte om på operatorene ved -
Du har nu:
case '-':
n1 = pop();
n2 = pop();
n3 = n1 - n2;
printf("%d - %d = %d\n", n1, n2, n3);
push(n3);
break;
n1 er den nyeste på stakken, dvs. den sidste der blev push'et, i dit tilfælde 9
n2 bliver så den forrige, dvs. 4, så du regner 9 - 4.
I stedet skal du have:
n3 = n2 - n1;
Der gælder nok ca det samme for /
Hvis du skriver 1+1 vil den forsøge at pop'e mere end der er på stakken, det burde give en fejl.
0
ja det prøvede jeg også, men så skriver den følgende ud:
58*49-/=
8 * 5 = 40 (som passer)
9 - 4 = -5 (9-4, giver da ikke -5)
-5 / 40 = -8 (det samme gælder hernede, at - -5/40 ikke er -8)
hvordan kan man få tallene til at stå rigtigt??
jeg prøvede at taste 1+1, men den skrev ikke noget ud. Da jeg så i stedet prøvede at taste
1+1= gav den 2 som resultat.
men det programmet skal er at hvis "The stack 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.
0
I regnestykket skriver du "49-", som skal udregnes som "4 - 9" som ganske rigtigt er -5
Så du skal bare bytte om på tallene der hvor du skriver ud:
printf("%d - %d = %d\n", n2, n1, n3);