Ciao a tutti, devo svolgere il seguente esercizio:
Implementare un applicazione che riproduca il meccanismo di funzionamento di una calcolatrice postfix. E' richiesta l'integrazione del codice che effettua la traduzione infix -> postfix con apposite azione semantiche che calcolino le espressioni postfix derivanti dalla traduzione di quanto fornito in input.
Per facilitarmi il lavoro ho realizzato un programma che realizza la conversione infix -> postfix e successivamente un'altro programma che simula il funzionamento della calcolatrice postfix. Adesso il mio problema è quello di unire i due programmi in uno solo, che svolga quanto richiesto dalla traccia. Non riesco a far prendere la stringa postfix precedentemente convertita dal programma traduttore al programma calcolatrice... Qualcuno può aiutartmi ?
Programma Traduttore:
codice:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 20
char stack[MAX];
int top=-1;
char pop();
void push(char item);
int prcd(char symbol)
{
switch(symbol)
{
case '+':
case '-':return 2;
break;
case '*':
case '/':return 4;
break;
case '^':
case '$':return 6;
break;
case '(':
case ')':
case '#':return 1;
break;
}
}
int isoperator(char symbol)
{
switch(symbol)
{
case '+':
case '-':
case '*':
case '/':
case '^':
case '$':
case '(':
case ')':return 1;
break;
default:return 0;
}
}
void convertip(char infix[],char postfix[])
{
int i,symbol,j=0;
stack[++top]='#';
for(i=0;i<strlen(infix);i++)
{
symbol=infix[i];
if(isoperator(symbol)==0)
{
postfix[j]=symbol;
j++;
}
else{
if(symbol=='(')push(symbol);
else if(symbol==')')
{
while(stack[top]!='(')
{
postfix[j]=pop();
j++;
}
pop();//pop out (.
}
else{
if(prcd(symbol)>prcd(stack[top]))
push(symbol);
else{
while(prcd(symbol)<=prcd(stack[top]))
{
postfix[j]=pop();
j++;
}
push(symbol);
}//end of else.
}//end of else.
}//end of else.
}//end of for.
while(stack[top]!='#')
{
postfix[j]=pop();
j++;
}
postfix[j]='\0';//null terminate string.
}
int main()
{
char infix[20],postfix[20];
printf("Enter the valid infix string:\n");
gets(infix);
convertip(infix,postfix);
printf("The corresponding postfix string is:\n");
puts(postfix);
getch();
}
void push(char item)
{
top++;
stack[top]=item;
}
char pop()
{
char a;
a=stack[top];
top--;
return a;
}
Programma calcolatore:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h> //per aotf
#include <ctype.h> //per getch e ungetch
#define MAXOP 100 // dimensione massima di operatori ed operandi
#define NUMBER '0' // segnala che è stato trovato un numero
//dichiarazione funzioni implementate
int getop (char s[]);
void push (double);
double pop (void);
//-----------------------------------
main()
{
int type;
double op2;
char s[MAXOP];
int pop_int1, pop_int2;
printf("\tLeggenda:\n\n\t^=potenza\n\ts=seno\n\te=funzione esponenziale e^x\n\n");
printf("Calcolatrice in notazione Polacca:\n\n");
while ((type = getop(s)) != EOF)
{
switch (type)
{
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 != 0.0)
push (pop() / op2);
else
printf("errore: divisione per zero\n");
break;
case '%':
pop_int2 = op2 = pop();
pop_int1 = pop();
if (pop_int2 != 0.0)
push (pop_int1 % pop_int2);
else
printf("errore: divisione per zero\n");
break;
case '^':
push(pow(pop(),pop()));
break;
case 's':
push(sin(pop()));
break;
case 'e':
push(exp(pop()));
break;
case '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("errore: comando %s sconosciuto\n", s);
break;
}
}
system("PAUSE");
return 0;
}
#define MAXVAL 100 // massima profondità dello stack
int sp = 0; // prossima posizione libera
double val[MAXVAL]; // stack dei valori
//push: inserisce f in cima allo stack
void push(double f)
{
if (sp<MAXVAL)
val[sp++] = f;
else
printf("errore: stack pieno; %g non inseribile\n", f);
}
//pop: preleva e rirorna il valore in cima allo stack
double pop(void)
{
if (sp>0)
return val[--sp];
else
{
printf("errore: lo stack e' vuoto\n");
return 0.0;
}
}
int getch(void);
void ungetch(int);
//etop: legge il successivo operatore o operando numerico
int getop(char s[])
{
int i,c;
while ((s[0] =c = getch()) == ' ' || c=='\t')
;
s[1] = '\0';
if (!isdigit(c) && c !='.')
return c; //non è un numero
i=0;
if (isdigit(c)) //legge la parte intera
while (isdigit(s[++i] = c = getch()))
;
if (c=='.') //legge la parte frazionaria
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c !=EOF)
ungetch(c);
return NUMBER;
}
#define BUFSIZE 100
char buf[BUFSIZE]; //buffer per ungetch
int bufp = 0; //prossima posizione libera in buf[]
int getch(void) //preleva un carattere (che potrebbe essere stato rifiutato in precedenza)
{
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) //rimette un carattere nell'input
{
if (bufp>=BUFSIZE)
printf("ungetch: troppi caratteri\n");
else
buf[bufp++] = c;
}