ESERCITAZIONE: GIUSTIFICARE

Sviluppare un programma che giustifichi un testo in lingua italiana, dividendo anche le parole in sillabe, dove
testo in lingua italiana
si intende un qualunque testo in lingua italiana rappresentato come una sequenza di caratteri ASCII (quindi lettere maiuscole/minuscole [solo le 21 lettere dell'alfabeto italiano], punteggiatura [inclusa l'apostrofo], cifre, separatori [spazio, andata a capo, tabulatore], le vocali accentate saranno rappresentate usando lo stesso carattere usato per l'apostrofo).
Tale testo può essere diviso liberamente in linee, ammesse anche linee vuote, ed anche i separatori tra le parole possono essere distribuiti liberamente.
giustificare
si intende, data una lunghezza di linea L, dividere il testo in linee di lunghezza L (cioè il più possibile vicino a L, e comunque non superiore a L), distribuendo inoltre gli spazi bianchi necessari nel modo più uniforme possibile, rispettando comunque la regole che non si mette mai uno spazio all'inizio della linea, e che non si mettono mai spazi davanti ai segni di punteggiatura.
dividere in sillabe
si intende come prescritto dalla grammatica della lingua italiana, vedere la documentazione allegata.
Si noti che nel caso della lingua italiana questa divisione è algoritmica, mentre non lo è per esempio per la lingua inglese.
Per chiarire il tutto diamo di seguito alcuni esempi.

Si consideri il seguente testo della lingua italiana

Alla fine del corso  viene proposta 
un'esercitazione;
in presenza di un numero di studenti rilevante e' possibile avere 
un'esercitazione di recupero da svolgere nella sospensione di Febbraio; 
per questa eventualita' contattare il docente verso Dicembre.

La prima prova risulta complessivamente, se superata, 
in un voto V1 (tra 15 e 
30 e lode); 
la seconda  prova  risulta, se superata, in un voto V2 (tra 15 e 
30 e lode). 
L'esame e' superato se sono superate entrambe le 
due prove e il voto finale sara'  V (tra 18 e 30 e lode)
tale che  V e' maggiore di un'opportuna combinazione lineare di V1 e V2
(in questi calcoli 30 e lode 
viene considerato 33).
Le due prove possono essere superate in ogni ordine (cioe' 
prima la prima  e poi la seconda, o viceversa, o simultaneamente).

Se una  delle due prove viene superata la sua validita'
 durera' per sempre.

E' possibile ripetere la prima prova, anche in caso di risultato 
sufficiente. Se tale prova viene ritentata (cioe' si ci presenta 
nuovamente all'esame) 
il risultato 
della prova precedente viene annullato e non sara' piu'
valido.

Notare che cio' vale anche in caso di prova precedente 
superata e di nuova prova 
non superata, in tal caso non si ha una prova valida.

E' possibile ripetere anche la prova 2 in caso di risultato 
sufficiente almeno una volta; anche in questo caso il nuovo risultato 
annullera' il precedente.
Giustificato su line di lunghezza 50
Alla fine del corso viene proposta un'esercitazio-
ne; in presenza di un numero di studenti rilevante
e' possibile avere un'esercitazione di recupero da
svolgere nella sospensione di Febbraio; per questa
eventualita' contattare il docente verso Dicembre.
La prima prova risulta  complessivamente, se supe-
rata, in un  voto V1  (tra 15 e 30 e lode); la se-
conda  prova  risulta,  se superata, in un voto V2 
(tra 15 e 30 e  lode). L'esame e' superato se sono 
superate  entrambe le due  prove e il  voto finale 
sara' V (tra 18 e 30 e lode) tale che V e' maggio-
re di un'opportuna combinazione lineare di V1 e V2
(in  questi  calcoli 30 e  lode viene  considerato 
33). Le due prove possono  essere superate in ogni 
ordine (cioe' prima  la prima  e poi la seconda, o 
viceversa, o  simultaneamente). Se  una  delle due 
prove viene superata  la sua validita' durera' per 
sempre. E' possibile  ripetere la prima prova, an-
che in caso di risultato sufficiente. Se tale pro-
va viene ritentata (cioe' si ci presenta nuovamen-
te all'esame) il  risultato della prova precedente 
viene  annullato e non  sara' piu'  valido. Notare 
che cio' vale  anche  in caso di prova  precedente 
superata e di nuova prova non superata, in tal ca-
so non si ha una  prova valida. E' possibile ripe-
tere anche la  prova 2 in caso di risultato suffi-
ciente  almeno una volta; anche in  questo caso il 
nuovo risultato annullera' il precedente.
Giustificato su righe di lunghezza 30.
Alla fine del corso viene pro-
posta   un'esercitazione;   in 
presenza  di un numero di stu-
denti  rilevante  e' possibile 
avere  un'esercitazione di re-
cupero da  svolgere  nella so-
spensione  di  Febbraio;   per 
questa eventualita' contattare
il docente verso  Dicembre. La
prima prova risulta complessi-
vamente,  se  superata, in  un 
voto  V1 (tra 15 e 30 e lode); 
la seconda  prova  risulta, se 
superata, in  un voto  V2 (tra 
15 e  30 e  lode).  L'esame e' 
superato se  sono superate en-
trambe le due  prove e il voto 
finale  sara' V (tra 18 e 30 e
lode) tale  che V e'  maggiore 
di  un'opportuna  combinazione 
lineare di V1  e V2 (in questi
calcoli 30 e lode viene consi-
derato 33).  Le due prove pos-
sono  essere superate  in ogni 
ordine (cioe' prima la prima e
poi la seconda, o viceversa, o
simultaneamente). Se una delle
due  prove  viene  superata la 
sua validita' durera' per sem-
pre. E' possibile  ripetere la
prima prova,  anche in caso di
risultato sufficiente. Se tale
prova  viene  ritentata (cioe' 
si ci presenta  nuovamente al-
l'esame)  il  risultato  della 
prova  precedente viene annul-
lato e  non sara' piu' valido.
Notare  che cio' vale anche in
caso di prova precedente supe-
rata e di  nuova prova non su-
perata,  in tal caso non si ha
una prova valida. E' possibile
ripetere  anche  la prova 2 in 
caso di  risultato sufficiente
almeno  una  volta;  anche  in 
questo caso il nuovo risultato
annullera' il precedente.

riga

INPUT DEL PROGRAMMA

L'input del programma sarà una stringa (il nome del file che contiene il testo da giustificare), un numero compreso tra 20 e 200 (la lunghezza delle linee giustificate), ed un'altra stringa (il nome del file che conterrà alla fine il testo giustificato).

È possibile fare le seguenti assunzioni sul testo di input:

riga

OUTPUT DEL PROGRAMMA

Il testo giustificato contenuto nel file indicato.

riga

TESTS

Gli esempi introdotti precedentemente costituiscono dei tests per il vostro programma
Utilizzateli per controllarlo.

riga

DOCUMENTAZIONE

Alleghiamo le immagini (ricavate usando lo scanner) di alcune pagine di un libro di grammatica, che presenta chiaramente le regole per la divisione in sillabe.

Pagina 1
Pagina 2
Pagina 3

riga

ALGORITMI PER LA SOLUZIONE

Lo sviluppo di questo programma richiede lo sviluppo di alcuni algoritmi:
Dividere un testo in righe di data lunghezza massima
Considerate prima un algoritmo per questo problema più semplice:
dividere un testo della lingua italiana in righe di lunghezza massima data senza spezzare le parole
Divisione in sillabe
occorre pensare a come viene fatta la divisione in sillabe di una parola nella lingua italiana, pensare a come sono fatte le sillabe (ricordarsi di decidere cosa fare con le parole che contengono l'apostrofo), e poi pensare un algoritmo abbastanza semplice e testarlo a mano su molte parole che presentino aspetti differenti.
suggerimento di algoritmo (occorre aggiungere qualche caso, ad esempio non spezza acqua ed acme):
Combinare i due
Raffinare il primo algoritmo introducendo la possibilità di spezzare le parole (aggiungendo il trattino)
Distribuzione uniforme degli spazi
A questo punto una riga potrà contenere un certo numero di spazi bianchi, che non devono essere messi alla fine della riga, ma distribuiti tra le varie parole in modo uniforme e abbastanza casuale in modo da evitare "disegni bianchi" cha appaiono ad una prima vista del testo.
Dopo aver determinato tutti gli algoritmi di cui sopra, si deve pensare alle strutture dati necessarie per implementarli.

Occorre poi definire una struttura modulare per il programma, che rifletta ciò di cui sopra.

Per finire, scrivere il codice C e testarlo seguendo la struttura modulare di cui sopra.

riga

VALUTAZIONE

È possibile risolvere solo una parte di questo problema, precisamente non considerare la parte che riguarda la distribuzione degli spazi all'interno di una riga.
In questo caso la valutazione massima ottenibile sarà 27.

riga

MODALITÀ DI CONSEGNA

Occorre consegnare
  1. Dischetto contenente il programma completo, il tutto contenuto in un folder chiamato PROGRAMMAngruppo.
  2. Una copia dei file descritti al punto 1 stampati su carta
  3. Documentazione del programma (incluso algoritmi, struttura modulare) realizzata come un documento ipertestuale scritto utilizzando HTML, il tutto contenuto in un folder chiamato DOCUMENTAZIONEngruppo.

riga

DATA DI CONSEGNA

La data di consegna ultima è il 16 Ottobre 2000.

riga

Ultima modifica: 20 Luglio 2000