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: 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