Java Quicksort

El método de ordenación Quicksort fue desarrollado por Hoare en el año 1960.
Es el algoritmo de ordenación más rápido.
Se basa en la técnica divide y vencerás, que consiste en ir subdividiendo el array en arrays más pequeños, y ordenar éstos. Para hacer esta división, se toma un valor del array como pivote, y se mueven todos los elementos menores que este pivote a su izquierda, y los mayores a su derecha. A continuación se aplica el mismo método a cada una de las dos partes en las que queda dividido el array.
Después de elegir el pivote se realizan dos búsquedas:
Una de izquierda a derecha, buscando un elemento mayor que el pivote
Otra de derecha a izquierda, buscando un elemento menor que el pivote.
Cuando se han encontrado los dos elementos anteriores, se intercambian, y se sigue realizando la búsqueda hasta que las dos búsquedas se encuentran.
La implementación del método de ordenación Quicksort es claramente recursiva.
Suponiendo que tomamos como pivote el primer elemento, el método Java Quicksort que implementa este algoritmo de ordenación para ordenar un array de enteros se presenta a continuación. Los parámetros izq y der son el primer y último elemento del array a tratar en cada momento.
El método ordena un array A d eenteros desde la posición izq hasta la posición der. En la primera llamada recibirá los valores izq = 0, der = ELEMENTOS-1.

public static void quicksort(int A[], int izq, int der) {

  int pivote=A[izq]; // tomamos primer elemento como pivote
  int i=izq;         // i realiza la búsqueda de izquierda a derecha
  int j=der;         // j realiza la búsqueda de derecha a izquierda
  int aux;
 
  while(i < j){                          // mientras no se crucen las búsquedas                                   
     while(A[i] <= pivote && i < j) i++; // busca elemento mayor que pivote
     while(A[j] > pivote) j--;           // busca elemento menor que pivote
     if (i < j) {                        // si no se han cruzado                      
         aux= A[i];                      // los intercambia
         A[i]=A[j];
         A[j]=aux;
     }
   }
   
   A[izq]=A[j];      // se coloca el pivote en su lugar de forma que tendremos                                    
   A[j]=pivote;      // los menores a su izquierda y los mayores a su derecha
   
   if(izq < j-1)
      quicksort(A,izq,j-1);          // ordenamos subarray izquierdo
   if(j+1 < der)
      quicksort(A,j+1,der);          // ordenamos subarray derecho
   
}
De forma gráfica el proceso sería el siguiente:


















La elección del pivote determinará la eficiencia de este algoritmo ya que determina la partición del array. Si consideramos que el array está desordenado, podemos elegir el primer elemento y el algoritmo funcionaría de forma eficiente. Pero si el array está casi ordenado, elegir el primer elemento como pivote sería una mala solución ya que obtendríamos un subarray muy pequeño y otro muy grande. Por la misma razón, elegir el último elemento del array como pivote también es una mala idea. Pretendemos conseguir que el tamaño de los subarrays sea lo más parecido posible.

Una alternativa a elegir el primer elemento es elegir como pivote un elemento al azar de entre todos los del array.
Otra estrategia es calcular la mediana de los valores de la izquierda, centro y derecha del vector.
Por ejemplo para el vector: 9 8 1 6 10 2 3, se calcula la mediana de los elementos que ocupan el primer lugar, el último y el centro o sea 9 3 6. La mediana es 6 que determinaría las particiones {1 3 2} {6} {8 10 9}.
En el peor caso, cuando el pivote es el elemento menor del array el tiempo de ejecución del método Quicksort es O(n2).
En general el tiempo medio de ejecución del Quicksort es O(n log n).

Algoritmos de ordenación en Java. Método de Ordenación por Selección.

El método de ordenación por selección consiste en repetir los siguientes pasos:
Se busca el elemento más pequeño del array y se coloca en la primera posición.
Entre los restantes, se busca el elemento más pequeño y se coloca en la segunda posición.
Entre los restantes se busca el elemento más pequeño y se coloca en la tercera posición.
……..
Este proceso se repite hasta colocar el último elemento.
De forma gráfica el proceso sería el siguiente:
Array original a ordenar: [50, 26, 7, 9, 15, 27]














