|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Notazione Polacca
Devo fare un programma utilizzando le pile che calcoli il risultato di una stringa in notazione polacca, tipo 34534+-* una cosa del genere
come faccio però a creare una stringa e dire al programma che per esempio se la stringa è 213 deve leggere 21 anzichè 2 e 1 separatamente? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Puoi decidere che il tuo "Motore" di calcolo accetta stringhe i cui elementi sono tutti separati da spazio.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
non si può fare una cosa tipo char s[10]={'21','23','432','+','-'}
??? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Certo... dipende da cosa hai in input.
Alla fine devi mettere il tutto in una pila comunque, mi sembra di aver capito
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
come posso fare nell'if per verificare se l'elemento della stringa è un numero oppure se è un simbolo(+,-,*,/)?
non posso usare il codice ascii perchè se il numero è a 2 o piu cifre cosa confronto? Codice HTML:
#include <stdio.h> #include <stdlib.h> #include "funzioni_pile" int Polacca(char s[], int n){ int op1=0; int op2=0; int operatore=0; int somma=0; pilaPtr P=NULL; int i=0; for(i=0;i<10;i++){ if(s[i]=OPERANDO){P=Push(P,OPERANDO);} if(s[i]=OPERATORE){ operatore=s[i]; op1=Top(P); P=Pop(P); op2=Top(P); P=Pop(P); somma=op1 operatore op2; P=Push(P,somma);}} int main(void){ char s[10]={'20','15','100','5','-','*','+','21','-','\0'} int Polacca(s[], 10); system("PAUSE");} Ultima modifica di xbubbax : 17-03-2008 alle 20:27. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
l'algoritmo dovrebbe essere giusto, non so come fare quei confronti...
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
non ti converrebbe leggere una stringa con spazi e usare quelli come delimitatori?
![]() edit:anche perchè se memorizzi i numeri come carattere non vai sopra il byte se non erro
__________________
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2004
Città: Nord-Est
Messaggi: 5160
|
Il mio progetto di info2 era proprio un calcolatore per matrici che implementava uno stack e DOVEVA usare la notazione polacca.
Sono passati 4 anni, non so se lo ho ancora, ma se lo trovo te lo mando, così puoi dare un'occhiata al codice. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
s[i][0]
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
quindi come potrei correggere, cioè come potrei fare il confronto? non ho capito bene
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ti ringrazio abadir ma io ho anche la soluzione di questo esercizio ma è fatta leggermente diversa,al limite do un'occhiata a quella. se mi mandi il progetto sto 3 anni a leggerlo, grazie comq
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Immagina di avere altre 2 o 3 livelli di indentazione e diventa un 400 colonne... non lo stampi piu' neppure se trovi le modulo continuo messe in orizzontale. Codice:
switch(s[i][0])
{
case '+':
case '-':
case '*':
case '/':
//operatore
break;
case '0':
case '1':
....
case '9':
//numero
break;
default:
//THROW PARSING ERROR
break;
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
ma come l'ha dichiarata lui è un'unica stringa..
che poi non dovrebbe nemmeno funzionare dato che non esiste il carattere '15' o '100' ecc.. ad esempio provando a stampare il carattere 15 ( cout<<'15' ) a me da 12597
__________________
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
non mi sembra
Ha solo sbagliato a dichiarare qualcosina... Comunque a me sarebbe piaciuto di piu' lo stringone separato da spazi
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
grazie, domani provo un po con i vostri metodi
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Quote:
__________________
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Ho provato a farlo un po a modo mio prendendo però le cifre singole dalla stringa, se funziona con le cifre singole funziona anche prendendo doppie cifre, basta solo cambiare qualcosa, tipo usare gli spazi come dite voi..
però mi da errore questo anche se sembra perfetto Codice HTML:
#include <stdio.h> #include <stdlib.h> #include "funzioni_pile.h" int Polacca(char *s){ pilaPtr P=NULL; char c; int op1=0; int op2=0; int risultato=0; while(c=*s++){ if(c!='+' && c!='*'){ if(c!='-' && c!='/'){ P=Push(P,c-'0');}}else{ op1=Pop(P); op2=Pop(P); switch(c){ case'+':P=Push(P,op1+op2);break; case'-':P=Push(P,op1-op2);break; case'/':P=Push(P,op1/op2);break; case'*':P=Push(P,op1*op2);break;}}} risultato=Pop(P); return risultato;} int main(void){ char *s="345+*6-"; printf("%d\n", Polacca(s)); system("PAUSE");} |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Perdonami, ma non si capisce nulla.
Proprio nulla. Una riga cosi' e' illeggibile Codice:
P=Push(P,c-'0');}}else{
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
va meglio?
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include "funzioni_pile.h" int Polacca(char *s){ pilaPtr P=NULL; char c; int op1=0; int op2=0; int risultato=0; while(c=*s++){ if(c!='+' && c!='*'){ if(c!='-' && c!='/'){ P=Push(P,c-'0');}}else{ op1=Pop(P); op2=Pop(P); switch(c){ case'+':P=Push(P,op1+op2);break; case'-':P=Push(P,op1-op2);break; case'/':P=Push(P,op1/op2);break; case'*':P=Push(P,op1*op2);break;}}} return Pop(P);} int main(void){ char *s="345*+2-"; printf("%d\n", Polacca(s)); system("PAUSE");} |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
va meglio, ma se non ti piace avere righe con solo } parentesi graffe chiuse, dovrai scegliere altri linguaggi.
Lo standard dei costrutti con le parentesi graffe e' Codice:
Controllore di flusso
{
//Qualcosa
}
e una parentesi graffa finale, per terminare il controllore di flusso, sempre a pari indentazione. Comunque un errore logico che mi salta subito agli occhi e' Codice:
char *s="345*+2-";
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:45.





















