Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aprenda Java - Raul Oramas
Aprenda Java - Raul Oramas
Aprenda Java.
ISC Ral Oramas Bustillos.
roramas@gmail.com
Este obra est bajo una Licencia Creative Commons Atribucin-NoComercial 2.5 Mxico.
1
Aprenda Java
En este curso se estudian los fundamentos de programacin con Java a travs de ejemplos
prcticos. Con este curso aprenders las habilidades necesarias para desarrollar
aplicaciones a un nivel bsico-intermedio utilizando el lenguaje de programacin Java SE
(Standard Edition), versin 7.
Audiencia.
Requisitos.
Ninguna, ya que en este curso iniciamos desde los fundamentos bsicos del lenguaje.
2
Aprenda Java
Tabla de contenidos:
1. Introduccin a Java.........................................................................................................5
1.1. El lenguaje Java......................................................................................................5
1.2. Etapas de desarrollo de un programa en Java.......................................................5
1.3. Software para el desarrollo de programas en Java................................................6
1.4. Estructura bsica de un programa en Java............................................................6
1.5. Instrucciones bsicas para imprimir texto...............................................................8
2. Programas simples.......................................................................................................11
2.1. Escribir un programa simple..................................................................................11
2.2. Leer datos desde el teclado..................................................................................12
2.3. Identificadores.......................................................................................................15
2.4. Variables................................................................................................................16
2.5. Operador de asignacin y expresin de asignacin.............................................18
2.6. Constantes con nombre........................................................................................19
2.7. Tipos de datos primitivos.......................................................................................21
2.8. Operadores aritmticos.........................................................................................22
2.9. Literales en Java...................................................................................................24
2.10. La evaluacin de expresiones en Java...............................................................25
2.11. Operadores abreviados de incremento/decremento...........................................26
2.12. Conversin de tipo (type casting)........................................................................28
2.13. Ejercicios resueltos..............................................................................................31
3. Instrucciones de seleccin...........................................................................................42
3.1. Tipo de dato boolean.............................................................................................42
3.2. Operadores relacionales y de igualdad.................................................................42
3.3. La instruccin if simple..........................................................................................43
3.4. La instruccin if/else..............................................................................................46
3.5. Instrucciones if anidadas.......................................................................................49
3.6. La instruccin if/else/if...........................................................................................52
3.7. Operadores lgicos...............................................................................................54
3.8. El operador condicional (?:)...................................................................................58
3.9. La instruccin switch.............................................................................................59
3.10. Ejercicios resueltos..............................................................................................62
4. Instrucciones de repeticin...........................................................................................73
4.1. Instruccin de repeticin while..............................................................................73
4.2. Ciclos controlados por un valor centinela.............................................................76
4.3. Ciclos infinitos........................................................................................................78
4.4. Instruccin de repeticin do/while.........................................................................79
4.5. Instruccin de repeticin for...................................................................................80
4.6. Ciclos anidados.....................................................................................................82
4.7. Instruccin break y continue..................................................................................83
4.8. Ejercicios resueltos................................................................................................86
5. Utilizacin de mtodos pre-construidos.......................................................................95
3
Aprenda Java
4
Aprenda Java
1. Introduccin a Java.
Al finalizar esta leccin, sers capaz de:
En aos recientes la tecnologa de Java fue adquirida por la empresa Oracle (famosa por
su programa administrador de base de datos del mismo nombre).
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Para desarrollar un programa en Java tenemos que pasar por las siguientes etapas: edicin,
compilacin y ejecucin.
En la etapa de edicin, se escriben las instrucciones del programa usando el lenguaje Java y
se guarda en un archivo cuyo nombre debe terminar con la extensin .java. As, por
ejemplo, el archivo podra llamarse Saludo.java. A este programa escrito en Java se
denomina cdigo fuente y para escribirlo se puede recurrir a cualquier editor de texto.
5
Aprenda Java
hace que los programas Java puedan ser ejecutados en cualquier mquina que disponga de
una JVM. Actualmente, existe una JVM para la mayor parte de las plataformas, lo que
garantiza que los programas Java sean ampliamente portables.
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Tambin necesitaremos un entorno de desarrollo integrado (IDE por sus siglas en ingls).
Entre los ms populares tenemos:
NetBeans: www.netbeans.og
Eclipse: www.eclipse.org
BlueJ: www.bluej.org.
Todo programa en Java consiste de, cuando menos una declaracin de clase: public
class HolaMundo. La palabra clave class introduce una declaracin de clase, la cual
debe ir seguida por el nombre de la clase.
Las palabras clave o palabras reservadas se reservan para uso exclusivo de Java y
siempre se escriben en minscula. El nombre de una clase es un identificador. Un
identificador es una serie de caracteres que pueden ser letras, dgitos, guiones bajos (_) y
signos de moneda ($) que no comience con un dgito ni tenga espacios.
Cada clase comienza con la palabra clave public. Al guardar este cdigo, el nombre de
ese archivo debe coincidir con el nombre de la clase. Por ejemplo: HolaMundo.java
Una llave izquierda {, comienza con el cuerpo de todas las declaraciones de clases. Su
correspondiente llave derecha }, debe terminar con la declaracin de una clase. A las llaves
{ y } se les conoce como bloque. Un bloque puede contener o anidar otros bloques.
6
Aprenda Java
Todo programa en Java debe de contener un mtodo principal al que se le denomina main.
Se dice entonces que una aplicacin en Java es un programa que contiene el mtodo main.
El programa siguiente, HolaMundo.java incorpora la definicin del mtodo main.
El mtodo main es el punto de inicio de toda aplicacin en Java. Los parntesis despus
del identificador main indican que este es un mtodo. La palabra clave void indica que
este mtodo realizar una tarea, pero no devolver ningn tipo de informacin cuando
complete su tarea. Las palabras String[] args entre parntesis son una parte requerida
de la declaracin del mtodo main.
Ya que tenemos la estructura bsica para crear aplicaciones en Java lo nico que falta es
agregar instrucciones para que el programa realice una o ms acciones. El programa
siguiente, HolaMundo.java, imprime un mensaje de texto en la consola de salida.
/*
Programa: HolaMundo.java
Propsito: Imprimir un mensaje en la consola de salida.
*/
public class HolaMundo {
// el mtodo main inicia la ejecucin del programa
public static void main(String[] args) {
System.out.println("Hola Mundo!");
} // fin del mtodo main
} // fin de la clase HolaMundo
7
Aprenda Java
Al escribir los primeros programas en Java es comn cometer errores de sintaxis. Un error
de sintaxis es una violacin a las reglas del lenguaje. El programa siguiente,
HolaMundo.java, tiene errores de sintaxis por lo tanto no funcionar hasta que esos errores
hayan sido identificados y corregidos.
Para hacer que un programa imprima una lnea de texto necesitamos utilizar el mtodo
println/print de System.out y pasarle como argumento entre comillas dobles el texto
que queremos desplegar en la pantalla de la computadora. El programa siguiente,
Saludo.java utiliza instrucciones print/println para mostrar texto.
El mtodo print y println se utilizan para mostrar texto. La diferencia es que println da
un salto de lnea.
Las cadenas pueden incluir caracteres especiales como el de una nueva lnea para indicarle
a los mtodos print y println de System.out cundo deben colocar el cursor de salida al
8
Aprenda Java
La barra diagonal inversa (\) se conoce como carcter de escape. Este carcter indica a
los mtodos print y println que se va a imprimir un carcter especial. A este carcter se
le conoce como secuencia de escape. La secuencia de escape \n representa el carcter
de una nueva lnea. Veamos otro ejemplo, el programa siguiente, ImprimirTexto.java,
muestra algunas secuencias de escape comunes.
En este curso vamos a utilizar frecuentemente la instruccin printf para dar formato al
texto. El programa siguiente, Bienvenido.java, utiliza el mtodo printf.
9
Aprenda Java
argumento del mtodo printf es una cadena de formato que puede consistir en texto fijo
y especificadores de formato. Cada especificador de formato es un receptculo para un
valor, y especifica el tipo de datos a imprimir. Los especificadores de formato empiezan con
un signo porcentual (%) y van seguidos de un carcter que representa el tipo de datos. El
especificador de formato %s es un receptculo para una cadena. La cadena de formato
especifica que printf debe imprimir dos cadenas, y que cada cadena le debe seguir un
carcter de nueva lnea.
10
Aprenda Java
2. Programas simples.
Al finalizar esta leccin, sers capaz de:
Escribir programas simples en Java que reciban valores desde el teclado y realicen
clculos aritmticos.
// calcula el rea
area = radio * radio * 3.14159;
// imprime el resultado
System.out.println( "El rea del crculo es: " + area );
Una variable es el nombre de una posicin de memoria que puede guardar un valor
especfico. Una declaracin de variable indica al compilador cul es su nombre y su tipo.
El tipo de una variable indica la clase de valor que sta puede almacenar, as como las
operaciones que se puede hacer con ella. Para asignar un valor a una variable se usa el
operador de asignacin, que es el signo igual (=).
11
Aprenda Java
Para emplear el valor de las variables basta con hacer referencia al nombre de stas dentro
del cdigo del programa. Para hacer operaciones matemticas se utilizan los operadores
aritmticos (+ - * / %).
Una expresin aritmtica es un clculo que produce un valor y est compuesta por
operadores aritmticos y operandos. El programa siguiente, DobleNumero.java, utiliza una
expresin aritmtica para calcular el doble de un nmero.
// proceso
int doble = numero * 2; // realiza el clculo
// salida
System.out.printf("El doble de %d es %d\n", numero, doble);
} // fin del mtodo main
} // fin de la clase DobleNumero
Todas las variables deben declararse con un nombre y un tipo antes de poder usarse. No se
puede utilizar una variable si no tiene un valor asignado. Intentar utilizar una variable sin un
valor asignado genera un error en tiempo de compilacin.
Los tipos de variables como int o double se conocen como tipos primitivos o tipos
integrados. Los nombres de los tipos primitivos son palabras clave y, por lo tanto, deben
escribirse en minsculas.
Java proporciona una clase pre-compilada llamada Scanner, que permite obtener entradas
desde el teclado. Dado que la clase Scanner no es parte del conjunto fundamental de las
clases de Java necesitamos indicarle al compilador donde encontrarla. El programa
siguiente, AreaCirculo.java es nos permitir leer datos desde el teclado y calcular el rea
de un crculo.
12
Aprenda Java
// declaracin de variables
double radio;
double area;
// mensaje de usuario
System.out.println("Calcula el rea de un crculo.");
System.out.println("------------------------------");
// calcula el rea
area = radio * radio * 3.14159;
// imprime el resultado
System.out.printf("El rea del crculo es: %f", area);
} // fin del mtodo main
} // fin de la clase AreaCirculo
Para continuar aprendiendo programacin con Java, veamos un par de ejemplos que nos
permitan trabajar con variables enteras y de punto flotante. En primer lugar vamos a escribir
un programa que nos permita leer del teclado dos nmeros enteros, calcular la suma e
imprimir el resultado en la consola de salida.
13
Aprenda Java
// declaracin de variables
int numero1; // primer nmero a sumar
int numero2; // segundo nmero a sumar
int suma; // almacena la suma de numero1 + numero2
// mensaje de usuario
System.out.println("Programa que suma dos nmeros enteros.");
System.out.println("--------------------------------------");
// entrada
System.out.print("Primer nmero a sumar? "); // indicador
numero1 = entrada.nextInt(); // lee el primer nmero
System.out.print("Segundo nmero a sumar? "); // indicador
numero2 = entrada.nextInt(); // lee el segundo nmero
// proceso
suma = numero1 + numero2; // suma los nmeros
// salida
System.out.printf("La suma es %d\n", suma); // imprime la suma
} // fin del mtodo main
} // fin de la clase Suma
// mensaje de usuario
System.out.println("Programa que multiplica dos nmeros.");
System.out.println("------------------------------------");
// entrada
System.out.print("Primer nmero? "); // indicador
14
Aprenda Java
// proceso
float producto = numero1 * numero2;
// salida
System.out.printf("%.2f x %.2f = %.2f\n",
numero1, numero2, producto);
} // fin del mtodo main
} // fin de la clase Producto
2.3. Identificadores.
Los identificadores deben estar formados enteramente por letras, dgitos y caracteres como
signos de moneda ($) y/o guin bajo (_). El primer carcter no debe ser un nmero. Si un
identificador no sigue estas reglas, el programa no compilar.
15
Aprenda Java
Para terminar con el tema de los identificadores: recuerda que Java es case-sensitive, es
decir hace distincin entre minsculas y maysculas. El programa siguiente,
CaseSensitive.java, demuestra lo mencionado anteriormente.
2.4. Variables.
Una variable en Java puede almacenar slo un tipo de valor. Por ejemplo, una variable de
tipo entero slo puede almacenar valores enteros y no valores en punto flotante. El
programa siguiente, Variable.java, utiliza variables para guardar y manipular datos.
16
Aprenda Java
// asignacin incorrecta
// edad = 18.50; //los tipos no coinciden
// la variable aumento no tiene un tipo
// aumento = 1500.0; //error de sintaxis
// declaracin de una variable
int x;
// la variable x no tiene un valor inicial
// x = x + 1; //error de sintaxis
} // fin del mtodo main
} // fin de la clase Variable
Los nombres de variables son identificadores. En Java, los nmeros no tienen comas.
Java utiliza el signo igual (=) para las instrucciones de asignacin. Una instruccin de
asignacin pone un valor dentro de una variable.
Veamos un ejemplo que nos permita practicar con todos los conceptos estudiados hasta el
momento. El programa siguiente, Numero234.java, calcula el doble, triple, cudruple de un
nmero.
// declaracin de variables
int numero, doble, triple, cuadruple;
// mensaje de usuario
System.out.println(
"Calcula el doble, tripe y cudruple de un nmero.");
System.out.println(
"-------------------------------------------------");
// entrada
System.out.print("Nmero? "); // indicador
numero = entrada.nextInt(); // lee el nmero
17
Aprenda Java
// proceso
doble = numero * 2;
triple = numero * 3;
cuadruple = numero * 4;
// salida
System.out.printf(
"El doble, triple y cudruple de %d es %d, %d y %d\n",
numero, doble, triple, cuadruple);
} // fin del mtodo main
} // fin de la clase Numero234
Al declarar una variable no olvidar poner el punto y coma al final. Al declarar ms de una
variable en una sola instruccin, es importante no olvidar separar las variables por comas.
Antes de usar una variable, es necesario declararla y asignarle un valor utilizando el signo
igual (=). El programa siguiente, CalculoSimple.java, realiza clculos simples utilizando
expresiones.
x = x + 1;
z = z + x * 2 / 4 - 5;
System.out.println(x);
System.out.println(z);
// esto es un error
// 1 = x;
// z + 1 = x + 1;
// x = 1.0; //asignacin ilegal de tipo
// x = x / 0; //divisin por cero
} // fin del mtodo main
} // fin de la clase CalculoSimple
18
Aprenda Java
// declaracin de variables
double area; // almacena el rea del tringulo
double base; // la base del tringulo
double altura; // la altura del tringulo
// mensaje de usuario
System.out.println("rea de un tringulo.");
System.out.println("---------------------");
// entrada
System.out.print("Base? "); // indicador
base = entrada.nextDouble(); // lee la base
System.out.print("Altura? "); // indicador
altura = entrada.nextDouble(); // lee la altura
// proceso
area = (base * altura) / 2.0; // calcula el rea
// salida
System.out.printf("El rea es %.2f\n", area);
} // fin del mtodo main
} // fin de la clase AreaTriangulo
Si queremos que un valor permanezca fijo, entonces debemos de utilizar una constante.
Una constante se declara en forma similar a una variable, pero aadiendo la palabra clave
final. El programa siguiente, AreaCirculo.java, define una constante con nombre para
calcular el rea de un crculo.
19
Aprenda Java
// declaracin de variables
double radio, area;
// mensaje de usuario
System.out.println("Calcula el rea de un crculo.");
System.out.println("------------------------------");
// calcula el rea
area = radio * radio * PI;
// imprime el resultado
System.out.printf("El rea del crculo es: %.2f", area);
} // fin del mtodo main
} // fin de la clase AreaCirculo
En una constante solamente se deben usar letras maysculas y subrayado. La palabra clave
final es un modificador y le indica a la computadora que genere un error si el programa
intenta cambiar el valor de la variable final en un momento posterior. Las constantes con
nombre hace ms fcil la documentacin del cdigo.
Veamos otro ejemplo para practicar con este concepto. El programa siguiente,
PieMetro.java, lee un nmero de pies y lo convierte a metros.
// entrada
System.out.print("Introduce un valor en pies? ");
double nPies = entrada.nextDouble();
// proceso
20
Aprenda Java
// salida
System.out.printf("%.2f pies son %.2f metros", nPies, metros);
} // fin del mtodo main
} // fin de la clase PieMetro
Hay seis tipos de datos numricos en Java: byte, short, int, long, float y double. Los
cuatro primeros se utilizan para almacenar nmeros enteros y los dos ltimos para
almacenar nmeros en punto flotante. La diferencia entre estos seis tipos de datos
numricos es principalmente el rango de valores que pueden representar.
Se dice que un tipo de datos con un rango variable ms grande tiene mayor precisin. Por
ejemplo el tipo double tiene una precisin mayor que el tipo de datos float.
En Java tambin se utiliza el tipo de dato char as como el boolean. El programa siguiente,
TipoPrimitivo.java, muestra los ocho tipos de datos primitivos en Java.
// punto flotante
float salario = 3850.0f; // 32 bits
// asignacin ilegal
// float salario = 3850.00; //3850.00 est en 64 bits
double granTotal = 125000.50; // 64 bits -->por default
// tipo carcter
char letra = 'A'; // 16 bits UNICODE
// asignacin ilegal
// char letra = "A"; //String->comillas dobles
// tipo boolean
boolean tengoPerro = false; // valores: true/false
21
Aprenda Java
Los tipos de variables definen un conjunto de valores que pueden tomar las variables. Al
asignar a una variable un valor que rebasa sus lmites, ocurre un error de desbordamiento.
La computadora tiene que representar los nmeros mediante una cantidad fija de unos y
ceros. En muchos casos, la computadora puede representar los nmeros con exactitud;
pero en otros, la representacin del nmero es slo cercana, no exacta. El programa
siguiente, Precisin.java, muestra lo que sucede con la aproximacin de punto flotante.
//imprime 0.89999999999999999
System.out.println( 2.0 - 1.1 );
//error de redondedo
System.out.println( 100 * 4.35 );
} //fin del mtodo main
} //fin de la clase Precision
Los operadores aritmticos pueden utilizarse con los tipos enteros y en punto flotante. Lo
que debemos de tener en cuenta es que si los operandos son enteros, el resultado es un
entero y si alguno de ellos est en punto flotante, el resultado se expresa en punto flotante.
El programa siguiente, CalculadoraSimple.java, muestra los operadores aritmticos en
Java.
22
Aprenda Java
// mensaje de usuario
System.out.println("Calculadora Java.");
System.out.println("-----------------");
// entrada
System.out.print( "Introduce un nmero? " );
int num1 = entrada.nextInt();
// proceso
int div1 = num1 / num2;
int mod1 = num1 % num2;
// salida
System.out.println(div1);
System.out.println(mod1);
23
Aprenda Java
System.out.println(div2);
System.out.println(mod2);
} // fin del mtodo main
} // fin de la clase Division
// entrada
System.out.print("Introduce un nmero entre 0 y 1000? ");
numero = entrada.nextInt();
// proceso
temporal = numero;
unidad = temporal % 10;
temporal = temporal / 10;
decena = temporal % 10;
temporal = temporal / 10;
centena = temporal % 10;
suma = unidad + decena + centena;
// salida
System.out.printf("La suma de los dgitos de %d es %d ",
numero, suma);
} // fin del mtodo main
} // fin de la clase SumaDigitos
24
Aprenda Java
//Expresin aritmtica.
public class Expresion {
public static void main(String[] args) {
int resultado = 14 + 8 / 2; // expresin aritmtica
System.out.println(resultado);
resultado = (14 + 8) / 2;
System.out.println(resultado);
resultado = 14 + (8 / 2);
System.out.println(resultado);
} // fin del mtodo main
} // fin de la clase Expresion
25
Aprenda Java
// mensaje de usuario
System.out.println("Promedio de tres calificaciones.");
System.out.println("--------------------------------");
x += 3; // x = x + 3;
System.out.println("x = " + x);
x -= 3; // x = x 3;
System.out.println("x = " + x);
x *= 2; // x = x * 2
System.out.println("x = " + x);
x /= 2; // x = x / 2
System.out.println("x = " + x);
} // fin del mtodo main
} // fin de la clase OpAbreviado
Los operadores abreviados son los siguientes: +=, -=, *=, /= y %= y permiten simplificar
la escritura de expresiones en Java. No hay espacios entre los operadores abreviados. Por
ejemplo: + = debe escribirse como +=.
26
Aprenda Java
//Operadores de incremento/decremento.
public class IncrementoDecremento {
public static void main(String[] args) {
int x = 0, y = 0;
x++; // x = x + 1;
x--; // x = x - 1;
// a tener en cuenta
// int i = 10;
// int num = 10 * i++;
// es lo mismo que
// int num = 10 * i;
// i = i + 1;
// a tener en cuenta
// int i = 10;
// int num = 10 * (++i);
// es lo mismo que
// i = i + 1;
// int num = 10 * i;
} // fin del mtodo main
} // fin de la clase IncrementoDecremento
27
Aprenda Java
Cuando una expresin aritmtica est formada por variables y constantes del mismo tipo,
el resultado se expresa en ese mismo tipo de dato.
Cuando los tipos de datos de las variables y constantes en una expresin aritmtica son
distintos, es necesario llevar a cabo una conversin. Una conversin de tipo es un proceso
que convierte el valor de un tipo de datos a otro tipo de datos. Hay dos conversiones
posibles en Java: implcitas y explcitas. Una conversin implcita, denominada
promocin numrica, se aplica a todos los operandos de un operador aritmtico. Esta
conversin se denomina promocin porque el operando se convierte de menor a mayor
precisin.
System.out.println(distancia);
System.out.println(aumento);
System.out.println(cubo);
System.out.println(raiz);
} // fin del mtodo main
} // fin de la clase Conversion
28
Aprenda Java
// declaracin de variables
float sueldoBase; // sueldo del trabajador
float ventas; // ventas realizadas por el trabajador
float comision; // la comisin por las ventas realizadas
float sueldoTotal; // el sueldo total
// mensaje de usuario
System.out.println("Calcula el sueldo de un trabajador.");
System.out.println("-----------------------------------");
// entrada
System.out.print("Sueldo base? "); // indicador
sueldoBase = entrada.nextFloat(); // lee el sueldo base
System.out.print("Ventas realizadas? "); // indicador
ventas = entrada.nextFloat(); // las ventas realizadas
// proceso
// comision = ventas * 0.10; //perdida de precisin
// comision = ventas * 0.10F; //ok
comision = (float) (ventas * 0.10); // casting
sueldoTotal = sueldoBase + comision;
// salida
System.out.printf("Sueldo base $%.2f\n", sueldoBase);
System.out.printf("Comisin $%.2f\n", comision);
System.out.printf("Sueldo total $%.2f\n", sueldoTotal);
} // fin del mtodo main
} // fin de la clase Sueldo
29
Aprenda Java
// mensaje de usuario
System.out.println("Calcula el volumen de un cilindro.");
System.out.println("----------------------------------");
// mensaje de usuario
System.out.println("Hipotenusa de un tringulo rectngulo.");
System.out.println("--------------------------------------");
30
Aprenda Java
+ Math.pow(catetoB, 2));
// imprime el resultado
System.out.printf("La hipotenusa es: %d", hipotenusa);
} // fin del mtodo main
} // fin de la clase Hipotenusa
Una vez que tenemos la idea de como resolver el problema, lo siguiente es codificar el
programa, compilar, corregir los errores de sintaxis y verificar que nuestro programa produce
los resultados adecuados. Finalmente, hay que documentar el programa.
Para empezar nuestro proceso de aprendizaje con Java, podemos seguir las siguientes
etapas:
Declarar de variables.
Entrada/Lectura de los datos.
Proceso de clculo (una o ms frmulas).
Salida/Impresin de resultados.
Nota: los problemas que se resuelven aqu no tienen una solucin nica.
Problema 1.
Escribir un programa que permita convertir una cantidad dada en metros a sus equivalentes
en centmetros, pulgadas, pies y yardas. Considera la siguiente informacin:
31
Aprenda Java
// declaracin de variables
double nMetros, pie, pulgada, yarda, centimetro;
// entrada
System.out.println("Cantidad de metros? ");
nMetros = entrada.nextDouble();
// proceso de conversin
centimetro = nMetros * 100;
pulgada = centimetro / 2.54;
pie = pulgada / 12;
yarda = pie / 3;
// salida de resultados
System.out.printf("%.2f metros equivalen a:\n\n", nMetros);
System.out.printf("%.2f centmetros\n", centimetro);
System.out.printf("%.2f pulgadas\n", pulgada);
System.out.printf("%.2f pies\n", pie);
System.out.printf("%.2f yardas\n", yarda);
} // fin del mtodo main
} // fin de la clase Metro
Problema 2.
Linus Torvalds, Miguel de Icaza y James Gosling aportan cantidades de dinero para formar
una empresa de tecnologas avanzadas. Escribe un programa que determine el capital
formado y el porcentaje de dicho capital que aporta cada uno de los inversionistas.
// declaracin de variables
float dineroTorvalds = 0.0f;
float dineroIcaza = 0.0f;
float dineroGosling = 0.0f;
32
Aprenda Java
System.out.println("Capital invertido.");
System.out.println("------------------");
// entrada de datos
System.out.println("Introduce las tres cantidades:");
System.out.print("Linus Torvalds $");
dineroTorvalds = entrada.nextFloat();
System.out.print("Miguel de Icaza $");
dineroIcaza = entrada.nextFloat();
System.out.print("James Gosling $");
dineroGosling = entrada.nextFloat();
// salida de resultados
System.out.printf("Total de capital a invertir: $%.2f\n",
capital);
System.out.printf("Linus Torvalds tiene el %.2f porciento\n",
porcentajeTorvalds);
System.out.printf("Miguel de Icaza tiene el %.2f porciento\n",
porcentajeIcaza);
System.out.printf("James Gosling tiene el %.2f porciento\n",
porcentajeGosling);
} // fin del mtodo main
} // fin de la clase Inversion
Problema 3.
Se usa una cantidad conocida como ndice de masa corporal (IMC)para calcular el riesgo de
los problemas de salud relacionados con el peso. El IMC se calcula como la frmula
w
IMC=
( h/100)2
en donde w es el peso en kilogramos y h es la altura en centmetros. Un IMC de 20 a 25 se
33
Aprenda Java
considera normal. Escribe un programa que acepte el peso y la altura (ambos en nmeros
enteros) y produzca el IMC.
// entrada
System.out.print("Introduce el peso(kilos) y altura(cms): ");
pesoCorporal = entrada.nextInt();
altura = entrada.nextInt();
// proceso
imc = pesoCorporal / Math.pow(altura / 100.0, 2);
// salida
System.out.printf("El ndice de masa corporal es %.2f\n", imc);
} // fin del mtodo main
} // fin de la clase IndiceMasaCorporal
Problema 4.
d= (( X 1X 2 )2+ (Y 1 Y 2)2 )
// entrada
34
Aprenda Java
// proceso
double d = Math.sqrt(Math.pow((x1 - x2), 2)
+ Math.pow((y1 - y2), 2));
// salida
System.out.printf(
"La distancia entre los dos puntos es %.2f\n", d);
} // fin del mtodo main
} // fin de la clase Distancia
Problema 5.
// variables
double pesoCorporal;
35
Aprenda Java
// entrada
System.out.print("Peso corporal (kgs)? ");
pesoCorporal = entrada.nextDouble();
// proceso
pesoMercurio = pesoCorporal * PESO_MERCURIO;
pesoVenus = pesoCorporal * PESO_VENUS;
pesoJupiter = pesoCorporal * PESO_JUPITER;
pesoSaturno = pesoCorporal * PESO_SATURNO;
// salida
System.out.printf("En la Tierra pesas: %.2f kgs.\n",
pesoCorporal);
System.out.printf("En Mercurio pesas: %.2f kgs.\n",
pesoMercurio);
System.out.printf("En Venus pesas: %.2f kgs.\n", pesoVenus);
System.out.printf("En Jpiter pesas: %.2f kgs.\n",
pesoJupiter);
System.out.printf("En Saturno pesas: %.2f kgs.\n",
pesoSaturno);
} // fin del mtodo main
} // fin de la clase PesoPlanetas
Problema 6.
Cuando usted dice que tiene 18 aos, est diciendo realmente que la Tierra ha dado 18
vueltas al Sol. Puesto que a otros planetas les cuesta ms o menos das que a la Tierra dar
una vuelta alrededor del Sol, su edad sera distinta en otros planetas.
Se puede calcular lo viejo que usted sera en otros planetas mediante la frmula: y = (x *
365) /d, donde x es la edad de la Tierra, y es la edad en otro planeta, y d es el nmero de
das de la Tierra que el planeta y viaja alrededor del Sol.
Escribe una aplicacin que reciba como entrada la edad del usuario en la Tierra e imprima su
edad en Mercurio, Venus, Jpiter y Saturno. Los valores para d en esos planetas se dan en
la tabla siguiente:
36
Aprenda Java
// variables
int edad, diasTerrestres;
int edadMercurio, edadVenus, edadJupiter, edadSaturno;
// entrada
System.out.print("Edad? ");
edad = entrada.nextInt();
// proceso
diasTerrestres = edad * DIAS_AO;
edadMercurio = diasTerrestres / DIAS_MERCURIO;
edadVenus = diasTerrestres / DIAS_VENUS;
edadJupiter = diasTerrestres / DIAS_JUPITER;
edadSaturno = diasTerrestres / DIAS_SATURNO;
// salida
System.out.printf("Edad en la Tierra: %d\n", edad);
System.out.printf("Edad en Mercurio: %d\n", edadMercurio);
System.out.printf("Edad en Venus: %d\n", edadVenus);
System.out.printf("Edad en Jpiter: %d\n", edadJupiter);
System.out.printf("Edad en Saturno: %d\n", edadSaturno);
} // fin del mtodo main
} // fin de la clase EdadPlanetas
37
Aprenda Java
Problema 7.
// variables
int hora, minuto, segundo;
int nSegundos;
// lectura
System.out.print(
"Introduce una hora, mins y segs (ejemplo 1 28 42): ");
hora = entrada.nextInt();
minuto = entrada.nextInt();
segundo = entrada.nextInt();
// proceso
nSegundos = hora * HORA_SEG + minuto * MIN_SEG + segundo;
// salida
System.out.printf(
"Una %d hora(s), %d min(s), %d seg(s) son %d segundos\n",
hora, minuto, segundo, nSegundos);
} // fin del mtodo main
} // fin de la clase HoraSegundos
38
Aprenda Java
Problema 8.
Escribe un programa que lea un nmero entero de cinco cifras y determine la cifra central del
nmero. As, si el nmero ingresado fuera 45781, la cifra central a mostrar es 7.
// entrada
System.out.print("Nmero de cinco cifras?");
numero = entrada.nextInt();
// salida de resultados
System.out.printf("La cifra central es %d", digitoCentral);
} // fin del mtodo main
} // fin de la clase CifraCentral
Problema 9.
Se pide un prstamo de P pesos durante n aos a una tasa de inters i. Al final de n aos, el
importe de la deuda es de P(i+i) n pesos. Escribe un programa para leer P, i (en porcentaje), n
y adems, para calcular el importe final del adeudo. Comprueba el programa para P =
100.00, i = 8% y n = 5.
// entrada
39
Aprenda Java
// proceso
adeudo = cantidad * Math.pow(1 + tasaInteres / 100.0, nAos);
// salida
System.out.printf("El monto final a pagar es de $%.2f",
adeudo);
} // fin del mtodo main
} // fin de la clase Prestamo
Problema 10.
Elabora un programa para calcular las monedas que deben darse como cambio en los
siguientes casos:
Verifica el programa para las siguientes compras: 97, 78, 54, 21 y 1 centavos.
// entrada
System.out.print("Monto de la compra (menor a 1 peso)? $");
montoCompra = entrada.nextInt();
// proceso
cambio = BILLETE_PESO - montoCompra;
temporal = cambio;
40
Aprenda Java
// salida
System.out.printf("Cambio = $%d\n", cambio);
System.out.printf("%d monedas de 50 centavos\n", moneda50);
System.out.printf("%d monedas de 20 centavos\n", moneda20);
System.out.printf("%d monedas de 10 centavos\n", moneda10);
System.out.printf("%d monedas de 5 centavos\n", moneda5);
System.out.printf("%d monedas de 1 centavos\n", moneda1);
} // fin del mtodo main
} // fin de la clase Monedas
41
Aprenda Java
3. Instrucciones de seleccin.
Al finalizar esta leccin, sers capaz de:
Las variables boolean slo pueden guardar valores true o false que son palabras clave.
Las variables booleanas se utilizan en programacin para mantener el registro del estado
de cierta accin. El programa siguiente, TipoBoolean.java, declara dos variables
booleanas.
42
Aprenda Java
// esto es un error
// boolean x = 10 > = 3; //hay un espacio entre > y =
// boolean w = 10 =! 3; //el ! y el = estn volteados
// int num1 = 5;
// int num2 = 6;
// esto es un error si lo que se quiere es comparar
// boolean z = ( num1 = num2 );
} // fin del mtodo main
} // fin de la clase ExpresionRelacional
43
Aprenda Java
Las llaves del bloque {...} son opcionales para el caso de los bloques que tienen una
instruccin condicional.
Utilizamos un if simple cuando queremos hacer una cosa o no hacer nada. El programa
siguiente, NumerosIguales.java, utiliza un if simple para determinar si dos nmeros son
iguales.
if (numero % 5 == 0) {
System.out.printf("%d es mltiplo de 5.\n", numero);
} // fin if
if (numero % 2 == 0) {
System.out.printf("%d es par.\n", numero);
} // fin if
} // fin del mtodo main
44
Aprenda Java
if (calif > 8) {
System.out.println("La calificacin es excelente.");
System.out.println("Eres un buen programador Java.");
} // fin if
System.out.println("El estudio es la base del triunfo.");
} // fin del mtodo main
} // fin de la clase CalificacionExamen
A continuacin mostramos algunos errores que pueden ocurrir al utilizar una instruccin if.
El programa siguiente, ErroresTipicos.java, muestra errores tpicos con la instruccin if
simple.
45
Aprenda Java
Utilizamos una instruccin if/else cuando queremos hacer una u otra cosa dependiendo de
una condicin (expresin booleana). En otras palabras: ejecutar instrucciones cuando la
evaluacin de la condicin es verdadera o falsa. Veamos como funciona una instruccin
if/else. El programa siguiente, ParImpar.java, utiliza la instruccin if/else para
determinar si un nmero es par o impar.
//Instruccin if/else.
import java.util.Scanner; //para leer del teclado
public class ParImpar {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
// operacin de lectura
System.out.print("Introduce un nmero: ");
int numero = entrada.nextInt();
if (numero % 2 == 0)
System.out.printf("%d es par\n", numero);
else
System.out.printf(numero + " %d es impar\n", numero);
// nota: tambin se puede utiliza las llaves { y } en if/else
} // fin del mtodo main
} // fin de la clase ParImpar
46
Aprenda Java
} // fin if
else {
System.out.printf("%d y %d no son iguales.", num1, num2);
} // fin else
} // fin del mtodo main
} // fin de la clase NumerosIguales
En el programa anterior utilizamos una instruccin compuesta, (as como lo hicimos con el if
simple) para que el programa sea ms fcil de leer.
Prctiquemos con otros ejemplos que utilicen la instruccin if/else. El programa siguiente,
Calificacion.java, determina si un estudiante est aprobado/reprobado en base a cuatro
calificaciones.
// entrada
System.out.print("Introduce cuatro calificaciones (0-10): ");
double calif1 = entrada.nextDouble();
double calif2 = entrada.nextDouble();
double calif3 = entrada.nextDouble();
double calif4 = entrada.nextDouble();
// proceso y salida
double califFinal = calif1 * 0.30 + calif2 * 0.20 + calif3 *
0.10 + calif4 * 0.40;
System.out.printf("La calificacin final es %.2f\n",
califFinal);
47
Aprenda Java
El programa siguiente, Suma.java, genera dos nmeros aleatorios y permite practicar sumas
aritmticas simples.
// compara la respuesta
if (numero1 + numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
} // fin else
} // fin del mtodo main
} // fin de la clase Suma
48
Aprenda Java
numero1 = numero2;
numero2 = temp;
} // fin if
// pregunta al usuario
System.out.printf("Cuanto es %d - %d ? ", numero1, numero2);
// lee la respuesta
Scanner entrada = new Scanner(System.in);
int respuesta = entrada.nextInt();
// compara la respuesta
if (numero1 - numero2 == respuesta)
System.out.println("La respuesta es correcta.");
else
System.out.println("La respuesta es incorrecta.");
} // fin del mtodo main
} // fin de la clase Resta
Un programa puede evaluar varios casos colocando instrucciones if/else dentro de otras
instrucciones if/else, para crear instrucciones if/else anidadas.
// entrada
System.out.print("Nmero? ");
numero = entrada.nextInt();
// proceso y salida
if (numero >= LINF)
if (numero <= LSUP)
System.out.printf(
"%d se encuentra entre [%d-%d]\n", numero,
LINF, LSUP);
else
System.out.printf(
49
Aprenda Java
En una instruccin if anidada, cada instruccin else debe concordar con la instruccin if
precedente ms prxima. Utilizar demasiadas instrucciones if anidadas hace que los
programas se vuelvan ms complejos.
if (numero > 0) {
System.out.println("El nmero es positivo.");
} // fin if
else {
if (numero == 0)
System.out.println("El nmero es cero.");
else
System.out.println("El nmero es negativo.");
} // fin else
} // fin del mtodo main
} // fin de la clase PositivoNegativoNulo
Observa que en programa anterior, utilizamos los bloques {...} para que el programa sea
mucho ms legible. De otra manera, tendramos que leer con cuidado el cdigo para
determinar a que instruccin if pertenece cada parte else.
50
Aprenda Java
if (numero == numeroSecreto) {
System.out.println("Adivinaste!");
} // fin if
else {
if (numero < numeroSecreto) {
51
Aprenda Java
System.out.println("Fro!");
} // fin if
else {
System.out.println("Caliente!");
} // fin else
} // fin else
} // fin del mtodo main
} // fin de la clase Adivinanza
Cuando en una condicin existen diversas posibilidades, nos vemos obligados a programar
usando if anidados, lo que complica la realizacin y depuracin del cdigo. Para facilitar la
programacin en estas situaciones se proporciona la instruccin if/else/if. El programa
siguiente, DiaSemana.java, lee un nmero del 1 al 7 y determina el da de la semana
utilizando esta tcnica.
// solicita el da de la semana
System.out.print("Introduce un da de la semana (1-7)? ");
int dia = entrada.nextInt();
52
Aprenda Java
if (numero == numeroSecreto)
System.out.println("Adivinaste!");
else if (numero < numeroSecreto)
System.out.println("Fro!");
else
System.out.println("Caliente!");
} // fin del mtodo main
} // fin de la clase Adivinanza
// entrada
System.out.print("Sueldo trabajador? ");
double sueldo = entrada.nextDouble();
// proceso
if (sueldo < 1000)
sueldo *= 1.25; // sueldo = sueldo * 1.25;
else if (sueldo <= 1500)
sueldo *= 1.21; // sueldo = sueldo * 1.21;
else
sueldo *= 1.18; // sueldo = sueldo * 1.18;
// salida
53
Aprenda Java
if (numero < 0)
System.out.printf("%d es menor que cero", numero);
else if (numero <= 100)
System.out.printf("%d se encuentra entre [0,100]",
numero);
else
System.out.printf("%d es mayor que 100", numero);
} // fin del mtodo main
} // fin de la clase ClasificarNumero
Las condiciones simples se expresan en trminos de los operadores relacionales >, <, >=
y <=, y los operadores de igualdad == y !=; cada expresin evala slo una condicin.
Para evaluar condiciones mltiples en el proceso de tomar una decisin, ejecutamos estas
pruebas en instrucciones separadas o en instrucciones if o if/else anidadas. En
ocasiones, las instrucciones if requieren condiciones ms complejas para determinar el
flujo de control de un programa.
Java cuenta con los operadores lgicos, que nos permite formar condiciones ms
complejas, al combinar las expresiones simples. A continuacin estudiaremos el AND
condicional (&&), el OR condicional (||) y el NOT lgico (!).
54
Aprenda Java
El AND condicional se utiliza cuando queremos verificar que dos condiciones sean
verdaderas. El OR condicional se utiliza cuando queremos verificar que al menos una de las
condiciones sea verdadera. Y el NOT se usa para negar una condicin.
System.out.print("Edad? ");
int edad = entrada.nextInt();
55
Aprenda Java
// entrada
System.out.print("Introduce las 4 calificaciones: ");
nota1 = entrada.nextInt();
nota2 = entrada.nextInt();
nota3 = entrada.nextInt();
nota4 = entrada.nextInt();
// proceso
if (nota1 < nota2 && nota1 < nota3 && nota1 < nota4)
suma = nota2 + nota3 + nota4;
else if (nota2 < nota1 && nota2 < nota3 && nota2 < nota4)
suma = nota1 + nota3 + nota4;
else if (nota3 < nota1 && nota3 < nota2 && nota3 < nota4)
suma = nota1 + nota2 + nota4;
else if (nota4 < nota1 && nota4 < nota2 && nota4 < nota3)
suma = nota1 + nota2 + nota3;
// salida
System.out.printf("El promedio es: %d\n", promedio);
} // fin del mtodo main
} // fin de la clase PromedioPracticas
56
Aprenda Java
// determina la ganancia
int ganancia = 0;
57
Aprenda Java
Java cuenta con el operador condicional (?:), que en ocasiones puede utilizarse en lugar
de una instruccin if/else. ste es el nico operador ternario en Java; es decir, que
utiliza tres operandos. En conjunto, los operandos y el smbolo ?: forman una expresin
condicional. El primer operando (a la izquierda del ?) es una expresin booleana (es
decir, una condicin que se evala a un valor booleano true o false), el segundo
operando (entre el ? y :) es el valor de la expresin condicional si la expresin booleana es
verdadera, y el tercer operando (a la derecha de :) es el valor de la expresin condicional si
la expresin booleana se evala como falsa. El programa siguiente, Mayor.java, utiliza el
operador condicional para determinar si un nmero es mayor que otro.
// equivalente a
// if( num1 > num2 )
// System.out.println( "El mayor es " + num1 );
// else
// System.out.println( "El mayor es " + num2 );
} // fin del mtodo main
} // fin de la clase Mayor
58
Aprenda Java
// entrada
System.out.print("Cdigo del fabricante (1-4)? ");
int codigo = entrada.nextInt();
// proceso y salida
switch (codigo) {
case 1:
System.out.println("3M Corporation");
break;
case 2:
System.out.println("Maxwell Corporation");
break;
case 3:
System.out.println("Sony Corporation");
break;
case 4:
System.out.println("Verbatim Corporation");
break;
59
Aprenda Java
default:
System.out.println("Cdigo incorrecto");
} // fin switch
} // fin del mtodo main
} // fin de la clase FabricanteDVD
// entrada
System.out.print("Categora y sueldo del trabajador: ");
int categoria = entrada.nextInt();
float sueldo = entrada.nextFloat();
// proceso
float nuevoSueldo = 0.0F;
switch (categoria) {
case 1:
nuevoSueldo = sueldo * 1.15F;
break;
case 2:
nuevoSueldo = sueldo * 1.10F;
break;
case 3:
nuevoSueldo = sueldo * 1.08F;
break;
case 4:
nuevoSueldo = sueldo * 1.07F;
break;
default:
System.out.println("Categora invlida");
} // fin switch
// salida
60
Aprenda Java
61
Aprenda Java
System.out.println("TIJERA");
break;
} // fin switch
// determina el ganador
if (jugador == PIEDRA && computadora == PIEDRA)
System.out.println("Empate.");
else if (jugador == PIEDRA && computadora == PAPEL)
System.out.println("La computadora gana.");
else if (jugador == PIEDRA && computadora == TIJERA)
System.out.println("El jugador gana!");
Nota: los problemas que se resuelven aqu no tienen una solucin nica.
Problema 1.
Una tienda de abarrotes vende paletas de dulce a precios unitarios que dependen de la
cantidad de unidades adquiridas de acuerdo a la siguiente tabla:
62
Aprenda Java
51 a 75 $12.50
76 en adelante $10.00
// entrada
System.out.print("Nmero de paletas a comprar? ");
numPaletas = entrada.nextInt();
63
Aprenda Java
// salida de resultados
System.out.printf("\nPaletas compradas: %d\n", numPaletas);
System.out.printf("Importe de compra: $%.2f\n", importeCompra);
System.out.printf("Descuento: $%.2f\n", importeDescuento);
System.out.printf("Total a pagar: $%.2f\n", importePagar);
} // fin del mtodo main
} // fin de la clase VentaPaletas
Problema 2.
El promedio final del curso de programacin Java se obtiene en base al promedio simple de
tres prcticas de laboratorio calificadas. Para ayudar a los alumnos, el profesor de Java ha
establecido incrementar en dos puntos la nota de la tercera prctica calificada, siempre y
cuando sea menor que 10. Disea y codifica un programa que determine el promedio final
de un alumno conociendo sus tres notas. Considera que las calificaciones estn en un rango
de 1 a 10.
// entrada
System.out.print("Introduce las 3 calificaciones (1-10)? ");
nota1 = entrada.nextDouble();
nota2 = entrada.nextDouble();
nota3 = entrada.nextDouble();
64
Aprenda Java
// determina el promedio
promedio = (nota1 + nota2 + nota3) / 3.0;
// salida de resultados
System.out.printf("El promedio final es de %.2f\n", promedio);
Problema 3.
Escribe un programa de manera que la salida sea el resultado de restar el nmero mayor del
menor. As por ejemplo si los nmeros son 6 y 9 la salida ser 3, pero si es 8 y 3, la salida
debe ser 5.
// entrada
System.out.print("Introduce dos nmeros enteros: ");
numeroUno = entrada.nextInt();
numeroDos = entrada.nextInt();
// proceso
if (numeroUno > numeroDos)
resta = numeroUno - numeroDos;
else
resta = numeroDos - numeroUno;
// salida
System.out.printf("La resta es %d", resta);
} // fin del mtodo main
} // fin de la clase RestaMenor
65
Aprenda Java
Problema 4.
Un programador Java recibe $40 dolares por hora si trabaja semanalmente 40 horas o
menos. Si trabaja ms de 40 horas se le pagan $40 dolares las primeras 40 horas, y $60 po
cada hora adicional. As, un programador que trabaja 40 horas recibe $1600, mientras que el
que trabaja 42 horas recibe 1600 + ( 42 40 ) * 60, que da un total de $1720. Escribe un
programa que lea el nmero de horas trabajadas por un programador e imprima el salario a
devengar.
// entrada
System.out.print("Horas trabajadas? ");
nHoras = entrada.nextInt();
// proceso
if (nHoras <= HORAS_BASE)
sueldoTotal = nHoras * HORAS_BASE;
else
sueldoTotal = SALARIO_SEMANA +
(nHoras - HORAS_BASE) * HORAS_EXTRA;
// salida
System.out.printf("El salario del trabajador es $%.2f",
sueldoTotal);
} // fin del mtodo main
} // fin de la clase SalarioProgramador
Problema 5.
Escribe un programa que lea un nmero entero positivo tres cifras y determine si las cifras
del nmero son o no consecutivas (en orden ascendente o en orden descendente). En caso
que el nmero no sea un nmero positivo de tres cifras, el programa debe imprimir el
mensaje: "El nmero debe ser un entero positivo de tres cifras".
66
Aprenda Java
// lectura
System.out.print("Nmero entero positivo de tres cifras? ");
int numero = entrada.nextInt();
// verifica el rango
if (numero >= 100 && numero <= 999) {
// determina las cifras del nmero
int centena = numero / 100;
int decena = (numero % 100) / 10;
int unidad = numero % 10;
Problema 6.
Escribe un programa que lea un nmero entero positivo de tres cifras y que con forme el
nmero mayor posible con esas cifras.
67
Aprenda Java
// lectura
System.out.print("Nmero 3 cifras? ");
int numero = entrada.nextInt();
// proceso y salida
a = numero / 100;
numero = numero % 100;
b = numero / 10;
c = numero % 10;
if (a > b)
if (a > c)
if (b > c)
System.out.println(a + "" + b + "" + c);
else
System.out.println(a + "" + c + "" + b);
else
System.out.println(c + "" + a + "" + b);
else if (b > c)
if (c > a)
System.out.println(b + "" + c + "" + a);
else
System.out.println(b + "" + a + "" + c);
else
System.out.println(c + "" + b + "" + a);
} // fin del mtodo main
} // fin de la clase TresCifras
Problema 7.
Escribe un programa, que dado como dato una temperatura en grados fahrenheit, determine
el deporte que es apropiado practicar a esa temperatura, teniendo en cuenta la siguiente
tabla:
Deporte Temperatura
Natacin > 85
Tenis 70 < TEMP 85
Golf 32 < TEMP 70
Esqu 10 < TEMP 32
Marcha 10
68
Aprenda Java
// entrada
System.out.print("Temperatura en fahrenheit? ");
int temp = entrada.nextInt();
// proceso y salida
if (temp > 85)
System.out.println("Practica natacin");
else if (temp > 70)
System.out.println("Practica tenis");
else if (temp > 32)
System.out.println("Practica golf");
else if (temp > 10)
System.out.println("Practica esqu");
else
System.out.println("Practica la marcha");
} // fin del mtodo main
} // fin de la clase Deporte
Problema 8.
// entrada
System.out.print("Introduce las 4 califs (0-100)? ");
calif1 = entrada.nextFloat();
69
Aprenda Java
calif2 = entrada.nextFloat();
calif3 = entrada.nextFloat();
calif4 = entrada.nextFloat();
// proceso y salida
promedio = (calif1 + calif2 + calif3 + calif4) / 4.0f;
Problema 9.
Escribe un programa que solicitar una nota numrica entera entre 0 y 10, y mostrar dicha
nota de la forma: cero, uno, dos, tres, etc.
switch (numero) {
case 0:
System.out.println("CERO");
break;
case 1:
System.out.println("UNO");
break;
case 2:
System.out.println("DOS");
break;
case 3:
System.out.println("TRES");
70
Aprenda Java
break;
case 4:
System.out.println("CUATRO");
break;
case 5:
System.out.println("CINCO");
break;
case 6:
System.out.println("SEIS");
break;
case 7:
System.out.println("SIETE");
break;
case 8:
System.out.println("OCHO");
break;
case 9:
System.out.println("NUEVE");
break;
} // fin switch
} // fin del mtodo main
} // fin de la clase NotaNumerica
Problema 10.
71
Aprenda Java
72
Aprenda Java
4. Instrucciones de repeticin.
Al finalizar esta leccin, sers capaz de:
Una instruccin de repeticin (tambin llamada instruccin de ciclo, ciclo, o bucles) nos
permite especificar que un programa debe repetir una accin mientras que cierta condicin
sea verdadera. A las instrucciones a repetir se conocen como el cuerpo del ciclo y al hecho
de repetir la secuencia de instrucciones se denomina iteracin.
La instruccin de repeticin while permite que los programas repitan instrucciones mientras
que una condicin sea verdadera. En un ciclo while la condicin se evala antes de
cualquier repeticin del ciclo. Si la condicin es verdadera, el ciclo contina. Si es falsa
termina. El programa siguiente, ContadorWhile.java demuestra el uso de un ciclo while.
A este tipo de ciclos se les denomina ciclos controlados por contador ya que necesitamos
de una variable llamada contador (o variable de control) para controlar el nmero de veces
que debe ejecutarse un conjunto de instrucciones. El programa siguiente,
CicloWhile.java, utiliza un ciclo controlado por contador.
73
Aprenda Java
{
System.out.println(contador);
contador--; // decrementa la variable de control en 1
} // fin de while
} // fin del mtodo main
} // fin de la clase CicloWhile
// entrada
System.out.print("Cantidad de nmeros a sumar? ");
n = entrada.nextInt();
// proceso
while (i <= n) {
suma += i; // suma = suma + i;
i++; // i = i + 1;
} // fin while
// salida
System.out.printf("La suma es %d\n", suma);
} // fin del mtodo main
} // fin de la clase SumaNaturales
74
Aprenda Java
// mensaje de usuario
System.out.println("Piensa un nmero entre 0 y 100.");
System.out.println("-------------------------------");
// evala
if (numero == numeroSecreto)
System.out.println("Adivinaste!");
else if (numero < numeroSecreto)
System.out.println("Fro!");
else
System.out.println("Caliente!");
} // fin while
} // fin del mtodo main
} // fin de la clase Adivinanza
El programa siguiente, es una versin mejorada del programa, Suma.java, que escribimos
en la leccin anterior y que nos permite practicar sumas sencillas un determinado nmero de
veces.
75
Aprenda Java
numero1, numero2);
int respuesta = entrada.nextInt();
// compara la respuesta
if (numero1 + numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
aciertos++;
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
System.out.printf("%d + %d = %d\n", numero1, numero2,
(numero1 + numero2));
} // fin else
contador++; // incrementa el contador
// genera el reporte
reporte += "\n"
+ numero1
+ " + "
+ numero2
+ " = "
+ respuesta
+ ((numero1 + numero2 == respuesta) ? " correcto"
: " incorrecto");
} // fin while
Un valor centinela (tambin llamada valor de seal, valor de prueba o valor de bandera)
indica el fin de la introduccin de datos en un ciclo. El programa siguiente,
SumaCentinela.java, utiliza un ciclo while controlado por centinela para sumar una
determinada cantidad de nmeros enteros.
76
Aprenda Java
while (numero != 0) {
suma += numero; // suma = suma + numero;
// lee el siguiente nmero
System.out.print("Nmero a sumar (0 para terminar)? ");
numero = entrada.nextInt(); // lectura
} // fin while
System.out.printf("La suma es %d", suma);
} // fin del mtodo main
} // fin de la clase SumaCentinela
El programa siguiente, Promedio.java, utiliza un ciclo while controlado por centinela para
calcular la suma y promedio de una serie de nmeros.
// mensaje de usuario
System.out.println(
"Ingresa una lista de nmeros enteros positivos.");
System.out.println(
"Marca el final de la lista con un nm negativo.");
System.out.println(
"Teclea la lista de nms: (ejemplo 4, 5, 4, 6, -3)");
numero = entrada.nextInt(); // lectura
if (contador == 0)
System.out.println("No ingresaste ningn nmero.");
else {
double promedio = (double) suma / contador;
System.out.printf("%d nmeros ledos.%n", contador);
System.out.printf("El promedio es %.2f ", promedio);
} // fin else
77
Aprenda Java
Al estar trabajando con ciclos es posible que ms de alguna vez provoquemos un ciclo
infinito. Un ciclo infinito es aquel que no logra que su condicin pueda concluir, y por tanto
detenerse. El programa siguiente, CicloInfinito.java, demuestra los ciclos infinitos.
int contador = 1;
78
Aprenda Java
item -= 0.1;
System.out.println("Procesando...item vale " + item);
} // fin while
System.out.println(suma);
} // fin del mtodo main
} // fin de la clase ErrorNumerico
do {
System.out.printf("%d ", contador);
contador++; // incrementa la variable de control
} while (contador <= 10); // condicin de continuacin
} // fin del mtodo main
} // fin de la clase ContadorDoWhile
Utilizamos el ciclo do/while cuando necesitamos por lo menos una repeticin del ciclo. El
programa siguiente, EncuentraUnTres.java, utiliza la instruccin de repeticin do/while
para generar un nmero aleatorio hasta que el nmero sea un tres.
int numero;
do {
numero = (int) (Math.random() * 20) + 1;
System.out.println(numero);
} while (numero != 3);
System.out.println(
"El programa ha terminado, he encontrado un 3.");
79
Aprenda Java
do {
// lee el siguiente nmero
System.out.print("Nmero a sumar (0 para terminar)? ");
numero = entrada.nextInt(); // lectura
suma += numero; // suma = suma + numero;
} while (numero != 0); // fin do/while
System.out.printf("La suma es %d", suma);
} // fin del mtodo main
} // fin de la clase SumaCentinela2
La instruccin while puede utilizarse para implementar cualquier ciclo controlado por un
contador. Java, tambin cuenta con la instruccin for, que especifica los detalles de la
repeticin controlada por contador en una sola linea de cdigo. El programa siguiente,
CicloFor.java, ilustra la sintaxis bsica para el ciclo for.
80
Aprenda Java
En el ciclo for, tenemos una variable de control (o contador del ciclo), un valor inicial, el
incremento o decremento de la variable de control y la condicin de continuacin del ciclo. El
programa siguiente, ContadorFor.java, utiliza la instruccin de repeticin for.
// esto es un error
// for( int i = 1; i < 10; i++ ); //genera un for vaco
// System.out.println( i );
} // fin del mtodo main
} // fin de la clase ContadorFor
81
Aprenda Java
// proceso
for (int i = LIM_INF; i <= LIM_SUP; i++) {
if (i % 2 == 0) // es par?
sumaPar += i; // sumaPar = sumaPar + i;
else
sumaImpar += i; // sumaImpar = sumaImpar + i;
} // fin for
// salida
System.out.printf("Suma pares: %d y Suma impares: %d\n",
sumaPar, sumaImpar);
} // fin del mtodo main
} // fin de la clase ParImpar
El programa siguiente, ParejaValores.java, utiliza dos ciclos for anidados para imprimir
una pareja de valores.
82
Aprenda Java
Adems de las instrucciones de seleccin y repeticin, Java cuenta con las instrucciones
break y continue para alterar el flujo de control de un programa. Anteriormente
utilizamos la instruccin break para terminar la ejecucin de una instruccin switch.
Cuando break se ejecuta en una instruccin while, do/while, for o switch, ocasiona la
salida inmediata de esa instruccin. La ejecucin contina con la primera instruccin
despus de la instruccin de control. Los usos comunes de break son para escapar
anticipadamente del ciclo, o para omitir el resto de una instruccin switch. El programa
siguiente, ForBreak.java, demuestra el uso de una instruccin break para salir de un ciclo
for.
83
Aprenda Java
System.out.println(cuenta);
} // fin de for
System.out.println("Salio del ciclo en cuenta = " + cuenta);
} // fin del mtodo main
} // fin de la clase ForBreak
Cuando la instruccin continue se ejecuta en una instruccin while, do/while o for, omite
las instrucciones restantes en el cuerpo del ciclo y contina con la siguiente iteracin del
ciclo. En las instrucciones while y do/while, el programa evala la prueba de
continuacin del ciclo justo despus de que se ejecuta la instruccin continue. En una
instruccin for se ejecuta la expresin de incremento y despus el programa evala la
prueba de continuacin del ciclo. El programa siguiente, ForContinue.java, utiliza la
instruccin continue en un ciclo for.
84
Aprenda Java
// entrada
System.out.print("n? ");
numero = entrada.nextInt();
// proceso
for (int i = 2; i <= numero / 2; i++) {
if (numero % i == 0) { // es primo?
esPrimo = false; // no es primo
break; // termina el ciclo
} // fin if
} // fin for
// salida
if (esPrimo)
System.out.printf(" %d es primo\n", numero);
else
System.out.printf(" %d no es primo\n", numero);
} // fin del mtodo main
} // fin de la clase NumeroPrimo
// mensaje de usuario
System.out.println("Los 50 nmeros primos son:\n");
85
Aprenda Java
Nota: los problemas que se resuelven aqu no tienen una solucin nica.
Problema 1.
Escribe un programa que lea un nmero entero y que imprima su cuadrado; el proceso debe
repetirse hasta que se introduzca un nmero negativo.
86
Aprenda Java
Problema 2.
while (numero != 0) {
if (numero > 0)
System.out.printf("%d es positivo\n", numero);
else
System.out.printf("%d es negativo\n", numero);
87
Aprenda Java
Problema 3.
Escribe un programa que lea un nmero entero y sume los dgitos individuales de ese
nmero. Por ejemplo para el nmero 234 el resultado es 9.
System.out.print("Nmero? ");
numero = entrada.nextInt();
temporal = numero;
while (temporal > 0) {
// obtiene el dgito
digito = temporal % 10;
// lo suma
suma += digito;
// recorta la cifra
temporal = temporal / 10;
} // fin while
System.out.printf("La suma de los dgitos de %d es %d",
numero, suma);
} // fin del mtodo main
} // fin de la clase SumaDigitos
88
Aprenda Java
Problema 4.
System.out.print("Nmero? ");
numero = entrada.nextInt();
temporal = numero;
while (temporal > 0) {
// obtiene el dgito
digito = temporal % 10;
// forma el nmero inverso
inverso = (inverso * 10) + digito;
// recorta la cifra
temporal = temporal / 10;
} // fin while
if (numero == inverso)
System.out.printf("%d es palndromo", numero);
else
System.out.printf("%d no es palndromo", numero);
} // fin del mtodo main
} // fin de la clase Palindromo
Problema 5.
89
Aprenda Java
entero inicial es 26, la secuencia ser: 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.
Escribe un programa que lea un entero positivo y obtenga e imprima la sucesin de ULAM.
System.out.println("Conjetura de ULAM");
System.out.println("-----------------");
System.out.print("Introduce un nmero entero: ");
int numero = entrada.nextInt();
while (numero != 1) {
if (numero % 2 == 0)
numero = numero / 2;
else
numero = numero * 3 + 1;
System.out.println(numero);
} // fin while
} // fin del mtodo main
} // fin de la clase ConjeturaUlam
Problema 6.
Escribir un programa que imprima y obtenga la suma de los trminos de la siguiente serie:
2, 5, 7, 10, 12, 15, 17, ..., 1800.
90
Aprenda Java
//imprime la serie
if( contador % NUMERO_POR_LINEA == 0 )
System.out.println(i);
else
System.out.print( i + "\t");
if( indicador ) {
i += 3;
indicador = false;
} //end if
else {
i += 2;
indicador = true;
} //fin else
} //fin while
Problema 7.
Escribe un programa que lea un nmero entero N y calcule el resultado de la siguiente serie:
1 1 1 1
1+ + + + ...+
2 3 4 N
//Calcula el resultado de una determinada serie.
import java.util.Scanner;
public class Serie2 {
public static void main(String[] args) {
double serie = 0.0;
Scanner entrada = new Scanner(System.in);
// entrada
System.out.print("Introduce el nmero n: ");
int numero = entrada.nextInt();
// proceso
for (int i = 1; i <= numero; i++)
serie = serie + 1.0 / i;
91
Aprenda Java
// salida
System.out.printf("La suma de la serie es %.2f\n", serie);
} // fin del mtodo main
} // fin de la clase Serie2
Problema 8.
Escribe un programa que lea un nmero entero N y calcule el resultado de la siguiente serie:
1 1 1 1
1 + + ...
2 3 4 N
92
Aprenda Java
Problema 9.
System.out.println("Factorial de un nmero.");
System.out.println("-----------------------");
System.out.print("Nmero? ");
numero = entrada.nextInt();
System.out.printf(
"El factorial de %d! es %d", numero, factorial);
} // fin del mtodo main
} // fin de la clase Factorial
Problema 10.
93
Aprenda Java
94
Aprenda Java
La clase Math es una de las clases pre-construidas en el paquete java.lang. Esta clase
contiene mtodos que implementan funciones matemticas estndar. Adems de proveer
mtodos matemticos, la clase Math tambin provee dos constantes matemticas: PI y e (la
base para los logaritmos naturales).
Todos los mtodos en la clase Math son static. El modificador static significa que son
mtodos de clase y deben llamarse antecediendo el nombre del mtodo con el de la clase
en la cual estn definidos. El programa siguiente, MathDemo.java utiliza algunos mtodos
de la clase Math.
95
Aprenda Java
Recuerda que los valores numricos que se pasan como argumento a los mtodos deben de
coincidir y que posiblemente suceda una conversin automtica de esos valores.
El programa siguiente MayorMenor.java nos ilustra las ventajas de utilizar mtodos pre-
construidos.
// encuentra el mayor
int mayor = max(num1, max(num2, num3));
// encuentra el menor
int menor = min(num1, min(num2, num3));
96
Aprenda Java
El mtodo printf de la clase System nos permite imprimir texto formateado. El programa
siguiente, PrintfDemo.java, ilustra como utilizar algunos especificadores de formato para
imprimir texto formateado.
System.out.println("123456789012345678901234567890123456789");
System.out.println("---------+---------+---------+---------");
// imprime un nmero en punto flotante
System.out.printf("%f %n", Math.PI);
// 3 digitos despus del punto decimal
System.out.printf("%.3f %n", Math.PI);
// 8 caracteres y 2 digitos
System.out.printf("%8.3f %n", Math.PI);
} // fin del mtodo main
} // fin de la clase PrintfDemo
97
Aprenda Java
Otra manera de dar formato al texto es mediante el mtodo format de la clase String. Este
mtodo trabaja de la misma manera que el mtodo printf de la clase System. El programa
siguiente, StringFormatDemo.java, muestra como dar formato al texto.
System.out.println("123456789012345678901234567890123456789");
System.out.println("---------+---------+---------+---------");
// imprime un nmero en punto flotante
cad = String.format("%f", Math.PI);
System.out.println(cad);
// 3 digitos despus del punto decimal
cad = String.format("%.3f", Math.PI);
System.out.println(cad);
// 8 caracteres y 2 digitos
cad = String.format("%8.3f", Math.PI);
System.out.println(cad);
} //fin del mtodo main
} //fin de la clase StringFormatDemo
98
Aprenda Java
La clase String es otra de las clases del paquete java.lang. La clase String contiene
muchos mtodos tiles para la manipulacin de cadenas. El programa siguiente
StringDemo.java utiliza algunos mtodos de la clase String.
System.out.println("012345678901234567890123456789");
System.out.println("+--------+---------+---------+");
System.out.println(mensaje);
System.out.println(mensaje.charAt(6)); // e
System.out.println(mensaje.length()); // 26
System.out.println(mensaje.indexOf('e')); // 6
System.out.println(mensaje.indexOf("es")); // 6
System.out.println(mensaje.substring(19)); // de Java
System.out.println(mensaje.substring(0, 6)); // de Java
System.out.println(mensaje.toLowerCase());
System.out.println(mensaje.toUpperCase());
System.out.println(mensaje.replace('e', '9'));
} // fin del mtodo main
} // fin de la clase StringDemo
99
Aprenda Java
// la forma correcta
if (cadUno.equals("Java"))
System.out.println("Son iguales (Java)");
else
System.out.println("No son iguales");
if (cadDos.equalsIgnoreCase("CSHARP"))
System.out.println("Son iguales (CSharp)");
else
System.out.println("No son iguales");
} // fin del mtodo main
} // fin de la clase CompararString
La clase NumberFormat se utiliza para formatear nmeros permitiendo que el cdigo sea
independiente de las convenciones propias de cada pas. El programa siguiente,
NumberFormatDemo.java, ilustra lo anterior.
100
Aprenda Java
System.out.println(monedaUK.format(19));
} // fin del mtodo main
} // fin de la clase NumberFormatDemo
La clase DecimalFormat nos permite mostrar nmeros con un formato deseado, es decir,
limitar el nmero de decimales, si usaremos punto o coma, etc. El programa siguiente,
DecimalFormatDemo.java, ilustra lo anterior.
System.out.println("Patrn 3: ##.###");
System.out.println(patron3.format(numero));
System.out.println("Patrn 4: #.##");
System.out.println(patron4.format(numero));
101
Aprenda Java
6. Mtodos.
Al finalizar esta leccin, sers capaz de:
Utilizar la programacin modular mediante mtodos void y con valor de retorno en los
programas Java.
Las tareas asignadas a los subprogramas pueden ser de diversa ndole: entrada, salida,
clculos, control de otros mdulos, etc. Para que un subprograma pueda efectuar su
tarea tiene que ser llamado o invocado por el programa principal o por algn otro mdulo
que considere necesario el servicio del subprograma. Una vez que el subprograma termina
su tarea, devuelve el control al punto donde se hizo la llamada. Un subprograma puede
llamar a su vez a otros subprogramas.
Un mtodo tipo void es un mdulo de programa que puede recibir datos de entrada a travs
de parmetros; pero, que no retorna ningn resultado al punto donde es invocado, razn por
el que se le conoce tambin como mtodo sin valor de retorno. Los mtodos tipo void
pueden dividirse a su vez en dos tipos:
Estos mtodos no pueden recibir datos de entrada ni retornar ningn resultado al punto de su
invocacin. El programa siguiente, TestMetodoVoid.java, ilustra lo mencionado
anteriormente.
102
Aprenda Java
Recuerda: si el encabezado del mtodo tiene la palabra clave void (localizado a la izquierda
del nombre del mtodo) significa que el mtodo no devuelve ningn valor. En este curso
utilizaremos mtodos con el modificador static.
// lee la temperatura
System.out.print("Ingresa una temperatura en Fahrenheit: ");
fahrenheit = entrada.nextDouble();
// realiza la conversin
celsius = 5.0 / 9.0 * fahrenheit - 32;
// imprime el resultado
System.out.printf("La temperatura en Celsius es %.2f%n",
celsius);
} // fin del mtodo fahrenheitCelsius
// lee la temperatura
System.out.print("Ingresa una temperatura en Celsius: ");
103
Aprenda Java
celsius = entrada.nextDouble();
// realiza la conversin
fahrenheit = 9.0 / 5.0 * celsius + 32;
// imprime el resultado
System.out.printf("La temperatura en Fahrenheit es %.2f%n",
fahrenheit);
} // fin del mtodo celsiusFahrenheit
// mensaje de usuario
System.out.println("1. Convertir de Fahrenheit a Celsius.");
System.out.println("2. Convertir de Celsius a Fahrenheit.");
if (opcion == 1)
fahrenheitCelsius();
else
celsiusFahrenheit();
} // fin del mtodo main
} // fin de la clase Temperatura
Estos mtodos reciben datos de entrada a travs de parmetros; pero, al igual que en el
caso anterior no pueden retornar ningn resultado al punto de su invocacin. El nmero de
parmetros es variable y depende de las necesidades del mtodo. El programa siguiente,
Curso.java, declara y utiliza un mtodo con un parmetro para imprimir un mensaje de texto
dependiendo del valor que se recibe como argumento.
104
Aprenda Java
Un mtodo con valor de retorno es un mdulo de programa que puede recibir datos de
entrada a travs de parmetros y que retorna un resultado al punto donde es invocado. Este
tipo de mtodo se utiliza para efectuar cualquier tipo de proceso que produzca un resultado .
105
Aprenda Java
Este tipo de mtodos no reciben datos de entrada; pero, retornan un resultado al punto
donde son invocados. El programa siguiente, TestMetodoReturn.java, define un mtodo
con valor de retorno, sin parmetros.
106
Aprenda Java
El programa siguiente, PieMetro.java, declara y utiliza dos mtodos con valor de retorno y
un parmetro para calcular la equivalencia pie a metro y viceversa.
System.out.printf("%s%9s%9s%9s%n",
" Pies", "Metros", "Metros", "Pies");
107
Aprenda Java
if (n % divisor == 0) // es divisible?
return false; // el nmero no es primo
return true; // el nmero es primo
} // fin del mtodo esPrimo
//Encuentra todos los pares primos (AB,CD) donde ABCD tambin es primo.
public class ParesPrimos {
// determina si un nmero es primo
private static boolean esPrimo(int n) {
for (int divisor = 2; divisor <= n / 2; divisor++)
if (n % divisor == 0) // es divisible?
return false; // el nmero no es primo
return true; // el nmero es primo
} // fin del mtodo esPrimo
108
Aprenda Java
Un mtodo puede especificar mltiples parmetros; slo hay que separar un parmetro de
otro mediante una coma (lista separada por comas). El programa siguiente,
BuscadorMaximo.java, declara y utiliza un mtodo con mltiples parmetros.
return valorMaximo;
} // fin del mtodo mximo
// entrada
System.out.print(
"Escribe tres nmeros, separados por espacios: ");
double numero1 = entrada.nextDouble();
double numero2 = entrada.nextDouble();
double numero3 = entrada.nextDouble();
109
Aprenda Java
110
Aprenda Java
Pueden declararse mtodos con el mismo nombre en la misma clase, siempre y cuando
tengan distintos conjuntos de parmetros (determinados en base al nmero, tipos y orden de
los parmetros). A esto se le conoce como sobrecarga de mtodos. Cuando se hace una
llamada a un mtodo sobrecargado, el compilador de Java selecciona el mtodo apropiado
mediante un anlisis del nmero, tipos y orden de los argumentos en la llamada. Por lo
general, la sobrecarga de mtodos se utiliza para crear varios mtodos con el mismo nombre
que realicen la misma tarea o tareas similares. El programa siguiente, Sobrecarga.java,
utiliza mtodos sobrecargados.
111
Aprenda Java
112
Aprenda Java
Los mtodos sobrecargados pueden tener tipos de valor de retorno distintos si los mtodos
tienen distintas listas de parmetros. Adems, los mtodos sobrecargados no necesitan
tener el mismo nmero de parmetros.
Una variable local es una variable que es declarada y utilizada localmente dentro de un
mtodo. El bloque de una variable se establece por el par de llaves ms cercanas que
encierran la declaracin de la variable.
113
Aprenda Java
114
Aprenda Java
Nota: los problemas que se resuelven aqu no tienen una solucin nica.
Problema 1.
Escribe un programa controlado por men que permita calcular el rea de un triangulo,
cuadrado, circulo y rectngulo. El programa deber utilizar mtodos void y con valores de
retorno.
115
Aprenda Java
switch (opcion) {
case 1:
System.out.println("1. rea tringulo.");
System.out.println("------------------");
calcularAreaTriangulo();
break;
case 2:
System.out.println("2. rea cuadrado.");
System.out.println("-----------------");
calcularAreaCuadrado();
break;
case 3:
System.out.println("3. rea rectngulo.");
System.out.println("-------------------");
calcularAreaRectangulo();
break;
case 4:
System.out.println("4. rea crculo.");
System.out.println("----------------");
calcularAreaCirculo();
break;
default:
System.out.println("Opcin del men invlida.");
} // fin switch
} // fin del mtodo menu
System.out.print("Base? ");
double base = entrada.nextDouble();
System.out.print("Altura? ");
116
Aprenda Java
System.out.print("Lado? ");
double lado = entrada.nextDouble();
System.out.print("Base? ");
double base = entrada.nextDouble();
System.out.print("Altura? ");
double altura = entrada.nextDouble();
System.out.print("Radio? ");
double radio = entrada.nextDouble();
117
Aprenda Java
do {
menu();
System.out.print("\nDeseas continuar? (S/N)");
opcion = entrada.next();
} while (opcion.equals("S") || opcion.equals("s"));
Problema 2.
Escribir un programa controlado por men para practicar sumas, restas, multiplicaciones y
divisiones.
do {
menu();
System.out.print("\nDeseas continuar? (S/N)");
opcion = entrada.next();
} while (opcion.equals("S") || opcion.equals("s"));
118
Aprenda Java
switch (opcion) {
case 1:
System.out.println("1. Practicar sumas.");
System.out.println("-------------------");
practicarSuma();
break;
case 2:
System.out.println("2. Practicar restas.");
System.out.println("--------------------");
practicarResta();
break;
case 3:
System.out.println("3. Practicar multiplicaciones.");
System.out.println("------------------------------");
practicarMultiplicacion();
break;
case 4:
System.out.println("4. Practicar divisiones.");
System.out.println("------------------------");
practicarDivision();
break;
default:
System.out.println("Opcin del men invlida.");
} // fin switch
} // fin del mtodo menu
119
Aprenda Java
// compara la respuesta
if (numero1 + numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
aciertos++;
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
System.out.println(numero1 + " + " + numero2 + " = "
+ (numero1 + numero2));
} // fin else
contador++; // incrementa el contador
// genera el reporte
reporte += "\n"
+ numero1
+ " + "
+ numero2
+ " = "
+ respuesta
+ ((numero1 + numero2 == respuesta) ?
" correcto" : " incorrecto");
} // fin while
120
Aprenda Java
// compara la respuesta
if (numero1 - numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
aciertos++;
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
System.out.println(numero1 + " - " + numero2
+ " = " + (numero1 - numero2));
} // fin else
contador++; // incrementa el contador
// genera el reporte
reporte += "\n"
+ numero1
+ " - "
+ numero2
+ " = "
+ respuesta
+ ((numero1 - numero2 == respuesta) ?
" correcto" : " incorrecto");
} // fin while
121
Aprenda Java
// compara la respuesta
if (numero1 * numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
aciertos++;
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
System.out.println(numero1 + " * " + numero2 + " = "
+ (numero1 * numero2));
} // fin else
contador++; // incrementa el contador
// genera el reporte
reporte += "\n"
+ numero1
+ " * "
+ numero2
+ " = "
+ respuesta
+ ((numero1 * numero2 == respuesta) ?
" correcto" : " incorrecto");
} // fin while
122
Aprenda Java
// compara la respuesta
if (numero1 / numero2 == respuesta) {
System.out.println("La respuesta es correcta.");
aciertos++;
} // fin if
else {
System.out.println("La respuesta es incorrecta.");
System.out.println(numero1 + " / " + numero2 + " = "
+ (numero1 - numero2));
} // fin else
contador++; // incrementa el contador
// genera el reporte
reporte += "\n"
+ numero1
+ " / "
+ numero2
+ " = "
+ respuesta
+ ((numero1 / numero2 == respuesta) ?
" correcto" : " incorrecto");
} // fin while
123
Aprenda Java
7. Arreglos unidimensionales.
Al finalizar esta leccin, sers capaz de:
// esto es incorrecto
// int[5] edad;
// int edad[5];
// double(5) miArreglo;
// double miArreglo(5);
} // fin del mtodo main
} // fin de la clase DeclaraArreglo
Para nombrar un arreglo unidimensional se siguen las mismas convenciones que los dems
nombres de variables adems de que tenemos que usar los corchetes. Los arreglos
unidimensionales se crean con la palabra clave new. El programa siguiente,
CrearArreglo.java crea un arreglo unidimensional de tipo int y double.
124
Aprenda Java
// double[] miArreglo;
// miArreglo = new Arreglo[10];
// declara y crea el arreglo en una sola lnea
double[] miArreglo = new double[10];
} // fin del mtodo main
} // fin de la clase CrearArreglo
Al crear un arreglo unidimensional con la palabra clave new, tenemos que indicar su longitud
(cuntos valores va a contener) y el tipo de valores que van a estar contenidos en el arreglo
unidimensional . El programa siguiente, ValoresArreglo.java, crea y asigna valores a un
arreglo unidimensional de tipo double.
125
Aprenda Java
La expresin arreglo.length obtiene el tamao del arreglo unidimensional. Dado que los
arreglos unidimensionales (y de dos ms dimensiones) son de longitud fija, una vez
establecido el tamao del arreglo unidimensional este no se puede cambiar.
126
Aprenda Java
//esto es un error
//int[] lista;
//lista = {1,2,3,4,5};
} // fin del mtodo main
} // fin de la clase DatosArreglo
// crea el arreglo
miArreglo = new int[tamao];
127
Aprenda Java
i, miArreglo[i]);
} // fin for
} // fin del mtodo main
} // fin de la clase LecturaArreglo
128
Aprenda Java
// procesa el arreglo
for (int i = 0; i < miArreglo.length; i++) {
// genera el indice j aleatoriamente
int j = (int) (Math.random() * miArreglo.length);
129
Aprenda Java
// procesa el arreglo
for (int elemento : miArreglo)
System.out.println(elemento);
} // fin del mtodo main
} // fin de la clase ForEach
La instruccin for mejorada, itera a travs de los elementos o coleccin sin utilizar un
contador. El programa siguiente, CopiarArreglo.java, copia el contenido de un arreglo
unidimensional en otro utilizando un ciclo for tradicional y usa un for mejorado para listar
los elementos del arreglo copiado.
// creamos el arreglo
int[] copia = new int[lista.length];
130
Aprenda Java
imprimir(x);
imprimir(y);
// usando un arreglo annimo
imprimir(new double[] { 11.0, 12.0, 13.0, 14.0, 15.0 });
} // fin del mtodo main
imprimir(x);
imprimir(y);
} // fin del mtodo main
// mtodo overload
public static void imprimir(double[] arreglo) {
for (int i = 0; i < arreglo.length; i++)
System.out.print(arreglo[i] + " ");
System.out.println();
} // fin del mtodo imprimir
// mtodo overload
131
Aprenda Java
Al igual que cualquier otro tipo de dato podemos especificar que un mtodo retorne un
arreglo unidimensional. El programa siguiente, ProductoVector.java, retorna un arreglo en
la llamada de un mtodo.
// proceso
int producto = productoVectores(a, b);
// salida
System.out.printf("El producto de AxB = %d", producto);
} // fin del mtodo main
132
Aprenda Java
return producto;
} // fin del mtodo productoVectores
} // fin de la clase ProductoVectores
Con las listas de argumentos de longitud variable podemos crear mtodos que reciben un
nmero arbitrario de argumentos. Un tipo de argumentos que va precedido por una elipsis
(...) en la lista de parmetros de un mtodo indica que ste recibe un nmero variable de
argumentos de ese tipo especfico. Este uso de la elipsis puede ocurrir slo una vez en una
lista de parmetros, y la elipsis, junto con su tipo, debe colocarse al final de la lista.
System.out.println("Valores iniciales.");
System.out.println("------------------");
System.out.printf("d1 = %.2f%n", d1);
System.out.printf("d2 = %.2f%n", d2);
System.out.printf("d3 = %.2f%n", d3);
System.out.printf("d4 = %.2f%n", d4);
System.out.println();
System.out.printf("El promedio de d1 y d2 es %.2f%n",
promedio(d1, d2));
133
Aprenda Java
La clase Arrays est definida en el paquete java.util e incluye una serie de mtodos para
manipular arreglos unidimensionales.
134
Aprenda Java
//ordena el arreglo
Arrays.sort( miArreglo );
//imprime el arreglo
imprimir( miArreglo );
135
Aprenda Java
// llena de 9 el arreglo
Arrays.fill(listaJava, 9);
imprimir(listaJava);
imprimir(listaNet);
} // fin del mtodo main
136
Aprenda Java
Nota: los problemas que se resuelven aqu no tienen una solucin nica.
Problema 1.
Escribir un programa controlado por men que utilice las operaciones bsicas estudiadas en
esta leccin.
do {
menu(listaNumero);
System.out.print("\nDeseas continuar? (S/N)");
opcion = entrada.next();
} while (opcion.equals("S") || opcion.equals("s"));
137
Aprenda Java
switch (opcion) {
case 1:
System.out.println("1. Leer desde el teclado.");
System.out.println("-------------------------");
leerArreglo(miArreglo);
break;
case 2:
System.out.println(
"2. Llenar el arreglo aleatoriamente.");
System.out.println(
"------------------------------------");
datosAleatorios(miArreglo);
break;
case 3:
System.out.println(
"3. Imprimir el contenido del arreglo.");
System.out.println(
"-------------------------------------");
imprimirArreglo(miArreglo);
break;
case 4:
System.out.println("4. Encontrar el nmero mayor.");
System.out.println("-----------------------------");
mostrarMayor(miArreglo);
break;
case 5:
System.out.println(
138
Aprenda Java
139
Aprenda Java
imprimirArreglo(miArreglo);
} // fin del mtodo leerArreglo
140
Aprenda Java
contador++;
} // fin for
return contador;
} // fin del mtodo cuentaCeros
// ordenamos el arreglo
Arrays.sort(temporal);
141
Aprenda Java
contador++;
} // fin if
} // fin for
// imprime el reporte
if (temporal[i] != -1)
System.out.printf(
"%d se repite %d veces%n", temporal[i],
contador);
contador = 1; // inicializa para volver a contar
} // fin for
} // fin del mtodo mostrarRepeticiones
142
Aprenda Java
8. Arreglos bidimensionales.
Al finalizar esta leccin, sers capaz de:
Los arreglos bidimensionales se utilizan para representar tablas de valores, las cuales
consisten en informacin ordenada en filas y columnas. Para identificar un elemento
especfico de un arreglo bidimensional, debemos especificar dos subndices. Por
convencin, el primero identifica la fila del elemento y el segundo su columna. El programa
siguiente, DeclararArreglo2D.java declara un arreglo bidimensional de tipo double.
// es un error
// double arreglo2D[5][6];
// double arreglo2D(4)(3);
} // fin del mtodo main
} // fin de la clase DeclararArreglo2D
Los arreglos bidimensionales usan la misma sintaxis bsica que los arreglos
unidimensionales, excepto por un par segundo par de corchetes ( []). Para declarar y crear
un arreglo bidimensional utilizamos el operador new y dos valores literales que representan
las filas y columnas respectivamente. El programa siguiente, CrearArreglo2D.java declara
y crea dos arreglos bidimensionales de tipo int y double con un tamao de 10x10
respectivamente.
// versin corta
int[][] tabla = new int[10][10];
// esto un error
// int tabla[4][5];
143
Aprenda Java
// int[4][5] tabla;
// int tabla = new tabla[5,5];
} // fin del mtodo main
} // fin de la clase CrearArreglo2D
Cada elemento del arreglo se identifica mediante una expresin de acceso a un arreglo de
la forma tabla[fila][columna] donde tabla es el nombre del arreglo, fila y columna
son los subndices que identifican en forma nica a cada elemento en el arreglo tabla por
nmero de fila y columna. El programa siguiente, ValoresArreglo2D.java, declara, crea y
asigna valores a un arreglo bidimensional de tipo double.
// esto es un error
// genera un ArrayIndexOutOfBoundsException
// tabla[3][3] = 12.5;
} // fin del mtodo main
} // fin de la clase ValoresArreglo2D
144
Aprenda Java
Al igual que los arreglos unidimensionales, los arreglos bidimensionales pueden inicializarse
mediante inicializadores de arreglos en las declaraciones. Un arreglo bidimensional de
nombre tabla con tres filas y tres columnas podra declararse e inicializarse con
inicializadores de arreglos anidados. El programa siguiente, DatosArreglo2D.java,
declarar e inicializa un arreglo bidimensional de tipo double.
// esto es un error
// int[][] lista;
// lista = {{1,2,3},{4,5,6},{7,8,9}};
} // fin del mtodo main
} // fin de la clase DatosArreglo2D
145
Aprenda Java
Los valores del inicializador se agrupan por filas entre llaves. El compilador cuenta el
nmero de inicializadores de arreglos anidados (representados por conjuntos de llaves
dentro de las llaves externas) en la declaracin del arreglo, para determinar el nmero de
filas en el arreglo. El compilador cuenta los valores inicializadores en el inicializador de
arreglos anidado de una fila, para determinar el nmero de columnas en esa fila. Esto
significa que las filas pueden tener distintas longitudes. El programa siguiente,
ArregloDesigual.java declara e inicializa un arreglo con filas de distintas longitudes.
En Java no existen los arreglos de dos o ms dimensiones ya que Java los mantiene como
arreglos de arreglos unidimensionales.
Los programas siguientes muestran como inicializar un arreglo bidimensional y el uso de los
ciclos for anidados en combinacin con los indices de fila y columna para manipular los
elementos del arreglo bidimensional.
146
Aprenda Java
// inicializa el arreglo 2D
for (int i = 0; i < tabla.length; i++)
for (int j = 0; j < tabla[i].length; j++)
tabla[i][j] = (int) (Math.random() * 100);
147
Aprenda Java
148
Aprenda Java
149
Aprenda Java
// intercambia tabla[ren][col]
// por tabla[renAux][colAux]
int temp = tabla[i][j];
tabla[i][j] = tabla[renAux][colAux];
tabla[renAux][colAux] = temp;
} // fin for
} // fin for
System.out.println("El arreglo despus del shuffling.");
// imprime el contenido del arreglo
for (int i = 0; i < tabla.length; i++) {
System.out.print("Rengln " + i + " = [ ");
for (int j = 0; j < tabla[i].length; j++)
150
Aprenda Java
System.out.println("]");
} // fin for
} // fin del mtodo imprimirArreglo
imprimirArreglo(tabla);
} // fin del mtodo main
} // fin de la clase PasoArreglo2D
151
Aprenda Java
{ 5, 6, 7 }, { 8, 9 } });
System.out.printf("La suma es %d%n", total2);
} // fin del mtodo main
Problema 1.
Escribir un programa controlado por men que utilice las operaciones bsicas estudiadas en
esta leccin.
// crea el Matriz
int[][] arreglo2D = new int[renglon][columna];
152
Aprenda Java
opcion = entrada.next();
} while (opcion.equals("S") || opcion.equals("s"));
switch (opcion) {
case 1:
System.out.println("1. Llenar el arreglo 2D.");
System.out.println("------------------------");
leer(arreglo2D);
break;
case 2:
System.out.println("2. Imprimir el arreglo 2D.");
System.out.println("--------------------------");
imprimir(arreglo2D);
153
Aprenda Java
break;
case 3:
System.out.println(
"3. Llenar el arreglo con valores random.");
System.out.println(
"----------------------------------------");
llenarRandom(arreglo2D);
break;
case 4:
System.out.println(
"4. Intercambiar valores aleatoriamente.");
System.out.println(
"---------------------------------------");
shuffling(arreglo2D);
break;
case 5:
System.out.println("5. Imprimir la suma total.");
System.out.println("--------------------------");
imprimirSuma(arreglo2D);
break;
case 6:
System.out.println("6. Imprimir el promedio.");
System.out.println("------------------------");
imprimirPromedio(arreglo2D);
break;
case 7:
System.out.println("7. Encontrar el elemento mayor.");
System.out.println("-------------------------------");
imprimirMaxValor(arreglo2D);
break;
case 8:
System.out.println("8. Encontrar el elemento menor.");
System.out.println("-------------------------------");
imprimirMinValor(arreglo2D);
break;
default:
System.out.println("Opcin del men invlida.");
} // fin switch
} // fin del mtodo mostrarMenu
// lee los datos de un matriz desde el teclado
// mensaje de usuario
System.out.printf("Introduce los datos de la matriz %d x %d%n",
154
Aprenda Java
matriz.length, matriz[0].length);
// lectura de la matriz
for (int ren = 0; ren < matriz.length; ren++) {
for (int col = 0; col < matriz[ren].length; col++) {
System.out.printf("Valor[%d][%d]? ", ren, col);
matriz[ren][col] = entrada.nextInt();
} // fin for
} // fin for
} // fin del mtodo leer
// intercambia tabla[ren][col]
155
Aprenda Java
// por tabla[renAux][colAux]
int temp = matriz[ren][col];
matriz[ren][col] = matriz[renAux][colAux];
matriz[renAux][colAux] = temp;
} // fin for
} // fin for
System.out.println(
"Los datos de la matriz ya se han intercambiado.");
imprimir(matriz);
} // fin del mtodo shuffling
156
Aprenda Java
return max;
} // fin del mtodo maxValor
157
Aprenda Java
9. Bibliografa consultada.
Deitel & Deitel, Como programar en Java, Sptima edicin, Pearson Education,
Mxico 2008.
John Dean & Raymond Dean, Introduccin a la programacin con Java, Primera
edicin, McGraw Hill, Mxico 2009.
C. Thomas Wu, Programacin en Java, Introduccin a la programacin orientada a
objetos, Primera edicin, McGraw Hill, Mxico 2008.
Bell Douglas & Parr Mike, Java para estudiantes, tercera edicion, Pearson Education,
Mxico 2003.
Y. Daniel Liang, Java Programming, Comprehensive versin, Eighth Edition , Prentice
Hall, New Jersey 2011.
Beth Brown , A guide to programming in Java 2 Platform Standard Edition 5, First
Edition, Lawrenceville Press , USA 2005.
Manual de introduccin a la algoritmia: http://es.scribd.com/doc/59204592/IntroducciA
%C2%B3n-a-la-Algoritmia-1.
158