Fecha y hora actual: Domingo 25 Ago 2019 04:53
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Programando desde 0: 32- Ejercicios de aplicación

Responder al Tema Ir a página 123Siguiente

Índice del Foro > Programación en general > Programando desde 0: 32- Ejercicios de aplicación

Autor Mensaje
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Martes 11 Oct 2011 14:57

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Ejercicios de aplicación:

Vayamos entonces a los primeros ejercicios en Modula, de modo que puedan practicar y chocar definitivamente con el lenguaje, con el entorno de desarrollo y con todos los problemas que pueden comenzar a tener a la hora de programar.

Esto es importante porque ustedes pueden venir leyendo este curso a la perfección y entender todo lo que comento, pero cuando llega el momento de sentarse a escribir código la cosa se complica. Espero entonces que hagan lo que se pide aquí:

Ejercicio 1: Realicen el programa del Adivinador planteado en el curso de Pascal, pero ahora en Modula 2. Esta versión será distinta, ya que en vez de intentar adivinar un número generado al azar por la CPU, el juego será de dos personas: Una persona primero deberá ingresar un número y luego la otra deberá intentar adivinar dicho número. Lo único que cambia entonces es que en vez de generar un número al azar deberán leerlo de la entrada estándar.

¿Por qué este cambio? Porque no tenemos en Modula 2 una librería por defecto que nos permita generar números aleatorios, sino que debemos implementar una o usar una de un tercero. Esto lo veremos más adelante.
----------------------------------------------------------------------------------

Ejercicio 2: Supongan que a los estudiantes de un curso se les dice que su calificación final será el promedio de las cuatro calificaciones más altas de entre las cinco que hayan obtenido en el curso.
Escribir en MODULA-2 un procedimiento llamado PROMCLASE con cinco parámetros de entrada (las calificaciones obtenidas) y un parámetro de salida (la calificación promedio) que realice el cálculo.

-------------------------------------------------------------------------------------

Ejercicio 3: Escribir en MODULA-2 un programa que determine las raíces de una ecuación de segundo grado, donde a, b y c son números reales. Presentar la salida discriminando los casos en que se tiene una raíz doble, dos raíces reales o ninguna raíz real. Los que se lleven bien con matemáticas podrían hacer que en el caso en que no existan raíces reales el programa muestre las raíces complejas.
-------------------------------------------------------------------------------------

Ejercicio 4: Escribir en MODULA-2 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)
  • una variable de tipo carácter llamada LETRA

La función ALFA devuelve el número de apariciones del carácter LETRA en el arreglo FRASE.

------------------------------------------------------------------------------------

Ejercicio 5: Escribir en MODULA-2 un procedimiento de clasificación por selección que ordene un arreglo de enteros en orden ascendente, mediante la localización del menor en cada iteración y la realización de intercambios.
------------------------------------------------------------------------------------

Ejercicio 6: Considerar una MATRIZ representada como un arreglo bidimensional de diez filas y diez columnas. Escribir en MODULA-2 un procedimiento llamado CAMBIO que recibe como parámetros una MATRIZ y dos variables naturales M y N e intercambia las filas M y N de la MATRIZ.

------------------------------------------------------------------------------------

Ejercicio 7: Este ejercicio está pensado para quienes manejan algo del álgebra de matrices, cómo por ejemplo, cómo se suman, cómo se multiplican, cómo se trasponen y qué es una matriz simétrica. Si conocen al menos alguno de estos conceptos hagan lo que saben, no importa si no completan todo el ejercicio.

Escribir en MODULA-2 los siguientes algoritmos sobre matrices de enteros:

  • SUMA: recibe dos matrices y devuelve la suma.
  • PRODUCTO: recibe dos matrices y devuelve el producto.
  • TRASPUESTA : recibe una matriz y devuelve su traspuesta.
  • ESSIMETRICA : recibe una matriz y devuelve un booleano que indica si es o no simétrica.


--------------------------------------------------------------------------------

Ejercicio 8: ¿Qué hace el siguiente código Pascal?

Código:
TYPE
    apuntador = ^registro;
    registro = RECORD
        dato: integer;
        sig : apuntador;
    END;
VAR
    apuntaInic : apuntador;
    apuntActual : apuntador;
    indice : integer;
