P_19_E21-Con+subprogramas

=__**Programa que realiza algunas operaciones sobre puntos de un plano**__=

> Programa que basado en un menú realiza las siquientes operaciones >> -- MENU DE OPCIONES --- >> 1. Ver si un punto está en una circunferencia de radio 10 y centro en el punto(0, 0) >> 2. Averiguar cuadrante en que está el punto >> 3. Paso de coordenadas cartesianas a polares >> 0. Terminar

> Version: Se utilizan subprogramas

code format="pascal" PROGRAM CONDIC_21_Pagina_19_Subprogramas ; USES Crt ; CONST rRADIO   = 10.0 ; rX_CENTRO = 0.0 ; rY_CENTRO = 0.0 ;

{-   Nombre........: fncLeerOpcion Descripción...:   Muestra el menú, pide una opción y retorna el valor de la opción leída Parámetros Entrada: Ninguno Salida:   Opcion elegida por el usuario Es el valor retornado por la función. -} FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN { Mostrar el menú de opciones } ClrScr ; Writeln ; Writeln (' -- MENU DE OPCIONES ---'); Writeln (' 1. Ver si un punto está en una circunferencia') ; Writeln ('     de radio 10 y centro en el punto (0, 0)') ; Writeln (' 2. En qué cuadrante se encuentra un punto') ; Writeln (' 3. Paso de coordenadas cartesianas a polares') ; WriteLn ; Writeln (' 0. Terminar') ; Writeln ;

{ Mostrar el menú de opciones } REPEAT Write (' Escribe el nº de la opcion elegida -> ') ; Readln (cOpcion) ; UNTIL ('0' <= cOpcion) AND (cOpcion <= '3') ; Writeln ;

fncLeerOpcion := cOpcion ; END ;

{-   Nombre........: LeerUnPunto Descripción...:   Lee y retorna las coordenadas de un punto del plano Parámetros Entrada: Ninguno Salida:   rX y rY las coordenadas de un punto del plano -} PROCEDURE LeerUnPunto (VAR rX, rY : Real) ; BEGIN Write ('  X: ') ; Readln (rX) ; Write ('  Y: ') ; Readln (rY) ; Writeln ; END ;

{-   Nombre........: fnboDentroCircunferencia Descripción...:   Recibe las coordenadas de un punto y retorna TRUE o                    FALSE en función de si el punto está dentro de la                    circunferencia de centro (0, 0) y radio 10. Parámetros Entrada: rX y rY las coordenadas de un punto del planoNinguno Salida:   La indicación de si el punto están dentro (TRUE) o no (FALSE) de la circunferencia. Es el valor retornado por la función. -} FUNCTION fnboDentroCircunferencia(rX, rY : Real) : Boolean ; VAR boDentro : Boolean ; BEGIN boDentro := ( Sqr (rX - rX_CENTRO) + Sqr (rY - rY_CENTRO)) <= Sqr (rRADIO) ;

fnboDentroCircunferencia := boDentro ; END ;

{-   Nombre........: fniCalcularCuadrante Descripción...:   Recibe las coordenadas de un punto y retorna el valor del cuadrante en que se encuentra el punto. Si el punto se encuentra en un eje o en el origen de                   coordenadas retorna el valor 0.

Parámetros Entrada: rX y rY las coordenadas de un punto del planoNinguno Salida:   El valor el cuadrante en el que se encuentra el punto. Es el valor retornado por la función. -} FUNCTION fniCalcularCuadrante (rX, rY : Real) : Integer ; VAR byCuadrante : Integer ; BEGIN byCuadrante := 0 ;

IF (rX > 0) THEN IF (rY > 0) THEN byCuadrante := 1 ELSE byCuadrante := 4 ELSE IF (rY > 0) THEN byCuadrante := 2 ELSE byCuadrante := 3 ;

fniCalcularCuadrante := byCuadrante ; END ;

