RPA Clase 12 - Departamento de Ciencias e Ingeniería de la

Anuncio
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.
Descargar