Programación procedimental

Entrada y salida

Expresiones y condicionales

Índice de masa corporal

 0 && masa <= 1000 && altura > 0 && altura <= 300 )
			{
				// Convertir la altura de centimetros a metros
				altura = altura / 100.0;
				// Calcular el indice de masa corporal
				double indiceMasaCorporal = masa / (altura * altura);
				// Imprimir el indice de masa corporal
				System.out.printf(" %5.2f ", indiceMasaCorporal);

                // Cacular el estado nutricional:
                // Si imc es menor que 18.5 entonces
                if ( indiceMasaCorporal < 18.5 )
                {
                    // el estado nutricional es infrapeso
                    System.out.print("underweight");
                }
                // De lo contrario
                // Si el imc es menor que 25 entonces
                else if ( indiceMasaCorporal < 25 )
                {
                    // el estado nutricional es normal
                    System.out.print("normal");
                }
                // De lo contrario si el imc es menor que 30 entonces
                else if ( indiceMasaCorporal < 30 )
                {
                    // el estado nutricional es sobrepeso
                    System.out.print("overweight");
                }
                // De lo contrario
                else
                {
                    // el estado nutricional es obesidad
                    System.out.print("obese");
                }

                // Imprimir el estado nutricional
                System.out.println();
			}
			// De lo contrario
            else
            {
				// Imprimir datos inválidos
                System.out.println(" invalid data");
            }
		}

		// Saber si los datos son validos:
			// Si masa es positiva y menor o igual a una tonelada y la altura es positiva y menor o igual que 300cm
				// Los datos son validos
			// De lo contrario
				// Los datos no son válidos

		// Calcular el indice de masa corporal:
			// Sea altura en metros la altura en centímetros dividido entre 100
			// Calcular el indice de masa corporal (imc) con la formula m/h^2

		// Cacular el estado nutricional:
			// Si imc es menor que 18.5 entonces
				// el estado nutricional es infrapeso
			// De lo contrario
				// Si el imc es menor que 25 entonces
					// el estado nutricional es normal
				// De lo contrario
					// Si el imc es menor que 30 entonces
						// el estado nutricional es sobrepeso
					// De lo contrario
						// el estado nutricional es obesidad

		// Close the standard input
		this.input.close();
	}
}
]]>
Lee masas y alturas. Imprime el índice de masa corporal y la categoría nutricional de acuerdo a la OMS. Obtener código fuente.

Subrutinas

Índice de masa corporal (con subrutinas)

 0 && masa <= 1000 && alturaEnCm > 0 && alturaEnCm <= 300;
	}

	// Calcular el estado nutricional:
	public String calcularEstadoNutricional(double indiceMasaCorporal)
	{
		// Si imc es menor que 18.5 entonces
		if ( indiceMasaCorporal < 18.5 )
		{
			// el estado nutricional es infrapeso
			return "underweight";
		}
		// De lo contrario si el imc es menor que 25 entonces
		else if ( indiceMasaCorporal < 25 )
		{
			// el estado nutricional es normal
			return "normal";
		}
		// De lo contrario si el imc es menor que 30 entonces
		else if ( indiceMasaCorporal < 30 )
		{
			// el estado nutricional es sobrepeso
			return "overweight";
		}
		// De lo contrario
		else
		{
			// el estado nutricional es obesidad
			return "obese";
		}
	}

	public double f(double x)
	{
		return 2.0 * x - 1.0;
	}

	public double g(double x)
	{
		return x * x - 2;
	}
	
	public void probar()
	{
		System.out.println( this.f(3) - f( this.g(-1) + 2 ) );

		if ( 0.1 + 0.2 == 0.3 )
			System.out.println(" 0.1 + 0.2 == 0.3 ");
		else
			System.out.println("Ay mama!");
	}
}
]]>
Igual al anterior, pero divide en subrutinas. Obtener código fuente.

Indirección, arreglos y matrices

Mediana estadística

Calcula la mediana de un conjunto de valores de tamaño conocido. Obtener código fuente.

¿Es permutación?

Lee un arreglo de textos y lo imprime. Obtener código fuente.

Leer e imprimir una matriz

Lee una matriz de caracteres y la imprime, útil para el problema del gato. Obtener código fuente.

