PDA

Visualizza la versione completa : [C] Calcolatrice Postfix


DevelopExpert
16-07-2012, 15:26
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:

#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:

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

Andreac88
15-12-2012, 00:01
Posso chiederti se hai risolto, sto cercando consigli utili anche io, evidentemente abbiamo la stessa traccia

Scara95
15-12-2012, 10:29
Se hai determinato che funzionano entrambi è più semplice seguire le istruzioni e fare un unico programma: semplicemente trasforma il main del primo in una funzione che restituisce una stringa che in seguito userai per fare i calcoli utilizzando una funzione che contenga il codice del main del secondo. Le modifiche da apportare non sono molte ed inoltre in questo modo rispetti la consegna che ti è stata data...

Loading