Salve è la prima volta che scrivo nel forum..sto cercando di imparare il c++ sto provando a creare un programma molto ma molto semplice per risolvere le espressioni la mia idea era che se posso scrivere delle espressioni dal sorgente (ess. R=(5+2)*3) posso trattare la mia espressione come una stringa (quella dichiarata con string)per poi dirgli di risolvere la stringa intesa come espressione dal compilatore ? la mia è solo un'idea spero che qualcuno che sicuramente è più esperto di me potra dirmi se si puó fare e come

chiesto 13 Mar '14, 22:05

mulinobianco7's gravatar image

mulinobianco7
10111

modificato 14 Mar '14, 21:34

enzotib's gravatar image

enzotib ♦♦
14.0k112186


Di norma la cosa che chiedi la possono fare solo i linguaggi interpretati, per esempio in bash c'è il comando eval che esegue una stringa contenente dei comandi nello stesso linguaggio di bash. Per esempio

$ str='ls -l; echo echo "Ho finito"'
$ eval "$str"
totale 4
drwxr-xr-x+   9 enzotib staff  306 2014-03-13 11:33 Desktop
drwxr-xr-x+  17 enzotib staff  578 2014-03-14 11:16 Documents
drwxr-xr-x+  12 enzotib staff  408 2014-03-14 13:04 Downloads
Ho finito
$

Nei linguaggi compilati questa cosa non mi risulta si possa fare, dato che le istruzioni vengono compilate prima dell'esecuzione e non è possibile modificarle a runtime. Quindi in C non si può fare, a meno di realizzare nel proprio programma C un piccolo compilatore, che segue tutte le fasi standard dell'analisi lessicale, sintattica, generazione del codice oggetto e linking con le opportune librerie, ma è una cosa di una certa difficoltà e non credo sia quello che volevi fare.

coll. permanente

ha risposto 14 Mar '14, 13:31

enzotib's gravatar image

enzotib ♦♦
14.0k112186

se quindi volessi fare un programma per calcolare le espressioni dovrei considerare tutti i casi possibili

(14 Mar '14, 15:16) mulinobianco7 mulinobianco7's gravatar image

Utilizza i commenti, le risposte servono solo per fornire soluzioni alla domanda :)

(14 Mar '14, 15:18) alevipri alevipri's gravatar image

@mulinobianco7: si, dovresti scrivere un piccolo parser che interpreta l'input e poi lo trasforma in un calcolo. Nel libro Algoritmi in C di Sedgewick ci sono degli esempi.

(14 Mar '14, 15:50) enzotib ♦♦ enzotib's gravatar image

in pratica vorresti usare un programma c++ come calcolatrice, quello che vuoi fare tu non si fa con le stringhe.

la prima cosa che mi viene in mente è la creazione di una classe che operi con ostringstream in grado di leggere caratteri come ( ) + * - ^ e reinterpretarli come operatori. ovviamente andranno ridefinite le precedenze in qualche modo.

non è un problema dalla soluzione banale, se sei ancora interessato dammi una voce.

(05 Ago '14, 11:18) airordl airordl's gravatar image

anzi, ora mi metto a farlo perchè mi hai intrigato.

(05 Ago '14, 21:37) airordl airordl's gravatar image

include<iostream>

include<sstream>

include<cmath>

include<string.h>

using namespace std;

class esprex { protected:

istringstream is ;

ios_base :: seekdir d = ios :: beg;//dichiaro la variabile 'd' di tipo 'ios_base' (il cui ambito di appartenenza è seekdir) inizializzata a 'inizio' (begin)

streamsize s = is . tellg(); //'s' è un oggetto streamsize il cui valore è dato dalla posizione in cui mi trovo

char * oprn = new char [100];//operandi

char * oprt = new char [100];//operatori

char * jolly = new char [200];//non so aprioristicamente cosa sta succedendo

(05 Ago '14, 23:07) airordl airordl's gravatar image

public:

esprex () = default;

esprex (char &es) : is (es) {/clog<<"sono il costruttore che prende un riferimento dx di un char\n";/}

esprex (char &&es) : is (es) {/clog<<"sono il costruttore che prende un riferimento sx di un char\n";/}

esprex (string &es) : is (es) {/clog<<"sono il costruttore che prende un riferimento dx di una stringa\n";*/}

esprex (string &&es) : is (es) {/clog<<"sono il costruttore che prende un riferimento sx di una stringa\n";*/}

~esprex () = default;

(05 Ago '14, 23:08) airordl airordl's gravatar image

double soluzione () {

int fine = taglia ();

is.seekg(0,ios::beg);

for (int i=0; i<fine; ++i) {

is>>jolly [i];

if (jolly[i]==' ') continue;//anche se non lo sarà mai, questo è dovuto alla natura di '>>' che salta a piedi pari gli spazi... ma la prudenza non è mai troppa.

//qui inizia il bello, però serve una persona più intelligente di me

/IL BELLO/

} }//fine soluzione

(05 Ago '14, 23:09) airordl airordl's gravatar image

private:

void doveSono () {clog<<is.tellg()<<endl;}

int dove_sono () {return is.tellg();}

void pagaiata (int a) {is.seekg(a,ios::cur);}

int taglia () { is.seekg(0,ios::end);/clog<<"è caldamente raccomandato salvarsi un 'cur' da qualche parte, dato che ora ti trovi in EOF";/return s;}

(05 Ago '14, 23:10) airordl airordl's gravatar image

bool pap (char a) {if (a=='(')return true; return false;}

bool pac (char a) {if (a==')')return true; return false;}

bool per (char a) {if (a=='*')return true; return false;}

bool piu (char a) {if (a=='+')return true; return false;}

bool men (char a) {if (a=='-')return true; return false;}

bool div (char a) {if (a=='/')return true; return false;}

bool num (char a) {if (a>'/' && a<':') return true;return false;}

(05 Ago '14, 23:10) airordl airordl's gravatar image

int num () {

ios_base :: seekdir qui = ios::cur;//cambierà

int *cifra = new int [32];

int cont=-1, numero=0;

do {++cont;

//con questo ciclo voglio scoprire quante cifre ha il numero

is>>oprn[cont];

if (!num(oprn[cont])){is.seekg(-cont,qui);if (cont !=0){break;} else return 0;}

//se il numero è finito, esce dal while ma prima torna all'inizio del numero, ameno che non sia un numero quello che sto pescando. in questo caso va tutto in tilt, sarà meglio prevedere questo errore in 'soluzione'.

} while (true) ;

(05 Ago '14, 23:12) airordl airordl's gravatar image

for (int c=0;c<cont;++c) {

is >> cifra[c]; numero+=cifra[c]* pow(10,cont-c); } //ora non c'è bisogno di 'is.seekg(-cont,qui);'

return numero; }//fine num

};//fine classe

//ovviamente, questo programma non è immediatamente compilabile a causa del format della pagina, ad esempio, nelle inclusioni manca il cancelletto simbolo della direttiva al preprocessore e gli argomenti dei costruttori sono puntatori a char... l'asterisco è stato mascherato..

(05 Ago '14, 23:13) airordl airordl's gravatar image

ovviamente non è ancora finito... manca il 'bello', mi chiedevo se @enzotib avesse qualche idea per rendere la cosa funzionante...

l'estensione deve essere .h, oppure scrivi un main

(05 Ago '14, 23:14) airordl airordl's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×29

domanda posta: 13 Mar '14, 22:05

domanda visualizzata: 8,773 volte

ultimo aggiornamento: 05 Ago '14, 23:40

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.