El método de ordenación por selección en java para ordenar un array de enteros A es el siguiente:
//método java de ordenación por selección
public static void seleccion(int A[]) {
          int i, j, menor, pos, tmp;
          for (i = 0; i < A.length - 1; i++) {      // tomamos como menor el primero
                menor = A[i];                       // de los elementos que quedan por ordenar                    
                pos = i;                            // y guardamos su posición
                for (j = i + 1; j < A.length; j++){ // buscamos en el resto
                      if (A[j] < menor) {           // del array algún elemento
                          menor = A[j];             // menor que el actual
                          pos = j;
                      }
                }
                if (pos != i){                      // si hay alguno menor se intercambia                         
                    tmp = A[i];
                    A[i] = A[pos];
                    A[pos] = tmp;
                }
          }
}
El tiempo de ejecución del algoritmo de ordenación por selección es del orden O(n2)


Java ArrayList. Estructura dinámica de datos

DECLARACIÓN Y CREACIÓN DE UN ARRAYLIST
ArrayList es una clase contenedora genérica que implementa arrays dinámicos de objetos de cualquier tipo.
De forma general un ArrayList en Java se crea de la siguiente forma:
ArrayList nombreArray = new ArrayList();   
ArrayList nombreArray = new ArrayList();
Esta instrucción crea el ArrayList nombreArray vacío.
Un arrayList declarado así puede contener objetos de cualquier tipo.
Por ejemplo:
ArrayList a = new ArrayList();   
a.add("Lenguaje");
a.add(3);
a.add('a');
a.add(23.5);
Los elementos del arrayList a son:
  “Lenguaje”  2  ‘a’   23.5
Es decir, un ArrayList puede contener objetos de tipos distintos.
En este ejemplo, el primer objeto que se añade es el String “Lenguaje”. El resto no son objetos. Son datos de tipos básicos pero el compilador los convierte automáticamente en objetos de su clase envolvente (clase contenedora o wrapper) antes de añadirlos al array.
Un array al que se le pueden asignar elementos de distinto puede tener alguna complicación a la hora de trabajar con él. Por eso, una alternativa a esta declaración es indicar el tipo de objetos que contiene. En este caso, el array solo podrá contener objetos de ese tipo.
De forma general:
ArrayList<tipo> nombreArray = new ArrayList<>();   
tipo debe ser una clase. Indica el tipo de objetos que contendrá el array.
No se pueden usar tipos primitivos. Para un tipo primitivo se debe utilizar su clase envolvente.
Por ejemplo:
ArrayList<Integer> numeros = new ArrayList<>();  
Crea el array numeros de enteros.

MÉTODOS DE ARRAYLIST
Algunos métodos que proporciona ArrayList son:
MÉTODO
DESCRIPCIÓN
size()
Devuelve el número de elementos (int)
add(X)
Añade el objeto X al final. Devuelve true.
add(posición, X)
Inserta el objeto X en la posición indicada.
get(posicion)
Devuelve el elemento que está en la posición indicada.
remove(posicion)
Elimina el elemento que se encuentra en la posición indicada. Devuelve el elemento eliminado.
remove(X)
Elimina la primera ocurrencia del objeto X. Devuelve true si el elemento está en la lista.
clear()
Elimina todos los elementos.
set(posición, X)
Sustituye el elemento que se encuentra en la posición indicada por el objeto X. Devuelve el elemento sustituido.
contains(X)
Comprueba si la colección contiene al objeto X. Devuelve true o false.
indexOf(X)
Devuelve la posición del objeto X. Si no existe devuelve -1
Puedes consultar todos los métodos de ArrayList en:


RECORRER UN ARRAYLIST
Podemos recorrerlo de forma clásica con un bucle for:
for(int i = 0;i < array.size();i++){
    System.out.println(array.get(i));      
}

Con un bucle foreach:
Si suponemos el array de enteros llamado numeros:
for(Integer i: numeros){
    System.out.println(i);                 
}

