Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1322
I Semestre 2004
[<=] [home] [<>] [\/] [=>]
CI-1322 Autómatas y compiladores

Tarea #7 [solución]

Detector de proyectos copiados

      Haga un programa que permita detectar si 2 o más estudiantes han copiado su proyecto programado. Su programa debe recibir archivos C++, a los que aplicará una serie de conversiones para al final obtener lista de números que se usará para detectar programas similares.

      Las transformaciones que tiene que aplicar son las siguientes:

ex-00.cpp
==> Archivo original
ex-01.cpp
==> Elimine comentarios
ex-02.cpp
==> Cambie todos los identificadores por "id"
ex-03.cpp
==> Cambie todas las hileras por "s"
ex-04.cpp
==> Cambie todos los números por 0
ex-05.cpp
==> Elimine espacios en blanco múltiples
ex-06.cpp
==> Elimine renglones en blanco
ex-07.cpp
==> Ordene todos los renglones
ex-08.cpp
==> Elimine renglones duplicados

      Haga esto para cada archivo de un proyecto, y luego calcule el tamaño del archivo resultantes. Distinga a los archivos que son referenciados en un #include "encabezado.h" de los que no lo son, y ordene los tamaños de los archivos de mayor a menor:

Torres.cpp    Casona.cpp   Isla.cpp     Torres.h   Casona.h   Lista.h   Isla.h
    345          312         215           415       412         233      105

NO es #include    Es #include
(345, 312, 215)  (415, 412, 233, 105)    Estos 2 son similares ==> Seguro son copias
(343, 310, 213)  (415, 412, 233)

(535, 212, 115)  (233, 105,  66,  35)    Nada que ver con los otros.

      La entrada para el programa detector de parejas de copia es la ruta a un directorio que contiene todos los proyectos, en donde cada subdirectorio es la solución del proyecto de cada estudiante. No es necesario examinar los sub-sub-directorios que estén más profundos:

Tareas
  |
  |--> A22222
  |--> A33333          Un sub-directorio por cada proyecto
  \--> A44444
          \--> Subdir: No interesa el contenido de sub-sub-directorios

      En cada subdirectorio hay que examinar archivos de 2 tipos:

      Para encontrar proyectos duplicados se pueden usar al menos estos métodos:

      Una vez que ya se han obtenido las listas de tamaños compactados para cada archivo, el proceso consiste en encontrar parejas de proyectos que aparenten ser similares.

      No es necesario urgar en archivos de extensión diferente, pues se debe suponer que si un proyecto parece copiado, pues tienen una estructura extraña, automáticamente quien califica tratará de revisar que ese proyecto no sea copiado.

      Como "n ≤ 100" (en donde "n" es el número de proyectos), un algoritmo que sea O(n4) o O(n5) es perfectamente efectivo, porque hacer 10,000,000 o 100,000,000 de cálculos en una Pentium 4 de 2.0 GigaHerts es suficientemente rápido.

// ex04_18.cpp
#include <iostream>

using std::cout; 
using std::endl;

int whatIsThis( int [], int );

int main()
{
   const int arraySize = 10;
   int a[ arraySize ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   int result = whatIsThis( a, arraySize );

   cout << "Result is " << result << endl;
   return 0;
}

int whatIsThis( int b[], int size )
{
   if ( size == 1 )
      return b[ 0 ];
   else
      return b[ size - 1 ] + whatIsThis( b, size - 1 );
}


/**************************************************************************
 * (C) Copyright 2000 by Deitel & Associates, Inc. and Prentice Hall.     *
 * All Rights Reserved.                                                   *
 *                                                                        *
 * DISCLAIMER: The authors and publisher of this book have used their     *
 * best efforts in preparing the book. These efforts include the          *
 * development, research, and testing of the theories and programs        *
 * to determine their effectiveness. The authors and publisher make       *
 * no warranty of any kind, expressed or implied, with regard to these    *
 * programs or to the documentation contained in these books. The authors *
 * and publisher shall not be liable in any event for incidental or       *
 * consequential damages in connection with, or arising out of, the       *
 * furnishing, performance, or use of these programs.                     *
 *************************************************************************/
ex-00.cpp: Archivo original

#include <iostream>

using std::cout; 
using std::endl;

int whatIsThis( int [], int );

int main()
{
   const int arraySize = 10;
   int a[ arraySize ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   int result = whatIsThis( a, arraySize );

   cout << "Result is " << result << endl;
   return 0;
}

int whatIsThis( int b[], int size )
{
   if ( size == 1 )
      return b[ 0 ];
   else
      return b[ size - 1 ] + whatIsThis( b, size - 1 );
}
ex-01.cpp: Elimine comentarios

#include <iostream>

using id::id;
using id::id;

id id( id [], id );

id id()
{
   const id id = 10;
   id id[ id ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   id id = id( id, id );

   id << "Result is " << id << id;
   return 0;
}

id id( id id[], id id )
{
   if ( id == 1 )
      return id[ 0 ];
   else
      return id[ id - 1 ] + id( id, id - 1 );
}
ex-02.cpp: Cambie todos los identificadores por "id"

#include <iostream>

using id::id;
using id::id;

id id( id [], id );

id id()
{
   const id id = 10;
   id id[ id ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   id id = id( id, id );

   id << "s" << id << id;
   return 0;
}

id id( id id[], id id )
{
   if ( id == 1 )
      return id[ 0 ];
   else
      return id[ id - 1 ] + id( id, id - 1 );
}
ex-03.cpp: Cambie todas las hileras por "s"

#include <iostream>

using id::id;
using id::id;

id id( id [], id );

id id()
{
   const id id = 0;
   id id[ id ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

   id id = id( id, id );

   id << "s" << id << id;
   return 0;
}

id id( id id[], id id )
{
   if ( id == 0 )
      return id[ 0 ];
   else
      return id[ id - 0 ] + id( id, id - 0 );
}
ex-04.cpp: Cambie todos los números por 0

#include <iostream>

using id::id;
using id::id;

id id( id [], id );

id id()
{
 const id id = 10;
 id id[ id ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

 id id = id( id, id );

 id << "s" << id << id;
 return 0;
}

id id( id id[], id id )
{
 if ( id == 0 )
 return id[ 0 ];
 else
 return id[ id - 0 ] + id( id, id - 0 );
}
ex-05.cpp: Elimine espacios en blanco múltiples

#include <iostream>
using id::id;
using id::id;
id id( id [], id );
id id()
{
 const id id = 10;
 id id[ id ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 id id = id( id, id );
 id << "s" << id << id;
 return 0;
}
id id( id id[], id id )
{
 if ( id == 0 )
 return id[ 0 ];
 else
 return id[ id - 0 ] + id( id, id - 0 );
}
ex-06.cpp: Elimine renglones en blanco

 const id id = 10;
 else
 id << "s" << id << id;
 id id = id( id, id );
 id id[ id ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 if ( id == 0 )
 return 0;
 return id[ 0 ];
 return id[ id - 0 ] + id( id, id - 0 );
#include <iostream>
{
{
}
}
id id( id [], id );
id id( id id[], id id )
id id()
using id::id;
using id::id;
ex-07.cpp: Ordene todos los renglones

 const id id = 10;
 else
 id << "s" << id << id;
 id id = id( id, id );
 id id[ id ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 if ( id == 0 )
 return 0;
 return id[ 0 ];
 return id[ id - 0 ] + id( id, id - 0 );
#include <iostream>
{
}
id id( id [], id );
id id( id id[], id id )
id id()
using id::id;
ex-08.cpp: Elimine renglones duplicados

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 10 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2004
Derechos de autor reservados © 2004
[home] <> [/\]