viernes, 25 de marzo de 2011

Ejercicio ordenar y buscar

Dada una tabla de nombres introducidos por el usuario, ordenarlos mediante el método de la sacudida (variante de la burbuja). Después el usuario pedirá buscar un nombre que se buscará en la tabla mediante el método de búsqueda dicotómica o binaria.

NOTA: enlace a una página de algoritmos de ordenación http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html

public class OrdenarBuscar {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int pos, cuantos;
        int ini, fin, i;
        int izq, der, med;
        String[] nombres;
        String aux, buscado;
        boolean intercambio = true;
        System.out.print("Cuántos nombres quiere introducir: ");
        cuantos = entrada.nextInt();
        nombres = new String[cuantos];
        entrada.nextLine(); //Para limpiar el buffer.
        System.out.println("Introduzca "+cuantos+" nombres.");
        for (pos=0; pos<nombres.length; pos++)
            nombres[pos] = entrada.nextLine();
        ini = 0;
        fin = nombres.length-1;
        while (ini<fin & intercambio){
            intercambio = false;
            for (i=ini;i<fin;i++){
                if (nombres[i].compareTo(nombres[i+1])>0){
                    aux = nombres[i];
                    nombres[i] = nombres[i+1];
                    nombres[i+1] = aux;
                    intercambio = true;
                }
            }
            fin--;
            if (intercambio){
                intercambio = false;
                for (i=fin-1;i>=ini;i--){
                    if (nombres[i].compareTo(nombres[i+1])>0){
                        aux = nombres[i];
                        nombres[i] = nombres[i+1];
                        nombres[i+1] = aux;
                        intercambio = true;
                    }
                }
            }
            i++;
        }
        System.out.println("Nombres ordenados:");
        for (pos=0; pos<nombres.length; pos++)
            System.out.print(nombres[pos]+"  ");
        System.out.println("\nIntroduzca el nombre a buscar.");
        buscado = entrada.nextLine();
        izq = 0;
        der = nombres.length-1;
        med = (izq+der)/2;
        while (buscado.compareTo("")!=0){
            while (buscado.compareTo(nombres[med])!=0 & izq<der){
                if (buscado.compareTo(nombres[med])<0)
                    der = med-1;
                else
                    izq = med+1;
                med = (izq+der)/2;
            }
            if (buscado.compareTo(nombres[med])==0)
                System.out.println("El nombre buscado está en la posición: "+med);
            else
                System.out.println("No encontrado.");
            System.out.println("Introduzca otro nombre.");
            buscado = entrada.nextLine();
        }
        System.out.println("FIN.");
    }
}

Ejercicio girar tabla de enteros

Girar el contenido de una tabla de enteros.

public class GirarTabla {
    public static void main(String[] args) {
        int i=0, j, k;
        String aux;
        String[] tabla={"1", "2", "3", "4", "5", "6", "7"};
        j = tabla.length - 1;
        System.out.println("Los valores de la tabla son:");
        for (k=0; k<tabla.length; k++)
            System.out.print(tabla[k]+"   ");
        while (i<j){
            aux = tabla[i];
            tabla[i] = tabla [j];
            tabla [j] = aux;
            i++;
            j--;
        }
        System.out.println();
        System.out.println("Los valores de la tabla tras girarla son:");
        for (i=0; i<tabla.length; i++)
            System.out.print(tabla[i]+"   ");
    }
}

Ejercicio contar cifras

Dado un número entero, mostrar el número de cifras que contiene.

public class ContarCifras {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i, numero, contador=0;
        Integer aux;
        String num;
        System.out.println("Introduzca un número entero positivo.");
        System.out.println("Este programa le mostrará el nº de cifras.");
        numero = entrada.nextInt();
        aux = (Integer) numero;
        num = aux.toString();
        for (i=0; i<num.length(); i++)
            contador++;
        System.out.println("El número de cifras es: "+contador);
    }
}

OTRA FORMA

public class ContarCifras {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int numero, cifras=1;
        System.out.println("Introduzca un número entero y el programa le mostrará el número de cifras.");
        numero = entrada.nextInt();
        while (numero > 9){
            numero = numero/10;
            cifras++;
        }
        System.out.println("El número de cifras del número introducido es: "+cifras);
    }
}

Ejercicio de binario a decimal

DIAGRAMA DE NASSI-SCHNEIDERMAN