Si el array contiene objetos de tipos distintos o desconocemos el tipo:
for(Object o: nombreArray){
    System.out.println(o);                 
}

Utilizando un objeto Iterator.
La ventaja de utilizar un Iterador es que no necesitamos indicar el tipo de objetos que contiene el array.
Iterator tiene como métodos:
hasNext: devuelve true si hay más elementos en el array.
next: devuelve el siguiente objeto contenido en el array.
Ejemplo:
ArrayList<Integer> numeros = new ArrayList<>();
......
//se insertan elementos
.....

Iterator it = numeros.iterator();       //se crea el iterador it para recorrer el array numeros                   
while(it.hasNext()){                    //mientras queden elementos
      System.out.println(it.next());    //se obtienen y se muestran                                               
}

EJEMPLOS DE USO DE ARRAYLIST
Ejemplo 1:
ArrayList<String> nombres = new ArrayList<>();
nombres.add("Ana");
nombres.add("Luisa");
nombres.add("Felipe");
System.out.println(nombres); // [Ana, Luisa, Felipe]
nombres.add(1, "Pablo");
System.out.println(nombres); // [Ana, Pablo, Luisa, Felipe]                                                       
nombres.remove(0);
System.out.println(nombres); // [Pablo, Luisa, Felipe]
nombres.set(0,"Alfonso");
System.out.println(nombres); // [Alfonso, Luisa, Felipe]                                                          
String s = nombres.get(1);
String ultimo = nombres.get(nombres.size() - 1);
System.out.println(s + " " + ultimo);  // Luisa Felipe

Ejemplo 2: Escribe un programa que lea números enteros y los guarde en un ArrayList hasta que se lea un 0 y muestra los números leídos, su suma y su media.
import java.util.*;

public class ArrayList2 {

    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> numeros = new ArrayList<>();
        int n;
  
        do {
            System.out.println("Introduce números enteros. 0 para acabar: ");                                     
            System.out.println("Numero: ");
            n = sc.nextInt();
            if (n != 0){
                numeros.add(n);
            }
        }while (n != 0);
       
        System.out.println("Ha introducido: " + numeros.size() + " números:");
       
        //mostrar el arrayList completo
        System.out.println(numeros);
       
        //recorrido usando un iterador para mostrar un elemento por línea                                         
        Iterator it = numeros.iterator();
        while(it.hasNext()){
              System.out.println(it.next());
        }
  
        //recorrido usando foreach para sumar los elementos
        double suma = 0;
        for(Integer i: numeros){
            suma = suma + i;
        }
        System.out.println("Suma: " + suma);
        System.out.println("Media: " + suma/numeros.size());
    }
}
COPIAR UN ARRAYLIST
El nombre de un ArrayList contiene la referencia al ArrayList, es decir, la dirección de memoria donde se encuentra el ArrayList, igual que sucede con los arrays estáticos.
Si disponemos de un ArrayList de enteros llamado ventas:









La instrucción:
ArrayList<Integer> ventas1 = ventas;   
No copia el array ventas en el nuevo array ventas1 sino que crea un alias:









De esta forma tenemos dos formas de acceder al mismo ArrayList: mediante la referencia ventas y mediante la referencia ventas1.
Para hacer una copia podemos hacerlo de forma manual elemento a elemento o se puede pasar la referencia del ArrayList original al constructor del nuevo:
ArrayList<Integer> ventas1 = new ArrayList(ventas);   

ARRAYLIST COMO PARÁMETRO DE UN MÉTODO
Un ArrayList puede ser usado como parámetro de un método. Además un método puede devolver un ArrayList mediante la sentencia return.
Ejemplo: Método que recibe un ArrayList de String y lo modifica invirtiendo su contenido:
import java.util.*;

public class ArrayList4 {

    public static void main(String[] args) {
 
        ArrayList<String> nombres = new ArrayList<>();
        nombres.add("Ana");
        nombres.add("Luisa");
        nombres.add("Felipe");
        nombres.add("Pablo");
        System.out.println(nombres);
        nombres = invertir(nombres);
        System.out.println(nombres);
    }

