SquirrelMail
  Desconectarse
Componer   Direcciones   Carpetas   Opciones   Buscar   Ayuda   Calendario   Recoger  


Ver un texto adosado - Ver el mensaje
Bajar este mensaje como un archivo

 

Sección A:

1)  Escribir un programa Perl que lea un número, lo multiplioque por 2, e imprima el resultado.

2) Escribir un programa Perl que lea 2 números y haga lo siguiente:

    1. Imprimir Error: no se puede dividir por cero si el segundo número es 0.
    2. Si el 1er. número es  0 o el 2do. es 1, simplemente imprime el 1er. número (no es necesario dividir).
    3. En cualquier otro caso, dividir el 1er. número por el 2do. e imprimir el resultado.

3) Encontrar los bugs en el siguiente programa (atención: puede ser que haya más de uno!.)

#!/usr/local/bin/perl
$value = <STDIN>;
if ($value = 17) {                            
print ("You typed the number 17.\n");                  
else {
print ("You did not type the number 17.\n");         

4) Escribir un programa Perl que imprima todos los números de 0 hasta 1 con un solo digito decimal (es decir: 0.1, 0.2, y así..).

5) Escribir un programa Perl que lea una línea ingresada por el usuario e imprima como salida lo siguiente:

    • 1 si la línea consiste en un entero distinto de cero
    • 0 si la línea consiste en un cero o un string
      (Sugerencia: recordar que los strings de caracteres son convertidos a 0 cuando son convertidos a enteros.)

6) Escribir un programa Perl que pide el ingreso de un número y se mantiene intentándolo hasta que se ingresa el número 47. En ese momento imprimir Correcto!.

7) Encontrar los bugs en el siguiente programa

#!/usr/local/bin/perl
$inputline = <STDIN>;
print (here is the value of \$inputline, : $inputline");

8) Encontrar qué está mal en el siguiente programa

$num1 6.02e+23;
$num2 = 11.4;
$num3 = 5.171e+22;
$num4 = -2.5;
$result = $num1 + $num2 - $num3 + $num4;

9) Encontrar los bugs en el siguiente programa

$result = "26" + "0xce" + "1";

10) Encontrar los bugs en el siguiente programa

#!/usr/local/bin/perl
$num = <STDIN>;
chop ($num);
$x = "";
$x += "hello";
if ($x != "goodbye" | $x ="farewell") { 
$result = $num eq 0 ? 43;
} else {
$result = ++$num++;   
}
print("the result is $result\n");

 

Sección B:

 

1) Se llama comúnmente filtro a un programa que tiene como input un cierto archivo y como output ese mismo archivo con ciertas modificaciones.

Por ejemplo, podríamos correr en el prompt del shell de Unix:

cat input_text | filter.pl 2 1 3     (o lo que es lo mismo:     filter.pl 2 1 3 < input_text)

En este caso el filtrado lo lleva a cabo el programa filter.pl, que por su extensión (.pl) es un script perl.

Desarrollar filter.pl para que invierta el orden de las palabras de cada línea del input: que les ponga el orden indicado como parámetro. Ej: si una linea de la entrada es “hola que tal” en este ejemplo debe ser reemplazada en la salida por “que hola tal”.

Aclarar en la solución las hipótesis que se necesite tener en cuenta, por ejemplo: qué se hace con las palabras de la 4ta. en adelante, etc.

 

2) Analizar el siguiente planteo y discutir si es más conveniente realizarlo en Shell Script o en Perl. Luego desarrollarlo.

Se desea desarrollar un conjunto de comandos que conformen un pequeño sistema de borrado de archivos con reciclado, algo así como el “Recycle bin” de Windows.

Para ello se deben tener los siguientes scripts:

2.a) rm

Se invocará:      rm arch.txt

                        rm arch1.txt arch2.txt

                        rm *.txt

Debe ‘borrar’ el archivo, pero con posibilidad de recuperarlo después.

Puede ser invocado con metacaracteres del shell (y por lo tanto recibir varios archivos como parámetro).

Sugerencia: moverlos a un directorio especial, acompañado de un archivo para guardar datos de los archivos ahí movidos.

2.b) recup

Se invocará:      recup arch.txt

                        recup arch1.txt arch2.txt

                        recup –f ddmmaaaa

Restaura el/los archivos pasados como parámetro al lugar donde estaban originalmente.

Opción –f: restaura el/los archivos que fueron ‘borrados’ en esa fecha.

2.c) liberar