BEGIN
    new(apuntaInic);
    apuntActual := apuntaInic;
    FOR indice := 1 TO 3 DO
    BEGIN
        new(apuntActual^.sig);
        apuntActual := apuntActual^.sig;
        apuntActual^.dato := indice
    END;
apuntActual^.sig := NIL;
END. 


Escribir código MODULA-2 equivalente al presentado.
------------------------------------------------------------------------------------

Ejercicio 9: 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.

  • 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.

  • Escribir en MODULA-2 una función que retorne el mínimo elemento de una lista, no vacía, de naturales de tipo Lnat.


===============================================
===============================================

Soluciones:

No se publicarán en el curso todas las soluciones, sino que tendremos las más significativas. Espero que intenten hacer los ejercicios antes de ver una solución. Tengan en cuenta que el hecho de que la solución que ustedes hayan implementado sea distinta a la que vean aquí no significa que esté mal, simplemente es diferente y punto. Pueden comparar sus soluciones con las mostradas aquí para ver en qué mejorar, si es que hace falta mejorar.

Solución Ejercicio 4: 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 9: 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.


-----------------------------------------------------------------------------------

Espero realmente que practiquen. Al igual que desde hace tiempo, tengo la sensación de que simplemente leen las lecciones y la cosa queda ahí. Si no practican y preguntan, no avanzarán, créanme, solo leer no sirve.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
juan alejandro
Usuario Iniciado


Registrado: 07 Ene 2011
Mensajes: 43
Ubicación: Bogotá - Colombia

Mensaje Publicado: Jueves 13 Oct 2011 14:09

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Muchas gracias por la lección, en mi caso, casi siempre trato de practicar, pero a veces no alcanzo. a hacerlos.... yo trabajo en desarrollo y estoy de acuerdo en que si uno no practica no se aprende...

Volver arriba
Ver perfil del usuario Enviar mensaje privado
sr floyd
Usuario Activo


Registrado: 05 Sep 2011
Mensajes: 196

Mensaje Publicado: Jueves 20 Sep 2012 23:32

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Hola profe, una duda con respecto al ejercicio 4: ¿cómo hago para especificar en el parámetro de la función ALFA que el arreglo que se recibe solo tiene un máximo de 100 caracteres?
Código:
un arreglo de caracteres llamado FRASE (con un máximo de 100 caracteres)

¿Es posible hacerlo sin que dependa de una anterior declaración de tipo?

Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Jueves 20 Sep 2012 23:55

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

No puedes especificarlo en la firma de la operación. Tienes que declarar el tipo primero y luego declaras el parámetro de ese tipo ¿me explico?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
sr floyd
Usuario Activo


Registrado: 05 Sep 2011
Mensajes: 196

Mensaje Publicado: Viernes 21 Sep 2012 01:21

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

perfectamente!

Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
sr floyd
Usuario Activo


Registrado: 05 Sep 2011
Mensajes: 196

Mensaje Publicado: Lunes 24 Sep 2012 07:31

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

hola, esta es una solución alterna al ejercicio 4, traté de limitarme a usar procedimientos o librerías que nos provee el lenguaje (lo hago como método de estudio) para irme relacionando mas a fondo con MODULA2, asi que el código quedó un tanto largo; para tal fin decidí usar el procedimiento FindNext de la librería Strings; al código le he hecho todas las pruebas que se me han ocurrido y todas las ha pasado:
Código:
MODULE ejercicio2;

FROM STextIO IMPORT WriteString,ReadString,SkipLine,WriteLn,ReadChar, WriteChar;
FROM Strings IMPORT FindNext, Length;
FROM SWholeIO IMPORT WriteCard;

    PROCEDURE ALFA (FRASE: ARRAY OF CHAR; LARGO: CARDINAL; LETRA:CHAR):CARDINAL;

      VAR
      cont, index, pos: CARDINAL;
      found: BOOLEAN;
      letra2: ARRAY[0..0] OF CHAR;

      BEGIN
      letra2[0]:=LETRA;
      index:=0; pos:=0; cont:=0; found:= TRUE;

      REPEAT
         FindNext (letra2,FRASE,index,found,pos);

           IF found = TRUE THEN
       cont:= cont+1;
      END;

         index:= pos+1;
      UNTIL (index > LARGO ) OR (found= FALSE);

      RETURN cont;

     END ALFA;

 VAR
 Arreglo: ARRAY[0..99] OF CHAR;
 letra: CHAR;
 tope,veces: CARDINAL;


