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 (4) alcuni errori, non arriva ad inizializzare la matrice e sbaglia il calcolo principale
// Leone Guido, 149729, mclaren.gl@tiscali.it, stud14
// 03-10-2003 - esame di Fondamenti di Informatica A, ing telecomunic
#include <iostream.h>
#include <string.h>
#include <stdio.h>
short Minore(short a, short b, short c);
int main()
{
char s[36]; // lunghezza massima della stringa = 35 caratteri
char t[36]; // lunghezza massima della stringa = 35 caratteri
short DL;
short n, m, i, j, costo, conta=0;
cout << "Inserire stringa s: "; cin.getline(s,36);
cout << "Inserire stringa t: "; cin.getline(t,36);
n = strlen(s);
m = strlen(t);
if (n==0)
{
DL = m;
cout << "La distanza di Levenshtein e' " << DL << endl;
exit(1);
}
else if (m==0) //FIXME l'else e' inutile
{
DL = n;
cout << "La distanza di Levenshtein e' " << DL << endl;
exit(2);
}
short d [n+1][m+1];
for (i=0; i<=n+1; i++) //FIXME se la stringa e' lunga n mi devo fermare prima (<n)
{
conta = conta++; //FIXME non si puo' usare cosi' l'operatore di incremento postfisso
d[i][0] = conta;
}
for (j=0; j<=m+1; j++) //FIXME come sopra
{
conta = conta++; //FIXME come sopra, aggravato dal fatto che qui conta non lo ha azzerato precedentemente
d[0][j] = conta;
}
for (i=0;i<strlen(s);i++) //FIXME strlen() ha un costo computazionale, doveva utilizzare n e m
for (j=0;j<strlen(t);j++)
{
if (s[i]==s[j])
costo = 0;
else
costo = 1;
} // FIXME questi due blocchi andavano uniti
for(int i=1; i<=strlen(s); i++)
for(int j=1; j<=strlen(t); j++)
d[j+1][i+1] = Minore(d[j+1][i]+1, d[j][i+1]+1, d[j][i]+costo);
DL = d[m][n];
cout << "La distanza di Levenshtein e' " << DL;
}
short Minore(short a,short b,short c)
{
short minore;
if ( (a<=b) && (a <=c) )
minore = a;
else if ( (b<=a) && (b <=c) )
minore = b;
else // per esclusione
minore = c;
} //FIXME il calcolo e' corretto, magari il valore doveva anche essere restituito.
Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a
bertozzi@CE.UniPR.IT