C2 Funciones
C2 Funciones
C2 Funciones
Conferencia # 2: Funciones.
Contenidos:
1. Bloques.
2. Funciones suministradas. Cap 3, Epíg 3.6, pág 45; Cap. 4, pág 62
3. Funciones construidas por el programador. Transferencia por valor. Cap. 3, Epíg.3.5,
pág 40
4. Función main() Cap1, Epíg 1.5, pág 19
5. Prototipo de funciones.
6. Homonimia de funciones
7. Entrada/salida de datos por teclado.
8. Estudio Independiente
Bibliografía:
Aprenda Java como si estuviera en primero
Introducción
1.- Bloques
Al construir sus aplicaciones verá que estas están formadas por conjuntos de sentencias
agrupadas que se denominan bloques organizados según las reglas sintácticas en cada caso.
Para delimitar un bloque se utilizan las llaves, {}.
Los bloques pueden estar anidados, o sea, un bloque puede estar dentro de otro bloque.
2- Funciones Suministradas.
Una función puede verse como una caja negra que, recibiendo unos datos de entrada,
realiza algunas operaciones para devolver un valor. O sea:
Datos de entrada Función Resultado
Funciones suministradas
Funciones construidas por el programador
Funciones suministradas
En todos los ambientes de desarrollo los programadores disponen de un grupo de funciones
ya definidas por los compiladores que pueden ser usadas para resolver problemas muy
frecuentes. Por ejemplo, tal es el caso las funciones trigonométricas seno, coseno o las
funciones matemáticas raíz cuadrada, exponencial, valor absoluto, logaritmo natural, etc.
Cada una de las funciones suministradas se encuentra en una librería (o biblioteca o clase)
que será necesario especificar para poder usarlas. Por ejemplo, power() se encuentra en la
librería Math y para poder usarla debemos incluir (poner en uso) dicha librería en nuestra
aplicación de la siguiente manera import java.lang.Math. Más adelante en el curso se
amplía el tema de las librerías o clases de utilidad como también se les conoce.
Algunas funciones suministradas tienen entre paréntesis uno o más argumentos que son los
valores que necesita la función para evaluarse y devolver un resultado. A los argumentos se
les conoce en programación como parámetros.
Las ayudas en línea de los ambientes de desarrollo y los libros o manuales de referencia de
los lenguajes contienen una descripción de todas las funciones disponibles. En ellos se
puede encontrar el identificador de cada función y sus argumentos, para poder usar las
funciones correctamente, así como el paquete donde se encuentra donde se encuentra.
En los programas las funciones suministradas se pueden invocar donde quiera que se
puede escribir una expresión y cuando se invocan se deben colocar entre paréntesis los
valores de los argumentos o paréntesis vacíos si la función no requiere argumentos.
Al invocar a una función esta siempre devuelve un valor. Por tanto, al evaluar las
expresiones donde ellas se encuentran es necesario primero evaluar la función, para tomar
su valor y con él evaluar la expresión.
¿Qué hace el compilador cuándo encuentra la invocación a una función? Podemos explicar
el procedimiento del compilador más o menos como sigue:
1ro: multiplica a y b
2do: se transfiere el control de la ejecución a la función sqrt(x) pasándole a través del
parámetro el valor de la variable x, se ejecuta el cuerpo de la función y se retorna un
resultado que se suma al valor resultante del producto a*b
3ro: al resultado anterior se le suma 3.
Los programadores también pueden construir sus propias funciones o métodos y después
invocarlas en las diferentes partes de la aplicación donde se necesiten. Para ello es
necesario construir un bloque con la siguiente sintaxis:
donde:
tipo de la función: es el tipo del valor que devuelve la función una vez que es invocada.
lista de parámetros formales: todos los argumentos separados por comas y especificando el
tipo de cada uno. Por ahora diremos que son los datos que debe recibir la función para que
pueda ejecutarse correctamente.
Dentro del cuerpo de la función generalmente es necesario colocar al menos una sentencia
return para indicar el valor que devuelve la función. Más adelante en el curso cuando se
amplíen los conocimientos veremos que esto cambia para funciones sin tipo.
Por ejemplo, la siguiente función calcula el volumen de un cilindro hueco recibiendo como
datos el radio exterior, el radio interior y la longitud. O sea, veremos cómo hacer una
función con el fragmento de código que se hizo en la conferencia anterior.
Nótese que:
La función recibe los valores del radio exterior, el radio interior y la longitud a través de
los parámetros radioExt, radioInt y longitud respectivamente, esto permite calcular
el volumen del cilindro hueco para distintos valores de radios y longitud.
IP, Conferencia 2, Curso 2021 Última modificación: 18/10/2021
Al igual que las funciones suministradas, las funciones construidas por el programador son
invocadas en expresiones. La invocación se realiza escribiendo el identificador de la
función y entre paréntesis el valor de sus argumentos o parámetros actuales como también
se les conoce.
float v= volumen(13.5,5,10);
float V= volumen(13.5,5,10);
A este tipo de transferencia en la que se transfieren los valores de los parámetros actuales a
los parámetros formales se le llama transferencia por valor. Más adelante en el curso
veremos que existe otra forma de transferir parámetros desde y hacia funciones.
Nótese que al tratarse de una transferencia por valor los parámetros actuales pueden ser:
Constantes
En el ejemplo anterior solo se transfieren valores constantes.
También pueden usarse identificadores de constantes declaradas previamente.
Variables
Por ejemplo: float v= volumen(RE,RI,L); donde RE, RI y L son variables que
tienen que haber tomado valor previamente.
Expresiones
Por ejemplo:
float v= volumen(RI+7,RI,L); donde RI y L son variables que tienen que haber
tomado valor previamente. Para el cilindro de este caso el radio exterior es 7 unidades
mayor que el radio interior.
float v= volumen(RE,RE*0.5,L); donde RE, y L son variables que tienen que haber
tomado valor previamente. El radio interior es la mitad del radio exterior
Los parámetros formales y actuales tienen que concordar en cantidad, tipo y orden.
Java no permite construir funciones anidadas, o locales, o sea una función dentro de otra.
En otros lenguajes como Pascal, Object Pascal esto sí es posible.
Es una función que debe aparecer en todo programa en Java. Como su nombre lo indica es
la función principal del programa y es por donde este comienza a ejecutarse.
contener una función con este nombre. Así pues, main representa el punto de la ejecución a
partir del cual el programador toma el control de la ejecución. Antes de esto ya han
sucedido muchas cosas en el programa.
El orden en que aparezcan las funciones dentro del código no es significativo. O sea, puede
escribirse primero la función main y a continuación otras funciones o viceversa.
Para crear un prototipo de función solo se necesita especificar su tipo de regreso seguido de
su identificador y entre paréntesis el tipo de cada uno de los parámetros que espera recibir
en el orden en que serán esperados. No es necesario incluir en el prototipo de funciones el
identificador de cada parámetro, aunque puede hacerse para documentar mejor el código.
De incluirse serán ignorados por el compilador. Sin embargo, es obligatorio escribir los
identificadores en la implementación.
Ejemplos:
hecho se crea una versión temporal para cada valor y se utiliza para la expresión
conservándose los valores originales). A continuación, se muestra la jerarquía de
promoción para los tipos de datos conocidos hasta ahora, comenzando por los tipos más
alto hasta los tipos más bajos:
Según esta jerarquía un char puede convertirse a un int, un int a un float y un float
a un double. Las conversiones contrarias, o sea, de tipos superiores a tipos inferiores,
implican pérdida de información, que por lo general resultan en valores incorrectos. Por
ejemplo, la conversión de un float a un int truncaría el número real, tomando solo la
parte entera de dicho número, por lo que se perdería la parte decimal. Por ejemplo, si la
función int square(int); que eleva al cuadrado el argumento de entrada se invoca por
square(4.5) regresaría 16 y no 20.25.
Java permite definir, en una misma aplicación, más de una función con el mismo
identificador, siempre que tengan diferentes conjuntos de parámetros, por lo menos en lo
que se refiere a sus tipos. Esta capacidad se llama Homonimia de Funciones y a las
funciones que cumplen estas condiciones se les conoce como funciones homónimas. La
homonimia de funciones se utiliza por lo general para crear varias funciones del mismo
nombre, que ejecutan tareas similares, sobre tipos de datos diferentes. Esto aporta más
claridad a los programas.
Las funciones homónimas pueden o no tener tipos de regresos distintos. Los conjuntos de
parámetros de funciones homónimas tienen que diferenciarse en cantidad y/o tipo de cada
parámetro. Debe prestarse especial atención a la homonimia de funciones utilizando
parámetros por omisión, ya que esto puede causar ambigüedad, pues una función con
argumentos por omisión omitidos pudiera ser llamada en forma idéntica a otra función
homónima.
Ejemplos
Si por ejemplo, las funciones tuvieran argumentos por omisión, como en el caso:
cómo el compilador podría distinguir cuál función se está invocando en cada uno de los
siguientes llamados:
a()
a(‘b’)
Por supuesto, el compilador no tiene cómo resolver esta ambigüedad y por tanto resultaría
en un error.
A una función le entran a través de sus parámetros los valores necesarios para su ejecución,
pero cómo la aplicación conoce los datos que debe transferir a las funciones cuando estos
varían de una ejecución a otra y quien los conoce es el usuario. Por otra parte, cómo la
aplicación le informa a los usuarios los resultados de cierto procesamiento.
La entrada y salida de datos se hace según el ambiente de desarrollo que se utiliza y el tipo
de interfaz desarrollada para la aplicación. En este curso explicaremos cómo se realiza en el
ambiente Netbeans para aplicaciones consola. En la asignatura DPOO se estudiará cómo se
hace la entrada y salida cuando se construyen aplicaciones con interfaces gráficas.
Entrada
La entrada estándar del ordenador es el teclado. Java, como lenguaje de programación,
ofrece las herramientas necesarias para leer los datos que un usuario introduce en un
programa a través del teclado. Para ello, se emplea el objeto System.in, perteneciente a la
clase InputStream.
El objeto System.in ofrece diversos métodos para leer del teclado. El más básico es el
método read.
Ejempo: char variable=(char) System.in.read();
IP, Conferencia 2, Curso 2021 Última modificación: 18/10/2021
El método read devuelve el código ASCII, en decimal, del carácter introducido. El método
read permite leer un único carácter a la vez. Para no tener que leer de carácter en carácter,
Java ofrece una clase diferente: BufferefReader. Se crea un objeto de la clase
BufferedReader a partir de la clase InputStream.
Ejemplo:
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
En ocasiones existen programas en los que se necesita leer otros tipos de datos, por
ejemplo, números. Para transformar la cadena de caracteres que lee el método readLine de
la clase BufferedReader se puede utilizar el código:
int numero=Integer.parseInt(br.readLine());
Código ASCII
El código ASCII, mencionado anteriormente, es un código de caracteres basado en el
alfabeto latino, tal como se usa en inglés moderno. Utiliza 7 bits para representar los
caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para
detectar errores en la transmisión. ASCII fue publicado como estándar por primera vez en
1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 32
caracteres no imprimibles, de los cuales la mayoría son caracteres de control que tienen
efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que les siguen
en la numeración (empezando por el carácter espacio).
IP, Conferencia 2, Curso 2021 Última modificación: 18/10/2021
Casi todos los sistemas informáticos actuales utilizan el código ASCII o una extensión
compatible para representar textos y para el control de dispositivos que manejan texto como
el teclado.
Salida
Java utiliza dos objetos para la salida: System.out y System.err.
System.out: implementa la salida estándar (consola). Los métodos que proporciona
para controlar la salida son:
o print(a) imprime a en la salida, donde a puede ser cualquier tipo básico de
Java ya que Java hace su conversión automática a cadena.
o println(a) igual que el método anterior, salvo que imprime un salto de línea
después de a
System.err: implementa una salida en caso de error. Los métodos de este objeto son
exactamente iguales a los de System.out. Suele usarse en las construcciones try-
catch.
Normalmente la salida es la pantalla, pero puede ser interesante redirigirlo, por ejemplo, a
un fichero, para diferenciar claramente ambos tipos de salida.
Conclusiones
Que los programadores puedan definir sus propias funciones tiene grandes ventajas. En
primer lugar permite aplicar el enfoque divide y vencerás y por tanto abordar un problema a
través de los distintos subproblemas en que este puede dividirse, en segundo lugar reutilizar
código, en tercer lugar aporta mayor claridad a los programas y por consiguiente se obtiene
un código mucho más fácil de depurar y mantener. Por último, no solo se puede dividir el
problema sino los propios equipos de programadores, de manera que cada uno programe
determinados módulos aumentando la productividad del equipo de desarrollo y logrando un
adecuado nivel de ocultamiento de información. Un buen principio de diseño de funciones
es el de mínimo privilegio, que parte de dar a conocer a cada función solo la información
que necesite para realizar las tareas en ellas programadas.
Motivación
Cómo proceder si en dependencia del valor de una condición nuestros algoritmos toman
por unos caminos u otros, o sea si necesitamos implementar algoritmos para los cuales en
determinadas condiciones se ejecuten unos pasos y en otras condiciones se ejecuten otros
pasos. En la próxima conferencia se estudiarán las estructuras alternativas que permiten
resolver este problema.
En las clases prácticas 3 y 4 se ejercitarán los contenidos sobre funciones que se han
estudiado en esta conferencia. Para ello el estudiante debe complementar la información
recibida en clases con la documentación orientada para la lectura en tiempo extra clase.
Estudio Independiente
IP, Conferencia 2, Curso 2021 Última modificación: 18/10/2021
1. Estudiar capítulo 15, epígrafe 15.3, pág 562. Entrada/salida con cin/cout.
1. Comprobación de Lectura.
a) Función hypotenuse que toma dos argumentos (longitud de los catetos) y devuelve
un resultado (longitud de la hipotenusa del triángulo rectángulo correspondiente).
b) Función smallest que toma tres enteros (ceros por defecto los tres) y regresa el
menor de ellos.
c) Función intToFloat que toma un argumento entero y devuelve un resultado en punto
flotante.
Invocaciones
c) Escriba un algoritmo en seudocódigo que recibiendo por teclado los datos de cada una de las 3
líneas de producción de una fábrica, calcule la producción promedio, el porcentaje que esta
representa de la norma conocida y la ganancia total de la fábrica conociendo el costo y precio
unitario. Asuma que las tres líneas producen el mismo producto, que la norma es igual para
todas y que la producción se da en unidades. Implemente dicho algoritmo en C.
int ProdLinea1,ProdLinea2,ProdLinea3;
ENTRAR ProdLinea1,ProdLinea2,ProdLinea3
int norma;
ENTRAR norma
float ganancia,precio,costo;
ENTRAR ganancia,precio,costo
int ProdTotal= ProdLinea1+ProdLinea2+ProdLinea3;
float promedio= ProdTotal/3.0;
IP, Conferencia 2, Curso 2021 Última modificación: 18/10/2021
a) El cubo de un número.
b) El volumen de una esfera
c) El perímetro de un rectángulo
2. Implemente un programa que tenga dos unit. En la unit principal implemente la entrada
de datos y en la otra una función que calcule cuánto ganará un individuo al cabo de un
mes si deposita su dinero en un banco, conociendo que la tasa de interés mensual.
3. Un vendedor recibe un sueldo base más un 10% extra por comisión de sus ventas, el
vendedor desea saber cuánto dinero obtendrá por concepto de comisiones por las tres
ventas que realiza en el mes y el total que recibirá en el mes tomando en cuenta su
sueldo base y comisiones. Implemente un programa que entre los datos necesarios e
invoque a una función que calcule el total que ganará el vendedor por concepto de
comisión.
4. Una tienda ofrece un descuento del 15% sobre el total de la compra y un cliente desea
saber cuánto deberá pagar finalmente por su compra. Implemente un programa que
entre los datos necesarios e invoque a una función que calcule el total que pagará el
cliente.
5. Un alumno desea saber cuál será su calificación final en una asignatura conociendo que
la nota final se compone de los siguientes porcentajes:
55% del promedio de sus tres calificaciones parciales.
30% de la calificación del examen final.
15% de la calificación de un trabajo final.