    public static ArrayList<String> invertir(ArrayList<String> nombres) {                             
        // Crea una lista para el resultado del método
        ArrayList<String> resultado = new ArrayList<>();
        // Recorre la lista de nombres en orden inverso
        for (int i = nombres.size() - 1; i >= 0; i--) {                                                           
             // Añade cada nombre al resultado
              resultado.add(nombres.get(i));
        }
        return resultado;
    }
}

ARRAYS BIDIMENSIONALES UTILIZANDO ARRAYLIST
Un ArrayList es un array unidimensional, pero con ellos podemos simular arrays de dos o más dimensiones anidando ArrayLists.
Para crear una matriz lo que creamos es un ArrayList cuyos elementos son a su vez ArrayList. Esto se puede extender sucesivamente y obtener arrays de más dimensiones.
Ejemplo:
Programa que lee las notas de 10 alumnos y las guarda en un ArrayList Bidimensional. Cada alumno tiene un número indeterminado de notas. La lectura de notas de cada alumno acaba cuando se introduce un número negativo. Finalmente se muestran todas las notas de todos los alumnos.

public static void main(String args[]){

        Scanner sc = new Scanner(System.in);
        final int numAlumnos = 10;  //número de alumnos
        int i, j, nota, cont = 1;
       
        //crear un ArrayList bidimensional de enteros vacío
        //Realmente se crea un ArrayList de ArrayLists de enteros
        ArrayList<ArrayList<Integer>> array = new ArrayList<>();                                        
       
        //Se leen las notas de cada alumno.
        System.out.println("Introduzca notas. < 0 para acabar");
        for(i=0;i < numAlumnos;i++){
            cont = 1;
            System.out.println("Alumno " + (i+1) + ": ");
            System.out.print("Nota " + cont + ": ");
            nota = sc.nextInt();

           //para cada alumno se añade una nueva fila vacía
           //esto es necesario porque el arrayList se crea vacío
            array.add(new ArrayList<Integer>());

            while(nota >= 0){
                array.get(i).add(nota); //en la fila i se añade un nueva nota
                cont++;
                System.out.print("Nota " + cont + ": ");
                nota = sc.nextInt();             
            }           
        }
       
        //Mostrar todas las notas
        System.out.println("Notas de alumnos");
        for(i=0;i < array.size();i++){                       //para cada alumno (para cada fila)
            System.out.print("Alumno " + i + ": ");
            for(j=0;j < array.get(i).size();j++){            //se recorre todas la columnas de la fila            
                System.out.print(array.get(i).get(j) + " "); //se obtiene el elemento i,j
            }
            System.out.println();          
        }
}

Matrices en Java

Un array en Java puede tener más de una dimensión. El caso más general son los arrays bidimensionales también llamados matrices o tablas.
La dimensión de un array la determina el número de índices necesarios para acceder a sus elementos.
Los vectores que hemos visto en otra entrada anterior son arrays unidimensionales porque solo utilizan un índice para acceder a cada elemento.
Una matriz necesita dos índices para acceder a sus elementos. Gráficamente podemos representar una matriz como una tabla de n filas y m columnas cuyos elementos son todos del mismo tipo.
La siguiente figura representa un array M de 3 filas y 5 columnas:
A los elementos del array se accede mediante la fila y columna donde están situados.
A efectos prácticos, cuando trabajamos con arrays bidimensionales podemos pensar en una tabla como la que se muestra en la imagen anterior donde los elementos están distribuidos en filas y columnas.
Pero en realidad una matriz en Java es un array de arrays.
La disposición real en memoria del array anterior la podemos representar gráficamente de esta forma:

M es el nombre del array.
M contiene la dirección de memoria (referencia) de un array unidimensional de 3 elementos.
Cada elemento de este array unidimensional contiene la dirección de memoria de otro array unidimensional.
Cada uno de estos últimos arrays unidimensionales contiene los valores de cada fila de la matriz.
M.length indica el número de filas de la matriz. En este ejemplo el número de filas (M.length) es 3.
M[i].length indica el nímero de columnas de la fila i. En este ejemplo la longitud de cada fila del array (M[i].length) es 5.
Para acceder a cada elemento de la matriz se utilizan dos índices. El primero indica la fila y el segundo la columna. 
M[0][2] = 9;  //asigna el valor 9 al elemento situado en la primera fila (fila 0) y tercera columna (fila 2).
No dedemos olvidar que la primera fila de una matriz es la fila 0 y la primera columna de una matriz es la columna 0.
CREAR MATRICES EN JAVA
Se crean de forma similar a los arrays unidimensionales, añadiendo un índice.
Por ejemplo:
matriz de datos de tipo int llamado ventas de 4 filas y 6 columnas:
int [][] ventas = new int[4][6];
matriz de datos double llamado temperaturas de 3 filas y 4 columnas:
double [][] temperaturas = new double[3][4]; 
En Java se pueden crear arrays irregulares en los que el número de elementos de cada fila es variable. Solo es obligatorio indicar el número de filas.
Por ejemplo:
int [][] m = new int[3][];
crea una matriz m de 3 filas.
A cada fila se le puede asignar un número distinto de columnas:
m[0] = new int[3];
m[1] = new int[5];
m[2] = new int[2];
Gráficamente podemos representar la disposición real en memoria del array anterior así:

INICIALIZAR MATRICES
Un array es un objeto, por lo tanto, cuando se crea, a sus elementos se les asigna automáticamente un valor inicial:
  • 0 para arrays numéricos
  • '\u0000' (carácter nulo) para arrays de caracteres
  • false para arrays booleanos
  • null para arrays de String y de referencias a objetos
También podemos dar otros valores iniciales al array cuando se crea.
Los valores iniciales se escriben entre llaves separados por comas.
Los valores que se le asignen a cada fila aparecerán a su vez entre llaves separados por comas.
El número de valores determina el tamaño de la matriz.
Por ejemplo:
int [][] numeros = {{6,7,5},{3, 8, 4}, {1,0,2}, {9,5,2}};
se crea la matriz numeros de tipo int, de 4 filas y 3 columnas, y se le asignan esos valores iniciales.
Asignando valores iniciales se pueden crear también matrices irregulares.
Por ejemplo la instrucción:
int [][] a = {{6,7,5,0,4}, {3, 8, 4}, {1,0,2,7}, {9,5}};
crea una matriz irregular de 4 filas. La primera de 5 columnas, la segunda de 3, la tercera de 4 y la cuarta de 2.
RECORRER MATRICES
Para recorrer una matriz se anidan dos bucles for. En general para recorrer un array multidimensional se anidan tantas instrucciones for como dimensiones tenga el array.
Ejemplo de recorrido de una matriz en Java:
Programa que lee por teclado números enteros y los guarda en una matriz de 5 filas y 4 columnas. A continuación muestra los valores leídos, el mayor y el menor y las posiciones que ocupan.
import java.util.Scanner;

public class Bidimensional2 {