BEGIN
WriteString('Digite una frase y presione ENTER...'); WriteLn();
ReadString(Arreglo); SkipLine();
WriteString('Digite una letra a buscar en frase: ');
ReadChar(letra); SkipLine(); WriteLn();

tope:= Length(Arreglo);

 veces:= ALFA(Arreglo,tope,letra);
 WriteLn();
 WriteString('La letra '); WriteChar(letra);
 WriteString(' aparece '); WriteCard(veces,2);
  IF veces=1 THEN
  WriteString(' vez en la frase:')
  ELSE
  WriteString(' veces en la frase:');
  END;
 WriteLn();
 WriteString(Arreglo);

END ejercicio2.



Ultima edición por sr floyd el Lunes 24 Sep 2012 09:25; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
sr floyd
Usuario Activo


Registrado: 05 Sep 2011
Mensajes: 196

Mensaje Publicado: Lunes 24 Sep 2012 07:36

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

y este es del ejercicio 2, es mas sencillo y tambien sometido a pruebas:

Código:
MODULE ejercicio1;

FROM SRealIO IMPORT ReadReal, WriteReal;
FROM STextIO IMPORT WriteString, WriteLn,SkipLine;

   PROCEDURE Promedio (a,b,c,d,e: REAL): REAL;

   VAR menor,promedio: REAL;

   BEGIN

   IF a <= b THEN
   menor:=a;
   ELSE
   menor:= b;
   END;

   IF menor > c THEN
   menor:=c;
    END;
   IF menor > d THEN
   menor:=d;
    END;
   IF menor > e THEN
   menor:=e;
    END;

   promedio:= (a+b+c+d+e-menor)/4.0 ;

   RETURN promedio;

   END Promedio;

VAR A,B,C,D,E: REAL;

 BEGIN
 WriteString('Digite 5 números, presione ENTER luego de cada número ingresado...');
 WriteLn();
 ReadReal(A); SkipLine();
 ReadReal(B); SkipLine();
 ReadReal(C); SkipLine();
 ReadReal(D); SkipLine();
 ReadReal(E); SkipLine();
 WriteString('el promedio de las mejores 4 notas es: ');
 WriteLn();
 WriteReal ( Promedio(A,B,C,D,E),1 );
 END ejercicio1.


en cuanto al ejercicio 8 a mi parecer básicamente crea una lista encadenada de 3 numeros enteros del 1 al 3, debo releer el tema pero es lo que creo que realiza.

Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Lunes 24 Sep 2012 16:37

Título del mensaje: Re: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Excelente!!! Ese es el espíritu de un programador. ¿Te vas dando cuenta de cómo eres capaz tú solo de leer una librería y usarla? Eso, aunque tal vez no se note tanto, es un avance gigantezco y es una de las metas de este curso. Así, luego de algunos temas más, serás capaz de leer cualquier lenguaje y aprender a usarlo porque la lógica necesaria ya la tienes.

Muy buen trabajo amigo. Sigue así.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
fedekun99



Registrado: 28 Feb 2014
Mensajes: 2

Mensaje Publicado: Jueves 06 Mar 2014 03:44

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

En el ejercicio 3

FROM SRealIO IMPORT ReadReal, WriteReal;
FROM RealMath IMPORT sqrt;
CONST cero = 0.0;
VAR a,b,c,disc,raiz : REAL;

BEGIN
ReadReal(a); ReadReal(b); ReadReal(c);
disc:=(b*b) -(4.0*a*c);
IF (disc > cero) THEN
raiz:= (-b + sqrt(disc))/(2.0*a);
WriteString('Primera Raiz :');
WriteReal(raiz,1);
raiz:= (-b - sqrt(disc))/(2.0*a);
WriteString('Segunda Raiz :');
WriteReal(raiz,1)

ELSIF (disc = 0.0) THEN
raiz:= -b/(2.0*a);
WriteString('Unica Raiz :'); WriteReal(raiz,1)

ELSIF (disc<cero) THEN
raiz:= -b/(2.0*a);
disc:= sqrt(disc);
WriteString('Primera Raiz :'); WriteReal(raiz,1); WriteString('+'); WriteReal(disc,1); WriteString('i');
WriteString('Segunda Raiz :'); WriteReal(raiz,1); WriteString('-'); WriteReal(disc,1); WriteString('i');
END
END raices.



