Correzione prova pratica del 3 ottobre 2003
Correzione prova pratica del 3 ottobre 2003
Istruzioni:
il commento iniziale rappresenta il giudizio complessivo sul programma. Nei commenti trovate:
- FIXME: segnalazione di un errore, non necessariamente sono tutti segnalati e non necessariamente sono tutti presi in considerazione
per il voto finale
- TODO: segnala l'assenza di parti di codice
- XXX: segnala qualcosa di non chiaro o inutile ai fini del codice, commenti di ordine generale, errori di battitura o suggerimenti
Il codice presentato non è necessariamente identico a quello consegnato in quanto possono essere state effettuate modifiche per
renderlo compilabile e/o per la corretta indentazione.
//XXX (5) errore in inizializzazione matrice, sbaglia a nidificare i cicli e lieve errore in calcolo minimo
// <NIGRO> <CARLO>, <145559>, <karl.lee@virgilio.it>, <DIS11>
// <03/10/2003>, <cdl. Ing.Informatica>
#include <iostream.h>
#include <string.h>
main()
{
char s[20], t[20];
int n, m, costo, dl; // variabili di calcolo lunghezza stringhe; costo e dl
cout << "Inserire stringa s: ";
cin.getline(s,20);
n = strlen(s); // calcolo lunghezza stringa s
cout << "\n" << "Inserire stringa t: ";
cin.getline(t,20);
m = strlen(t); // calcolo lunghezza stringa s
cout << "\n\n";
if (n == 0)
{
cout << "La distanza di Levenshtein è " << strlen(t); //FIXME strlen() ha un costo computazionale, poteva direttamente utilizzare m
return 0;
}
else if (m == 0)
{
cout << "La distanza di Levenshtein è " << strlen(s); //FIXME come sopra
return 0;
}
int d[21][21]; // inizializzazione matrice come array bidimensionale
for (int cnt=0, i=0, j=0; cnt <= n; cnt++, j++, i++) //FIXME doveva usare due cicli, cosi' se la stringa s e' piu' corta di t rischia l'errore
{
d[0][i] = cnt; // definisce la riga della matrice
d[j][0] = cnt; // definisce la colonna della matrice
}
for (i=0; i<=n-1; i++)
{
for (j=0; j<=m-1; j++) //FIXME questo ciclo sottintende solo la riga seguente e non il resto!
if (t[j] == s[i]) costo = 0; else costo = 1;
{
int a = d[j+1][i]+1, b = d[j][i+1]+1, c=d[j][i]+costo;
if ( a < b && a < c ) d[j+1][i+1] = a;
else
if ( b < a && b < c ) d[j+1][i+1] = b;
else
if ( c < a && c < b) d[j+1][i+1] = c; //FIXME e se a==b && a <c ? che valore ci finisce in quella cella?
}
}
dl = d[m][n];
cout << "La distanza di Levenshtein è " << dl;
return 0;
}
Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a
bertozzi@CE.UniPR.IT