EJERCICIO EN JAVA

public class BinDec {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i, j=0, decimal=0;
        String binario;
        System.out.println("Escriba un número en binario. Este programa lo pasará a decimal.");
        binario = entrada.nextLine();
        for (i=binario.length()-1; i>=0; i--){
            if(binario.charAt(i) == '0'){
                decimal = (int) (decimal + 0 * (Math.pow(2, j)));
                j++;
            }
            if(binario.charAt(i) == '1'){
                decimal = (int) (decimal + 1 * (Math.pow(2, j)));
                j++;
            }
        }
        System.out.println(binario+" = "+decimal+" en base decimal.");
    }
}

jueves, 24 de marzo de 2011

Ejercicios búsquedas

Realizar un programa que pida el nombre de una isla y una vez introducido, compruebe si dicha isla pertenece a las Islas Canarias.

public class BuscarIslas {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int pos=0;
        String islaBuscada;
        String[] islasCanarias = {"El Hierro", "La Palma", "La Gomera", "Tenerife", "Gran Canaria", "Lanzarote", "Fuerteventura"};
        System.out.println("Introduzca el nombre de una isla.");
        System.out.println("Este programa le dirá si pertenece al archipiélago canario.");
        islaBuscada = entrada.nextLine();
        while (pos<(islasCanarias.length-1) & !islaBuscada.equals(islasCanarias[pos]))
            pos++;
        if (islaBuscada.equals(islasCanarias[pos]))
            System.out.println("Sí se trata de una de las Islas Canarias.");
        else
            System.out.println("No es una de las Islas Canarias o el nombre no se ha escrito bien.");
    }
}

Realizar un programa que contenga una tabla de alturas y pida al usuario una altura concreta. Buscará si la altura dada está en la tabla y mostrará la posición.

public class BuscarAlt {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int pos=0;
        double[] alturas = {1.75, 1.58, 1.50, 2.07, 1.67, 2.11, 1.98, 1.83, 1.49, 1.67};
        double alturaUsuario;
        System.out.println("Introduzca la altura que desee.");
        System.out.println("Este programa le mostrará la posición en que se encuentra.");
        alturaUsuario = entrada.nextDouble();
        while (pos<(alturas.length-1) & alturas[pos]!=alturaUsuario)
            pos++;
        if (alturas[pos]==alturaUsuario)
            System.out.println("La altura "+alturaUsuario+" se encuentra en la posición: "+pos);
        else
            System.out.println("La altura "+alturaUsuario+" no se ha encontrado.");
    }
}

Ejercicio calcular media de una serie de números

Calcular la media de una serie de números introducidos por teclado, hasta que se introduzca uno que provoca la finalización del programa.

public class MediaNum {
	public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        double numero, suma=0, media;
        int contador=0;
        System.out.println("Este programa calcula la media de una serie de números.");
        System.out.println("Cuando quiera finalizar introduzca '999'.");
        System.out.println("Introduzca los números:");
        numero = entrada.nextDouble();
        while (numero != 999){
            suma = suma + numero;
            contador++;
            numero = entrada.nextDouble();
        }
        if (numero == 999)
            System.out.println("Ha decidido salir sin introducir números.");
        else{
            media = suma/contador;
            System.out.println("La media de los números introducidos es: "+ media);
        }
    }	
}

Ejercicio calcular media (tabla de double)

Pedir al usuario que elija el tamaño de la tabla de double y que la rellene por teclado. Posteriormente, se le pedirá un número y se calculará la media de aquellos de la tabla que sean mayores que dicho número.

DIAGRAMA DE NASSI-SHNEIDERMAN



EJERCICIO EN JAVA

public class Media {
	public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i, contador=0, elementos;
        double suma=0, media, minimo;
        double[] numeros;
        System.out.println("¿Cuántos números quiere introducir?");
        elementos = entrada.nextInt();
        numeros = new double[elementos];
        System.out.println("Introduzca "+ elementos +" números:");
        for (i=0; i<=elementos-1; i++){
            System.out.print("Número "+ (i+1) +": ");
            numeros[i] = entrada.nextDouble();
        }
        System.out.println("Introduzca el nº mínimo. Se calculará la media de los números mayores que este");
        minimo = entrada.nextDouble();
        for (i=0; i<=elementos-1; i++)
            if (numeros[i] > minimo){
                suma = suma + numeros[i];
                contador++;
            }
        if (contador == 0)
            System.out.println("El número introducido es mayor que todos los anteriores.");
        else{
            media = suma/contador;
            System.out.println("La media de los nº mayores que "+ minimo +" es: "+ media);
        }
    }	
}

