Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    85

    [c++]risolvere una semplice espressione

    (1+1)+(2+2)=

    voglio creare un programma che mi risolva questa semplice espressione,ma non so' come fare....................per favore aiutatemi....................................
    E SE TUTTO FOSSE SOLO UN RIFLESSO?

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    inanzitutto fai una ricerca qui sul forum, se ne è parlato già più di una volta, l'ultima proprio ultimamente...cerca tipo "calcolatrice".
    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    85
    nella discussione che mi hai indicato si parla di somme algebriche e io invece devo eseguire una semplice espressione.
    se qualcuno mi potrebbe postare un'esempio..................
    E SE TUTTO FOSSE SOLO UN RIFLESSO?

  4. #4
    Temo non sia così semplice ... finche si tratta di una semplice somma la puoi gestire come nel thread che ti è stato consigliato.

    Se invece vuoi proprio un lettore di espressioni il discorso si fa molto + complicato... devi creare un parser per "smontare" le stringhe con l'espressioni.

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Originariamente inviato da apatico
    nella discussione che mi hai indicato si parla di somme algebriche e io invece devo eseguire una semplice espressione.
    se qualcuno mi potrebbe postare un'esempio..................
    Ti ripeto che più volte se ne è parlato, ricordo anche di aver aiutato qualcuno qui sul forum che stava a buon punto, la sua "calcolatrice" valutava espressioni con somme,prodotti,logaritmi,radici,parentesi,...ecc.
    Ora vedo se ritrovo il 3D.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    85
    peerchè è cosi difficile?in fondo bisogna solamente dire al computer che di calcolare solo il risultato messo fra parentesi......................
    E SE TUTTO FOSSE SOLO UN RIFLESSO?

  7. #7
    codice:
    /* eval_expr.symbol */
    
    int	Plus(int a,int b)
    {
    	return (a+b);
    }
    
    int	Minus(int a,int b)
    {
    	return (a-b);
    }
    
    int	Divide(int a,int b)
    {
    	return (a/b);
    }
    
    int	Multiply(int a,int b)
    {
    	return (a*b);
    }
    
    int	Modulus(int a,int b)
    {
    	return (a%b);
    }
    
    typedef struct _operand
    {
    	char symbol;
    	int  preced;
    	int  (*funct)();
    } Operand;
    
    
    Operand	operand [] =
    {
    	{'+',1,Plus},
    	{'-',1,Minus},
    	{'/',2,Divide},
    	{'*',2,Multiply},
    	{'%',2,Modulus},
    	{0,0,0}
    };
    
    int	FindLastOp(char *str,int preced)
    {
    	int	pos,i,numParent,retValue;
    	   
    	//valore di ritorno
    	retValue = -2;
    
    	//stato bilanciamento parentesi
    	numParent = 0;
    
    	//partiamo da fine stringa
    	pos = strlen(str)-1;
    
    	//per ogni carattere str[pos]
    	//fino ad arrivare all'inizio dell'espressione
    	while (pos>=0)
    	{
    		//teniamo conto delle parentesi incontrate
    		if (str[pos] == ')')
    			numParent ++;
    		if (str[pos] == '(')
    			numParent --;
    
    		i = 0;
    		//per tutti gli operatori definiti e finchè le 
    		//parentesi non sono bilanciate
    		while (!numParent && operand[i].symbol)
    		{
    			//se il carattere corrente è un'operatore
    			if (operand[i].symbol == str[pos])
    			{
    				retValue = -1;
    				if (operand[i].preced == preced)
    					return (pos);
    			}
    			//prossimo operatore
    			i++;
    		}
    		//carattere successivo (o meglio precedente)
    		pos--;
    	}
    	return (retValue);
    }
    
    int	is_nb(char *str)
    {
    	if ( *str == '(' )
    	{
    		str[strlen(str)-1] = 0;
    		return (eval_expr_sub(str+1,0));
    	}
    	return (atoi(str));
    }
    
    int	eval_expr_sub(char *str,int preced)
    {
    	int	pos;
    	char save;
    	int	nb2;
    	if ((pos = FindLastOp(str,preced))==-1)
    		return (eval_expr_sub(str,preced+1));
    	if (pos==-2)
    		return (is_nb(str));
    	nb2 = eval_expr_sub(str+pos+1,preced+1);
    	save = str[pos];
    	str[pos] = 0;
    	pos = 0;
    	while (operand[pos].symbol)
    	{
    		if (save==operand[pos].symbol)
    			return (operand[pos].funct(eval_expr_sub(str,preced),nb2));
    		pos ++;
    	}   
    	printf("PB !!!\n");
    	return (0);
    }
    
    
    int	eval_expr(char *str)
    {
    	return (eval_expr_sub(str, 0));
    }
    
    #include "eval_expr.c"
    int main(int ac,char **av)
    {
       if (ac>1)
       {
          printf("%d\n", eval_expr(av[1]));
       } 
       getchar();
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Originariamente inviato da apatico
    peerchè è cosi difficile?in fondo bisogna solamente dire al computer che di calcolare solo il risultato messo fra parentesi......................
    3+88 se le espressioni sono tutte così è semplice

    (3+(3*22))-55/(3+22) è molto + difficile e come divevo richiede un parser

    Non ti voglio scoragiare è solo che se le espresioni possono variare ci vuole abbastanza codice per gestire i vari casi

  9. #9
    Come ti hanno già detto non è una cosa così semplice, e se ne è parlato già varie volte.

    In C guarda qui e qui. C'è la versione semplice di base alla quale ci siamo rifatti io e unomichisiada, (che però l'ha resa più esplicativa, quindi studia questa sua, che ti ha già postato), c'è anche la mia versione (incompleta) che implementa funzioni.


    Ma visto che lo vuoi in C++, qua ti indirizzano sulla strada OOP:
    http://forum.html.it/forum/showthrea...ghlight=parser

    E qui sembra che abbiano fatto qualcosa (in java):
    http://forum.html.it/forum/showthrea...ghlight=parser


    Alla fine ho fatto io la ricerca al posto tuo !

    Summum crede nefas animam preferre pudori e propter vitam vivendi perdere causas.
    (Giovenale)

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    85
    unomichisiada come dovrò impostare i cout nel codice???


    SnakePlissken sono programmi in java che avevo già visto,io voglio un esempio da studiare in c++.
    E SE TUTTO FOSSE SOLO UN RIFLESSO?

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.