Objetivos: Presentar nuevos elementos del lenguaje Java.
Temas:
Ejercicio: búsqueda en archivos.
Escriba un programa que entregue la distancia entre Santiago y alguna ciudad de Chile. El diálogo debe ser el siguiente:
Nombre de ciudad ? arica
La distancia entre Santiago y Arica es 2030 kilómetros
Arica 2030
Puerto Mont 1012
Valparaiso 109
...
Observe que el usuario ingresa arica en minúsculas y que la misma ciudad aparece en mayúsculas en el archivo. El programa debe ignorar este tipo de diferencias.
Si la ciudad solicitada por el usuario no aparece en el archivo, el programa debe desplegar el siguiente mensaje:
Nombre de ciudad ? Mendoza
La ciudad de Mendoza no se encuentra en mi base de datos
(Ver el programa completo en BuscaCiudad.java. Recupere también el archivo
de datos en dist.txt.)
print("Nombre de ciudad ? ");
String ciudadBusc= lower(readLine());
TextReader lect= new TextReader("dist.txt");
int existe= 0;
String linea= lect.readLine();
while (!lect.eofReached() && existe==0) {
FieldParser decod= new FieldParser(linea, ":");
String ciudad= lower(trim(substring(linea, 0, 20)));
int dist= parseInt(trim(substring(linea, 20, 4)));
if (compare(ciudad, ciudadBusc)==0) {
println("La distancia entre Santiago y "+ciudad+" es "+dist+
" kilometros");
existe= 1;
}
linea= lect.readLine();
}
if (existe==0) {
println("La ciudad de "+ciudadBusc+
" no se encuentra en mi base de datos");
}
lect.close();
Observación: La comparación se debe hacer ignorando la diferencia entre mayúsculas y minúscula. Por esta razón, se usó la función lower que traduce todo a letras minúsculas.
Si se encuentra la ciudad, no tiene sentido seguir leyendo el archivo. Por esta razón se agregó la variable existe. Esta variable permanece en 0 mientras no se haya encontrado la ciudad. Cuando se encuentra la ciudad se le asigna un 1, lo que se traduce en que el ciclo termina, puesto que no satisface la condición existe==0.
Constantes:
Aplicaciones:
boolean existe; // sin inicialización
boolean terminar= false; // con inicialización
Los operadores relacionales <, ==, >=, etc. permiten construir expresiones que producen valores de verdad. Estos valores pueden ser utilizados en condiciones en un while o un if, y también pueden ser asignados a variables:
También existen funciones y métodos que producen valores de verdad:
isInt(...) y lect.eofReached().
boolean mayor= a>b;
Ejemplo:
El programa que entrega la distancia de una ciudad a Santiago puede ser reescrito:
(Ver el programa completo en BuscaCiudad2.java.)
print("Nombre ciudad ? ");
String ciudadBusc= lower(readLine());
TextReader lect= new TextReader("dist.txt");
boolean existe= false;
String linea= lect.readLine();
while (!lect.eofReached() && !existe) {
String ciudad= lower(trim(substring(linea, 0, 20)));
int dist= parseInt(trim(substring(linea, 20, 4)));
if (compare(ciudad, ciudadBusc)==0) {
println("La distancia entre Santiago y "+ciudad+" es "+dist+
" kilometros");
existe= true; // (C)
}
else linea= lect.readLine();
}
if (!existe) {
println("La ciudad de "+ciudadBusc+
" no se encuentra en mi base de datos");
}
lect.close();
El patrón de uso de esta instrucción consiste en un ciclo while que contiene un if, en donde se ejecuta la instrucción break:
Mientras la codición (B) sea falsa, el ciclo continuará realizando
iteraciones de la manera usual. Esto significa que se ejecuta
tanto (A) como (E). Pero si (B) resulta verdadera, se ejecutan
las instrucciones de (C) y luego break que termina el
ciclo. La próxima instrucción en ejecutarse será (F).
while ( ... ) {
... // (A)
if ( ... ) { // (B)
... // (C)
break;
// (D)
}
... // (E)
}
... // (F)
Esta secuencia de ejecución se observa más claramente en el siguiente diagrama:
Observaciones:
while (...) {
...
if (...) {
break;
}
...
if (...) {
break;
}
...
}
La instrucción break se puede usar para simplificar el patrón de lectura:
Ejemplo:
while (true) {
lectura de un dato
if ( se acabaron los datos ) {
break;
}
... procesar dato
}
Modificar el programa que determina la distancia entre Santiago y otra ciudad de modo que ahora se acepten varias ciudades. El diálogo debe ser:
Nombre de ciudad ? valparaiso
La distancia entre Santiago y Valparaiso es 109 kilómetros
Nombre de ciudad ? Mendoza
La ciudad de Mendoza no se encuentra en mi base de datos
Nombre de ciudad ? arica
La distancia entre Santiago y Arica es 2030 kilómetros
(Ver el programa completo en BuscaCiudad3.java.)
while (true) { // Ciclo externo
// Dialogar para obtener la ciudad
print("Nombre ciudad ? ");
String ciudadBusc= lower(readLine());
if (compare(ciudadBusc,"fin")==0) {
break; // (A)
}
// Buscarla en el archivo dist.txt
TextReader lect= new TextReader("dist.txt");
while (!lect.eofReached()) { // Ciclo interno
String linea= lect.readLine();
if (lect.eofReached()) {
break; // (B)
}
String ciudad= lower(trim(substring(linea, 0, 20)));
int dist= parseInt(trim(substring(linea, 20, 4)));
println(ciudad+" "+dist+" "+ciudadBusc);
if (compare(ciudad, ciudadBusc)==0) {
println("La distancia entre Santiago y "+ciudad+" es "+dist+
" kilometros");
break; // (C)
}
}
if (lect.eofReached()) {
println("La ciudad de "+ciudadBusc+
" no se encuentra en mi base de datos");
}
lect.close();
}
Observaciones: