• Publicidad

Comparar cadenas porcentualmente

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comparar cadenas porcentualmente

Notapor Lukcuppers » 2012-09-30 01:34 @106

Hola, soy nuevo en Perl. Por lo general programo en C++, pero mi padre me recomendó hacer este proyecto en Perl puesto a su parecido con PHP (posteriormente lo debo publicar en web).

Se trata de un examen de preguntas al azar de 3 niveles diferentes: 5 de nivel 1, 5 nivel 2 y 1 nivel 3.

Previamente el programa debe comprobar tu identidad y verificar si no diste el examen antes, si lo hiciste no te permitiría ingresar al examen.

Entonces el programa lee el archivo "preguntas.txt" carga las preguntas a la memoria y su nivel correspondiente y luego lee las respuestas de "respuestas.txt" y las carga a la memoria y lo mismo con "registro.txt" (archivo donde se encuentran los resultados anteriores), mi problema está cuando tengo que hacer la comparación entre la información nueva del usuario y el registro (comparación de cadenas) y posteriormente en la función "pregu()" cuando debe comparar la respuesta ingresada con la respuesta correspondiente (en por lo menos un 80%).

Cualquier tipo de ayuda o consejo con respecto a la comparación de cadenas, la escritura de datos en un archivo o traducción de código de Perl a PHP me serviría muchísimo, es un proyecto de mucha importancia para mi, y si no lo tengo listo para la próxima semana mis amigas me matan.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. #
  4. use strict;
  5.  
  6. my @preguntas;
  7. my @respuestas;
  8. my @registro;
  9. my $counter=0;
  10. my $level;
  11. my @levelpregunta;
  12. my @levelrespuesta;
  13. my $cont1=0;
  14. my $cont2=0;
  15. my $cont3=0;
  16. my $conterr=0;
  17. my @pregslev;
  18.  
  19. open(PREG, "< preguntas.txt") or die "Could not open preguntas.txt";
  20. while (<PREG>) {
  21.         if (/Level/) {
  22.                 s/Level//;
  23.                 chomp;
  24.                 $level = $_;
  25.                 $pregslev[$level]=0;
  26.         } else {
  27.                 $levelpregunta[$counter] = $level;
  28.                 $preguntas[$counter++] = $_;
  29.                 $pregslev[$level]++;
  30.         }
  31. }
  32. close(PREG);
  33. $counter=0;
  34. open(RESP, "< respuestas.txt") or die "Could not open respuestas.txt";
  35. while (<RESP>) {
  36.         if (/Level/) {
  37.                 s/Level//;
  38.                 chomp;
  39.                 $level = $_;
  40.         } else {
  41.                 $levelrespuesta[$counter] = $level;
  42.                 $respuestas[$counter++] = $_;
  43.         }
  44. }
  45. close(RESP);
  46. my $contreg;
  47. $counter=0;
  48. $contreg=0;
  49. open(REG, "< registro.txt") or die "Could not open registro.txt";
  50. while (<REG>) {
  51.                 $registro[$counter++] = $_;
  52.                 $contreg++;
  53. }
  54. close(REG);
  55. my @info;
  56. print "antes de empezar, Favor ingrese los siguientes datos: \n";
  57. print "Nombre (tal cual esta en facebook): ";$info[1]=<STDIN>;print"\n";
  58. print "Correo electronico (este no sera agregado a ningun mailinglist): ";$info[2]=<STDIN>;print"\n";
  59. print "Numero de telefono(o escribe -1 si no deseas dar alguno): ";$info[3]=<STDIN>;print"\n";
  60. print "Departamento (elegir entre: COCHABAMBA , LAPAZ, SANTACRUZ , TARIJA , POTOSI , CHUQUISACA , ORURO , BENI , PANDO ) ";$info[4]=<STDIN>;print"\n";
  61. my $temp;
  62. my $string;
  63. $temp=0;
  64. #$string=$info[1]+" "+ $info[2]+" "+ $info[3]+" "+ $info[4];
  65.   chop($info[1]);
  66.   chop($info[2]);
  67.   chop($info[3]);
  68.   chop($info[4]);
  69. $string=$info[1]." ".$info[2]." ".$info[3]." ".$info[4]."\n";
  70. #$string=@info;
  71. print "\n se registro: ";print $string;#print "\n";
  72.  
  73. while ($temp<=$contreg)
  74. {
  75. if ($string=$registro[$temp]) ##corregir revision de existencia de datos
  76. {die "your name is already on the database.\n"}
  77. else
  78. {
  79. $temp++;
  80. }
  81. }
  82. ##open(RESP, "< registro.txt") or die "Could not open registro.txt"; ##guardar $string en registro.txt
  83.  
  84. print "Gracias ahora podemos continuar...\n";
  85.  
  86.  
  87.  
  88. while(( $conterr<=3) && ($cont1 < 5) ) {
  89.                 if (&pregu(1)) {
  90.                         $cont1++;
  91.                 } else {
  92.                         $conterr++;
  93.                 }
  94. }
  95. if ($cont1==5){
  96. while(( $conterr<=3) && ($cont2 < 5) ) {
  97.                 if (&pregu(2)) {
  98.                         $cont2++;
  99.                 } else {
  100.                         $conterr++;
  101.                 }
  102.         }
  103. }
  104. else {die "Lo sentimos ha reprobado" }
  105. if ($cont2==5)
  106. {
  107.         print "Solo una pregunta mas... \n";
  108.         $conterr=0;
  109.         while (( $conterr<=3) && ($cont3 < 1)) {
  110.                 if (&pregu(3)) {
  111.                         $cont3++;
  112.                 } else {
  113.                         $conterr++;
  114.                 }
  115.         }
  116.  
  117. }
  118. else {die "Lo sentimos ha reprobado"}
  119. sub compare
  120. {
  121.         ##recibir $resp y $respuestas[$offset+$preg] si 80% parecido entonces true else false;
  122.  
  123.  
  124. }
  125.  
  126. sub pregu {
  127.         my $lev = @_;
  128.         my $preg;
  129.         my $offset=0;
  130.         my $resp;
  131.         if ($lev>1) { $offset = $pregslev[1] };
  132.         if ($lev>2) { $offset += $pregslev[2] };
  133.         $preg = int(rand()*$pregslev[$lev]+0.5);
  134.         print $preguntas[$offset+$preg];
  135.         $resp = <STDIN>;
  136.         if ( $resp =~ $respuestas[$offset+$preg]) {
  137.                 return 1;
  138.         } else {
  139.                 return 0;
  140.         }
  141. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Muchas gracias.

Lucas Cuppers

P.D.: tengo 16 años, cualquier tipo de programación desordenada o lenguaje inculto se debe a mi falta de experiencia en esta vida ¡ji,ji! :D
Lukcuppers
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2012-09-30 01:08 @088
Ubicación: Cochabamba, Bolivia

Publicidad

Re: Comparar cadenas porcentualmente

Notapor explorer » 2012-09-30 09:50 @451

Bienvenido a los foros de Perl en Español, Lukcuppers.

Sí que se nota que programas en C++ :) Tu código Perl tiene muchas referencias a la forma de escribir en C++ ;)