Simulación: el bosque encantado

 0 || medianoche == Math.abs(medianoches) )
			{
				// Separar este bosque del anterior
				System.out.println();

				// Imprimir el bosque
				imprimirBosque(bosque, medianoche);
			}
		}
	}

	public char[][] aplicarReglas(char[][] bosqueDiaAnterior)
	{
		// Crear un bosque para el dia siguiente
		char[][] bosqueDiaSiguiente = new char[bosqueDiaAnterior.length][bosqueDiaAnterior[0].length];

		// Recorrer todas las celdas del bosque y actualizarlas
		for ( int fila = 0; fila < bosqueDiaAnterior.length; ++fila )
		{
			for ( int columna = 0; columna < bosqueDiaAnterior[fila].length; ++columna )
			{
				// Actualizar la celda en la nueva matriz aplicando las reglas
				aplicarReglas( fila, columna, bosqueDiaAnterior, bosqueDiaSiguiente );
			}
		}

		// Retornar una referencia al nuevo bosque
		return bosqueDiaSiguiente;
	}

	public void aplicarReglas( int fila, int columna, char[][] bosqueDiaAnterior, char[][] bosqueDiaSiguiente )
	{
		// Contar los vecinos de cada tipo
		int arboles = contarVecinos(fila, columna, bosqueDiaAnterior, 'a');
		int lagos = contarVecinos(fila, columna, bosqueDiaAnterior, 'l');

		// Aplicar la regla de inundacion
		if ( bosqueDiaAnterior[fila][columna] == 'a' && lagos >= 4 )
			bosqueDiaSiguiente[fila][columna] = 'l';
		// Aplicar la regla de sequia
		else if ( bosqueDiaAnterior[fila][columna] == 'l' && lagos < 3 )
			bosqueDiaSiguiente[fila][columna] = '-';
		// Aplicar la regla de refosteracion
		else if ( bosqueDiaAnterior[fila][columna] == '-' && arboles >= 3 )
			bosqueDiaSiguiente[fila][columna] = 'a';
		// Aplicar la regla de hacinamiento
		else if ( bosqueDiaAnterior[fila][columna] == 'a' && arboles > 4 )
			bosqueDiaSiguiente[fila][columna] = '-';
		// Aplicar la regla de estabilidad
		else
			bosqueDiaSiguiente[fila][columna] = bosqueDiaAnterior[fila][columna];
	}

	public int contarVecinos(int fila, int columna, char[][] bosque, char tipoVecino)
	{
		// Cuenta la cantidad de ocurrencias de tipoVecino
		int cantidad = 0;

		// Contar tipoVecino en las 8 celdas alrededor de bosque[fila][columna]
		if ( valorCelda(fila - 1, columna - 1, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila - 1, columna + 0, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila - 1, columna + 1, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila + 0, columna - 1, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila + 0, columna + 1, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila + 1, columna - 1, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila + 1, columna + 0, bosque) == tipoVecino ) ++cantidad;
		if ( valorCelda(fila + 1, columna + 1, bosque) == tipoVecino ) ++cantidad;

		return cantidad;
	}

	char valorCelda(int fila, int columna, char[][] bosque)
	{
		// Si la celda existe, retornar su valor
		if ( fila >= 0 && fila < bosque.length && columna >= 0 && columna < bosque[0].length )
			return bosque[fila][columna];

		// La celda no existe, retornar un valor no valido
		return '\0';
	}
}
]]>
Simula un bosque cambiando en el tiempo de acuerdo a reglas escogidas por un mago. Obtener código fuente.

Archivos: simulación con matrices

El siguiente programa debe invocarse desde la línea de comandos con al menos dos argumentos: el número de simulaciones y archivos de valores separados por comas tabuladores (CSV). Por ejemplo:

# Compilar el codigo fuente, genera Simulacion.class:
javac Simulacion.java

# Correr Simulacion.class con varios archivos:
java Simulacion 2000 Simulacion01.csv Simulacion02.csv

El código se creó utilizando el IDE llamado DrJava. Los comandos anteriores pueden escribirse en la pestaña interacciones.

= 2 )
            {
                long corridas = Long.parseLong( args[0] );
                for ( int indice = 1; indice < args.length; ++indice )
                    simular( corridas, args[indice] );
            }
            else
            {
                System.out.println("Uso: java Simulacion CORRIDAS ARCHIVOS");
            }
        }
        catch ( java.io.FileNotFoundException excepcion )
        {
            System.err.println( excepcion );
        }
    }
    
    public void simular(long corridas, String nombreArchivo) throws java.io.FileNotFoundException
    {
        // this.input = new Scanner( new File("Simulacion01.csv") );
        this.input = new Scanner( new File(nombreArchivo) );
        String nombreArchivoSalida = nombreArchivo.replace(".csv", "-" + corridas + ".csv");
        this.output = new PrintWriter( new File(nombreArchivoSalida) );
        System.out.printf("Simulando %d corridas de %s en %s...%n", corridas, nombreArchivo, nombreArchivoSalida);
        
        double[][] matriz = leerMatriz();
        
        imprimirMatriz(matriz);
        
        // Close the standard input
        this.input.close();
        this.output.close();
    }
    
    public double[][] leerMatriz()
    {
        //this.input.useDelimiter("[\\t\\n]+");
        
        int filas = this.input.nextInt();
        int columnas = this.input.nextInt();
        
        double[][] matriz = new double[filas][columnas];
        
        for ( int fila = 0; fila < matriz.length; ++fila )
        {
            for ( int columna = 0; columna < matriz[fila].length; ++columna )
            {
                matriz[fila][columna] = this.input.nextDouble();
            }
        }
        
        return matriz;
    }
    
    public void imprimirMatriz(double[][] matriz)
    {
        for ( int fila = 0; fila < matriz.length; ++fila )
        {
            for ( int columna = 0; columna < matriz[fila].length; ++columna )
            {
                this.output.printf("%.2f\t", matriz[fila][columna]);
            }
            
            this.output.println();
        }
    }
}
]]>
Simula corridas en archivos CSV. Obtener código fuente.