    public static void main(String[] args) {

        final int FILAS = 5, COLUMNAS = 4;
        Scanner sc = new Scanner(System.in);
        int i, j, mayor, menor;
        int filaMayor, filaMenor, colMayor, colMenor;

        int[][] A = new int[FILAS][COLUMNAS]; //Se crea una matriz de 5 filas y 4 columnas

        //Se introducen por teclado los valores de la matriz
        System.out.println("Lectura de elementos de la matriz: ");
        for (i = 0; i < FILAS; i++) {
            for (j = 0; j < COLUMNAS; j++) {
                System.out.print("A[" + i + "][" + j + "]= ");
                A[i][j] = sc.nextInt();
            }
        }

        //Mostrar por pantalla los valores que contiene la matriz
        System.out.println("valores introducidos:");
        for (i = 0; i < A.length; i++) { 
            for (j = 0; j < A[i].length; j++) {
                System.out.print(A[i][j] + " ");
            }
            System.out.println();
        }

        //Calcular el mayor valor de la matriz y el menor.
        //Obtener las posiciones que ocupan el mayor y el menor dentro de la matriz 
        mayor = menor = A[0][0]; //se toma el primer elemento de la matriz como mayor y menor
        filaMayor = filaMenor = colMayor = colMenor = 0;

        //mediante dos bucles for anidados recorremos la matriz
        //buscamos el mayor, el menor y sus posiciones
        for (i = 0; i < A.length; i++) {  //para cada fila de la matriz
            for (j = 0; j < A[i].length; j++) { //para cada columna de la matriz
                if (A[i][j] > mayor) {
                    mayor = A[i][j];
                    filaMayor = i;
                    colMayor = j;
                } else if (A[i][j] < menor) {
                    menor = A[i][j];
                    filaMenor = i;
                    colMenor = j;
                }
            }           
        }

        //Mostrar por pantalla el mayor elemento de la matriz,el menor y las posiciones que ocupan           
        System.out.print("Elemento mayor: " + mayor);
        System.out.println(" Fila: "+ filaMayor + " Columna: " + colMayor);
        System.out.print("Elemento menor: " + menor);
        System.out.println(" Fila: "+ filaMenor + " Columna: " + colMenor);
    }
}
Ejemplo de recorrido de una matriz irregular en Java:
Programa que crea una matriz irregular de enteros. El número de filas se pide por teclado. Para cada fila se pedirá el número de columnas que tiene. El número mínimo de filas debe ser 2 y el número mínimo de columnas debe ser 1. A continuación asigna a cada elemento de la matriz un número aleatorio del 1 al 5. Finalmente muestra por pantalla el contenido de la matriz.

import java.util.Random;
import java.util.Scanner;

public class MatrizIrregular {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random rnd = new Random();
        int filas, columnas;

        do { //lectura de las filas
            System.out.print("Introduce número de filas: ");
            filas = sc.nextInt();
            if (filas < 2) {
                System.out.println("Valor no válido");
            }
        } while (filas < 2);

        //se crea el array solo con el número de filas
        //el número de columnas se deja vacío 
        //el número de columnas para cada fila lo indicaremos después
        int[][] A = new int[filas][];

        //para cada fila pedimos el número de columnas que tendrá
        for (int i = 0; i < A.length; i++) {
            do {
                System.out.print("Número de columnas para la fila " + i + ": ");                                  
                columnas = sc.nextInt();
                if (columnas < 1) {
                    System.out.println("Valor no válido");
                }
            } while (columnas < 1);
            //Se crea un array del tamaño indicado y se le asigna a la fila
            A[i] = new int[columnas];
        }

        //A cada elemento de la matriz se le asigna un valor aleatorio del 1 al 5                                 
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < A[i].length; j++) {
               A[i][j] = rnd.nextInt(5) + 1;
            }
        }

        //Se muestra el contenido de la matriz
        System.out.println("Contenido del array:");
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < A[i].length; j++) {
                System.out.print(A[i][j] + " ");
            }
            System.out.println();
        }
    }
}

Puedes encontrar más ejercicios para seguir practicando en este libro.


Contiene ejercicios resueltos sobre los conceptos básicos del lenguaje java: Declaración de variables, literales, tipos de datos, operadores, crear expresiones algebraicas correctas, etc.

Las soluciones de los ejercicios incluyen una explicación detallada sobre cómo se ha resuelto.

El contenido del libro es una recopilación de ejercicios realizados en mis clases de Programación en los ciclos formativos de grado superior Desarrollo de aplicaciones web y Desarrollo de aplicaciones multiplataforma.

Intercambiar el contenido de dos variables en Java

En esta entrada vamos a explicar dos métodos para realizar el intercambio de valores entre dos variables.
El primer método de intercambio utiliza una variable auxiliar y el segundo método realiza el intercambio de valores sin utilizar variable auxiliar.

Intercambio de valores entre dos variables utilizando una variable auxiliar.


Programa para intercambiar el valor de dos variables. Los valores iniciales se leen por teclado.

Por ejemplo, suponiendo que las variables se llaman A y B, si A contiene 3 y B contiene 5, después del intercambio A contendrá 5 y B 3. 

