Soluciones lección 021
Página 1 de 1.
Soluciones lección 021
Soluciones selectas para los ejercicios propuestos en la lección 21:
Solución ejercicio 4:
Solución ejercicio 5:
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.
Temas similares
» Soluciones lección 009
» Soluciones lección 005
» Soluciones lección 014 a 017
» Soluciones lección 006
» Soluciones lección 007
» Soluciones lección 005
» Soluciones lección 014 a 017
» Soluciones lección 006
» Soluciones lección 007
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.