Departamento de Informática
Universidad Técnica Federico Santa María
Tema 7:Subprogramas
Programación de Computadores (IWI-131)
Luis Pizarro Q.
www.labmc.inf.utfsm.cl/~lpizarro/IWI-131
Luis Pizarro Q. ©20032
Subprogramas Un programa con cierta complejidad
puede descomponerse en varios subprogramas de menor dificultad.
Estos subprogramas pueden ser de 2 tipos:
- Procedimientos
- Funciones El uso de procedimientos y funciones
ayuda a organizar y simplificar programas largos y complejos.
Luis Pizarro Q. ©20033
Entrada
Procesamiento
Salida
PROGRAM Estudio_Cilindro;CONST
pi = 3.14159;VAR
radio, altura, sup, vol: REAL;BEGIN
WRITELN(‘Ingrese radio y altura: ’);READLN(radio, altura);sup:=2*pi*radio*altura + 2*pi*SQR(radio);vol:=pi*SQR(radio)*altura;WRITELN(‘La superficie es: ’,sup:8:2);WRITELN(‘El volumen es: ’,vol:8:2)
END.
Ejemplo de Subprogramas Recordemos el programa que calcula la superficie y el
volumen de un cilindro. Podemos descomponerlo en varios subprogramas.
Subprograma 1
Subprograma 2
Subprograma 3
Luis Pizarro Q. ©20034
Estructura de un programa PascalPROGRAM nombre_del_programa;
CONST
{aquí se declaran las costantes}
VAR
{aquí se declaran las variables}
TYPE
{aquí se declaran las variables tipo}
PROCEDURE (FUNCTION)
{aquí se declaran procedimientos y/o funciones}
BEGIN
{aquí se escribe el cuerpo del programa}
END.
Luis Pizarro Q. ©20035
Subprogramas
Procedimiento: subprograma que realiza una tarea específica. Puede recibir cero o más valores del programa que lo llama y devuelve cero o más valores a éste.
Función: subprograma que puede recibir cero o más valores del programa que lo llama y devuelve un único resultado al programa que lo llama.
Luis Pizarro Q. ©20036
Procedimientos y Funciones Procedimiento
PROGRAM nombre_del_programa;CONST
{constantes}VAR
{Variables GLOBALES}PROCEDURE nom_proc(v1: tipo1; v2: tipo2; ... ; vN: tipoN); VAR
{Variables LOCALES} BEGIN
{Cuerpo del Procedimiento} END;BEGIN
{Cuerpo del Programa}END.
Luis Pizarro Q. ©20037
Procedimientos y Funciones Función
PROGRAM nombre_del_programa;CONST
{Constantes}VAR
{Variables GLOBALES}FUNCTION nom_func(v1: tipo1; v2: tipo2; ... ; vN: tipoN): tipo_a_devolver; VAR
{Variables LOCALES} BEGIN
{Cuerpo del Procedimiento} END;BEGIN
{Cuerpo del Programa}END.
Luis Pizarro Q. ©20038
Procedimientos y Funciones
Variables Globales: se declaran en el programa principal, y pueden ser utilizadas por éste y por todos los subprogramas.
Variables Locales: se declaran en los procedimientos y funciones, y pueden ser utilizadas sólo en los subprogramas en que fueron declaradas.
Luis Pizarro Q. ©20039
Invocación de un Procedimiento
PROGRAM procedimientos;VAR {variables};
PROCEDURE Proc(lista_de_parametros); { Cuerpo del procedimiento }
BEGIN { Cuerpo Principal } ............. Proc(lista_de_parametros); .............END.
Invocación del procedimiento Proc.
Luis Pizarro Q. ©200310
Invocación de una Función
PROGRAM funciones;VAR x, y: INTEGER;
FUNCTION Fun(lista_de_parametros): INTEGER; { Cuerpo de la función }
BEGIN { Cuerpo Principal } ............. x:= Fun(lista_de_parametros); ............. IF (y+2*Fun(lista_de_parametros)) > 0 THEN ....... .............END.
Se asigna su resultado a una variable del mismo tipo.
Se utiliza su resultado en una expresión válida.
Luis Pizarro Q. ©200311
Procedimientos y Funciones
PROGRAM procedimientos;VAR {variables};FUNCTION A(p1: REAL; p2: BOOLEAN): REAL; { .... Cuerpo del procedimiento A; .... }PROCEDURE B; { .... Cuerpo del procedimiento B; .... Valor := 2*A(2.3,TRUE); }BEGIN ............. B; WRITELN(A(4.0,FALSE)); B; .............END.
Se llama a la función A.
En el cuerpo principal pueden entrelazarse las llamadas a los
procemientos y funciones.
Orden: si los procedimientos (funciones) A y B son definidos dentro del mismo programa, y el procedimiento B invoca al procedimiento A, entonces A debe estar declarado antes que B.
Luis Pizarro Q. ©200312
PROGRAM Estudio_Cilindro;CONST
pi = 3.14159;VAR
radio, altura, sup, vol: REAL;PROCEDURE entrada; BEGIN
WRITELN(‘Ingrese radio y altura: ’);READLN(radio, altura);
END;PROCEDURE procesamiento; BEGIN
sup:=2*pi*radio*altura + 2*pi*SQR(radio);vol:=pi*SQR(radio)*altura;
END;PROCEDURE salida; BEGIN
WRITELN(‘La superficie es: ’,sup:8:2);WRITELN(‘El volumen es: ’,vol:8:2)
END;BEGIN
entrada;procesamiento;salida;
END.
Ejemplo de Procedimiento
Variables Globales, pueden emplearse en cualquier
procedimiento.
Luis Pizarro Q. ©200313
Ejemplo de Función
PROGRAM EjemploFuncion;VAR numero: INTEGER;FUNCTION Funcion(n: INTEGER): INTEGER; BEGIN
Funcion:= n MOD 2; END;BEGIN
REPEAT WRITELN(‘Ingrese número: ’); READLN(numero); IF Funcion(numero) = 0 THEN
WRITELN(‘El número ’, numero, ‘ es par’) ELSE
WRITELN(‘El número ’, numero, ‘ es impar’);UNTIL numero = 0
END.
Indicar al usuario si los números que ingresa por pantalla son pares o impares, hasta que ingrese el cero.
Luis Pizarro Q. ©200314
Parámetros por Valor y por Referencia Parámetros por Valor: estas variables sólo
reciben información. No devuelven valores.
PROGRAM ejemplo;VAR x, y: REAL;PROCEDURE suma(a,b: REAL); VAR aux:REAL; BEGIN
aux := a + b;WRITELN(‘La suma es ’, aux);
END;BEGIN REPEAT
WRITELN(‘Ingrese 2 números: ’);READLN(x, y);suma(x, y);
UNTIL (x=0) OR (y=0)END.
Parámetros por ValorLas variables a y b reciben una copia de los valores de las variables x e y, respectivamente.
Por lo que las variables x e y no sufren modificación.
Luis Pizarro Q. ©200315
Parámetros por Valor y por Referencia Parámetros por Referencia: estas variables se
utilizan para recibir información y para transmitir valores de vuelta. Se antepone la palabra VAR en la definición de estas variables.
PROGRAM ejemplo;VAR x, y, z: REAL;PROCEDURE mayor(a,b: REAL; VAR max: REAL); BEGIN
max := b;IF a > b THEN max := a;
END;BEGIN REPEAT
WRITELN(‘Ingrese 2 números: ’);READLN(x, y);mayor(x, y, z);WRITELN(‘El mayor es ’, z);
UNTIL (x=0) OR (y=0)END.
Parámetro por Referencia Las variables a y b están definidas por valor. En cambio, la variable max está definida por referencia, la cual no recibe una copia del valor de la variable z, sino que recibe la variable misma, por lo que cualquier cambio que se realice en la variable max se efectúa directamente en la variable z.
Luis Pizarro Q. ©200316
Ejercicio Utilizando funciones, escriba un programa que tome un número
entero y entregue el dígito en la posición k. Ejemplo, el dígito en la posición 4 del entero 18573 es 8.
PROGRAM Ejercicio;VAR num, pos, valor: INTEGER; FUNCTION digito(n, k: INTEGER): INTEGER; VAR d: INTEGER {para guardar el dígito} i: INTEGER {para contar posiciones} BEGIN
i := 0;REPEAT d := n MOD 10; {devuelve el último dígito} n := n DIV 10; {devuelve la parte entera de la división} i := i + 1;UNTIL (i = k) OR (n = 0)IF i = k THEN digito := dELSE digito := -1;
END;BEGIN
WRITELN(‘Ingrese número: ’);READLN(num);WRITELN(‘Ingrese posición: ’);READLN(pos);valor := digito(num, pos)IF valor = -1 THEN WRITELN(‘Posición fuera de rango’)ELSE WRITELN(‘El dígito en la posición ’,pos, ‘ es ’,valor)
END.
Luis Pizarro Q. ©200317
Tarea Nº11. Si una cantidad de dinero P se coloca en una cuenta de ahorros para la
que el interés se calcula Q veces por año, entonces la cantidad de intereses ganados después de N años viene dada por la siguiente fórmula (I es el porcentaje del interés decimal):
Cantidad = P * (1 + I/Q)N * Q
Escribir un programa que lea los valores P, I, Q y N y dé como salida los intereses ganados por cada año a lo largo de N años. Se debe utilizar una función que calcule la cantidad de los intereses. El programa debe solicitar los datos de forma apropiada al usuario, etiquetar los valores de salida y escribirse con buen estilo de programación.
Luis Pizarro Q. ©200318
Tarea Nº12. Escribir un programa para jugar al juego de niños “roca, papel o tijeras”.
Considere dos jugadores, los cuales jugarán un máximo de 11 veces. El programa debe imprimir quien es el ganador en cada juego; al final, la cantidad de juegos ganados por cada jugador, el número de empates y quién es el ganador global.
Considere la lectura de una jugada como un carácter:
R: roca
P: papel
T: tijeras
Luis Pizarro Q. ©200319
Tarea Nº13. La distancia del punto de caída de un proyectil que es lanzado con un
ángulo A (en radianes) y una velocidad inicial V (en pies/seg), ignorando la resistencia al aire, viene dada por la fórmula:
Distancia = SQR(V) * SIN(2*A) / 32.2
Escribir un programa pascal que implemente un juego en el que el usuario introduce primero la distancia a un objetivo. Luego el usuario introduce el ángulo y la velocidad de lanzamiento del proyectil. Si éste cae dentro de un 10% de la distancia al objetivo, el usuario gana el juego. Si el proyectil no se acerca lo suficiente, se le dice al usuario cuánto se ha alejado el proyectil y se le permite intentarlo de nuevo. Si después de cinco intentos no ha introducido ninguna entrada ganadora, entonces el usuario pierde el juego.
Para simplificar las entradas del usuario; el programa debe permitir que el ángulo sea ingresado en grados. La fórmula para convertir los ángulos en radianes es: Radianes = Grados * PI / 180.
Cada fórmula debe implementarse como una función. El programa debe solicitar las entradas adecuadas al usuario, etiquetar los valores de salida y escribirse con un buen estilo de programación.
Luis Pizarro Q. ©200320
Tarea Nº14. Implementar un calculador de números romanos. En el Imperio Romano
rara vez se utilizaba la notación sustractiva (tal como que IV significa 4), sino que por facilidad utilizaban la notación adivita (IIII es 4). El programa introducirá dos números romanos y un operador aritmético (+, -, *, /) e imprimirá el resultado de la operación, también como un número romano. Una forma de enfocar el problema es convertir los números romanos a enteros, ejecutar la operación requerida y luego convertir el resultado de nuevo a números romanos para imprimirlos. Por ejemplo, el siguiente puede ser el resultado de una ejecución del programa en un sistema interactivo:
Introduzca el primero número:
MCCXXVI
El primero número es 1226
Introducir el segundo número:
LXVIIII
El segundo número es 69
Introducir la operación aritmética deseada:
+
La suma de MCCXXVI y LXVIIII es MCCLXXXXV (1295)(sigue)
Luis Pizarro Q. ©200321
Tarea Nº1
4. El programa debe hacerse con buen estilo, comentarios apropiados, identificadores con significado y buena identació. También deben comprobarse los errores de entrada, tales como dígitos u operadores aritméticos no legales y tomar acciones apropiadas cuando se encuentran a éstos. También debe comprobarse que los números están de una forma aditiva pura: los dígitos van seguidos sólo de dígitos del mismo o menor valor.
Entrega: Miércoles 15 de Abril.
(continuación)
Departamento de Informática
Universidad Técnica Federico Santa María
Tema 7:Subprogramas
Programación de Computadores (IWI-131)
Luis Pizarro Q.
www.labmc.inf.utfsm.cl/~lpizarro/IWI-131