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

Saludos Wink

Soluciones lección 021

Ir abajo

Soluciones lección 021

Mensaje  Kyshuo Ayame el Mar Nov 19, 2013 1:34 pm

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

Solución ejercicio 4:

Código:
Descripcion:

 Procedimiento calcula las raices reales de un polinomio de segundo grado.
 -------

*)

(* Estructuras utilizadas para almacenar las raices encontradas.
*)

type
  tiporaices = record
                  case cantidad:0..2 of
                      2 : (raiz1,raiz2: real);
                      1 : (raiz: real);
                      0 :();
                  end;

(* Procedimiento que calcula las raices.
*)

procedure raices (a, b,c:real; var r:tiporaices);

var
  i: real;

begin
  (* Se calcula el discriminante
  *)
  i := sqr(b) - (4 * a * c);
  if i = 0 then
      r.cantidad := 1
  else
      if i < 0 then   
        r.cantidad := 0
      else
        r.cantidad := 2;

  (* Segun el discriminante sea positivo, negativo o 0, se calculan las raices reales del polinomio y
      se almacenan en la estructura correspondiente.
  *)
  case r.cantidad of
      2: begin
                  r.raiz1:= (-b +  sqrt (i)) / (2 * a);
                  r.raiz2:= (-b -  sqrt (i)) / (2 * a);
        end;
      1: r.raiz:= (0 - b) / (2 * a); 
  end;
end;
=================================================================================

Solución ejercicio 5:

Código:
Descripcion:

  (* Implementar el tipo "naturales con error" y algunas de sus operaciones *)

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

*)


PROGRAM naturalesConError(input, output);

TYPE
  Err = (diverr, reserr, argerr);
  Nat = 0 .. maxint;
  Tipo = (natural,error);
  Nerr = RECORD
          CASE es :Tipo OF
            natural: ( num : Nat );
            error: ( cod : Err );
          END;

PROCEDURE division(x,y : Nerr; VAR z : Nerr);
BEGIN
  IF (x.es = error) OR (y.es = error)
  THEN BEGIN
        z.es := error;
        z.cod := argerr;
        END
  ELSE IF y.num = 0 (*En el else sabemos que y es un natural*)
        THEN BEGIN
            z.es := error;
            z.cod := diverr;
            END
        ELSE BEGIN
            z.es := natural;
            z.num := x.num div y.num;
            END;
END;


(* FALTAN LAS OPERACIONES: resta, suma y producto *)


PROCEDURE writeNerr( n :Nerr );
BEGIN
  (* Siempre debemos preguntar que es *)
  (* antes de acceder a sus campos    *)
  IF n.es = error
  THEN
    CASE n.cod OF
      diverr :
        (* n es el resultado de una division en que el      *)
        (* segundo agrumento era 0                          *)
        write('<Error de division por cero>');
      reserr :
        (* n es el resultado de una resta cuyo resultado es *)
        (* negativo, y por lo tanto no es un natural        *)
        write('<Error de resta con resultado negativo>');
      argerr :
        (* En alguna de las operaciones para calcular n    *)
        (* al menos uno de los argumentos no era un natural *)
        write('<Error de argumento>');
    END
  ELSE (*En el else sabemos que es un natural*)
    write(n.num);
END;

VAR
  x, y : Integer;
  a, b, c: Nerr;

BEGIN  (*Programa principal*)
  writeln('Ingrese 2 naturales a y b: ');
  readln (x,y);
  (*Asumo que me ingresaron 2 naturales válidos*)
  a.es := natural;
  a.num := x;
  b.es := natural;
  b.num := y;
  division(a,b,c);
  write('c = a div b es: '); writeNerr(c); writeln;
  division(a,c,c);
  write('a div c es: '); writeNerr(c); writeln;
END.
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.