ESERCITAZIONE LP 97/98 (RECUPERO)

L'esercitazione di recupero richede di sviluppare un programma applicando lo sviluppo top-dovn guidato dalla sintassi dei dati di input. Il tipo di problema proposto si presta poi allo sviluppo di alcuni moduli. Vediamo in dettaglio il lavoro proposto.


I numeri reali enormi

I "numeri reali enormi" sono tutti i numeri reali con parte intera rappresentabile con al più 50 cifre in base dieci e con parte decimale rappresentabile con al più 50 cifre.

Per esempio
12,23
e
11111111111111111111111111111111111111111,3333333333333333333333333333333333333333333333333
sono numeri reali enormi.


Sintassi del file di input

Il programma deve prendere in input un file il cui nome sarà 'ingresso.txt' ed il cui contenuto è definito dalla seguente sintassi:

Decidere a piacere se è possibile o no aggiungere degli spazi vuoti (caratteri blank) nel file di input.

fine linea
Nel file saranno dunque contenute le definizioni di alcune costanti e di alcune funzioni operanti su numeri reali enormi, ed infine vi saranno alcune espressioni costruite usando queste costanti e funzioni. Lo scopo del programma è stampare nel file 'uscita.txt' i numeri reali enormi che sono il risultato della valutazione delle espressioni date.

Non è possibile dichiarare due volte la stessa costante.

una lettera maiuscola (a, ..., z)

Non è possibile che un elemento di contenga più di 50 cifre.

una cifra decimale (0, 1, 2, 3, 4, 5, 6 ,7, 8, 9)

Non è possibile dichiarare due volte la stessa funzione.
I nomi dei parametri delle funzioni sono tutti distinti, e sono altresì differenti da tutte le costanti dichiarate precedentemente.

una lettera minuscola (A, ..., Z)

Ogni lettera minuscola che appare in un'espressione deve corrispondere ad una costante dichiarata nella parti constanti.
Ogni lettera maiuscola che appare in un'espressione deve essere il nome di una funzione dichiarata nella parte funzioni, ma non occorre che tale dichiarazione preceda l'uso; pertanto ogni nome di funzione dichiarato può apparire nel corpo di ogni funzione. Tuttavia non è possibile dichiarare funzioni ricorsive e gruppi di funzioni mutuamente ricorsive.
La seguente parte funzioni è corretta

@funz
F(x)=(+2,0-G(x))
G(y)=((y*+3,34)-y)
mentre quella che segue è errata
@funz
F(x)=(+2,0-F(x))
G(y)=((y*+3,34)-H((y-+1,1)))
H(z)=G((z-+1,1))
poichè F è ricorsiva e G, H sono mutuamente ricorsive.

L'operatore unario precisione cambia la precisione (cioè il numero di cifre decimali) di un reale enorme; la nuova precisione è al numero racchiuso tra le parentesi quadrate, chiaramente tale numero deve essere minore od uguale a 50 e maggiore di zero.


Sintassi del file di output

L'uscita andrà prodotta nel file 'uscita.txt' secondo la sintassi indicata qui sotto:

Si ricorda che i reali enormi vengono scritti sul file di output seguendo le seguenti convenzioni


Sintassi del file degli errori

Gli errori possono essere trattati in tutto o in parte, quanti decidessero di trattare degli errori lo facciano producendo un file di messaggi d'errore chiamato 'errori.txt' che dovrà contenere una linea per ogni errore rilevato secondo la sintassi data qui di seguito.

Il messaggio (e):l va interpretato come segue:


Classificazione degli errori

Quanti decidano di trattare degli errori indichino gli errori trattati specificando per ogni codice il tipo di errore trattato. I codici vanno assegnati tenendo conto della seguente classificazione.


Materiale da consegnare

Cartaceo
Magnetico
Dischetto per Macintosh contenete il programma ed il file ingresso.txt distribuito con l'esercitazione.

Si richiama l'attenzione sul fatto che, se si esclude la parte relativa alle ottimizzazioni e agli errori, due pagine sono più che sufficienti per la relazione finale.


Annotazioni


Tests

Il tests è costituito da un file di ingresso.txt e dal file uscita.txt che è l'uscita che dovrebbe produrre il programma corretto sull'input dato. Si consiglia di creare altri tests più semplici per espressioni piccole.


DATA DI CONSEGNA

1 MARZO 1999


FAQ (Frequently Asked Questions)

Ultima revisione 10/1/99

IL programma non gira perchè non c'è abbastanza spazio sullo stack delle chiamate.
Modificare la dimensione di tale stack usando il menù run (item run options).
Come calcolare le operazioni sui reali enormi ?
Si suggerisce di implementare gli algoritmi correntemente utilizzati per eseguire tali operazioni a mano usando carta e penna.