Ejercicios con tablas

Crear una tabla de enteros, cuyas casillas se rellenarán pidiendo números por teclado. Una vez rellena, mostrarla en orden inverso.

public class Tabla1 {
	public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i;
        int[] numero;
        numero = new int[10];
        System.out.println("Escriba 10 números:");
        for (i=0; i<=9; i++)
            numero[i] = entrada.nextInt();
        System.out.println("Los números en orden inverso son:");
        for (i=9; i>=0; i--)
            System.out.print(numero[i] + "   ");
    }	
}

Ejercicio similar, pero con una tabla de String.

public class Tabla2 {
	public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        final int CUANTOS=5;
        String[] nombres = new String[CUANTOS];
        int i;
        System.out.println("Introduzca "+ CUANTOS +" nombres:");
        for (i=0; i=0; i--)
            System.out.println(nombres[i]);
    }	
}

Igual que el anterior, pero mostrar las cadenas de caracteres que tengan más de 5 caracteres, en orden inverso.

public class Tabla3 {
	public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        final int CUANTOS=5;
        String[] nombres = new String[CUANTOS];
        int i;
        System.out.println("Introduzca "+ CUANTOS +" nombres:");
        for (i=0; i=0; i--)
            if (nombres[i].length() > 5)
                System.out.println(nombres[i]);
    }	
}

Varios ejercicios

Busca el algoritmo de Euclides (implementado de manera iterativa) y exprésalo en forma de diagrama de nassi-shneiderman.

Después implementa una aplicación Java que lea de teclado dos números enteros positivos y que muestre su máximo común divisor.

NOTA: el algoritmo de Euclides calcula el Máximo Común Divisor de dos números enteros.

DIAGRAMA DE NASSI-SHNEIDERMAN


EJERCICIO EN JAVA

public class Euclides {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int num1, num2, aux;
        System.out.println("Escriba dos números enteros y este programa le mostrará el MCD.");
        System.out.println("Número 1:");
        num1 = entrada.nextInt();
        System.out.println("Número 2:");
        num2 = entrada.nextInt();
        while (num2 != 0){
            aux = num1;
            num1 = num2;
            num2 = aux % num2;
        }
        System.out.println("El MCD de los números introducidos es: " + num1);
    }	
}

Implementa un programa Java que lea de la entrada estándar una frase y la analice para informarnos de:
  • número de caracteres que tiene.
  • número de caracteres alfabéticos que tiene.
public class Caracteres {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String frase;
        int pos=0, caracteres, caracteresAlfa=0;
        System.out.println("Introduzca una frase:");
        frase = entrada.nextLine();
        caracteres = frase.length();
        while (pos < frase.length()){
            if (Character.isLetter(frase.charAt(pos)))
                caracteresAlfa++;
            pos++;
        }
        System.out.println("El número de caracteres es: "+ caracteres);
        System.out.println("El número de caracteres  alfabéticos es: "+ caracteresAlfa);
    }	
}

Implemente un programa que calcule los divisores de un número entero previamente leído de la entrada estándar.

public class Divisores {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int n, i;
        System.out.println("Introduzca un número entero. Este programa le mostrará sus divisores.");
        n = entrada.nextInt();
        System.out.println("Los divisores de "+ n +" son:");
        for (i=1; i<=n; i++)
            if ((n%i) == 0)
                System.out.println(i);
    }
}

Implemente un programa que lea de la entrada estándar una serie de 5 nombres y calcule la longitud media de los nombre introducidos.

public class LongMedia1 {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String nombre;
        int i, longitud=0;
        double longMedia;
        System.out.println("Introduzca 5 nombres:");
        for (i=1; i<=5; i++){
            nombre = entrada.nextLine();
            longitud = longitud + nombre.length();
        }
        longMedia = (double)longitud/5;
        System.out.println("La longitud media de los nombres introducidos es de: "+ longMedia + " caracteres.");
    }
}

Repite el anterior ejercicio, pero leyendo nombres hasta que se introduzca el 'nombre' FIN.