En este ejemplo, para intercambiar el valor entre dos variables utilizaremos una avariable auxiliar donde guardar el valor de una de ellas. Después veremos la forma de hacerlo sin usar una variable auxiliar para el intercambio. 

Las instrucciones a realizar son:

AUX = A;
A = B;
B = AUX;

Programa completo:
/* 
 * Programa que lea dos variables
 * numéricas A y B e 
 * intercambie sus contenidos.
 */
import java.util.*;
public class Secuenciales2_5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int A, B, AUX;
        System.out.print("Introduzca valor de A: ");
        A = sc.nextInt();
        System.out.print("Introduzca Valor de B: ");
        B = sc.nextInt();
        System.out.println("Valores iniciales: A = " + A + "   B = " + B);                                        
        //instrucciones para hacer el intercambio
        //se utiliza una variable auxiliar
        AUX = A;
        A = B;
        B = AUX;      
        System.out.println("Valores intercambiados: A = " + A + "   B = " + B);                                   
    }
}



Intercambio de valores entre dos variables sin utilizar variable auxiliar.


También se puede intercambiar el valor de dos variables sin utilizar una variable auxiliar.
En ese caso se resuelve utilizando aritmética básica:

A = A + B;
B = A - B;
A = A - B;

Si por ejemplo A = 5 y B = 3

A = 5 + 3 = 8
B = 8 - 3 = 5
A = 8 - 5 = 3


Programa completo:
/* 
 * Programa que intercambie dos variables sin auxiliar
 */
import java.util.*;
public class Secuenciales2_5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int A, B, AUX;
        System.out.print("Introduzca valor de A: ");
        A = sc.nextInt();
        System.out.print("Introduzca Valor de B: ");
        B = sc.nextInt();
        System.out.println("Valores iniciales: A = " + A + "   B = " + B);                                        
        //instrucciones para hacer el intercambio
        //sin utilizar una variable auxiliar 
        A = A + B;
        B = A - B;
        A = A - B;
        System.out.println("Valores intercambiados: A = " + A + "   B = " + B);                                   
    }
}

Java Ejercicios Básicos Resueltos 4

Ejercicios básicos resueltos con estructura secuencial
Relación Nº 4: Ejercicios 11, 12 y 13
Ejercicio 11:
Programa que lea un número entero N de 5 cifras y muestre sus cifras igual que en el ejemplo.
Por ejemplo para un número N = 12345   La salida debe ser:
1
12
123
1234
12345

/*
 *
 * N = 12345    La salida debe ser:
 * 1
 * 12
 * 123
 * 1234
 * 12345
 */
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N;
        System.out.print("Introduzca valor de N: ");
        N = sc.nextInt(); //supondremos que el número introducido tiene 5 cifras                                  
        System.out.println(N/10000);
        System.out.println(N/1000);
        System.out.println(N/100);
        System.out.println(N/10);
        System.out.println(N);
    }
}
Ejercicio 12:
Programa Java que lea un número entero N de 5 cifras y muestre sus cifras igual que en el ejemplo.
Por ejemplo para un número N = 12345    La salida debe ser:

5
45
345
2345
12345

/*
 *
 * N = 12345    La salida debe ser:
 * 5
 * 45
 * 345
 * 2345
 * 12345
 */
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N;
        System.out.print("Introduzca valor de N: ");
        N = sc.nextInt();  //supondremos que el número introducido tiene 5 cifras                                 
        System.out.println(N%10);
        System.out.printf("%02d %n",N%100);
        System.out.printf("%03d %n",N%1000);
        System.out.printf("%04d %n",N%10000);
        System.out.printf("%05d %n",N);
    }
}
Ejercicio 13:
Programa que pida por teclado la fecha de nacimiento de una persona (dia, mes, año) y calcule su número de la suerte.
El número de la suerte se calcula sumando el día, mes y año de la fecha de nacimiento y a continuación sumando las cifras obtenidas en la suma.
Por ejemplo:
Si la fecha de nacimiento es 12/07/1980 
Calculamos el número de la suerte así: 12+7+1980 = 1999  1+9+9+9 = 28
Número de la suerte: 28