No me puedo hacer que lea 3 enteros,
con 1 da bien, con 2 da bien, con 3 salta un erro

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Sábado 21 Mar 2015 13:25

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Ejercicio 1, Adivinador:

Código:

MODULE Adivinador2;
FROM SWholeIO IMPORT ReadCard, WriteCard;
FROM STextIO IMPORT WriteString, WriteLn, SkipLine;


CONST
Maximo= 100;
MaxIntentos= 15;

VAR
NumeroAdivinar: CARDINAL; (*Numero a adivinar*)
Intento: CARDINAL;
k,restantes: CARDINAL;


BEGIN
(*Mensaje de entrada *)
WriteString("********** BIENVENIDO!!! **********"); WriteLn;
WriteString("Adivinador 2.0 ");
WriteString(" JLRODS SOFTTECH");   WriteLn;  WriteLn;

(* Se indica al usuario 1 que ingrese un numero   *)
REPEAT
  WriteString("Jugador 1 por favor ingrese el numero que el Jugador 2 debe ");
  WriteString("advinar: ");
  ReadCard(NumeroAdivinar);SkipLine;
  WriteLn;
  IF (NumeroAdivinar <1) OR (NumeroAdivinar>Maximo) THEN
    WriteString("Por favor ingrese un numero dentro del rango!");WriteLn; WriteLn;
  END;
UNTIL
  ((NumeroAdivinar >0) OR (NumeroAdivinar<= Maximo));
(* Se indica al jugador 2 que es su turno*)
WriteString("Juegador 2 es su turno:"); WriteLn;


(*Se inicia un repeat loop para leer los numeros ingresados por el jugador
 Y comparar con el numero ingresado por el jugador 1 dependiendo de si acierta
 o no se mostrara un mensaje  u otro.*)

k:=0;
restantes:=0;

REPEAT
  (*Se aumenta el contador de intentos *)
  k:= k+1;
  restantes:= (MaxIntentos+1) - k;
  (*Se incluye un repeat loop para capturar errores en la entrada *)
  REPEAT
    (* Se indica de cuantos intentos se disponen*)
    WriteString("Dispones de "); WriteCard(restantes,1); WriteString(" intentos para adivinar.");
    WriteLn;
    (*Indicar al jugador 2 que ingrese un numero para adivinar*)
    WriteCard(k,1); WriteString(")---> ");
    (* Se lee el numero ingresado*)
    ReadCard(Intento);  SkipLine;
    (*Si el numero ingresado esta fuera del rango se indica el error *)
    IF (Intento<1) OR (Intento>Maximo) THEN
      WriteString("Lo siento ha ingresado un numero fuera del rango");
      WriteLn; WriteLn;
      END; (*Fin del si el numero es errado*)
  (*Se repite hasta que el numero este dentro de rango *)
  UNTIL
    (Intento>0) AND (Intento<= Maximo);
  (*Se revisa si el intento acerto o no *)
  IF (Intento = NumeroAdivinar)  THEN
    WriteString(" Muy Bien!!! Has adivinado!!!");
    WriteLn;WriteLn;
  ELSE
    WriteString("Lo siento, no has acertado.");
    WriteLn; WriteLn;
    IF (Intento < NumeroAdivinar) THEN
      WriteString("El numero a adivinar es MAYOR!");
      WriteLn; WriteLn;
    ELSE
      WriteString("El numero a adivinar es MENOR!");
      WriteLn; WriteLn;
    END; (* Fin del si el numero es mayor o menor *)
  END; (*Fin del si el numero es igual al que hay que adivinar  *)
(*Se repite hasta que se adivine el numero o se llegue al maximo de intentos*)
UNTIL
(Intento= NumeroAdivinar) OR (k=MaxIntentos);

(* Se verifica si el loop se salio porque se gano o se perdio el juego*)
IF (Intento <> NumeroAdivinar) THEN
  WriteString("Lo siento ha llegado al maximo de intentos permitidos!");
  WriteLn;WriteLn;
END;

END Adivinador2. (*Fin del juego*)

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Sábado 21 Mar 2015 13:26

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Ejercicio 2, calculador de promedios:

