FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS TEMA 6 SUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES DECLARACION DE TIPOS (TYPE) En programación es frecuente que un determinado procedimiento de cálculo deba repetirse varias veces a lo largo de un problema. Para reducir el trabajo de programación, todos los lenguajes disponen de la posibilidad de utilizar subprogramas. En general un subprograma es una parte autónoma del programa que realiza una misión perfectamente definida y a la cual se puede ir desde cualquier parte del programa principal. Después de ejecutarse el subprograma el control vuelve a la sentencia siguiente a la que llamó al subprograma. A un subprograma se le puede llamar cuantas veces sea necesario. La declaración de los subprogramas se hace después de la declaración de variables y antes del comienzo de programa principal. Y la llamada a los subprogramas se hace desde el programa principal. Los subprogramas no sólo tienen razón de ser cuando se está ante un procedimiento repetitivo, cada vez se impone más la idea de que un programa es una cosa compleja de realizar y por tanto es importante que esté bien estructurado y que sea lo más inteligible posible. Con este último enfoque, si un grupo de sentencias realiza una tarea bien definida, entonces se justifica el aislarlas formando un subprograma aunque sólo se le llame una vez. Así es posible ver el "programa principal" con esta forma: BEGIN Entrada_datos ( ); Calculos_matematicos ( Salida_datos ( ); ); END. Cada subprograma cumple con una parte específica del programa principal, de modo que la corrección o modificación del mismo sólo afecta a cada parte por separado y el mantenimiento del programa resulta más sencillo. Existen dos tipos diferente de subprogramas, las funciones y los procedimientos . Los procedimientos son los subprogramas en su sentido más general, mientras que las funciones son un tipo particular diferenciándose en la forma de la llamada y en la forma de los parámetros que utiliza. 6.1.- FUNCIONES Las funciones se diferencian de los procedimientos en lo siguiente: 1º En la forma de la llamada; deben estar siempre dentro de una sentencia de salida o a la derecha de una sentencia de asignación 2º En la función pueden entrar tantos parámetros como sean necesario, pero la salida es siempre un solo dato. La forma de declarar una función es la siguiente: Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 1 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS El cuerpo de la función se desarrolla como si de un Function nombre ( parámetros:tipo ) : tipo_resultado ; programa independiente se tratara, con su apartado de <declaraciones locales de la función > declaraciones si es necesario ( son declaraciones begin locales por lo tanto solo se podrán utilizar en esa sentencia1; función) y, encerradas en un bloque begin-end;, el sentencia2; conjunto de sentencias que la componen. El resultado ............. que se obtiene en la parte ejecutable de la función y sentenciaN; que se desea enviar al programa principal debe ser end; asignado al nombre de la función. El nombre de la función nunca podrá aparecer a la derecha de un sentencia de asignación o como componente de una expresión. Ya hemos visto funciones incorporadas a la librería Pascal como pueden ser: abs(x), sin(x), cos(x), ln(x), sqr(x) ... El ejemplo que se da a continuación es el desarrollo de una función no incorporada a la librería Pascal, como es la función tangente. function tang ( x:real) : real ; begin tang := sin(x) / cos(x) ; end; Veamos ahora como se realiza la llamada a una función desde el programa principal: PROGRAM ejemplo1; CONST k= 200; VAR x,y,m,n,valor :real; FUNCTION media ( a,b : real ) : real; begin media:= (a+b)/2; end; BEGIN {programa principal} readln(x,y,m,n); valor= k + media (x,y); writeln(' El valor es = ' ,valor,' El nuevo valor es =' , media(m,n)); END. 6.2.- PROCEDIMIENTOS Su diferencia con las funciones es que: 1º Son llamados mediante sentencias de procedimiento, no como parte de otra sentencia. 2º Pueden tener más de un resultado de salida o incluso ninguno. La forma de declarar un procedimiento es la siguiente: Procedure nombre ( parámetros:tipo ) ; <declaraciones locales del procedimiento> begin sentencia1; sentencia2; ............. sentenciaN; end; Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos Los procedimientos, al igual que las funciones, se declaran entre la declaración de variables y el comienzo del programa principal. El cuerpo del procedimiento se considera como un programa autónomo pero ,a diferencia de las funciones, el nombre del procedimiento no toma el valor de salida, sino que serán los parámetros los que realicen esta tarea. Los parámetros del procedimiento pueden ser de dos TEMA 6 - pag. 2 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS tipos, según su función de paso de información: Parámetros valor, son los que únicamente se pueden utilizar para introducir datos en el procedimiento. Parámetros variable, son los que podemos utilizar a la vez para entrada y salida de datos del procedimiento o únicamente para salida de datos. Estos se diferencian de los anteriores porque en la declaración van precedidos de la palabra VAR. La forma de hacer la llamada a un procedimiento es invocando su nombre como si de una sentencia se tratara, colocando entre paréntesis los parámetros correspondientes. En la llamada al procedimiento debe haber tantos parámetros como en la ventana de la declaración del procedimiento. Cuando en la declaración del procedimiento tengamos parámetros valor éstos podrán corresponderse en la llamada con constantes, variables o expresiones, pero cuando en la declaración tengamos parámetros VAR éstos deberán corresponderse siempre en la llamada al procedimiento con variables. Ejemplo: Program ejemplo; VAR xx:char; yy, zz, aa, bb: integer; cc:real; PROCEDURE EjemploLlamadas (x:char; y,z:integer; VAR a,b:integer; VAR c:real ); begin .................... end; Posibles llamadas, desde el programa principal, al procedimiento EjemploLlamadas: BEGIN {programa principal} ........................... EjemploLlamadas (xx,yy,zz,aa,bb,cc); EjemploLlamadas ( xx,2,124,aa,bb,cc): EjemploLlamadas (‘T’,yy,81,aa,bb,cc); ............................. END. A los procedimientos no sólo se les puede llamar desde el programa principal. sino que la llamada se puede hacer desde otro procedimiento siempre y cuando el procedimiento llamado esté declarado antes que el que efectúa la llamada. Los procedimientos ofrecen dos ventajas: 1º.- Mejoran la legibilidad del programa asignando un nombre a una tarea y, por tanto, clarificando su propósito. 2º.- Acortan los programas (si es que el procedimiento se utiliza más de una vez), ya que evitan tener que escribir repetidamente las correspondientes instrucciones. CONCLUSIONES: La diferencia esencial entre un procedimiento y una función es que la función obtiene un valor que puede ser utilizado en una expresión, mientras que un procedimiento no tiene ningún valor asociado a su nombre. Las funciones generalmente se utilizan para crear operaciones nuevas (o funciones) que no están incluidas en el Pascal tradicional. Los procedimientos normalmente se utilizan para estructurar un programa y para mejorar su claridad y generalidad. Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 3 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS PROGRAMAS EJEMPLO: PROGRAM dibujo; {Este programa dibuja un rectángulo de 10 columnas y 6 filas con el símbolo introducido por el usuario del programa} uses crt; VAR caracter:char; PROCEDURE rectangulo (simbolo:char; largo,ancho:integer); var i,j:integer; begin for i:=1 to largo do begin for j:= 1 to ancho do write( simbolo,' '); writeln; end; {for} end; { fin del procedimient} BEGIN {programa principal} write ( 'Introduce un símbolo para dibujar el rectángulo '); readln(caracter); clrscr; {limpiar pantalla} rectangulo (caracter, 6,10); END. PROGRAM multiplicar; VAR a :integer; b,c,d : real; PROCEDURE cubo ( dato: integer; VAR x,y,z : real); begin x:= x*x*x; y:= y*y*y; z := x*y*dato; end; BEGIN {programa principal} write (' Introduce tres números'); readln(a,b,c); cubo ( a,b,c,d); writeln ('Los resultados son: ', b,c,d); END. 6.3.- DECLARACION DE TIPOS Existen dos tipos de datos: los predefinidos y los definidos por el usuario. Los tipos predefinidos son: enteros, reales, carácter y booleano. Los tipos definidos por el usuario pueden ser: enumerados y subrango. En la estructura general de un programa, la definición de tipos se realiza antes de la declaración de las variables. El formato de la declaración es el siguiente: TYPE identificador = tipo ; Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 4 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS Los tipos enumerados se componen de una lista de identificadores encerrados entre paréntesis y separados por comas. Las variables de tipo enumerado no pueden leerse desde teclado, ni escribirse en pantalla. Las únicas operaciones que se pueden realizar con variables de tipo enumerado son las relacionales (de comparación) y las de asignación. Se considera que un valor es mayor que otro si en la definición aparece más a la derecha que el otro. Ejemplo: PROGRAM ejemplo1; TYPE diasemana = (lunes,martes,miercoles,jueves,viernes,sabado,domingo); VAR dia1,dia2: diasemana; BEGIN read(dia1); {MAL !!!} dia1:= jueves; dia2:=lunes; write(dia2); {MAL !!!} IF dia1> dia2 THEN write(‘Mayor’) ELSE write(‘Menor’); ..... END: El tipo subrango es un subconjunto de un tipo ordinal1 que se declara indicando el primer y el último elemento del conjunto. Ej.: TYPE dias = 1 . . 7 ; letras = ‘A’ . . ‘L’ ; VAR d:dias; caracter: letra; Utilidad de la declaración TYPE En la declaración de un subprograma, los parámetros no pueden ser declarados directamente de tipo array, string o de un tipo enumerado, sino que estos tipos deberán estar definidos globalmente PROGRAM ejemplo2; TYPE d=array [1..10 ] of integer; cadena= string[15 ]; VAR datos : d; nombre: cadena; PROCEDURE empleado ( pdatos: d; VAR pnombre: cadena ); begin .......... end; {fin del procedimiento} BEGIN {programa principal } ....... empleado ( datos,nombre ); ....... END. 1 Un tipo ordinal representa una secuencia ordenada de valores, a los que se les puede aplicar los conceptos de predecesor y sucesor. Tipos ordinales son: entero, carácter, booleano y enumerado. Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 5 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS EJERCICIOS: 6.1.- La empresa DEFECTOS S.A., que fabrica cuatro tipos diferentes de piezas (A,B,C, y D), realiza cada día ocho muestreos para controlar su producción. En cada muestreo determina, para cada tipo de pieza, el número de defectos críticos, principales y secundarios encontrados. Realizar un programa que, una vez leídos los datos de los muestreos realizados durante un día, nos permita obtener los siguientes resultados: 1.- Tipo de pieza con mayor número total de defectos críticos. Idem para defectos principales y secundarios. 2.- Tipo de pieza y número del muestreo en el que se ha encontrado el mayor número de defectos críticos. Idem para los defectos principales y secundarios. 3.- Para cada tipo de pieza número total de defectos encontrados al finalizar los ocho muestreos. 4.- Tipo de pieza con mayor número total de defectos. 5.- Para cada tipo de pieza , % de defectos críticos , % de defectos principales y % de defectos secundarios encontrados en el conjunto de los ocho muestreos. 6.2.- Una empresa, que fabrica 10 tipos distintos de herramientas de corte, desea realizar un análisis de sus gastos y beneficios correspondientes a un año. Los datos de que se dispone son los siguientes: - Por cada mes y por cada tipo de herramienta, número de unidades fabricadas. - Para cada tipo de herramienta, coste total de fabricación y precio de venta (suponemos que el coste de fabricación y el precio de venta no varia durante todo el año). Realizar un programa que, después de leer estos datos, nos calcule: 1.- Por cada mes, beneficios obtenidos con cada tipo de herramienta. 2.- Por cada mes, beneficio total obtenido. 3.- Beneficio total del año y media de los beneficios mensuales. 4.- Por cada tipo herramienta, número total de unidades producidas al año 5.- Tipo de herramienta de la que se han producido más unidades al año. 6.- Herramienta que más beneficios ha dado en total y herramienta de la que se ha obtenido menos beneficios. 6.3.- La Regresión Lineal es una técnica para determinar la “mejor” línea recta que pasa entre una serie de puntos que siguen un comportamiento lineal. La ecuación para una línea recta puede expresarse como: y = a0 + a1 x Determinar la línea recta nos permitirá predecir valores de y (variable dependiente) en función de x (variable independiente). Ecuación para determinar la pendiente : a1 a1 = n∑n i = 1 xiy i - n∑n i = 1 x ∑n i = 1 xi ∑n i = 1 Ecuación para calcular la ordenada al origen: a0 yi ao = 2 2 - ( ∑n x i ) i i = 1 ∑n i = 1 y i - a ∑n x 1 i =1 i n Realizar un programa que : 1.- Utilice la regresión lineal para ajustar una línea recta a un conjunto de 6 pares de datos introducidos por teclado y muestre en pantalla la ecuación resultante. 2.- Que permita estimar el valor de la variable dependiente (y), para una serie de valores introducidos por teclado (máximo 4 ), y presente en pantalla una tabla con los resultados. *El siguiente ejemplo puede ser utilizado para probar el programa: Se realiza un experimento para definir la relación entre el esfuerzo aplicado y el tiempo de fractura para un acero inoxidable, obteniéndose los siguientes resultados: Esfuerzo aplicado xi , kg/mm2 Tiempo de fractura yi , h. 5 40 10 30 15 25 20 32 25 18 30 20 Mediante la regresión lineal se obtiene la línea recta: y = 40,4 - 0,737 x Por lo tanto el tiempo de fractura estimado para un esfuerzo aplicado de 33 kg/mm2 sería de 16,07 horas. Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 6 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS PRACTICA UTILIZAR: - SUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES - DECLARACIÓN DE TIPOS ( TYPE) EJERCICIOS: 6.4.- Realizar un programa que ordene una secuencia de números enteros de menor a mayor por el método de la burbuja. 6.5.- Chafarín es una ciudad en la que las calles forman una red rectangular de 10 x 15 y se quiere averiguar cuál es el cruce en el que se producen más accidentes. Para ello se cogen todos los partes de accidentes del último año y se meten al ordenador (dándole las coordenadas de los cruces donde se han producido los accidentes (nº de calle, nº de avenida)). El fin de accidentes se introduce con (0,0) como coordenadas del cruce. Los accidentes sólo se producen en los cruces. 6.6.- Dada una frase que termina en un punto y con menos de 100 caracteres, realizar un programa que determine si es o no palíndrome. Ejemplo : Dabale arroz a la zorra el abad 6.7.- Los cabecillas de dos organizaciones de espionaje han descubierto que cierto número de sus agentes están en la nómina de ambos grupos. Se va a llevar a cabo una reunión secreta para determinar las acciones a tomar contra los dobles agentes. A la reunión están invitados los agentes que están en una única organización. Diseñar un programa que, con los nombres de los agentes en nómina de cada una de las organizaciones, prepare una lista de invitados a dicha reunión. Cada lista de agentes acaba con un falso agente ZZZ. 6.8.- Preparar un programa que, conocida una lista de primeros platos, segundos platos y postres, con sus respectivas calorías, genere diferentes menús de, a lo sumo 1.200 calorías. ( Se supone que todo menú ha de estar compuesto de 1er plato, 2º plato y postre). Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 7 FUNDAMENTOS DE INFORMÁTICA - APUNTES Y PRÁCTICAS 6.9. Confeccionar un programa que calcule el número de escaños que correspondería a cada partido de los que intervienen en una confrontación electoral. Consultados los resultados electorales de las últimas elecciones, el máximo número de partidos que concurrió, en una sola circunscripción electoral fue de 20. Este valor será definido como constante al principio del programa. El programa deberá mostrar el porcentaje de votos y de escaños de cada partido, por ejemplo: PARTIDO A B C D E VOTOS 2.700 800 9.000 117 6.300 %VOTOS 14,27 4,23 47,57 0,62 33,30 ESC. 0 0 3 0 2 %ESC. 0 0 60 0 40 Para calcular el número de escaños de cada partido se procederá de la siguiente forma: (Método D'HONT) Se eliminarán los partidos cuyo porcentaje de votos sea inferior al 3%. Se dividirá el número de votos de todos y cada uno de los partidos restantes, por los números naturales comprendidos entre 1 y el número de escaños asignados a la circunscripción. De este modo se obtiene una serie de cocientes. Los escaños se asignan uno a uno y sucesivamente a los partidos poseedores de los cocientes mayores, hasta asignar todos los escaños disponibles. Ver el siguiente ejemplo: En una circunscripción electoral hay que repartir 5 escaños entre los partidos A, B, C, D y E que han obtenido, respectivamente, 2.700, 800, 9.000, 117, 6.300 votos. Seguiremos paso a paso las instrucciones anteriores: DIVISOR 1 2 3 4 5 A 2.700 1.350 900 675 540 B 800 400 266 200 160 C 9.000 (1º) 4.500 (3º) 3.000 (5º) 2.250 1.800 D - E 6.300 (2º) 3.150 (4º) 2.100 1.575 1.260 De esta forma el partido C recibe 3 escaños (1º,3º y 5º) y el E recibe 2 escaños (2º y 4º). Esquema para la resolución del programa: 1º 2º 3º Leer datos: nº de escaños, nombres de los partidos, nº de votos obtenidos por cada partido. Calcular el nº de escaños de cada partido: calcular los cocientes y asignar los escaños. Presentar los resultados. Montse Ferreira. Dpto. de Lenguajes y Sistemas Informáticos TEMA 6 - pag. 8