Programación orientada a objetos

Enteros de precisión arbitraria


    
    /**
     * Run the solution. This method is called from main()
     */
    public void probarMultiplicacion()
    {
        // Create object to read data from standard input
        this.input = new Scanner(System.in);
        
        System.out.print("Numero 1: ");
        BigInteger numero1 = this.input.nextBigInteger();

        System.out.print("Numero 2: ");
        BigInteger numero2 = this.input.nextBigInteger();
        
        BigInteger result = numero1.multiply(numero2);
        
        System.out.printf("%d * %d == %d%n", numero1, numero2, result);
        
        // Close the standard input
        this.input.close();
    }
    
// 
}
]]>
Ejemplo de multiplicaciones con BigInteger. Obtener código fuente.

Calculadora fraccional


    
    /**
     * Run the solution. This method is called from main()
     */
    public void run()
    {
/*        int x = 18, y = -27;
        long mcd = Fraccion.maximoComunDivisor(x, y);
        System.out.println(mcd);
*/
        // Create object to read data from standard input
        this.input = new Scanner(System.in);
        
            
        Fraccion fraccion1 = new Fraccion();
        System.out.print("Fraccion 1: ");
        fraccion1.leer(input);
        // fraccion1.simplificar(); ERROR: violacion de encapsulacion
        
        Fraccion fraccion2 = new Fraccion();
        System.out.print("Fraccion 2: ");
        fraccion2.leer(input);

        // fraccion1 + fraccion2
        Fraccion resultado = fraccion1.sumar(fraccion2);
        
        fraccion1.imprimir();
        System.out.print(" + ");
        fraccion2.imprimir();
        System.out.print(" = ");
        resultado.imprimir();
        System.out.println();
        
        resultado = fraccion1.restar(fraccion2);
        fraccion1.imprimir();
        System.out.print(" - ");
        fraccion2.imprimir();
        System.out.print(" = ");
        resultado.imprimir();
        System.out.println();

        // Close the standard input
        this.input.close();
    }
    
// 
}
]]>
Clase que representa la calculadora fraccional. Obtener código fuente.
Representa una fraccion. Obtener código fuente.

Tienda de artículos de playa

Enunciado del problema: Examen03 (2017a).

Con tres sucursales

datos1.txt: caso de prueba de ejemplo. Obtener código fuente.
= 8 && mes <= 11 ) )
		{
			// un cierre de caja en temporada baja
			this.sumaBaja += cierreCaja;
			++this.vecesBaja;
		}
		else
		{
			// un cierre de caja en temporada alta
			this.sumaAlta += cierreCaja;
			++this.vecesAlta;
		}
	}

	public void imprimirEstadisticas()
	{
		// Carrillo			  20,745.00			0.00
		System.out.printf("%-15s %,15.2f %,15.2f%n"
			, this.ubicacion, this.promedioBaja(), this.promedioAlta());
	}

	public double promedioBaja()
	{
		if ( vecesBaja == 0 )
			return 0.0;
		else
			return this.sumaBaja / this.vecesBaja;
	}

	public double promedioAlta()
	{
		if ( vecesAlta == 0 )
			return 0.0;
		else
			return this.sumaAlta / this.vecesAlta;
	}
}
]]>
Calcula los promedios de ventas con las tres sucursales originales (en el enunciado del problema). Obtener código fuente.

Con N sucursales

datos2.csv: caso de prueba con 4 sucursales (aunque se reportaron 5). Obtener código fuente.
= 8 && mes <= 11 ) )
		{
			// un cierre de caja en temporada baja
			this.sumaBaja += cierreCaja;
			++this.vecesBaja;
		}
		else
		{
			// un cierre de caja en temporada alta
			this.sumaAlta += cierreCaja;
			++this.vecesAlta;
		}
	}

	public void imprimirEstadisticas()
	{
		// Carrillo			  20,745.00			0.00
		if ( this.ubicacion != null )
		{
			System.out.printf("%-15s %,15.2f %,15.2f%n"
				, this.ubicacion, this.promedioBaja(), this.promedioAlta());
		}
	}

	public double promedioBaja()
	{
		if ( vecesBaja == 0 )
			return 0.0;
		else
			return this.sumaBaja / this.vecesBaja;
	}

	public double promedioAlta()
	{
		if ( vecesAlta == 0 )
			return 0.0;
		else
			return this.sumaAlta / this.vecesAlta;
	}
}
]]>
Calcula los promedios de ventas una cantidad arbitraria de sucursales. Obtener código fuente.