public class LongMedia2 {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i, longitud=0, veces=0;
        double longitudMedia;
        String nombre="";
        System.out.println("Escriba los nombre que desee. Cuando haya finalizado escriba 'fin'.");
        while (!nombre.equals("fin")){
            nombre = entrada.nextLine();
            longitud = longitud + nombre.length();
            nombre = nombre.toLowerCase();
            veces++;
        }
        longitudMedia = (double)(longitud-3)/(veces-1); //sin tener en cuenta los caracteres de 'fin'
        System.out.println("La longitud media de los nombres introducidos es de: "+ longitudMedia + " caracteres.");
    }
}

Palíndromo

Realizar un programa que, dada una frase por el usuario, diga si dicha frase es o no un palíndromo.
NOTA: según el diccionario de la RAE, palíndromo es una palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda.

DIAGRAMA DE NASSI-SHNEIDERMAN



EJERCICIO EN JAVA

public class Palindromo1 {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int pos=0;
        StringBuffer frase, inversa;
        String s1, s2;
        System.out.println("Introduzca una frase. Este programa comprobará si se trata o no de un palíndromo.");
        frase = new StringBuffer(entrada.nextLine());
        while (pos < frase.length()) //si utilizamos for, dejamos la parte de pos++ vacía
            if (!Character.isLetter(frase.charAt(pos)))
                frase.deleteCharAt(pos);
            else
                pos++;
        inversa = new StringBuffer(frase);
        inversa.reverse();
        s1 = frase.toString();
        s2 = inversa.toString();
        if (s1.equalsIgnoreCase(s2)) //ignora si hay mayusculas o minisculas
            System.out.println("La frase introducida es un palíndromo.");
        else
            System.out.println("La frase introducida no es un palíndromo.");
    }	
}

El mismo ejercicio, pero sin emplear StringBuffer.

DIAGRAMA DE NASSI-SHNEIDERMAN


EJERCICIO EN JAVA

public class Palindromo2 {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i=0, j, pos=0, contador=0, contador2=0;
        String frase;
        System.out.println("Introduzca una frase. Este programa le dirá si es un palíndromo.");
        frase = entrada.nextLine();
        j=(frase.length()-1);
        while (i<frase.length() & j>=0)
            if (!Character.isLetter(frase.charAt(i)))
                i++;
            else
                if (!Character.isLetter(frase.charAt(j)))
                    j--;
                else
                    if (frase.charAt(i) == frase.charAt(j)){
                        contador++;
                        i++;
                        j--;
                    }
                    else{
                        i++;
                        j--;
                    }
        while (pos <= (frase.length()-1))
            if (Character.isLetter(frase.charAt(pos))){
                contador2++;
                pos++;
            }
            else
                pos++;
        if (contador == contador2)
            System.out.println("La frase es un palíndromo.");
        else
            System.out.println("La frase no es un palíndromo.");
    }	
}

OTRA FORMA DE HACER EL EJERCICIO EN JAVA (MÁS SENCILLA). Esta forma está basada en el diagrama anterior.

public class Palindromo3 {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int i=0, j;
        String frase;
        boolean esPalindromo=true;
        System.out.println("Introduzca una frase. Este programa le dirá si es un palíndromo.");
        frase = entrada.nextLine();
        j=(frase.length()-1);
        while (i<j & esPalindromo)
            if (!Character.isLetter(frase.charAt(i)))
                i++;
            else
                if (!Character.isLetter(frase.charAt(j)))
                    j--;
                else
                    if (frase.charAt(i) == frase.charAt(j)){
                        i++;
                        j--;
                    }
                    else
                        esPalindromo = false;
        if (i>=j)
            System.out.println("La frase es un palíndromo.");
        else
            System.out.println("La frase no es un palíndromo.");
    }
}   

Ejercicio calcular factorial

Calcular el factorial de un número que se pide por teclado.

public class Factorial {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int num, n;
        long f=1L;
        System.out.println("Introduzca un número entero (>= 0):");
        num = entrada.nextInt();
        n = num;
        while(n > 1){
            f = f*n;
            n--;
        }
        System.out.println("El factorial de " + num + " es: " + f);
    }	
}

De nuevo aquí...

Tras algún tiempo sin escribir nada, retomo el blog. Iré añadiendo poco a poco ejercicios realizados desde la última entrada hasta ahora y los siguientes.