package com.trifulcas.saludo; public class Recursividad { public static void main(String[] args) { System.out.println(factorial(5)); System.out.println(fibonacci(5)); System.out.println(fibonacci(8)); } // Una función recursiva es una función que se llama a sí misma // Factorial: multiplicación desde el 1 hasta el número // Factorial: N! -> N*(N-1)! 1!->1 // factorial(5)-->5*factorial(4) // factorial(4)-->4*factorial(3) // factorial(3)-->3*factorial(2) // factorial(2)-->2*factorial(1) // factorial(1)-->1 public static int factorial(int num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } } /* * Las reglas para definir una función recursiva son dos * a) Tener un caso base, es decir habrá un momento en el que la función * devuelve un valor fijo. * b) Descomponer el problema en la misma función pero de valores más pequeños */ /* * Sucesión de fibonacci. Empezamos con 1,1 y cada número es la suma de los dos anteriores * 1,1,2,3,5,8,13,21,34,.... * Obtener el elemento N de la sucesión de fibonacci * Si N es 1 o 2 --> 1 * El elemento N es igual a suma de fib(N-1) + fib(N-2) */ public static int fibonacci(int posicion) { if(posicion<=2) { return 1; } else { return fibonacci(posicion-1)+fibonacci(posicion-2); } } }
Mes: marzo 2021
Ámbito (scope) de variables
https://www.w3schools.com/java/java_scope.asp
package com.trifulcas.saludo; public class Ambito { public static void main(String[] args) { // x está definida para todo el bloque, incluyendo subbloques int x=0; for(int i=0;i<10;i++) { // i y nombre sólo están definidas dentro de este bloque String nombre="Juan"; System.out.println(i); System.out.println(nombre); System.out.println(x); } // x existe System.out.println(x); // Pero i y nombre no porque se ha cerrado el bloque en el que // estaban definidas System.out.println(i); System.out.println(nombre); } }
Ejercicios arrays
Cread un programa que nos pida 5 números, los almacene en un array y después nos pida un número y nos diga cuantos valores del array son mayores o iguales a ese número.
Cread un programa que nos pida seis nombres de alumnos y los guarde en un array. Después nos pedirá un nombre y nos dirá si ese nombre está en el array o no.
Cread un programa que cree un array bidimensional de 3×3 y que nos ponga el valor 1 en la diagonal principal:
1 0 0
0 1 0
0 0 1
Con el programa que ya hay en trifulcas de las notas y los alumnos que nos pida los datos y luego nos diga cual es la nota máxima de todos los alumnos y qué alumno lo tiene.
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicio4 { public static void main(String[] args) { int[] numeros = new int[5]; Scanner in = new Scanner(System.in); for (int i = 0; i < 5; i++) { System.out.println("Introduce el número " + (i + 1)); numeros[i]=in.nextInt(); } System.out.println("Introduce el número a comprobar"); int numero=in.nextInt(); int cont=0; for(int i=0;i<numeros.length;i++) { if(numeros[i]>=numero) { cont++; } } System.out.println("Hay "+cont+" numeros mayores o iguales que "+numero); System.out.println("Hay "+mayores(numeros,numero)+" numeros mayores o iguales que "+numero); in.close(); } public static int mayores(int[] numeros, int numero) { int cont=0; for(int n:numeros) { if (n>=numero) { cont++; } } return cont; } }
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicio4b { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] numeros=pedirNumeros(5,in); int numero=pedirNumero(in); System.out.println("Hay "+mayores(numeros,numero)+" mayores que "+numero); in.close(); } public static int[] pedirNumeros(int tam,Scanner in) { int[] numeros=new int[tam]; for (int i = 0; i < 5; i++) { System.out.println("Introduce el número " + (i + 1)); numeros[i]=in.nextInt(); } return numeros; } public static int pedirNumero(Scanner in) { System.out.println("Introduce el número "); int numero=in.nextInt(); return numero; } public static int mayores(int[] numeros, int numero) { int cont=0; for(int n:numeros) { if (n>=numero) { cont++; } } return cont; } }
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicio5 { public static void main(String[] args) { Scanner in = new Scanner(System.in); String[] alumnos = new String[6]; for (int i = 0; i < 6; i++) { System.out.println("Introduce el alumno " + (i + 1)); alumnos[i] = in.nextLine(); } System.out.println("Introduce el alumno a buscar"); String alumno = in.nextLine(); boolean esta = false; for (String el : alumnos) { // Para comparar dos strings if (alumno.equals(el)) { esta = true; } } System.out.println("El alumno "+alumno+(esta?"":" no ")+" está en la lista"); in.close(); } }
package com.trifulcas.saludo; public class Ejercicio6 { public static void main(String[] args) { int[][] tabla = new int[3][3]; // Recorrer todo el array bidimensional // Y cuando se cumpla la condición poner un 1 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { tabla[i][j] = 1; } } } for (int i = 0; i < 3; i++) { tabla[i][i] = 1; } int[][] otra=diagonal(5); mostrar(otra); } public static int[][] diagonal(int tam){ int[][] tabla=new int[tam][tam]; for (int i = 0; i < tam; i++) { tabla[i][i] = 1; } return tabla; } static void mostrar(int[][] tabla) { // Es otro bucle anidado porque tengo dos dimensiones for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[i].length; j++) { System.out.print(tabla[i][j] + " | "); } System.out.println(); } } }
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicio7 { public static void main(String[] args) { Scanner in = new Scanner(System.in); // Pido el número de alumnos (alto de mi tabla multidimensional) System.out.println("Introduce el número de alumnos"); int alumnos = in.nextInt(); // Pido el número de notas (ancho de mi tabla multidimensional) System.out.println("Introduce el número de notas por alumno"); int numero = in.nextInt(); // Creo un array multidimensional con los datos que me han dado int[][] notas = new int[alumnos][numero]; // Para pedir los datos tengo que usar un bucle anidado // El primero (i) es de los alumnos // El segundo (j) es de las notas // La combinación (i,j) son las coordenadas de mi array bidimensional for (int i = 0; i < alumnos; i++) { System.out.println("Introduce las notas del alumno " + (i + 1)); for (int j = 0; j < numero; j++) { System.out.println("Introduce la nota " + (j + 1)); // Guardo la nota en la coordenada adecuada notas[i][j] = in.nextInt(); } } mostrar(notas); int mayor = notas[0][0]; // Esto es una triquiñuela para evitar coger mínimos como el '0' int alumno = 0; for (int i = 0; i < alumnos; i++) { for (int j = 0; j < numero; j++) { if (mayor < notas[i][j]) { mayor = notas[i][j]; alumno=i; } } } System.out.println("La nota más alta es " + mayor+" y es del alumno "+(alumno+1)); } static void mostrar(int[][] tabla) { // Es otro bucle anidado porque tengo dos dimensiones for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[i].length; j++) { System.out.print(tabla[i][j] + " | "); } System.out.println(); } } }
Ojo: Los arrays se pasan como referencia
https://books.trinket.io/thinkjava2/chapter7.html#sec89
package com.trifulcas.saludo; public class Referencia { public static void main(String[] args) { int[] num= {1,2,3,4}; mostrar(num); int[] doble=doble(num); mostrar(doble); mostrar(num); doble[0]=27; mostrar(num); int[] otroDoble=dobleOk(num); mostrar(num); mostrar(otroDoble); } static int[] doble(int[] tabla) { for(int i=0;i<tabla.length;i++) { tabla[i]*=2; } return tabla; } static int[] dobleOk(int[] tabla) { int[] copia=new int[tabla.length]; for(int i=0;i<tabla.length;i++) { copia[i]=tabla[i]*2; } return copia; } static void mostrar(int[] tabla) { for(int elemento:tabla) { System.out.println(elemento); } } }
Ejemplos
Pedir un tamaño y pedir el número de notras
public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Introduce el tamaño"); int tam=in.nextInt(); int[] notas=new int[tam]; for(int i=0;i<tam;i++) { System.out.println("Introduce la nota "+(i+1)); notas[i]=in.nextInt(); } mostrar(notas); } static void mostrar(int[] tabla) { for(int el:tabla) { System.out.print(el+" | "); } System.out.println(); }
Nos piden refactorizarlo para que sean alumnos y notas:
package com.trifulcas.saludo; import java.util.Scanner; public class EjemploMulti { public static void main(String[] args) { Scanner in = new Scanner(System.in); // Pido el número de alumnos (alto de mi tabla multidimensional) System.out.println("Introduce el número de alumnos"); int alumnos = in.nextInt(); // Pido el número de notas (ancho de mi tabla multidimensional) System.out.println("Introduce el número de notas por alumno"); int numero = in.nextInt(); // Creo un array multidimensional con los datos que me han dado int[][] notas = new int[alumnos][numero]; // Para pedir los datos tengo que usar un bucle anidado // El primero (i) es de los alumnos // El segundo (j) es de las notas // La combinación (i,j) son las coordenadas de mi array bidimensional for (int i = 0; i < alumnos; i++) { System.out.println("Introduce las notas del alumno " + (i + 1)); for (int j = 0; j < numero; j++) { System.out.println("Introduce las nota " + (j + 1)); // Guardo la nota en la coordenada adecuada notas[i][j] = in.nextInt(); } } mostrar(notas); } static void mostrar(int[][] tabla) { // Es otro bucle anidado porque tengo dos dimensiones for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[i].length; j++) { System.out.print(tabla[i][j] + " | "); } System.out.println(); } } }
package com.trifulcas.saludo; import java.util.Scanner; public class EjemploMulti { public static void main(String[] args) { Scanner in = new Scanner(System.in); // Pido el número de alumnos (alto de mi tabla multidimensional) System.out.println("Introduce el número de alumnos"); int alumnos = in.nextInt(); // Pido el número de notas (ancho de mi tabla multidimensional) System.out.println("Introduce el número de notas por alumno"); int numero = in.nextInt(); // Creo un array multidimensional con los datos que me han dado int[][] notas = new int[alumnos][numero]; // Para pedir los datos tengo que usar un bucle anidado // El primero (i) es de los alumnos // El segundo (j) es de las notas // La combinación (i,j) son las coordenadas de mi array bidimensional for (int i = 0; i < alumnos; i++) { System.out.println("Introduce las notas del alumno " + (i + 1)); for (int j = 0; j < numero; j++) { System.out.println("Introduce las nota " + (j + 1)); // Guardo la nota en la coordenada adecuada notas[i][j] = in.nextInt(); } } mostrar(notas); // Para cada alumno la nota más alta for (int i = 0; i < alumnos; i++) { System.out.print("La nota más alta del alumno " + (i + 1) + " es: "); int alta = 0; for (int j = 0; j < numero; j++) { if (alta < notas[i][j]) { alta = notas[i][j]; } // alta=Math.max(alta,notas[i][j]) } System.out.println(alta); } // Para cada alumno la media for (int i = 0; i < alumnos; i++) { System.out.print("La media de notas del alumno " + (i + 1) + " es: "); int suma = 0; for (int j = 0; j < numero; j++) { suma+=notas[i][j]; } System.out.println(suma/numero); } } static void mostrar(int[][] tabla) { // Es otro bucle anidado porque tengo dos dimensiones for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[i].length; j++) { System.out.print(tabla[i][j] + " | "); } System.out.println(); } } }
Utilizando funciones:
package com.trifulcas.saludo; import java.util.Scanner; public class EjemploMulti { public static void main(String[] args) { Scanner in = new Scanner(System.in); // Pido el número de alumnos (alto de mi tabla multidimensional) System.out.println("Introduce el número de alumnos"); int alumnos = in.nextInt(); // Pido el número de notas (ancho de mi tabla multidimensional) System.out.println("Introduce el número de notas por alumno"); int numero = in.nextInt(); // Creo un array multidimensional con los datos que me han dado int[][] notas = new int[alumnos][numero]; // Para pedir los datos tengo que usar un bucle anidado // El primero (i) es de los alumnos // El segundo (j) es de las notas // La combinación (i,j) son las coordenadas de mi array bidimensional for (int i = 0; i < alumnos; i++) { System.out.println("Introduce las notas del alumno " + (i + 1)); for (int j = 0; j < numero; j++) { System.out.println("Introduce las nota " + (j + 1)); // Guardo la nota en la coordenada adecuada notas[i][j] = in.nextInt(); } } mostrar(notas); // Para cada alumno la nota más alta for (int i = 0; i < alumnos; i++) { System.out.print("La nota más alta del alumno " + (i + 1) + " es: "); System.out.println(mayor(notas[i])); } // Para cada alumno la media for (int i = 0; i < alumnos; i++) { System.out.print("La media de notas del alumno " + (i + 1) + " es: "); System.out.println(media(notas[i])); } } static void mostrar(int[][] tabla) { // Es otro bucle anidado porque tengo dos dimensiones for (int i = 0; i < tabla.length; i++) { for (int j = 0; j < tabla[i].length; j++) { System.out.print(tabla[i][j] + " | "); } System.out.println(); } } static int mayor(int[] numeros) { int mayor=numeros[0]; for(int n:numeros) { if (n>mayor) { mayor=n; } } return mayor; } static int media(int[] numeros) { int suma=0; for(int n:numeros) { suma+=n; } return suma/numeros.length; } /* * notas[2][3] (2x3) * * |3 | 4 | 5 | * |2 | 6 | 10 | * * notas[0]=|3 | 4 | 5 | * notas[1]=|2 | 6 | 10 | * * notas[0] es un array normal de una dimensión * notas[1] es otro array de una dimensión * int[] foo=notas[0] */ }
Arrays Multidimensionales
public static void main(String[] args) { // Un array de 3 números int[] numeros = new int[3]; // Un array de 3x3 int[][] bidimensional = new int[3][3]; // Un array de 3x3x3 int[][][] tridimensional = new int[3][3][3]; numeros[0] = 5; bidimensional[0][0] = 5; bidimensional[1][1] = 3; tridimensional[0][1][0] = 7; for (int i = 0; i < numeros.length; i++) { System.out.print(numeros[i]+" | "); } System.out.println(); System.out.println(); for (int i = 0; i < bidimensional.length; i++) { for (int j = 0; j < bidimensional[i].length; j++) { System.out.print(bidimensional[i][j]+" | "); } System.out.println(); } System.out.println(); System.out.println(); // Array de dos dimensiones int[][] irregular= {{1,2,3},{4,5},{6,7,8,9},{10}}; for (int i = 0; i < irregular.length; i++) { for (int j = 0; j < irregular[i].length; j++) { System.out.print(irregular[i][j]+" | "); } System.out.println(); } }
Fill y sort en array
import java.util.Arrays; public class ArraysJava { public static void main(String[] args) { String[] aulas= new String[5]; // aulas:{...} Espacio vacío de 5 posiciones // Mostrar mostrar(aulas); // Nos rellena un array con el valor que le digamos Arrays.fill(aulas, "SIN NOMBRE"); // Mostrar mostrar(aulas); //Asignar un valor individual a cada aula con el número for(int i=1;i<=aulas.length;i++) { aulas[i-1]="AULA "+i; } //Mostrar mostrar(aulas); // Cambiar el valor por índice aulas[2]="AUla Música"; aulas[4]="AUla auxiliar"; // Mostrar mostrar(aulas); // Ordenar aulas Arrays.sort(aulas); mostrar(aulas); // Sin importar mayúsculas/minúsculas Arrays.sort(aulas, String.CASE_INSENSITIVE_ORDER); mostrar(aulas); // Orden inverso Arrays.sort(aulas, Collections.reverseOrder()); mostrar(aulas); } static void mostrar(String[] tabla) { for(String el:tabla) { System.out.println(el); } } }
Arrays en Java
https://www.w3schools.com/java/java_arrays.asp
https://www.tutorialspoint.com/java/java_arrays.htm
package com.trifulcas.saludo; public class ArraysJava { public static void main(String[] args) { String nombre; String[] nombres = { "Juan", "Eva", "Ana" }; String[] alumnos = { "Juan", "Pepe", "Ana" }; String[] aulas= new String[5]; System.out.println(nombres[1]); // For tradicional for (int i = 0; i < nombres.length; i++) { System.out.println(nombres[i]); } // Foreach for (String n : nombres) { System.out.println(n); } System.out.println(estaEva(nombres)); System.out.println(estaEva(alumnos)); int[] longitudes=longitudes(alumnos); for (int a : longitudes) { System.out.println(a); } } public static boolean estaEva(String[] nombres) { for (String n : nombres) { if (n == "Eva") { return true; } } return false; } public static int[] longitudes(String[] nombres) { int[] l = new int[nombres.length]; for (int i = 0; i < nombres.length; i++) { l[i] = nombres[i].length(); } return l; } }
Ejercicios java
Vamos a hacer un programa que nos pida un nombre y si la longitud del nombre es mayor de 10 nos diga ‘¡Que nombre más largo!’.
Cread un progrma que nos pida dos números y nos diga cual es el mayor.
Otro que nos pida dos números y nos diga si los dos son pares o los dos son impares.
Cread una función que nos calcule el área de un círculo y otra que nos calcule la circunferencia.
Con esta función cread un programa que nos vaya pidiendo radios y nos muestre el valor del área y de la circunferencia de un círculo con el radio que nos han dado. Cuando el usuario introduzca un 0 salimos del programa.
Cread una función a la que le pasemos una cadena y un número y nos devuelva esa cadena repetida n veces.
Con esa función cread otra a la que le pasemos una letra y haga lo siguiente:
si la longitud de la cadena que le pasamos es diferente de ‘1’ mostrar la cadena.
Si la longitud es 1 mostrar el arbolito siguiente hasta 5:
A
AA
AAA
AAAA
AAAAA
Cread una sobrecarga de la función para que podamos pasar un número que será el tamaño del arbolito.
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicios1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); // Nombre más largo de 10 System.out.println("Introduce tu nombre"); String nombre=in.nextLine(); if (nombre.length()>10) { System.out.println("Que nombre más largo"); } // Número mayor System.out.println("Introduce el número 1"); int a=in.nextInt(); System.out.println("Introduce el número 2"); int b=in.nextInt(); System.out.println("El número mayor es "+Math.max(a, b)); // Paridad de dos números System.out.println("Introduce el número 1"); a = in.nextInt(); System.out.println("Introduce el número 2"); b = in.nextInt(); if (esPar(a) == esPar(b)) { System.out.println("Los dos tienen la misma paridad"); } else { System.out.println("Los dos tienen distinta paridad"); } //Usando operador ternario System.out.println("Los dos tienen " + (esPar(a) == esPar(b) ? "la misma" : "distinta") + " paridad"); in.close(); } // Función que nos devuelve si un número es par public static boolean esPar(int num) { return num % 2 == 0; } }
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicios2 { public static void main(String[] args) { double radio; Scanner in = new Scanner(System.in); do { System.out.println("Introduce el radio"); radio = in.nextDouble(); if (radio != 0) { System.out.println("El círculo de radio " + radio + " tiene una circunferencia de " + circunferencia(radio) + " y un área de " + area(radio)); } } while (radio != 0); in.close(); } public static double area(double radio) { return Math.PI * radio * radio; } public static double circunferencia(double radio) { return Math.PI * radio * 2; } }
package com.trifulcas.saludo; import java.util.Scanner; public class Ejercicio2b { public static void main(String[] args) { double radio; Scanner in = new Scanner(System.in); while (true) { System.out.println("Introduce el radio"); radio = in.nextDouble(); if (radio == 0) { break; } System.out.println("El círculo de radio " + radio + " tiene una circunferencia de " + circunferencia(radio) + " y un área de " + area(radio)); } in.close(); } public static double area(double radio) { return Math.PI * radio * radio; } public static double circunferencia(double radio) { return Math.PI * radio * 2; } }
package com.trifulcas.saludo; public class Ejercicio3 { public static void main(String[] args) { System.out.println(arbol("hola")); System.out.println(arbol("J")); System.out.println(arbol("@")); System.out.println(arbol("@", 3)); System.out.println(arbol("@", 8)); } public static double iva(double precio) { return iva(precio,.21); } public static double iva(double precio,double iva) { return precio*(1+iva); } public static String arbol(String cadena) { return arbol(cadena, 5); } public static String arbol(String cadena, int veces) { if (cadena.length() != 1) { return cadena; } String res = ""; for (int i = 0; i < veces; i++) { res += repetir(cadena, i + 1) + "\n"; } return res; } public static String repetir(String cadena, int veces) { String res = ""; for (int i = 0; i < veces; i++) { res += cadena; } return res; } }
Sobrecarga
public static void main(String[] args) { saludo("Ana", 2); saludo("Juan", 3); saludo("Eva"); saludo(3); int a = doble(7); System.out.println(a); int b = doble(doble(doble(3))); System.out.println(b); System.out.println(mayor(1,3)); System.out.println(mayor(10,3)); } // Esto es un método porque no devuelve nada static void saludo(String nombre, int n) { for (int i = 0; i < n; i++) { System.out.println("Hola " + nombre + " que tal"); } } // SObre carga (overloading) de funciones. Distintos parámetros // Mismo nombre de función // Java llamará a la función que 'encaje' con los parámetros // Si no encaja ninguna, nos da un error // Podemos llamar a funciones entre sobrecargas o no static void saludo(String nombre) { saludo(nombre,1); } static void saludo(int n) { for (int i = 0; i < n; i++) { System.out.println("Hola que tal estás"); } } // Esto sí es una función, porque devolvemos un valor static int doble(int numero) { return numero * 2; } static int mayor(int a, int b) { if (a > b) { b = a; } return b; }