Objetivos
Implementar control con repeticiones en un programa usando sentencias while Implementar control con repeticiones en un programa usando sentencias do-while Implementar control con repeticiones en un programa usando sentencias for Anidar la sentencia de control de repeticin de un bucle dentro de otra sentencia de repeticin Elegir la sentencia de control de repeticin adecuada para una tarea determinada Preguntar al usuario por una respuesta de tipo si-no usando el AnswerBox Formatear los datos de salida usando la clase Format del paquete javabook
Introduccin
Las sentencias de repeticin (sentencias de Control, bucles, ciclos) controlan un bloque de cdigo para que se ejecute un nmero fijo de veces o hasta que se cumple una determinada condicin. En java existen tres tipos de ciclos: while, do-while, for
La sentencia while
La sintaxis de la sentencia while es:
while (<expresin booleana>) <sentencias> int suma = 0, numero = 1;
Expresin booleana
numero = numero + 1; }
Diagrama de flujo
int suma = 0; numero = 1;
numero <= 20
verdadero
falso
numero: numero: numero: numero: numero: numero: numero: numero: numero: numero:
11 12 13 14 15 16 17 18 19 20
suma= suma= suma= suma= suma= suma= suma= suma= suma= suma=
Producto de impares
int producto = 1, numero = 1, contador = 20, ultimoNumero; ultimoNumero = 2 * contador -1; while (numero <= ultimoNumero) { producto = producto * numero; numero = numero + 2; }
Diagrama de flujo
int producto = 0; numero = 1; contado = 20; ultimoNumero = 2*contador -1
numero<= ultimoNumero
verdadero
falso
Diagrama de flujo
edad
verdadero
falso
edad
Tarea
1. Escriba una sentencia while que sume los nmeros del 10 al 50.
2. Escriba un lazo while que sume los cuadrados de los nmero del 1 al 40.
3. Escriba una sentencia while para calcular el promedio de un conjunto de valores. La entrada de datos deber terminar con un valor negativo, es un bucle controlado por contador o por centinela? Debe tener un contador del nmero de valores que se introducen.
Ciclos infinitos
Cuando la condicin de un ciclo while es siempre verdadera, se tiene un ciclo infinito.
byte contador = 1;
contador++;
}
...
contador++;
OBOE corregido
int contador = 0; while (contador < 10) { ... contador++; } int contador = 1; while (contador <= 10)
...
contador++;
Preguntas rpidas
1. Cul de los siguientes es un bucle infinito?
2. Para cada una de las siguientes sentencias, determine el valor de la suma despus de que se haya ejecutado el lazo. a. int contador = 0,suma = 0; while (contador < 10){ suma += contador; contador++; } b. int contador = 1,suma = 0; while (contador <= 30){ suma += contador; contador += 3; } c. int contador = 0,suma = 0; while (contador < 20){ suma += 3*contador; contador += 2; }
La sentencia do-while
La sintaxis de la sentencia do-while es: do <sentencias> while (<expresin booleana>); int suma = 0, numero = 1;
Expresin booleana
do { suma += numero;
Diagrama de flujo
int suma = 0; numero = 1;
numero <= 20
falso
verdadero
int edad; do { edad = entrada.getInteger( "Su edad entre 0 y 130 : "); if(edad < 0 || edad> 130) System.out.prinln("Se ha introducido+ una edad invlida." + "intentelo de nuevo."); } while (edad < 0 || edad> 130);
Condicin compleja
El bucle termina cuando se reciba el valor centinela 0, cuando se introduzca un nmero par o cuando la suma sea mayor que 100. suma = 0; do { num = entrada.getInteger(teclee un entero:); if(num == 0)// centinela mensaje.show(suma = +suma); else if(num % 2 ==0)// nmero par mensaje.show(Error: nmero par); else{ suma += num; if(suma>100)//mayor que 100 mensaje.show(Suma > 100); } } while(!(num % 2 == 0 || num == 0 || suma > 100));
La condicin anterior se puede expresar como sigue haciendo uso de la equivalencia: !(a || b) <==> !a && !b
(num % 2 != 0 && num != 0 && suma <= 100);
boolean repetir = true; suma = 0; do { num = entrada.getInteger(teclee un entero:); if(num == 0){ // centinela mensaje.show(suma = +suma); repetir = false; } else if(num % 2 ==0){ // nmero par mensaje.show(Error: nmero par); repetir = false; } else{ suma += num; if(suma>100)//mayor que 100 mensaje.show(Suma > 100); repetir = false; } } while(repetir);
Preguntas rpidas
1. Escriba una sentencia do-while para calcular la suma de los primeros 30 enteros positivos e impares.
2. Reescriba los siguientes bucles while como bucles dowhile a. int contador = 0, suma = 0; while(contador < 10){ suma += contador; contador++; } b. int contador = 1, suma = 0; while(contador <= 30){ suma += contador; contador += 3; }
La sentencia for
La sintaxis de la sentencia for es:
for(<inicio>; <expresin booleana>; <incremento>) <sentencia>
Expresin booleana
inicio Incremento
for( i = 0 ; i < 20 ; i++ ){ numero = entrada.getInteger(); suma += numero;
Sentencia }
Diagrama de flujo
i = 0; <Inicio>
falso
i < 20
<Expresin booelana>
verdadero
<Sentencia>
i++;
<incremento>
Cada libre
Se deja caer un objeto desde una altura H, la posicin P del objeto en el instante t esta dada por, P = 16t2 + H El instante en que toca el suelo se encuentra haciendo P = 0 en la ecuacin anterior y es igual a t = (H/16)
Programa
double alturaInicial, posicion,tiempoContacto; SimpleInput entrada = new SimpleInput(); alturaInicial = entrada.getDouble(" Altura inicial: "); tiempoContacto = Math.sqrt(alturaInicial/16.0); System.out.println( " Tiempo t posicion en el instante t "); for(int instante=0;instante<tiempoContacto;instante++){ posicion = -16.0*instante*instante+alturaInicial; System.out.pritnln(" " + instante+" " + posicion); } System.out.println(tiempoContacto + " 0.00");
Preguntas rpidas
1. Escriba un bucle for para calcular: a. La suma de 1, 2, ..., 100 b. La suma de 2, 4, ..., 500 c. El producto de 3, 5, 7, ..., 25 2. Reescriba los siguientes bucles while usando sentencias for, a. int contador = 0, suma = 0; while(contador < 10){ suma += contador; contador++; } b. int contador = 1, suma = 0; while(contador <= 30){ suma += contador; contador += 3; }
Preguntas rpidas
Escriba sentencias for, do-while y while para calcular las siguientes sumas y productos
a. 1 + 3 + 7 + ...+ (220 -1)
Lazos anidados
Es posible tener una lazo dentro de otro. A esto se le llama anidamiento.
int precio=100; salida.printLine(" 5 10 15 20 for(int ancho = 11; ancho <= 20; ancho++) { salida.print(ancho + " "); for(int longitud = 5; longitud <= 25; longitud+=5){ salida.print(" " + precio); } salida.skipLine(1); } 25");
Estructuras de Decisin
Sintaxis (prueba): switch (expr) { case expr1: decla1; break; case expr2: decla2; break; default: decla3; break; }
switch (estCivil) { case 1: conteoCasado++; break; case 2: conteoSoltero ++ break; default: // error; break; }
La Sentencia: Break
Es usa para salir del contexto actual (el cdigo que se ejecuta dentro de las llaves)
Usualmente no es un buena idea viola la filosofa: entrada simple / salida simple single.
En las sentencias switch, el resto del cdigo es saltado y se sale del bucle switch.
La sentencia: Continue
Usada para salir de la iteracin actual de un ciclo y continue con la siguiente iteracin. Solamente se usa con los ciclos(for, while, etc) La parte de incremento del bucle for se ejecuta todava en la iteracin actual.
La sentencia: Return
Usado para salir del mtodo actual, regresa el valor por el cual el mtodo es llamado. Es Opcional si el tipo de mtodo es de tipo void
Sintaxis: return;
Tabla de multiplicar
static public void main(String[] args){ MainWindow ventana = new MainWindow(); OutputBox salida = new OutputBox(ventana); ventana.show(); salida.setTitle("Tabla de multiplicar"); salida.show(); salida.printLine(" 1 2 3+ 5 6 7 8 9 10"); for(int i = 1; i <= 10; i++) { salida.print(i + " "); for(int j = 1; j <= 10; j++){ salida.print(" " + i*j); } salida.skipLine(1); } }
Preguntas rpidas
1. Cul ser la suma despus de ejecutar los siguientes for anidados?
a. Int suma = 0; for(int i=0; i<5; i++){ suma = suma + i; for(int j=0; i<5; j++){ suma = suma + j; }
b. Int suma = 0; for(int i=0; i<5; i++){ suma = suma + i; for(int j=i; i<5; j++){ suma = suma + j; }
inicio
algoritmo
intentos = intentos + 1
V
num
F
num>secreto?
F
V V
num == secreto? Alto Fallo
F
num<secreto?
V
Bajo
Acerto
fin
Tarea
1. Escriba un mtodo que devuelva true si el argumento es un nmero primo. 2. Utilizando el mtodo del problema 1 escriba un mtodo que liste todos los primos entre 1 y N , donde N es tecleado por el usuario. 3. Una terna de nmeros a, b, c es cuadrada perfecta si a2 + b2 = c2. Por ejemplo, 3, 4, 5 es una terna cuadrada perfecta. Escriba un programa para obtener todos las ternas cuadradas perfectas entre 1 y N, donde N es tecleado por el usuario. El programa no deber repetir ternas, es decir, la terna 3, 4, 5 es la misma que la terna 4, 3, 5, y deber imprimirse una sola vez.
Convenciones de Nombres
Mezcla de Maysculas y minsculas, siempre se comienza con letras minsculas para la primera palabra y las palabras subsiguientes comienzan con letras maysculas. Por Ejemplo: miPrimerMetodo(), miCuentaBancaria
Mezcla de Maysculas y minsculas, siempre se comienza con una letra mayscula para la primer palabra y para las otras palabras siempre se empieza con maysculas. Por Ejemplo: MiClase, MiInterfase
Convenciones de Nombres
Constantes:
Cada palabra con letras maysculas separadas con un carcter de subrayado Por Ejemplo: MI_CONSTANTE_LARGA
Paquetes:
Todos se escriben con letras minsculas en toda la palabras Por Ejemplo: com.josefuentes.proyecto1
Pseudocdigo
Un algoritmo es una forma de escribir un cdigo de programacin ms adecuado a nuestro lenguaje. Y que tanto nosotros como otras personas puedan verlo. No necesariamente tiene que estar escrito en un lenguaje de programacin especfico. Mediante un algoritmo se pueden pasar a diferentes lenguajes de programacin fcilmente, teniendo la idea bsica en el algoritmo. Cdigo:
valor = 0 Mientras (valor sea menor a 20) { mostrar valor valor = valor + 1 Si (valor es igual a 10) { mostrar "me gusta el 10" } }
Pseudocdigo: Ejemplos
Ejemplo: Realizar el pseudocdigo de un programa que permita calcular el rea de un rectngulo. Se debe introducir la base y la altura para poder realizar el clculo..
Programa; rea Entorno: BASE, ALTURA, AREA son nmero enteros Algoritmo: escribir :Introduzca la base y la altura leer BASE, ALTURA calcular AREA = BASE * ALTURA escribir: El rea del rectngulo es AREA Fin programa Ejemplo: Realizar el pseudocdigo que permita al usuario introducir por teclado dos notas, calculando la suma y el producto de las notas. Programa: SumaProducto Entorno: NOTA1, NOTA2, SUMA, PRODUCTO son nmeros enteros Algoritmo: escribir: Introduzca las notas leer NOTA1,NOTA2 calcular SUMA = NOTA1 + NOTA2 calcular PRODUCTO = NOTA1 * NOTA2 escribir: La suma de las dos notas es: SUMA escribir: El producto de las dos notas es: PRODUCTO Fin programa
Pseudocdigo: Tarea.
Problema: Elabore el Pseudocdigo de un programa que calcule la suma de dos numero..
Programa Suma dos nmeros. Variables n1, n2, Suma enteros Inicio leer n1, leer n2, suma = n1 + n2; escribir suma Fin del programa.
Clases
Una clase es una plantilla (eso es una matriz) para la creacin de objetos. Una clase puede extenderse a otra clase (extends, eso quiere decir relacin de herencia)
Por De facto, todas las clases estn derivadas de una clase raz llamada Object. Todas las clases tienen una clase inmediata superior o superclase, con excepcin de la clase Object.
Clases
// Estudiante.java public class Estudiante{ private String nombre; // nombre es un campo, atributo o una variable de instancia public Estudiante(String n) { //este es un constructor. Note que tiene el mismo nombre = n; // nombre que la clase. Despus hablamos mas. } public void setNombre (String n) { Los mtodos getter y setter. Tpicamente, los nombre = n; Mtodos get y set se definen para cada atributo. } Si un campo se define, por decir dirTrab, public String getNombre () { Entonces un mtodo get se definir return nombre; getDirTrab() y el mtodo set setDirTrab(). } public void print () { System.out.println(El Nombre es: + nombre); } }
Clases
// TestEstudiante.java (esta es una clase para probar la funcionalidad de la clase Estudiante) public class TestEstudiante{ public static void main (String argv[]) { Estudiante s1 = new Estudiante("Lusa"); Estudiante s2 = new Estudiante("Juan"); s2.setNombre("Juan Jr."); s1.print(); System.out.println(s2.getNombre()); // tambin se puede usar print() } }
Note: las clases Estudiante y TestEstudiante necesitan estar en el mismo directorio para poder trabajar propiamente.
Objeto y clase
La clase implementa al tipo. Un objeto se define por medio de su clase de ah que un objeto sea una instancia individual de una clase. Al proceso de crear un objeto se le llama instanciacin. Una clase es la combinacin de estructuras, funciones e interfaces. La interfaz de una clase es todo lo visible para aquellas funciones que no forman parte de la clase. Las funciones cliente se comunican con la clase mediante la invocacin de su interfaz. Los objetos estn protegidos por una interfaz: el contrato entre el objeto y el cliente. Todos los objetos de un mismo tipo pueden recibir los mismos mensajes.
Objeto y clase
interfaz
objeto
mtodo cdigo datos mtodo cdigo
Mtodos
implementacin
57
Clases y objetos
58
Objetos
Las instancias de los Objetos de una clase se crean usando la palabra new
Una variable no primitiva mantiene un manejador conocido como la referencia del objeto(object reference). De esta manera se asignan copias al manejador no el objeto.
Objetos (2)
s2
s2.setNombre(Luis JR.); // que nombre se ha cambiado?
Nota: Esto es por que se necesita usar.arraycopy para copiararrays
Objetos (3)
Ejemplo: Estudiante s1; // s1 tiene valor null s1 = new Estudiante(Juan); s1 s1 = new Estudiante(Maria); s1
Juan
Juan
Maria
Atributos
Creacin de un atributo
opcional
Sintaxis:
tipoAcceso tipoDato nombreAtributo;
Ejemplo:
private int horasTrab; private String nombre;
Sintaxis:
nombreAtributo (Si esta dentro de su clase) objectReference.nombreAtributo (si la clase es de afuera y el atributo esta accesible)
Ejemplo:
if (nombreAtributo < 40) // clase interna employee1.nombreAtributo = 37; // clase de afuera
Mtodo
Mtodo
define el comportamiento de una clase (llamado funciones miembros en C++) Pueden se implementada en las clases. Tiene que regresar algn tipo a menos que sean constructores (los que no tienen tipo de retorno) Los parmetros como argumentos se declaran dando el tipo y nombre y se separan con una coma entre ellos cuando hay mas de uno (Si no tiene parmetros, el listado esta vaco).
Definicin de un Mtodo
opcional
Sintaxis:
[TipodeAcceso] [modificadores(s)] tipoRetorno nombreMetodo (listado parmetros) { // cuerpo del mtodo }
Ejemplos:
public static void main(String[] args) { } private int miMetodo(int j, String s) { } String miMetodo2( ) { }
Constructores
Mtodo especial que lleva el mismo nombre que su clase. Son invocados al crearse un objeto (new) nuevo. Los Constructores no regresan nada Constructores ( y Mtodos en general) puede ser overloaded al cambiar el numero de sus parmetros.
Constructores (2)
Un constructor por De Facto (default) se provee automticamente para usted en cada clase
Formato: public MiClase() { // asumiendo que el nombre
de la clase es MiClase
Se permite que:
MiClase mc = new MiClase( );
Especificadores de Acceso
Como en C++, los componentes de la clases se pueden asociar con sus especificadores de acceso
public. Accesible por todos protected Accesible solo por la misma clase, sus subclases, y el paquete. private Accesible solo por esta clase. friendly Accesible por el paquete; este es el acceso por de facto el acceso no especificado
Especificadores de Acceso
Criterios de Accesibilidad.
Modificadores Misma Clase Mismo Paquete Subclase public Si Si Si protected Si Si Si Default Si Si private Si Todo Si
Especificadores de Acceso
Examine las clases Empleados.java y PruebaAcceso.java en su disco. Compile la clase PruebaAcceso.java y observe el resultado. (Mirara un mensaje de error.) Ahora cambie los campos nombre y salario para variables publicas y re-compile y crralo PruebaAcceso.java . Observacin: Mantener las variables/campos private!
De esta forma el contenido actual del objeto puede cambiarse dentro del mtodo pero la referencia misma del objeto nunca cambia.
Ejemplo:
public static void main (String args[]) {
int a = 10; String s = hola; Empleado e = new Empleado(Maria); metodo1(a, s, e); System.out.println(a =+a+s=+s+e+e); // imprime 10, hola2 y Juan
} public static void metodo1 (int a2, String s2, Empleado e2) {
a2 = 100; s2 = hola2; e2.setNombre(Juan); e2 = new Empleado(Esther);
Creando Objetos
int num; //declara una variable int String nombre; //declara un objeto String
// ambos no estn inicializados
String nombre1 = Aniceto Prieto; String nombre2 = Pacho Madrigal; nombre1 = nombre2; //Cual es la diferencia?
Nombres (ID)
5 num1 = num2; num2 10 num2 10 10
num1
num1
nombre1
Aniceto Prieto
nombre2
La Clase String
String nombre = Donald Duck; conteo = nombre.length(); Cual ser el valor de conteo?
Regresa una nueva cadena que comienza con primLetra y continua hasta la letra con ultIndex-1)
Cadenas (Strings)
Ejemplos
String apellido = Schaefer; apellido.length() // regresa 8 apellido.toUpper() // regresa SCHAEFER apellido.toLower() // regresa schaefer apellido.indexOf(e) // regresa 4 apellido.indexOf(x) // regresa 1 (por no encontrarse) apellido.indexOf(e,5) // regresa 6 apellido.substring(2,5) // da hae (1er index es inclusive,
2o index es excluido)
Varias clases que ya usamos (System , Scanner, String) son parte de la Librera de Clases de Java. Otras clases de la librera se obtienen de terceras personas, o Usted mismo las crea.
Paquetes
Las clases de la librera de clases en Java se organizan en paquetes. Algunos de los paquetes de la librera estndar de Java son:
Propsito Soporte General Formateo del texto de salida Interfaces Graficas e interfaces graficas del Usuario Capacidades graficas adicionales Comunicacin de Redes Utilidades Realiza calculaciones
La declaracin import
Cuando se va a utilizar una clase de un paquete, Usted debe usar el nombre de la clase de forma entera:
java.util.Scanner
O Usted puede hacer un import de la clase y despus hacer uso del nombre de la clase
import java.util.Scanner;
Para hacer import de todas las clases en particular de un paquete, usamos * como carcter comodn: import java.util.*;
La declaracin import
Todas las clases del paquete java.lang son importadas automaticamente para el programa Si el programa contiene la siguiente linea: import java.lang.*;
Esa es la razon porque no hicimos un import de la clase System o clase String de forma explicita en programas anteriores.
La Clase Random
Un objeto Random realiza una calculacin compleja basada en una semilla que produce un flujo de valores aleatorios.
import java.util.Random; public class RandomSimple { public static void main(String[] args) { int num1; float num2; Random generador = new Random(); //genera un numero entre 1 y 5000 num1 = generador.nextInt(5000)+ 1; System.out.println(El entero es " + num1);
//genera un numero entre 1000 y 9999 num2 = generador.nextFloat(); System.out.println(El numero decimal es: " + num2); } }
La Clase Math
La clase Math es parte del paquete java.lang La clase Math contiene mtodos que realizan varias funciones matemticas Entre ellas estn:
La Clase Math
Los mtodos de la clase Math son mtodos estticos static (tambin llamados mtodos de clase) Un mtodo Static solo puede ser invocado a travs del nombre de la clase no por el objeto de la clase Math.
Muy frecuentemente es necesario darle formato a los resulados para que ellos sean entendidos de manera mas apropiada. La libreria estandar de clases contiene clase que proveen las capacidades para formatear los datos La clase NumberFormat le permite que Usted formatee valores de dinero y porcentajes.
La clase DecimalFormat le permite que Usted formatee los valores bajo un formato establecido
Ambos son parte del paquete java.text
getPercentInstance()
Objeto formateador tien un metodo llamado format que regresa una cadena con la informacion especificada en el formato apropiado.
import java.text.NumberFormat; public class FormatoNums { public static void main(String[] args) { int num1 = 12345; double num2 = 98765.54391; float num3 = .067f; NumberFormat fmtNum = NumberFormat.getNumberInstance();
NumberFormat fmtCurr = NumberFormat.getCurrencyInstance(); System.out.println(fmtCurr.format(num1)); System.out.println(fmtCurr.format(num2)); NumberFormat fmtPercent = NumberFormat.getPercentInstance(); System.out.println(fmtPercent.format(num1)); System.out.println(fmtPercent.format(num3));
} }
La clase DecimalFormat puede ser usada para formatear un valor decimal de maneras diferentes. Por ejemplo, Usted puede especificar que el numero ser truncado a tres decimales. El constructor de la clase DecimalFormat toma una cadena que representa el formato bajo el cual se adaptara el numero.
Si tenemos 123456.789
###,###.### ###.## Si tenemos 123.4 00000.00 123,456.789 123456.79
00123.40
import java.util.Scanner; import java.text.DecimalFormat; public class Average { public static void main(String[] args) { int num1, num2, num3; double average; Scanner scan = new Scanner (System.in); System.out.print(Digite tres enteros:"); //captura 3 enteros del usuario num1 = scan.nextInt(); num2 = scan.nextInt(); num3 = scan.nextInt(); average = (num1 + num2 + num3)/3.0; //calcula el average System.out.println(El average es " + average); DecimalFormat fmtDosDigitosPlaces = new DecimalFormat("###.##"); System.out.println(" El average ya formateado es " + fmtDosDigitos.format(average)); DecimalFormat fmtCuatro = new DecimalFormat("0000.0000"); System.out.println(El average ya formateado es " + fmtCuatro.format(average)); } }