Se invocará:      liberar arch.txt

                        liberar arch1.txt arch2.txt

                        liberar –f ddmmaaaa

Borra definitivamente los archivos (si se encuentran en el recycle bin).

Opción –f: borra definitivamente el/los archivos que fueron ‘borrados’ en esa fecha.

2.d) list

Se invocará:      list arch.txt

                        list arch1.txt arch2.txt

                        list

list –f ddmmaaaa

list –L arch.txt

                        list –L arch1.txt arch2.txt

Lista (imprime en pantalla o stdout) los archivos que se encuentran en el recicle bin y que fueron pasados como parámetro.

Opción sin parámetros: equivale a pasarle todos los archivos existentes en el recicle bin.

Opción –f: lista el/los archivos de la fecha

Opción –L: lista agregando la información del archivo guardada por nuestro sistema de recicle bin.

 

Notar que se les ha dado a algunos comandos, el mismo nombre que tienen en Unix los comandos para fines parecidos pero que ya son standards del sistema operativo. Ej: el comando “rm” es para borrar en Unix. Al haber instalado convenientemente los comandos desarrollados por nosotros, el usuario correrá en forma transparente el rm nuestro sin saber que en realidad no está borrando completamente los archivos, y se le podrá proveer backup en caso de necesidad.

 

3) Escribir un perl script que lea un string y un número que el usuario ingrese por teclado, e imprima el string la cantidad de veces indicada por el número, en líneas separadas.

 

4) Escribir un perl script que lea una lista de strings (es decir, un texto cualquiera de entrada) ingresada por el usuario, e imprima la lista en orden inverso.

 

5) Escribir un perl script que lea un número y una lista de strings ingresados por el usuario y luego imprima una de las lineas de la lista: aquella correspondiente al número de línea indicado por el número ingresado.

 

6) Escribir un perl script que imprima todos los números primos que va encontrando, en el campo de los números enteros, en un rango ingresado por el usuario. También informará la cantidad de ellos encontrada.

 

7) Escribir un programa q lea un texto ingresado por el usuario, de la forma: una palabra por línea. Éste debe sacar un reporte de: palabras y su cantidad de apariciones.

 

8) Concatenar el programa del punto anterior con uno del sistema operativo para que cuente las apariciones en un texto de cualquier cantidad de palabras por línea, es decir, sin la restricción de una sóla palabra por línea en el input.

 

9) Idem. ant. pero contando la cantidad de las letras en vez de palabras.

10) Escribir un programa que lee un texto ingresado por el usuario e imprime cada linea del texto junto con un contexto. Asumir que se ingresa una palabra por línea. Ejemplo:

   DOS> perl expand 2
   the
   top
   tip
   the
   tie
   tax
   ^Z
   ??? ??? the top tip
   ??? the top tip the
   the top tip the tie
   top tip the tie tax
   tip the tie tax ???
   the tie tax ??? ???

El programa muestra las palabras ingresadas por el usuario pero adicionalmente muestra n palabras antes y n despues. El valor de n es especificado como argumento en linea de commando al programa. Las palabras de contexto no-existentes antes de las palabras iniciales y despues del final son reemplazadas por tres signos de pregunta por palabra.

El programa debe usar una subrutina para leer el texto dentro de la lista conteniendo una palabra por elemento y otra subrutina para generar la salida de la lista.

 

11) Escribir un perl script que lea una lista de strings ingresadas por el usuario y los imprima en 20 columnas, justificando a derecha.

 

12) Modificar el pto. ant. para que el usuario también ingrese la cantidad de columnas.

 

13) El sig. programa juega al ta-ta-ti. Puedes hacer copy & paste y correrlo en un equipo para probarlo. Leer y analizar a grandes rasgos el programa. Cómo elige la movida que realizará el programa (y dónde y cómo modificaría para mover más inteligentemente)?

 

# ttt:   play tic-tac-toe
# usage: ttt
# 2000-03-13 erikt@uia.ua.ac.be
 
$true = 1;
$false = 0;
$gamesPlayed = 0;
$continue = $true;
$computerScore = 0;
$humanScore = 0;
$computerStarts = "";
 
