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