{-   Nombre........: PasarCartesianasAPolares Descripción...:   Recibe las coordenadas cartesianas de un punto y                    retorna el valor de sus coordenadas polares (módulo                    y argumento). Parámetros Entrada: rX y rY las coordenadas de un punto del planoNinguno Salida:   El valor el cuadrante en el que se encuentra el punto. Es el valor retornado por la función. -} PROCEDURE PasarCartesianasAPolares ( rX, rY : Real ; VAR rModulo, rArgumento: Real) ; VAR byCuadrante : Integer ; BEGIN IF (rX <> 0) AND (rY <> 0) THEN BEGIN rModulo := Sqrt (Sqr (rX) + Sqr (rY)) ;

{ Cálculo como si fuera un punto del cuadrante 1º } rArgumento := Arctan (rY / rX) ;

{ Modificar el argumento dependiento del cuadrante } { Identificar el cuadrante } byCuadrante := fniCalcularCuadrante (rX, rY) ;

{ Modificar el argumento dependiento del cuadrante } CASE byCuadrante OF          2 : rArgumento := PI + rArgumento ; 3 : rArgumento := PI + rArgumento ; 4 : rArgumento := 2 * PI + rArgumento ; END ; END ELSE { NOT ( (rX <> 0) AND (rY <> 0) ) } BEGIN { El punto está en un eje de coordenadas }

rModulo := Sqrt (Sqr (rX) + Sqr (rY)) ;

IF (rX = 0) AND (rY = 0) THEN rArgumento := 0 ELSE IF rX = 0 THEN IF rY > 0 THEN rArgumento := PI / 2 ELSE rArgumento := 3 * PI / 2 ELSE IF rY > 0 THEN rArgumento := 0 ELSE rArgumento := PI ; END ; END ;

{- Declaración de variables del programa principal --} VAR cOpcion, cEspera      : Char ; rX, rY                : Real ; rModulo, rArgumento   : Real ; byCuadrante           : Byte ;

BEGIN {--- Programa Principal ---} REPEAT

cOpcion := fncLeerOpcion ;

CASE cOpcion OF        '1' : BEGIN Writeln (' Escribe las coordenadas del punto:') ; LeerUnPunto (rX, rY) ;

IF fnboDentroCircunferencia (rX, rY) THEN Writeln (' El punto ESTA DENTRO de la circunferencia') ELSE Writeln (' El punto ESTA FUERA de la circunferencia') ; END ; '2' :             BEGIN Writeln (' Escribe las coordenadas del punto:') ; LeerUnPunto (rX, rY) ;

byCuadrante := fniCalcularCuadrante (rX, rY) ;

{ Mostrar resultado } Writeln ; IF byCuadrante <> 0 THEN Writeln (' El punto (', rX:0:2, ', ', rY:0:2, ') está en el cuadrante: ', byCuadrante) ELSE Writeln (' El punto (', rX:0:2, ', ', rY:0:2, ') está en alguno de los ejes de coordenadas') ; Writeln ; END ;

'3' :            BEGIN Writeln (' Escribe las coordenadas del punto:') ; LeerUnPunto (rX, rY) ;

PasarCartesianasAPolares (rX, rY, rModulo, rArgumento) ;

Writeln (' El punto (', rX:0:2, ',', rY:0:2, ') :') ; Writeln ('     M¢dulo: ', rModulo:0:2) ; Writeln ('  Argumento: ', rArgumento:0:2, ' rad'); END ; END ; { del CASE }

IF cOpcion <> '0' THEN BEGIN WriteLn ; Write  ('Pulsa una tecla para continuar') ; cEspera := ReadKey ; END ; UNTIL cOpcion = '0' ;

WriteLn ; WriteLn ('====================================================') ; WriteLn ('           Pulsa una tecla para terminar') ; Write  ('___________________________________________________') ; cEspera := ReadKey ;

END. { FIN del PROGRAMA } code