Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Calcolatrice Postfix

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

  2. #2
    Posso chiederti se hai risolto, sto cercando consigli utili anche io, evidentemente abbiamo la stessa traccia

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    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...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.