Código:

MODULE PromedioEvaluaciones;
FROM STextIO IMPORT WriteString, WriteLn, SkipLine;
FROM SWholeIO IMPORT WriteCard;
FROM SRealIO IMPORT WriteReal, ReadReal;

VAR
nota1, nota2, nota3, nota4, nota5: REAL;
PROMEDIO: REAL;

PROCEDURE PROMCLASE(calif1, calif2, calif3, calif4, calif5: REAL;VAR promedio: REAL);

TYPE
Lista= ARRAY [0..4] OF REAL;

VAR
Calificaciones: Lista;
i, mayor: CARDINAL;
suma, temp: REAL;
PROCEDURE EncontrarMaximo(arr: Lista; ultimo:CARDINAL): CARDINAL;
VAR
j,max:CARDINAL;
BEGIN
  max:=0;
  FOR j:=1 TO (ultimo) DO
    IF arr[j] > arr[max] THEN
       max:=j;
     END; (* Fin del IF*)
  END; (*Fin del for loop*)
  RETURN  max;
END EncontrarMaximo;

(*Inicio del procedimiento*)
BEGIN
(*Primero se guardan las calificaciones en el arreglo para luego ordenarlos y escoger las mas altas*)
Calificaciones[0]:= calif1;
Calificaciones[1]:= calif2;
Calificaciones[2]:= calif3;
Calificaciones[3]:= calif4;
Calificaciones[4]:= calif5;

(*Se ordena el arreglo de menor a mayor*)
FOR i:= 4 TO 1 BY -1 DO
  mayor:= EncontrarMaximo(Calificaciones,i);
  temp:= Calificaciones[mayor];
  Calificaciones[mayor]:= Calificaciones[i];
  Calificaciones[i]:= temp;
END; (*Fin del For que ordena el arreglo*)

FOR i:=0 TO 4 DO
  WriteReal(Calificaciones[i],1); WriteString(", ");
END;
WriteLn;WriteLn;

(*Una vez ordenado el arreglo de menor a mayor se escogen las ultimas cuatro celdas del arreglo para hacer el promedio*)
suma:=0.0;
FOR i:=1 TO 4 DO
  suma:= suma + Calificaciones[i];
  WriteCard(i,1); WriteString(", ");
  WriteReal(suma,1); WriteLn;
END; (* Fin del For loop que calcula el promedio*)



(*Se calcula el promedio*)
promedio:= (suma / 4.0);

END PROMCLASE; (*Fin del procedimiento*)

BEGIN (*Inicio del programa*)
  PROMEDIO:=0.0;
  (*Mensaje de Bienvenida al programa*)
  WriteString("Calculador de Promedio de Evaluaciones");
  WriteLn; WriteLn;
  WriteString("Por favor ingrese las calificaciones correspondoentes a las ");
  WriteString("5 evaluaciones del curso: ");
  ReadReal(nota1); ReadReal(nota2); ReadReal(nota3); ReadReal(nota4); ReadReal(nota5); SkipLine;
  WriteLn;
  PROMCLASE(nota1,nota2,nota3,nota4,nota5,PROMEDIO);
  WriteString("El promedio del alumno actual es: ");
  WriteReal(PROMEDIO,1); WriteString("!!!");

END PromedioEvaluaciones. (*Fin del programa*)

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Lunes 23 Mar 2015 12:00

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Muy buen trabajo. Tu avance es muy significativo.

Sigue así amigo... saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Martes 24 Mar 2015 12:10

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Ejercicio 3, calculador de raices reales e imaginarias para una ecuacion de segundo grado:

Código:

MODULE Resolvente;
FROM STextIO IMPORT WriteString, WriteLn, SkipLine;
FROM SRealIO IMPORT WriteReal, ReadReal;
FROM RealMath IMPORT sqrt; 
 
