virtualword
Te invitamos a registrarte para poder acceder a todo el contenido gratuito que esta comunidad provee.

Saludos Wink

Soluciones lección 032

Ir abajo

Soluciones lección 032

Mensaje  Kyshuo Ayame el Miér Nov 20, 2013 4:57 pm

Soluciones selectas para los ejercicios propuestos en la lección 32:

Solución Ejercicio 3: Escribir una función ALFA que tenga como parámetros un arreglo de caracteres llamado FRASE (con un máximo de 100 caracteres), un natural llamado LARGO (número de caracteres en la frase) y una variable de carácter llamada LETRA. La función ALFA produce el número de apariciones del carácter LETRA en el arreglo FRASE.

La idea es recorrer el arreglo FRASE carácter a carácter y comparar cada uno de los caracteres con el carácter buscado. En caso de coincidencia se incrementa una variable, la cual es la salida del procedimiento. A continuación se presenta una solución al problema. Además de la función ALFA se incluye un programa principal que pide al usuario la frase y el carácter a buscar y devuelve la cantidad de veces que el carácter aparece en la frase.

Código:
MODULE Pr1_4;
FROM STextIO IMPORT WriteString, WriteLn, WriteChar, ReadRestLine, ReadChar, SkipLine;
FROM SWholeIO IMPORT WriteCard;
FROM Strings IMPORT Length;
PROCEDURE ALFA (FRASE:ARRAY OF CHAR;LARGO:CARDINAL; LETRA:CHAR ): CARDINAL;
VAR n, cantVeces: CARDINAL;
BEGIN
  cantVeces := 0;
  FOR n:= 0 TO LARGO DO
    IF FRASE[n] = LETRA THEN
      cantVeces := cantVeces +1;
    END; (*END IF*)
  END; (*END FOR*)
  RETURN cantVeces;
END ALFA;
(*---------------PROGRAMA PRINCIPAL----------------------*)
VAR
  f: ARRAY[0..100]OF CHAR;
  c: CHAR;
  cant: CARDINAL;
BEGIN
  WriteString('INGRESE LA FRASE');
  WriteLn();
  ReadRestLine(f);
  SkipLine();
  WriteLn();
  WriteString('INGRESE CARACTER');
  WriteLn();
  ReadChar(c);
  SkipLine();
  WriteLn();
  cant := ALFA(f, Length(f), c);
  WriteString('El caracter ');
  WriteChar(c);
  WriteString(' aparece ');
  WriteCard(cant,2);
  WriteString(' veces.');
END Pr1_4.
====================================================================================

Solución Ejercicio 8: Dada la siguiente definición de lista de naturales:

Código:
FROM Storage IMPORT ALLOCATE;
TYPE
  LNat = POINTER TO NodoLista;
  NodoLista = RECORD
    elem : CARDINAL;
    sig : LNat;
  END;
-----------------------------------------------------------------------------------

Escribir en MODULA-2 un procedimiento que recibe como parámetro una lista de naturales de tipo LNat y muestra todos los números de dicha lista, desde el primero al último.

Solución

Código:
MODULE Pr1_9show;
FROM STextIO IMPORT WriteString, WriteLn;
FROM SWholeIO IMPORT WriteCard;
FROM Storage IMPORT ALLOCATE;
TYPE
  LNat = POINTER TO NodoLista;
  NodoLista = RECORD
    elem : CARDINAL;
    sig : LNat;
  END;
PROCEDURE printLst(L: LNat);
VAR lpos: LNat;
BEGIN
  lpos:= L;
  IF (lpos = NIL) THEN
    WriteString("Lista vacía.");
  ELSE
    WHILE (lpos <> NIL) DO
      WriteCard(lpos^.elem,0);
      WriteString(" ");
      lpos:= lpos^.sig;
    END;
  END;
END printLst;
(*---------------PROGRAMA PRINCIPAL----------------------*)
VAR
  L, aux, actual: LNat;
  x:CARDINAL;
BEGIN
 (* Se genera la lista L*)
 L := NIL;
 FOR x := 1 TO 10 DO
    NEW(aux);
    aux^.elem := x;
    aux^.sig := NIL;
    IF L = NIL THEN
      (* L es puntero al primer elemento de la lista *)
      L := aux;
  ELSE
      actual^.sig := aux;
  END;
  (* puntero al último elemento agregado en la lista *)
  actual := aux;
 END; 
 (* Este es un ejemplo para ver como se muestran los  *)
 (* elementos de una lista, también podría solicitarse *)
 (* al usuario que ingrese dichos elementos            *)
 printLst(L);   
END Pr1_9show.
Escribir en MODULA-2 un procedimiento que recibe como parámetro una lista de naturales de tipo LNat y muestra todos los números de dicha lista, desde el último al primero, es decir, al revés.

Solución

Para resolver este ejercicio existen dos posibilidades:
recorrer iterativamente la lista toda las veces que sea necesario para encontrar los elementos en el orden pedido.
recorrer la lista mediante un procedimiento recursivo.

Solución Iterativa

Código:
MODULE pr1_9i;
FROM STextIO IMPORT WriteString;
    FROM SWholeIO IMPORT WriteCard; 
TYPE
        LNat = POINTER TO NodoLista;
  NodoLista = RECORD
          elem : CARDINAL;
          sig : Lnat;
      END;
PROCEDURE printLstReverseIt(L: LNat);
VAR lpos, lult: LNat;
BEGIN
      lult:= NIL;
  WHILE (lult<>L) DO
        lpos:= L;

        WHILE (lpos^.sig <>lult) DO
            lpos:= lpos^.sig;
        END;
    WriteCard(lpos^.elem,0);
        WriteString(" ");
        lult:= lpos;
      END;
END printLstReverseIt;
(*---------------PROGRAMA PRINCIPAL----------------------*)
VAR
        L: LNat;
BEGIN
  ... (*Se genera la lista L*)
  printLstReverseIt(L);
END pr1_9i.
Solución Recursiva: Para comprender esta solución debe ver el tema Recursión, que viene a continuación de estos ejercicios. Igualmente, aunque aún no lo dimos, les dejo aquí el primer ejemplo de un programa recursivo:

Código:
   MODULE pr1_9r;
   FROM STextIO IMPORT WriteString;
   FROM SWholeIO IMPORT WriteCard; 
   TYPE
     LNat = POINTER TO NodoLista;
   NodoLista = RECORD
        elem : CARDINAL;
      sig : LNat;
   END;
   PROCEDURE printLstReverseRec(L: LNat);
   BEGIN
      IF (L <> NIL) THEN
         printLstReverseRec(L^.sig);
         WriteCard(L^.elem,0);
         WriteString(" ");
      END;
   END printLstReverseRec;
   (*---------------PROGRAMA PRINCIPAL----------------------*)
   VAR
      L: LNat;
   BEGIN
      ... (*Se genera la lista L*)
      printLstReverseRec(L);
   END pr1_9r.
avatar
Kyshuo Ayame
Admin

Mensajes : 105
Fecha de inscripción : 14/11/2012
Edad : 29

Ver perfil de usuario http://virtualworld.foroargentina.net

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.