Perl es perfectamente capaz de dar la funcionalidad en la web, sin que tengas que pasarlo a PHP, pero bueno, todo depende de los conocimientos que tengas de cada uno.

Unos comentarios sobre el código:
  • las líneas 65 a 69 las puedes reducir a
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. chomp @info;
    2. $string = join(" ", @info) . "\n";
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
  • en la línea 75 estás usando el operador de asignación '=', cuando seguramente lo que querías era hacer una comparación entre cadenas de caracteres. En ese caso, debes usar 'eq'
  • en la línea 136 intentas usar una expresión regular, pero $respuestas[$offset+$preg] no es un patrón, es solo una cadena de caracteres. Se debería escribir como
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. my $pregunta = $respuestas[$offset+$preg];
    2. if ( $resp =~ /$pregunta/) {
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
    pero, atención: esto lo que hace es devolver verdadero si la cadena que está dentro de $pregunta está dentro de lo que contiene $resp. O dicho de otra manera: si $resp corresponde al patrón definido por $pregunta
En cuanto a compare(), puede resultar algo muy complicado.

Si dejamos que el usuario pueda escribir cualquier respuesta, puede hacerlo de cualquier manera (con mayúsculas, con minúsculas, todo mezclado, con abreviaturas -'q' en lugar de 'que'- y demás cosas).

Una opción sencilla es que las respuestas que tenemos guardadas consistan en una lista de palabras. Y consideraremos que el usuario ha acertado si un cierto porcentaje de esas palabras aparecen en su respuesta. Solo tienes que dividir respuesta y pregunta en listas de palabras.

Aún más sencillo es si la respuesta consiste en una palabra, o en una serie de palabras que siempre deben aparecer en el mismo orden.

En cambio, si la respuesta es más complicada, quizás debamos usar algoritmos de aproximación. En CPAN tienes los módulos String::Approx y Test::Approx que pueden ayudarte en esta tarea.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 31 invitados