Instituto Tecnológico “PUERTO DE
MEJILLONES”
PROGRAMACION I
Docente: Lic. Alan E. Ochoa Pérez
INFORME DE LABORATORIO #:8
Fecha de la realización de la práctica: 28-10-2022
Fecha de entrega del informe: 11-11-2022
Grupo: Voltaje
Integrantes: Illatarco Condori Armin Iban
Aguayo Cussi Edman Sergio
FUNCIONES EN JAVA
Las funciones, como su propio nombre indica, se encargarán de hacer una "función"
concreta de nuestro programa.
El sistema ya tiene muchas funciones establecidas, pero tu mismo también puedes crear
funciones.
Por ejemplo cuando mostramos algo por pantalla, estamos utilizando la función del
sistema System.out.println.
Vamos a suponer, que queremos mostrar el "Hola Mundo" cada vez que queramos y de
forma fácil, podemos hacer lo siguiente:
De esta forma, cada vez que quisiéramos escribir el "Hola Mundo", nos bastaría con
llamar a la función, y no lo tendríamos que hacer varias veces. Esa es la idea de las
funciones.
Esta función que hemos hecho es para entenderlo a modo explicación, pero no es muy
útil que digamos.
Hay más tipos de funciones:
Reciben datos y no devuelven nada.
No reciben datos y no devuelven nada. (La que hemos visto en el ejemplo)
Reciben datos y devuelven datos.
Vamos a ver un ejemplo de una función que recibe datos y no devuelve nada.
Esta función muestra el número que le pasemos entre los paréntesis. Los datos que
recibe una función se llaman parámetros.
Fijaos que dentro de la función la variable se llama "numero", pero contiene el valor de
"num". Esto se entenderá en la siguiente lección, el ámbito de las variables.
El último tipo de función que nos falta por ver son las que reciben datos y devuelven un
dato.
Vamos a realizar una función que sume dos variables pasadas por parámetro.
En la creación de la función, hemos cambiado el void por int...Void significaba que no
devolvía ningún valor, y como esta vez devuelve un número entero, ponemos int.
Si devolviera un tipo doublé pues escribiríamos doublé.
Para devolver el valor, tenemos que utilizar la palabra return, como veis en la función.
El resultado se muestra en pantalla a través de la siguiente línea:
System.out.println ("El resultado de la suma es: " + Suma (num1, num2));
Cuando escribimos Suma (num1, num2), realmente es como si estuviéramos
escribiendo una variable tipo "int", porque es lo que devuelve la función.
Todo este tema de las funciones puede parecer un poco lioso al principio, tendrás que ir
familiarizándote con su uso poco a poco. Al principio son difíciles de entender.
MÉTODOS EN JAVA
Un método en Java es un conjunto de instrucciones definidas dentro de una clase, que
realizan una determinada tarea y a las que podemos invocar mediante un nombre.
Algunos métodos que hemos utilizado hasta ahora:
Math.pow ()
Math.sqrt ()
Character.isDigit ()
System.out.println ();
En la imagen vemos la llamada al método Math.pow para que realice la operación de
elevar 3 a 7. También en la instrucción siguiente se está haciendo uso del
método println para mostrar el valor de x. Cuando se llama a un método, la ejecución
del programa pasa al método y cuando éste acaba, la ejecución continúa a partir del
punto donde se produjo la llamada.
En la imagen se muestra el flujo de ejecución del programa cuando se produce la
llamada al método Math.pow: En la llamada al método le enviamos los valores con los
que tiene que realizar la operación. La ejecución del programa continúa dentro del
método. Su tarea en este caso es realizar la operación de elevar 3 a 7. Cuando termina
devuelve el resultado al punto donde se invocó el método. La ejecución continúa en el
método main desde el punto donde se produjo la llamada.
Utilizando métodos:
Podemos construir programas modulares.
Se consigue la reutilización de código. En lugar de escribir el mismo código
repetido cuando se necesite, por ejemplo para validar una fecha, se hace una
llamada al método que lo realiza.
Cuando trabajamos con métodos debemos tener en cuenta lo siguiente:
En Java un método siempre pertenece a una clase. No podemos escribir
métodos fuera de una clase.
No podemos escribir métodos dentro de otros métodos.
Todo programa java tiene un método llamado main. La ejecución del programa
empieza en este método. El método main es el punto de entrada al programa y
también el punto de salida.
Un método tiene un único punto de inicio, representando por la llava de inicio {
La ejecución de un método termina cuando se llega a la llave final} o cuando se
ejecuta una instrucción return.
La instrucción return puede aparecer en cualquier lugar dentro del método, no
tiene que estar necesariamente al final.
Cuando un método finaliza, la ejecución del programa continúa a partir del
punto donde se produjo la llamada al método.
Desde dentro de un método se puede a su vez invocar a otro método.
1. ESTRUCTURA GENERAL DE UN MÉTODO JAVA
La estructura general de un método Java es la siguiente:
[especificadores] tipoDevuelto nombre Método ([lista parámetros])
[throws listaExcepciones]
{
// instrucciones
[return valor;]
}
Los elementos que aparecen entre corchetes son opcionales.
Especificadores (opcional): determinan el tipo de acceso al método. Se verán en detalle
más adelante.
TipoDevuelto: indica el tipo del valor que devuelve el método. En Java es
imprescindible que en la declaración de un método, se indique el tipo de dato que ha de
devolver. El dato se devuelve mediante la instrucción return. Si el método no devuelve
ningún valor este tipo será void.
Nombre Método: es el nombre que se le da al método. Para crearlo hay que seguir las
mismas normas que para crear nombres de variables.
Lista de parámetros (opcional): después del nombre del método y siempre entre
paréntesis puede aparecer una lista de parámetros, también llamados argumentos,
separados por comas. Estos parámetros son los datos de entrada que recibe el método
para operar con ellos. Un método puede recibir cero o más argumentos. Se debe
especificar para cada argumento su tipo. Los paréntesis a continuación del nombre
del método son obligatorios aunque estén vacíos.
Throws listaExcepciones (opcional): indica las excepciones que puede generar y
manipular el método.
Return: se utiliza para devolver un valor. Algunos aspectos importantes sobre la
palabra clave return en un método:
La palabra clave return va seguida de una expresión que será evaluada para
saber el valor de retorno. Esta expresión puede ser compleja o puede ser
simplemente una variable de tipo primitivo o una constante.
El tipo del valor de retorno debe coincidir con el tipoDevuelto que se ha
indicado en la declaración del método.
Si el método no devuelve nada (tipoDevuelto = void) la instrucción return es
opcional.
Un método puede devolver un tipo primitivo, un array, un String o un objeto.
La instrucción return puede aparecer en cualquier lugar dentro del método.
La ejecución de un método termina cuando se llega a su llave final} o cuando se
ejecuta la instrucción return.
2. IMPLEMENTACIÓN DE MÉTODOS EN JAVA
Pasos para implementar un método:
1. Describir lo que el método debe hacer.
2. Determinar las entradas del método, es decir, lo que el método recibe.
3. Determinar los tipos de datos de las entradas.
4. Determinar lo que debe devolver el método y el tipo del valor devuelto.
5. Escribir las instrucciones que forman el cuerpo del método.
6. Prueba del método: diseñar distintos casos de prueba.
Ejemplo de método: método llamado sumar que recibe dos números enteros y calcula y
devuelve su suma.
import java.util.Scanner;
public class Metodos1 {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
int numero1, numero2, resultado;
System.out.print("Introduce primer número: ");
numero1 = sc.nextInt();
System.out.print("Introduce segundo número: ");
numero2 = sc.nextInt();
resultado = sumar(numero1, numero2);
System.out.println("Suma: " + resultado);
}
//método sumar
public static int sumar(int a, int b){
int c;
c = a + b;
return c;
}
}
El método se llama sumar. Recibe dos números enteros a y b que son los parámetros de
entrada. El método devuelve un valor de tipo int.
El flujo de ejecución del programa es el siguiente:
1. En el método main cuando se produce la llamada al método sumar, los
valores de las variables numero1 y numero2 se copian en las variables a y b
respectivamente. Las variables a y b son los parámetros del método.
2. El flujo de ejecución del programa pasa al método sumar.
3. El método suma los dos números y guarda el resultado en c.
4. El método devuelve mediante la instrucción return la suma calculada.
5. Finaliza la ejecución del método.
6. El flujo de ejecución del programa continúa en el método main a partir de
dónde se produjo la llamada al método sumar.
7. El valor devuelto por el método es lo que se asigna a la
variable resultado en el método main.
Si un método devuelve un valor, como sucede en el método sumar, la llamada al
método puede estar incluida en una expresión que utilice el valor devuelto.
En el ejemplo anterior, el método sumar devuelve un valor entero que después vamos a
mostrar. En este caso podríamos haber hecho la llamada al método directamente dentro
del System.out.println:
System.out.println ("Suma: " + sumar (numero1, numero2));
Ejemplo de programa Java que contiene un método con varios return:
Programa que lee por teclado un año y calcula y muestra si es bisiesto. Para realizar el
cálculo se utiliza un método llamado es Bisiesto.
El método es Bisiesto tiene un parámetro de tipo entero llamado a. Será el encargado de
recibir el valor del año a comprobar si es bisiesto o no. El método devuelve un valor de
tipo boolean. Devuelve true si el año recibido es bisiesto y false si no lo es.
Como el método devuelve un dato de tipo boolean se puede llamar dentro de una
instrucción if.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int año;
System.out.print("Introduce año: ");
año = sc.nextInt();
if(esBisiesto(año)){ //llamada al método
System.out.println("Bisiesto");
}else {
System.out.println("No es bisiesto");
}
}
/*
* método que calcula si un año es o no bisiesto
*/
public static boolean esBisiesto(int a){
if(a%4==0 && a%100!=0 || a%400==0)
return true;
else
return false;
}
}
Flujo de ejecución:
1. En el método main se llama al método esBisiesto dentro de la instrucción
if.
2. El valor de la variable año se copia en la variable a.
3. El flujo de ejecución pasa al método esBisiesto.
4. El método comprueba si el año recibido es o no bisiesto.
5. El método devuelve true si el año es bisiesto o false si no lo es.
6. Finaliza la ejecución del método.
7. El flujo de ejecución continúa en el método main en la instrucción if
donde se produjo la llamada al método.
8. El valor true o false devuelto por el método es lo que determina si la
condición es cierta o no.
Ejemplo de programa Java: Método que no devuelve ningún valor.
El método caja Texto tiene un parámetro de tipo String.
El String que recibe lo muestra por pantalla rodeado con un borde.
Este método no devuelve nada, solo se limita a mostrar el String por pantalla.
Cuando un método no devuelve nada hay que indicar void como tipo devuelto.
Como el método no devuelve nada no es necesario escribir la sentencia return.
El método acaba cuando se alcanza la llave final.
import java.util.Scanner;
public class MetodoVoid {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String cadena;
System.out.print("Introduce cadena de texto: ");
cadena = sc.nextLine();
cajaTexto(cadena); //llamada al método
}
// método que muestra un String rodeado por un borde
public static void cajaTexto(String str){
int n = str.length(); //longitud del String
for (int i = 1; i <= n + 4; i++){ //borde de arriba
System.out.print("#");
}
System.out.println();
System.out.println("# " + str + " #"); //cadena con un
borde en cada lado
for (int i = 1; i <= n + 4; i++){ //borde de abajo
System.out.print("#");
}
System.out.println();
}
PROCEDIMIENTOS EN JAVA
Un procedimiento es similar a una función, pero difiere en que no entrega ningún
resultado. Su interés radica en las acciones que se realizan durante su invocación. Un
ejemplo de procedimiento es println(...). Éste siempre se invoca en forma aislada (no
como parte derecha en una asignación): println (... );
Las acciones que realiza la invocación de println consisten en desplegar en pantalla el
argumento que recibe. Es ilegal escribir asignaciones como: x= println( ... );
Porque println no retorna ningún valor.
Definición de procedimiento
Un procedimiento se define y se comporta de la misma forma que una función. La única
diferencia es que el tipo retornado por un procedimiento es void. Por ejemplo, el
siguiente procedimiento despliega los elementos de un arreglo con valores reales:
void mostrar(double[] tab, int pri, int ult) {
int i= pri;
while (i<=ult) {
println(i+" -> "+tab[i]);
i= i+1;
}
// no hay return
}
Ejemplos de uso de mostrar son los siguientes:
mostrar(tab, 0, 3);
Que produce el siguiente resultado en pantalla:
0 -> 4.5
1 -> 15.0
2 -> 2.2
3 -> 4.3
Ejercicio 5: procedimiento que graba el contenido de un arreglo en un archivo.
Defina el procedimiento grabar que reciba como argumentos un arreglo con valores de
tipo double, dos enteros que señalan el rango de llaves válidas (pri y ult) y el nombre de
un archivo. Su procedimiento debe producir un archivo con el contenido del arreglo. Por
ejemplo, la siguiente invocación:
grabar (tab, 0, 3, "cont.txt");
debe producir un archivo de nombre "cont.txt" con 4 líneas cuyo contenido es:
4.5
15.0
2.2
4.3
(Propuesto.)
Procedimientos con efectos laterales
Definir un procedimiento leer que recibe como argumentos un arreglo y el nombre de
un archivo con 4 líneas, e inicializa el arreglo con los valores reales contenidos en un
archivo. Por ejemplo:
double [ ] tabB= new double[4];
leer(tabB, "cont.txt");
mostrar(tabB, 0, 3);
Debe producir el siguiente resultado en pantalla:
0 -> 4.5
1 -> 15.0
2 -> 2.2
3 -> 4.3
Solución:
void leer(double[ ] tab, String nom) {
TextReader lect= new TextReader(nom);
int i= 0;
while (true) {
double x= lect.readDouble();
if (lect.eofReached())
break;
tab[i]= x;
i= i+1;
}
lect.close();
}
Una función o procedimiento puede modificar los arreglos que recibe como argumentos.
En general, pueden producir efectos laterales sobre sus parámetros, cuando son algún
tipo de objetos.
En una función o procedimiento, los parámetros que corresponden a algún tipo de
objetos son en realidad referencias de objetos (recuerde que una referencia es como el
teléfono celular del objeto). Por lo tanto, dentro del procedimiento leer, la variable tab
referencia el mismo objeto que es referenciado por la variable tabB en la invocación de
leer:
Funciones con efectos laterales
El procedimiento anterior no permite saber cuántos valores se leyeron en el archivo. Por
esta razón, es conveniente transformarlo en una función que retorna cuantos elementos
había en el archivo. Por ejemplo:
double[ ] tabc= new double[1000]; // tabc está vacío
int n= leer(tabC, "cont.txt");
mostrar(tabC, 0, n-1);
Para esto hay que cambiar la definición de leer por:
int leer2(double[ ] tab, String nom) {
... // idéntico a leer
return i; // la última llave inicializada
}
En este caso leer2 es una función con efectos laterales porque su labor no es sólo
retornar un valor, sino que además debe alterar los valores que se encuentran en el
arreglo.
Observación:
En la primera versión de leer la asignación:
int ult= leer(tabB, "cont.txt"); es ilegal porque se definió leer
como void. Con la segunda versión sí es válida esta asignación.
Experimento:
¿Qué despliega el siguiente programa?
int i=1;
double[ ] tabD= new double[1000];
int ult= leer2(tabD, "cont.txt");
println("leidos= "+i);
En este caso, el valor desplegado para i es 1. La variable i que usa la función leer es
interna a esa función y no tiene relación alguna con la variable i recién escrita. Diremos
que la variable i declarada internamente en la función leer es invisible fuera de la
función o procedimiento.
Funciones que retornan arreglos
Una función puede retornar arreglos (u objetos en general). Por ejemplo, se puede
construir una función que construye un arreglo y lo entrega a su llamador (el que invoca
la función):
double[ ] tabE= leer3("cont.txt");
mostrar(tab3);
En donde leer3 es una función que recibe el nombre de un archivo y construye un
arreglo con los valores almacenados en el archivo. Se define como:
double[ ] leer3(String nom) {
// Se lee una vez el archivo para determinar cuantos reales
contiene
TextReader lect= new TextReader(nom);
int i= 0;
while (true) {
double x= lect.readDouble();
if (lect.eofReached())
break;
i= i+1;
}
lect.close();
int nelem= i;
// volvemos a leer el archivo para llenarlo
double[] tab= new double[nelem];
lect= new TextReader(nom);
i= 0;
while (i<nelem) {
tab[i]= lect.readDouble();
i= i+1;
}
lect.close();
return tab; // la última llave inicializada
}
Esta función cuenta los reales contenidos en el archivo, crea un arreglo del tamaño
apropiado, coloca los números contenidos en el archivo en el arreglo, y al final retorna
la referencia del arreglo. Esta es una función sin efectos laterales, porque no produce
ningún cambio en ninguno de sus argumentos.
Término anticipado de una función
La línea return que aparece al final de las funciones es una instrucción como cualquier
otra y por lo tanto puede aparecer en cualquier parte del código de la función:
return exp;
Cuando se ejecuta la instrucción return, se termina con la ejecución de la función en
donde aparece y la función entrega el resultado de evaluar la expresión que acompaña
return. Por ejemplo, la siguiente función calcula si un número es primo:
boolean esPrimo(int n) {
int i= 2;
while (i<n) {
if (n%i==0) {
return false;
}
i= i+1;
}
return true;
}
La instrucción return en este caso es más ``fuerte'' que un break, puesto que no sólo
termina el ciclo, también termina la función completa.
CAPTURAS REALIZADAS EN LABORATORIO
a). mayor de dos números
b). alumno aprobado o reprobado
c). par o impar
CONCLUSIÓN.
En conclusión el laboratorio que se desarrolló salió todo con éxito gracias a la guía que
nos proporcionó el docente.