C'è una cosa che non capisco:
Il parser che scriveremo dovrà riuscire a gestire espressioni contenenti numeri, parentesi e gli operatori + e *. Partiamo dal presupposto che la stringa da analizzare sia già stata spezzata in token che nel nostro caso sono elementi di una lista:
['(', 3, '+', 7, ')', '*', 9, 'end']
Il token end è stato aggiunto per fare il modo che il parser non continui la lettura al termine della lista.
Che significa la parte in grassetto? Io ho solo notato che togliendo 'end' dalla lista ottengo un index out of range.
Comunque ecco il codice degli esercizi che ho postato sopra, potreste correggerlo e scrivere il codice giusto? Grazie.
Esercizio1: modifica StampaAlberoIn così da mettere un paio di pa
rentesi che racchiuda ogni coppia di operandi ed il loro operatore
Il risultato pu` o essere considerato a questo punto corretto e no
ambiguo? Sono sempre necessarie le parentesi?
Codice:
Codice: Seleziona tutto
def StampaAlberoIn(Albero):
if Albero == None: return
StampaAlberoIn(Albero.Sinistra)
print '(',
print Albero.Contenuto,
print ')',
StampaAlberoIn(Albero.Destra)
Esercizio2: Esercizio: scrivi una funzione che accetta un’espressione e la con-
verte in una lista di token.
Codice:
Codice: Seleziona tutto
def OttieniToken(Espressione):
import re
ListaToken = re.split("([^0-9])", Espressione)
Esercizio3: pensa ai vari modi in cui potresti salvare l’albero su file e
poi implementa quello che ritieni sia il più semplice
Apparte che il codice della funzione Animale ha problemi visto che dà sempre qualche errore, ad esempio RamoSinistro che non capisco dove sia stato definito, ecco il codice:
Codice: Seleziona tutto
def Animale():
# parte con una lista composta di un solo elemento
Radice = Albero("uccello")
# continua finche? l?operatore non abbandona
while 1:
print
if not RispostaAffermativa("Stai pensando ad un animale? "): break
# percorre l?albero
SottoAlbero = Radice
while SottoAlbero.RamoSinistro() != None:
Messaggio = SottoAlbero.OttieniContenuto() + "? "
if RispostaAffermativa(Messaggio):
SottoAlbero = SottoAlbero.RamoDestro()
else:
SottoAlbero = SottoAlbero.RamoSinistro()
# prova a indovinare
Ipotesi = SottoAlbero.OttieniContenuto()
Messaggio = "E? un " + Ipotesi + "? "
if RispostaAffermativa(Messaggio):
print "Ho indovinato!"
continue
# ottiene nuove informazioni
Messaggio = "Qual e? il nome dell?animale? "
Animale = raw_input(Messaggio)
Messaggio = "Che domanda permette di distinguere tra un %s e un %s? "
Domanda = raw_input(Messaggio % (Animale, Ipotesi))
# aggiunge le nuove informazioni all?albero
SottoAlbero.SettaContenuto(Domanda)
Messaggio = "Se l?animale fosse un %s quale sarebbe la risposta? "
if RispostaAffermativa(Messaggio % Animale):
SottoAlbero.SettaRamoSinistro(Albero(Ipotesi))
SottoAlbero.SettaRamoDestro(Albero(Animale))
else:
SottoAlbero.SettaRamoSinistro(Albero(Animale))
SottoAlbero.SettaRamoDestro(Albero(Ipotesi))
def RispostaAffermativa(Domanda):
from string import lower
Risposta = lower(raw_input(Domanda))
return (Risposta[0] == 's')
Il codice che ho scritto io per cercare di risolvere l'esercizio è sul notebook, però non mi funziona, come gli altri due del resto. Ho provato aprendo un file e cercando di scriverci sopra, ma niente.
Ora potreste farmi vedere come si risolvono questi esercizi? Ve ne sarei davvero grato
Se c'è un limite è nell'informatico, non nell'informatica - Coltivate Linux... Winzozz si pianta da solo - Linux User #473380 - L'informatica... che arte meravigliosa