Dra. Jessica Andrea Carballido [email protected] Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Cuando la complejidad de los problemas aumenta, la tarea de hallar una solución se torna más difícil. Una metodología para reducir la complejidad consiste en plantear la solución del problema a partir de la solución de una serie de subproblemas más sencillos que forman parte del problema original. En Pascal, los subprogramas son implementados mediante procedimientos o funciones. • Procedimientos predefinidos: write, writeln, read, readln • Funciones predefinidas: sqr, abs, chr, ord FUNCION La invocación se realiza desde una expresión. PROCEDIMIENTO Program p; La invocación var n: integer; constituye begin en sí misma writeln(‘Ingrese un número: ‘); una instrucción. readln(n); if (abs(n)=n) then writeln(‘El numero es positivo.’) else writeln(‘El numero es negativo.’); end. Un programa en Pascal puede incluir procedimientos y funciones definidos por el programador. En la declaración se establece su nombre y la lista de parámetros (datos que se intercambian con el exterior). Cuando un procedimiento o función ha sido declarado puede ser usado mediante una instrucción de invocación. Datos locales Variables y constantes declaradas y usadas solamente dentro del subprograma Datos intercambiados con el exterior (parámetros) Datos de entrada y datos de salida Datos de entrada Datos locales Parámetros Datos de salida Cuando el subprograma tiene un único dato de salida, y su resultado será utilizado en el contexto de una expresión, definiremos una FUNCIÓN. Datos de entrada Datos locales Parámetros UN Dato de salida entero, real, lógico o caracter Una función (predefinida o definida por el programador) se caracteriza porque se invoca desde una expresión. Definiremos funciones que pueden ser invocadas desde expresiones aritméticas, lógicas o de caracter. Tienen un único dato de salida, de un tipo simple. Por ejemplo: x := sqr(y) + potencia(y, n); - sqr es una función predefinida de Pascal que recibe un parámetro de tipo real y computa un resultado de tipo real. - potencia es una función definida por el programador que recibe dos parámetros, uno de tipo real y otro de tipo integer y computa un valor de tipo real. Una función es una instrucción compuesta que tiene un nombre, puede tener parámetros, puede contener declaraciones y debe retornar un único valor de un tipo simple. Algoritmo minimo DE: n, m {enteros} DS: minimo {entero} Comienzo Si (n<m) entonces minimo<- n sino minimo<-m Fin Datos de entrada Datos locales Dato de salida Tipo: entero El nombre la función es minimo. Los parámetros de la función son dos enteros n y m. El resultado es de tipo integer y se liga a través de una asignación usando el nombre de la función. function minimo (n, m: integer): integer; begin if (n < m) then minimo := n else minimo := m Dato de salida end; Siempre tiene que haber al menos una asignación donde se establece el valor del nombre de la función program pruebaMin; var n1, n2, min: integer; function minimo(n , m: integer): integer; begin if (n < m) Por el momento, el then minimo := n nombre de la función else minimo := m solo podrá aparecer del end; lado izquierdo de una begin asignación. write (‘Ingrese dos números ‘); readln (n1,n2); min := minimo(n1, n2); writeln(‘El minimo es ‘, minimo(n1, n2)); writeln (‘El minimo es ‘,min); end. program pruebaMin; var n1, n2, min: integer; function minimo (n , m: integer): integer; begin if (n < m) then minimo := n else minimo := m end; begin … end. n y m son los parámetros formales de la función, los datos que la función va a utilizar para computar el resultado. EN LA DEFINICION DE LA FUNCION, el nombre funciona como una variable del tipo de la función que se usa SOLAMENTE del lado izquierdo de una asignación (por ahora) para almacenar el dato de salida. program pruebaMin; var n1,n2,min : integer; function minimo ( n , m : integer): integer; begin if (n < m) then minimo := n else minimo := m end; begin … end. Cuando en la parte izquierda de una asignación aparece el nombre de la función, estamos indicando cuál va a ser el resultado de computar la función. Bloque ejecutable En la declaración Parámetros program pruebaMin; formales var n1, n2, min: integer; function minimo ( n , m : integer): integer; begin … En la end; invocación begin Parámetros … reales min := minimo( n1 , n2 ); end. En el bloque ejecutable del programa principal invocamos a la función a través de su nombre. n1 y n2 son los parámetros reales de la función. Los parámetros formales y reales tienen que coincidir en tipo, orden y número. Problema: Leer un archivo de tipo text conteniendo una secuencia pares de números enteros y mostrar por pantalla el mínimo de cada par. Se asume que en el archivo se escribieron dos números enteros por línea. 2 40 21 2 program minimoSecuencia; var f: text; n1, n2: integer; begin assign (f, ’archivos\paresEnt.txt’); reset(f); while not eof(f) do begin readln(f, n1, n2); writeln(minimo(n1, n2)); end; close(f); end. Problema: Leer dos números enteros y determinar si ambos tienen igual cantidad de dígitos. Primitiva: Contar la cantidad de dígitos de un número entero n. EN LA DEFINICION DE LA FUNCION, su nombre funciona como una variable del tipo de la función que se usa SOLAMENTE del lado izquierdo de una asignación (por ahora) para almacenar el dato de salida. Algoritmo cantDigitos DE: n {entero} DS: cantDigitos {entero} Comienzo cantDigitos<-0 repetir mientras (n<>0) hacer n<-n div 10 cantDigitos<- cantDigitos+1 Fin function cantDigitos( num : integer ): integer; var contador: integer; begin Variable local: almacena contador := 0; temporalmente el dato de while (num<>0) do salida begin contador := contador + 1; num := num div 10; Por ahora, el dato de salida end; se guarda en una variable local cantDigitos := contador; y se asigna al nombre de la función end; solamente al final de la misma. Observemos que hemos usado una variable auxiliar para el contador y al terminar el procesamiento de la secuencia asignamos la variable auxiliar al nombre la función. Parámetro formal program igualCantDigitos; var n1, n2: integer; function cantDigitos( num : integer): integer; begin … Parámetros reales end; begin write (‘Ingrese dos números enteros‘); readln(n1, n2); if (cantDigitos(n1)=cantDigitos(n2)) then writeln (‘Ambos nros tienen = cant de digitos’) else writeln(‘Los nros no tiene = cant de digitos’); end. Cuando la función cantDigitos termina, tanto n1 como n2 conservan su valor Problema: Leer de un archivo enteros.txt una secuencia de números enteros y mostrar en consola cada número, seguido de la cantidad de dígitos. Al final debe mostrar la cantidad total de números leídos y la mayor cantidad de dígitos encontrada. 12 2 134 21 5 <eof> 12 2 2 1 134 3 21 2 5 1 Total Nros: 5 Mayor cant digitos: 3 program secuenciaEnteros; … … begin … while not eof(fent) do begin read(fent, n); cantDig:= cantDigitos(n); writeln(n, ' ', cantDig); if (cantDig > max) then max := cantDig; cantNum := cantNum + 1; end; writeln ('La cantidad de números es ', cantNum); writeln ('La cantidad máxima de digitos es ', max); … end. program secuenciaEnteros; var n, cantDig, cantNum, max: integer; fent: text; … begin assign(fent, 'c:\archivos\enteros.txt'); reset(fent); max:=0; cantNum:=0; … close(fent); end. Errores De compilación En el bloque ejecutable del programa, usar la variable contador. De aplicación En el cuerpo de la función, utilizar en expresiones el nombre de la función cantDigitos en lugar de usar la variable auxiliar contador (ya que el objetivo no es realizar una invocación). No asignar un valor a cantDigitos al final de la función.