/*
 * Programa que calcula el número de la suerte
 */
import java.util.Scanner;

public class Secuenciales2_13 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int dia, mes, año, suerte, suma, cifra1, cifra2, cifra3, cifra4;                                          
        System.out.println("Introduzca fecha de nacimiento");
        System.out.print("día: ");
        dia = sc.nextInt();
        System.out.print("mes: ");
        mes = sc.nextInt();
        System.out.print("año: ");
        año = sc.nextInt();
        suma = dia + mes + año;
        cifra1 = suma/1000;      //obtiene la primera cifra
        cifra2 = suma/100%10;    //obtiene la segunda cifra
        cifra3 = suma/10%10;     //obtiene la tercera cifra
        cifra4 = suma%10;        //obtiene la última cifra
        suerte = cifra1 + cifra2 + cifra3 + cifra4;
        System.out.println("Su número de la suerte es: " + suerte);                                               
    }
}

Java Ejercicios Básicos Resueltos 3

Ejercicios básicos Java con estructura secuencial

Relación Nº 3: Ejercicios 8, 9 y 10

Ejercicio 8:
Programa que tome como dato de entrada un número que corresponde a la longitud del radio una esfera y nos calcula y escribe el volumen de la esfera que se corresponden con dicho radio.

La fórmula para calcular el volumen de la esfera es
v = (4/3)*PI*r^3

/* 
 * Programa que calcula el volumen de una esfera
 */
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        double radio, volumen;
        System.out.print("Introduzca radio de la esfera: ");
        radio = sc.nextDouble();
        System.out.println("Volumen de la esfera de radio " + radio + " = " + (4.0/3)* Math.PI * Math.pow(radio, 3));  
    }
}
La operación para calcular el volumen es: (4.0/3)* Math.PI * Math.pow(radio, 3))

Debemos tener cuidado con la división entre números enteros. Si hacemos 4/3 nos da como resultado 1, por eso se debe escribir al menos uno de los dos números como double. En este caso se ha puesto el numerador como double simplemente escribiendo 4.0 y de esta forma el resultado de la división 4.0/3 será de tipo double.

Ejercicio 9:
Programa Java que calcule el área de un triángulo en función de las longitudes de sus lados (a, b, c), según la siguiente fórmula:  
Area = RaizCuadrada(p*(p-a)*(p-b)*(p-c))
donde p =  (a+b+c)/2
Para calcular la raíz cuadrada se utiliza el método Math.sqrt() 

/* 
 * Programa que calcule el área de un triángulo en función de las longitudes de sus lados (a, b, c)                    
 * según la siguiente fórmula: area=raiz2(p(p-a)(p-b)(p-c)) donde p = (a+b+c)/2
 */
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        double a,b,c,p;

        System.out.print("Introduzca longitud del primer lado del triángulo: ");
        a = sc.nextDouble();

        System.out.print("Introduzca longitud del segundo lado del triángulo: ");
        b = sc.nextDouble();

        System.out.print("Introduzca longitud del tercer lado del triángulo: ");
        c = sc.nextDouble();

        p = (a+b+c)/2;
        
        System.out.println("Area -> " +  Math.sqrt(p*(p-a)*(p-b)*(p-c)));
    }
}

Ejercicio 10:
Programa Java que lea un número entero de 3 cifras y muestre por separado las cifras del número.

/*
 * Programa que lea un número de 3 cifras y muestre por pantalla las cifras del número                                 
 */
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N;

        System.out.print("Introduzca valor de N: ");
        N = sc.nextInt(); //supondremos que el número introducido tiene 3 cifras
        
        System.out.println("Primera cifra de " + N + " -> " + (N/100));
        System.out.println("Cifra central de " + N + " -> " + (N/10)%10);
        System.out.println("Última cifra  de " + N + " -> " + (N%10));
        
    }  
}

Recuerda que la división entre enteros da como resultado la parte entera de la división (sin decimales). Si por ejemplo N = 123 la operación N/10 da como resultado 12 y no 12.3 
Recuerda que el operador % obtiene el resto de la división.