VAR
a,b,c,x1,x2,disc: REAL;
xImaginaria1, xImaginaria2: REAL;
 
 
BEGIN
(*Se ingresa un mensaje de inicio*)
WriteString("BIENVENIDO al calculador de raices de una fincion de segundo grado!");
WriteLn; WriteLn;
WriteString("Por favor ingrese el valor de los coeficientes a y b asi como"); WriteLn;
WriteString("para la constante c: "); WriteLn;
REPEAT
  WriteString("a: "); ReadReal(a); SkipLine;
  WriteString("b: "); ReadReal(b); SkipLine;
  WriteString("c: "); ReadReal(c); SkipLine;
  WriteLn; WriteLn;
  IF a=0.0 THEN
    WriteString("El valor del coeficiente a no puede tomar el valor de 0,  "); WriteLn;
    WriteString(" ello conlleva a una indeterminacion. Ingrese un valor de valido!."); WriteLn;
    WriteString("");
  END;
UNTIL
  (a<>0.0);
 
(* Se muestra en pantalla la funcion completa*)
IF (a<>0.0) THEN
  WriteString("La funcion a la cual desea determinar sus raices es: ");
  IF (b>0.0) AND (c>0.0) THEN
    WriteReal(a,1); WriteString("x^2 + "); WriteReal(b,1); WriteString("x + "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b>0.0) AND (c=0.0) THEN
    WriteReal(a,1); WriteString("x^2 + "); WriteReal(b,1); WriteString("x"); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b=0.0) AND (c>0.0) THEN
    WriteReal(a,1); WriteString("x^2 + "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b=0.0) AND (c=0.0) THEN
    WriteReal(a,1); WriteString("x^2"); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b<0.0) AND (c>0.0) THEN
    WriteReal(a,1); WriteString("x^2 "); WriteReal(b,1); WriteString("x + "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b=0.0) AND (c<0.0) THEN
    WriteReal(a,1); WriteString("x^2 "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b=0.0) AND (c<0.0) THEN
    WriteReal(a,1); WriteString("x^2 "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b>0.0) AND (c<0.0) THEN
    WriteReal(a,1); WriteString("x^2 + "); WriteReal(b,1); WriteString("x "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn;
  ELSIF (b<0.0) AND (c=0.0) THEN
    WriteReal(a,1); WriteString("x^2 "); WriteReal(b,1); WriteString("x "); WriteString(" = 0");
    WriteLn; WriteLn
  ELSIF (b<0.0) AND (c<0.0) THEN
    WriteReal(a,1); WriteString("x^2 "); WriteReal(b,1); WriteString("x "); WriteReal(c,1); WriteString(" = 0");
    WriteLn; WriteLn
  END;
END;
 
disc:= ((b*b) - 4.0*a*c);
WriteString("El discriminante de la funcion es: ");WriteReal(disc,1); WriteLn; WriteLn;
(*SI el discriminante es mayor que cero se calculan las dos raices*)
IF (a<>0.0) THEN
  IF (disc)>0.0 THEN
    x1:= (-b + sqrt(disc))/(2.0 *a);
    x2:= (-b - sqrt(disc))/(2.0 *a);
  ELSIF (disc)=0.0 THEN
    x1:= -b/(2.0 *a);
    x2:=x1;
  ELSE
    x1:= -b/(2.0 *a);
    x2:= x1;
    xImaginaria1:=   sqrt((-1.0)*((b*b) - 4.0*a*c))/(2.0 *a);
    xImaginaria2:=  (-1.0)*sqrt((-1.0)*((b*b) - 4.0*a*c))/(2.0 *a);
  END;
END;
 
(*Se muestra en pantalla las raices de la ecuacion de segundo grado*)
IF (a<>0.0) THEN
  WriteString("Las raices de la ecuacion son:"); WriteLn; WriteLn;
  IF (disc)>=0.0 THEN
    WriteString("x1= ");WriteReal(x1,1); WriteLn; WriteLn;
    WriteString("x2= "); WriteReal(x2,1); WriteLn; WriteLn;
  ELSE
    WriteString("x1= ");WriteReal(x1,1); WriteString(" +"); WriteString("("); WriteReal(xImaginaria1,1); WriteString("i"); WriteString(")");WriteLn;WriteLn;
    WriteString("x2= ");WriteReal(x2,1); WriteString(" +"); WriteString("("); WriteReal(xImaginaria2,1); WriteString("i");WriteString(")");WriteLn;WriteLn;
  END;
END;
END Resolvente.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
jlrods
Usuario Inquieto


Registrado: 03 May 2014
Mensajes: 60

Mensaje Publicado: Martes 24 Mar 2015 12:26

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Ejercicio 5, Ordenador por seleccion, buscando siempre el menor valor del rango.

Hola Kysuo, solo una duda, al trabajar con el debugger de XDS, para este programa particular cuando cuando recorria las sentencias paso a paso, los procedimientos se los saltaba y no veia que pasaba dentro de ellos, como si presionara F8 en Pascal... Exsite algo similar en Modula como la diferencia entre recorrer los codigos con F7 y F8 en Pascal?

Tenia un problema con el codigo y nunca pude ver que pasaba dentro del procedimietno Ordenar y el subprocedimiento EncontrarMenor, asi que lo resolvi viendo paso a paso, pero con papel y lapiz. Con otros ejercicios habia utilizado el debugger y definitivamente entraba en los procedimietnos... Habre desconfigurado algo en XDS?


Código:

MODULE OrdenadorAscendente;
 
FROM STextIO IMPORT WriteLn, WriteString, SkipLine;
FROM SWholeIO IMPORT WriteInt, ReadInt;
 
CONST
MaxLista= 10;
 
TYPE
Lista= ARRAY [1..MaxLista] OF INTEGER;
 
VAR
Arreglo: Lista;
largo: CARDINAL;
i: CARDINAL;
 
PROCEDURE Ordenar(VAR ARREGLO:Lista;LARGO:CARDINAL);
VAR
i, menor: CARDINAL;
temp: INTEGER;
 
 
PROCEDURE EncontrarMenor(LISTADO: Lista; PRIMERO, ULTIMO: CARDINAL):CARDINAL;
VAR
i, min: CARDINAL;
BEGIN (*Inico del subprocedimiento*)
min:= ULTIMO;
FOR i:= PRIMERO TO ULTIMO DO
  IF   LISTADO[i]< LISTADO[min] THEN
     min:= i;
  END; (*Fin del IF*)
END; (*Fin del FOR*)
RETURN min;
END EncontrarMenor;
 
BEGIN (*Inicio del procedimietno ClasifSelecconAscendente*)
FOR i:= 1 TO LARGO DO
  menor:=EncontrarMenor(ARREGLO,i,LARGO);
  temp:= ARREGLO[i];
  ARREGLO[i]:= ARREGLO[menor];
  ARREGLO[menor]:= temp;
END; (*Fin del For*)
WriteLn;
END Ordenar;
 
BEGIN (* Inicio del programa*)
 
WriteString("Ingrese una lista de hasta un maximo de "); WriteInt(MaxLista,1); WriteString(" numeros: "); WriteLn;
WriteString("--->");
(*Se rellena el arreglo con los numeros ingresados*)
FOR i:=1 TO MaxLista DO
  ReadInt(Arreglo[i]);
END; (*Fin del For*)
SkipLine;
 
(*Se invoca  al procedimiento que ordenara el arreglo*)
Ordenar(Arreglo,MaxLista);
(*Se imprime el arreglo ordenado*)
WriteString("El listado ordenado quedria de esta forma: "); WriteLn;
WriteString("---> ");
FOR i:=1 TO MaxLista DO
  WriteInt(Arreglo[i],1);
  WriteString(", ");
END;(*FIn del FOR*)
WriteLn;
END OrdenadorAscendente. (*Fin programa*)



Saludos;

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Kyshuo Ayame
Moderador Global


Registrado: 07 Ene 2011
Mensajes: 1043

Mensaje Publicado: Martes 24 Mar 2015 15:13

Título del mensaje: Programando desde 0: 32- Ejercicios de aplicación

Responder citando

Lo logras usando F7 y CTRL+F7 en el Debugger. Pruébalo.
Aún asi hiciste un gran trabajo, se aprende mucho haciendo de intérprete en un papel.

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página 123Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Buenas desde el sur del sur =)

Maugarni Preséntate a la comunidad 1 Jueves 22 Ago 2019 14:09 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Hola desde bcn

Dav2k6 Preséntate a la comunidad 2 Miércoles 26 Jun 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Existen problemas al descargar musica desde you...

SusanaP Tu PC 2 Martes 26 Mar 2019 19:22 Ver último mensaje
El foro no contiene ningún mensaje nuevo

hola!! los saludo desde argentina

mery Preséntate a la comunidad 2 Jueves 13 Dic 2018 17:28 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Llamada a web service desde form

mrrobot2 Programación Web en general 1 Martes 14 Nov 2017 00:50 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,