# this loop allows us to play a series of games
while ($continue) {
   $movesPlayed = 0;
   $maxMovesPlayed = 9;
   $gameWon = $false;
   
   # The field contains nine squares which can be identified as follows:
   # 0..1..2
   # 3..4..5
   # 6..7..8 
   # In the move lists the value $true means that the player has occupied
   # the square. 
   @computerMoves = 
      ($false,$false,$false,$false,$false,$false,$false,$false,$false);
   @humanMoves = 
      ($false,$false,$false,$false,$false,$false,$false,$false,$false);
   @occupied = 
       ($false,$false,$false,$false,$false,$false,$false,$false,$false);
   
   # The field contains eight rows which can be identified as follows:
   # 0  1  2  3  4    row 0 contains squares 0, 4, 8
   #    0..1..2  5    row 1 contains squares 0, 3, 6
   #    3..4..5  6    row 2 contains squares 1, 4, 7
   #    6..7..8  7    row 3 contains squares 2, 5, 8
   #                  row 4 contains squares 2, 4, 6
   #                  row 5 contains squares 0, 1, 2
   #                  row 6 contains squares 3, 4, 5
   #                  row 7 contains squares 6, 7, 8
   # Each square is represented by a number in which ones and zeroes 
   # indicate in what rows the square appears. 
   @fieldValues = ( 11000100,  100100,   11100,
                     1000010,10101010,   10010,
                     1001001,  100001,10010001);
   # The numbers will be added to the field value of the player that 
   # occupies them. As soon as one of these numbers contains a 3 then
   # the player has three-in-a-row
   $computerField = 0;
   $humanField = 0;
   
   # let the computer play the first move, if necessary
   if ($computerStarts !~ /^[01]$/) {
      print "Do you want to start (y/n)? ";
      chomp($answer = <>);
      $computerStarts = $answer ne "y";
   }
   if ($computerStarts) {
      # compute a computer move: choose a random number until it is ok
      $move = $maxMovesPlayed;
      $move = int(rand(9)) while (not(defined($occupied[$move])) or
                                  $occupied[$move]);
      print "computer playes ",$move+1,"\n";
      $computerMoves[$move] = $true;
      $occupied[$move] = $true;
      $computerField += $fieldValues[$move];
      $movesPlayed++;
      # for next game
      $computerStarts = $false;
   } else { $computerStarts = $true; }
   
   # while the game has not ended, read a human move
   while ($movesPlayed < $maxMovesPlayed and not($gameWon)) {
      # print the field
      for ($i=0;$i<$maxMovesPlayed;$i++) {
         if (not($occupied[$i])) { print ". "; }
         elsif ($computerMoves[$i]) { print "x "; }
         elsif ($humanMoves[$i]) { print "o "; }
         else { print "cannot happen\n"; exit(1); }
         if ($i == 3*(int(($i+1)/3))-1) { print "\n"; }
      }
      # read a human move: accept numbers 1-9!
      $move = "";
      while ($move !~ /^[1-9]$/ or $occupied[$move-1]) {
         print "Please enter a move (1-9): ";
         chomp($move = <>);
      }
      # go back to numbers 0-8
      $move--;
      $humanMoves[$move] = $true;
      $occupied[$move] = $true;
      $humanField += $fieldValues[$move];
      $movesPlayed++;
      if ($humanField =~ /3/) { 
         print "Human wins!\n"; 
         $humanScore++;
         $gameWon = $true; 
      }
   
      # if the game has not ended, play a computer move
      if ($movesPlayed < $maxMovesPlayed and not($gameWon)) {
         $move = $maxMovesPlayed;
         $move = int(rand(9)) while (not(defined($occupied[$move])) or
                                     $occupied[$move]);
         print "computer playes ",$move+1,"\n";
         $computerMoves[$move] = $true;
         $occupied[$move] = $true;
         $computerField += $fieldValues[$move];
         $movesPlayed++;
         if ($computerField =~ /3/) { 
            print "Computer wins!\n";
            $computerScore++;
            $gameWon = $true; 
         }
      }
   }
   
   # print the final field
   for ($i=0;$i<$maxMovesPlayed;$i++) {
      if (not($occupied[$i])) { print ". "; }
      elsif ($computerMoves[$i]) { print "x "; }
      elsif ($humanMoves[$i]) { print "o "; }
      else { print "cannot happen\n"; exit(1); }
      if ($i == 3*(int(($i+1)/3))-1) { print "\n"; }
   }
   if (not($gameWon)) { print "Draw.\n"; }
 
   # print results
   $gamesPlayed++;
   print "\n$gamesPlayed game";
   print "s" if ($gamesPlayed != 1);
   print " played: Computer $computerScore - Human $humanScore\n";
   print "\nContinue playing? (y/n)";
   chomp($answer = <>);
   $continue = $false if ($answer eq "n");
}
exit(0);