Resolución de Problemas y Algoritmos Segundo cuatrimestre 2015 Clase 11: Construcción de primitivas (Funciones) Dr. Sergio A. Gómez http://cs.uns.edu.ar/~sag Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca, Argentina
idea desarrollo Ciclo de Uso/mantenimiento vida del software análisis diseño (i.) implementación El software surge de una necesidad, problema o idea. Luego se desarrolla e implementa. Finalmente se usa durante un tiempo y de ser necesario se modifica (según la experiencia el 60-80% del ciclo de vida lo constituye esta etapa). Es importante utilizar metodologías y técnicas que simplifiquen el desarrollo y faciliten el mantenimiento.
Solución de problemas con primitivas Hemos visto cómo resolver problemas simples, escribiendo un algoritmo y luego implementándolo en Pascal utilizando asignaciones, condicionales y repeticiones. En lo que resta de la materia veremos: 1. Técnicas para resolver problemas complejos. 2. Cómo escribir algoritmos basados en primitivas y algoritmos que son primitivas. 3. Cómo implementar en Pascal primitivas y poder usar las dos técnicas anteriores. 3
Técnica: Descomposición de problemas. Cuando se intenta resolver un problema complejo, es conveniente descomponer el problema en partes (sub-problemas). Si los subproblemas también son complejos, entonces pueden a su vez descomponerse en otros subproblemas, y así siguiendo. 4
Técnica: descomposición de problemas. Comprar Ropa novio Comprar ropa Comprar vestido novia Organizar casamiento Contratar salón Organizar fiesta Diseñar Contr invitacion Contrat atar es ar DJ caterin g Enviar invitaciones Enviar Imprimir invitac invitacio iones nes Comprar traje Comprar zapatos Un problema complejo que puede dividirse en subproblemas... 5
Técnicas top-down y bottom-up Top-down: División del problema principal en subproblemas más simples hasta llegar a problemas que no necesitan dividirse. Problema subproblemas Bottom-up: Por composición, resolviendo primero los subproblemas más simples hasta llegar a solucionar al problema principal. 6
Ejemplo de trabajo Problema: Escriba un algoritmo y luego un programa para calcular la suma hasta el término K-ésimo de la siguiente suma infinita: suma = 2/1 + 4/2 + 8/6 + 16/24 + 32/120 + 64/720... Técnica: Dar ejemplos particulares y luego generalizar. Ejemplos particulares: K=1,2,3 Término general: 2 N / N! K=6 Solución: sumar (2 N / N!) desde N=1 hasta N=k Técnica: Para escribir el algoritmo y el programa se sugiere descomponer el problema en sub-problemas. 7
Descomposición del problema SumaTérminos Algoritmo Suma-términos DISEÑO Término i-ésimo IMPLEMENTACIÓN Algoritmo Termino-iesimo Algoritmo Potencia Algoritmo Factorial Potencia Factorial 8
Algoritmos como primitivas Los Algoritmos: 1. Reciben datos (entrada) 2. Modifican los datos (acciones primitivas + estructuras de control) 3. Devuelven datos (salida) Veremos a continuación que un algoritmo puede ser usado como una primitiva por otro algoritmo a través de lo que se denomina invocación o llamada. La motivación para usar algoritmos para describir primitivas es que estas podrán ser utilizadas luego en otros algoritmos más complejos. 9
Flujo de control en la invocación de Algoritmo principal una primitiva (subprograma) Invocación a primitiva P argumentos resultado Primitiva P Código describiendo el algoritmo la primitiva P Nota: Sinónimos para primitiva son subprograma, subrutina, módulo (ojo: término más general) - Dr. Sergio A. Gómez 10
Conceptos a entender Cómo se definen los subprogramas? Cuándo se ejecutan los subprogramas? Cómo se le brinda información de entrada a los subprogramas? Cómo se retorna información de salida desde los subprogramas? Cómo interactúan las variables en subprogramas separados? - Dr. Sergio A. Gómez 11
Potencia SumaTérminos Término i-ésimo Factorial PRIMITIVA Potencia Datos Entrada : Base, Exponente Datos Salida : Pot COMIENZO Pot 1 REPETIR Exponente VECES Pot Pot * Base FIN ALGORITMO PRIMITIVA Factorial Datos Entrada : N {natural} Datos Salida : Fact COMIENZO Fact 1 mientras N>0 Fact Fact * N N N-1 FIN ALGORITMO 12
Algoritmos como primitivas PRIMITIVA Termino-i-esimo D. Entrada : i {posición del término en la sucesión} D. Salida : Termino {valor del término i-esimo} COMIENZO Termino Potencia(2,i) / Factorial(i) FIN ALGORITMO 13
Algoritmos como primitivas PRIMITIVA SumaTerminos D. Entrada : K {cant. términos a sumar} D. Salida : Suma {suma de primeros K términos} COMIENZO i 1 Suma 0 Repetir K veces Suma Suma + Término-i-esimo(i) i i + 1 FIN ALGORITMO 14
División del problema en subproblemas SumaTérminos Program suma; Término i-ésimo PRIMITIVAS en Pascal: 1. FUNCTION 2. PROCEDURE Potencia Factorial Termino-iesimo Suma-términos Potencia Factorial Begin End. 15
Pascal es estructurado por bloques PROGRAM MIPROGRAMA CONST... VAR... FUNCTION FACTORIAL( ) CONST... VAR.. BEGIN... END; FUNCTION POTENCIA( ) CONST... VAR.. BEGIN... END; BEGIN... END. En Pascal, un programa está definido por un bloque que tiene: constantes variables FUNCIONES sentencias Una función es también un bloque que tiene constantes, variables, sentencias, etc. 16
Primitivas en Pascal Cuando un algoritmo tiene un único dato de salida se puede invocarlo desde una expresión. Estas primitivas se pueden considerar como nuevas funciones a utilizar en los algoritmos. En Pascal se pueden construir funciones que tienen un número indeterminado de datos de entrada pero un único dato de salida. Se utiliza la palabra reservada FUNCTION. 17
PRIMITIVA Potencia D. Entrada : Base, Exponente D. Salida : Pot COMIENZO Pot 1 REPETIR Exponente VECES Pot Pot * Base FIN ALGORITMO Parámetros formales Tipo del Resultado Variables Locales FUNCTION Potencia ( Base, Exponente : integer) : integer; VAR aux, P : integer; BEGIN P := 1; FOR aux := 1 TO Exponente DO P := P * Base; Potencia := P; END; Asignación del resultado 18
En Pascal toda función tiene: 1. Un nombre (con el cual se la invocará desde una expresión). 2. Parámetros (entre los cuales estarán los datos de entrada). 3. Tipo del resultado (que será el tipo de la función y determinará en que expresión usarla) 4. Variables locales (para uso interno solamente). 5. Sentencias. 6. Asignación del valor de salida al nombre de la función (es la forma de devolver un valor). FUNCTION Potencia (Base, Exponente:integer) : integer; VAR aux,p : integer; BEGIN P := 1; FOR aux:= 1 TO Exponente DO P := P * Base; Potencia:= P; END; 19
Funciones en Pascal Para llamar (invocar o usar) a una función debe: 1) Utilizarse su nombre en una expresión. 2) Coincidir la cantidad de parámetros y tipo de cada uno. 3) El tipo del resultado debe coincidir con el tipo de la expresión en la que se lo llama. 20
La llamada a FUNCTION debe realizarse desde una expresión: PROGRAM Prueba_potencia; VAR B,E, Pot :Integer; FUNCTION Potencia (Base, Exponente:integer) : integer; VAR aux,p: integer; BEGIN Parámetros formales por valor: reciben una P := 1; copia de los valores de los actuales FOR aux:= 1 TO Exponente DO P := P * Base; Potencia:= P; END; BEGIN write( Ingrese base y exponente: ); readln(b, E); Pot:=Potencia(B,E); B := B+1; E := E+1; writeln( pot, <>, potencia(b,e)); END. Parámetros actuales (o efectivos) 21
Invocación a funciones (en expresiones) FUNCTION EsVocal (letra :char): boolean; BEGIN CASE letra OF A, E, I, O, U, a, e, i, o, u, : EsVocal := true; ELSE EsVocal := false; END; END; Algunos ejemplos de invocación: VAR ch: char; es_letra_voc:boolean; read(ch); es_letra_vocal := EsVocal(ch); writeln(esvocal(ch)); IF (EsVocal(ch) or (ch= @ )) THEN WHILE not EsVocal(ch) and not EOF(archi) DO 22
Problema propuesto Realizar la implementación y la traza completa del programa propuesto para la serie. 23
Problema: Mínimo entre dos números Program PruebaMinimo; Var a, b : integer; {------------------------------------------------------} Function Minimo2( x, y : integer ) : integer; Begin if x < y then Minimo2 := x else Minimo2:= y; end; {------------------------------------------------------} Begin WriteLn( Ingrese dos numeros: ); ReadLn( a, b ); WriteLn( El minimo es:, Minimo2( a, b ); End. - Dr. Sergio A. Gómez 24
Problema: Mínimo entre tres números Program PruebaMinimo; Var a, b, c : integer; Function min3( a, b, c : integer ) : integer; Begin if (a<=b) and (a<=c) then min3 := a else if (b<=c) then min3 := b else min3 := c; end; Begin WriteLn( Ingrese tres numeros: ); ReadLn( a, b, c ); WriteLn( El minimo es:, min3( a, b, c ) ); End. - Dr. Sergio A. Gómez 25
Mínimo entre tres números (de nuevo) Program PruebaMinimo; Var a, b, c : integer; Function min2( x, y : integer ) : integer; Begin if x<y then min2 := x else min2 := y end; Function min3( x, y, z : integer ) : integer; Begin min3 := min2( x, min2( y, z ) ); end; Begin WriteLn( Ingrese tres numeros: ); ReadLn( a, b, c ); WriteLn( El minimo es:, min3( a, b, c ); End. - Dr. Sergio A. Gómez 26
Problema: Convertir a minúscula Program ConvertirAMinuscula; Var car : char; Function Minuscula( c : char ) : char; Begin if ( A <= c) and (c <= Z ) then Minuscula := Chr( Ord(c) Ord( A ) + Ord( a ) ) else Minuscula := c; end; Begin WriteLn( Ingrese un carácter: ); ReadLn( car ); WriteLn( car, en mayuscula es, Minuscula( car ) ); end. - Dr. Sergio A. Gómez 27
Sumario de temas Diseño top-down versus diseño bottom-up Primitivas (subprogramas, subrutinas) Notación en pseudocódigo Dos clases: Funciones y procedimientos Invocación Parámetros (formales y actuales) Retornar un valor de la función Ejemplos - Dr. Sergio A. Gómez 28