Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: Espressioni Algebriche

  1. #1
    Utente di HTML.it L'avatar di Fool
    Registrato dal
    May 2002
    Messaggi
    8,342

    Espressioni Algebriche

    Devo sviluppare un programma che sia in grado di sviluppare una esperssione algebrica del tipo

    (1x2)x(12:2)+12-(12+6)

    Il programma ovviamente deve sviluppare prima le operazioni nelle parentesi e dopo quelle fuoir....

    In un futuro se non è difficilissimo vorrei che il programma possa lavorare anche con le lettere...

    Di logica, come posso fare capire al programma quale parte sviluppare prima ?

    Posso lavorare in c o Pascal/java

    Piu che altro vorrei capire come faccio a farlo capire al programma

  2. #2
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Ciao; scusami.... da quanto ne so il compilatore già sa che deve eseguire prima le operazioni in parentesi e poi le altre... quindi tu non dovresti indicargli altro che i numeri da utilizzare; mi sbaglio?
    Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  3. #3
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Credo che lui intenda un programma in cui l'utente immette l'espressione sotto forma di stringa ed il prog. la valuta....mi era passato sotto mano una volta un programma uguale, chi lo aveva fatto mi chiedeva di dargli un'okkiata (qui sul forum). Era sviluppato in Java, aveva definito due/tre classi, e dava la possibilità di inserire delle lettere nell'espressione algebrica assagnandogli e memorizzando i valori di ogni lettera.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  4. #4
    Utente di HTML.it L'avatar di Fool
    Registrato dal
    May 2002
    Messaggi
    8,342
    esatto...io voglio inserire l'espessione ed ottenere il risultato..

    Magari avete un esempio?

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Non è una cosa semplice...qualcuno comunque sta cercando di fare la stessa cosa qui:
    http://forum.html.it/forum/showthrea...hreadid=715135
    Magari in due....
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Utente di HTML.it L'avatar di Fool
    Registrato dal
    May 2002
    Messaggi
    8,342
    a me non serve una calcolatrice, mi servirebbe solo sapere qual'è il progedimento logico per fare quell'operazione

  7. #7
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Il procedimento logico è facile: scorri la stringa finchè non individui l'operazione che ha precedenza su tutte, la valuti, ne sostituisci il risultato e ricominci finchè il risultato non è un numero.....implementarlo è un pò meno facile.
    Buon lavoro.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  8. #8
    Utente di HTML.it L'avatar di Fool
    Registrato dal
    May 2002
    Messaggi
    8,342
    Si ma su quale base il prograsmma decide quale operazione ha maggiore precedenza?

  9. #9
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    VVoVe:
    Sulla base delle regole della matematica....
    Precedenze:
    ()
    % o *
    + o -
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  10. #10
    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));
    }
    Questo è il codice di un semplice parser di espressioni aritmetiche,studiatelo un pò e capirai molte cose riguardo a ciò che hai chiesto.
    Un membro di questo forum (SnakePlissken) sta (o stava non so),estendendo questo parser al fine di fargli supportare anche operazioni più complesse,contatta lui se ti interessa,comunque lui ha postato l'intero codice del suo parser sul forum e io l'ho scaricato,se ti interessa ce l'ho anche io.
    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.)

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.