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;
}
