|
|
|
Exercici 1: L'altura de les capitals espanyoles
(obligatori) |
|
|
|
En aquest exercici repassareu les següents
habilitats: utilització de matrius,
entrada des del teclat, lectura
seqüencial de fitxers i lectura de
fitxers *.properties. |
|
|
|
Fareu una aplicació que servirà
per mostrar l'altura respecte el nivell del
mar de les capitals espanyoles. El programa serà multillenguatge:
en fareu una versió en català i una en castellà.
L'idioma es podrà triar tot modificant un fitxer de configuració.
L'aplicació operarà de la següent forma: llegirà
els fitxers de configuració, carregarà
les dades topogràfiques des del fitxer altures.txt,
preguntarà a l'usuari per la ciutat
l'altura de la qual vol consultar i, recorrent
la matriu de ciutats-altures, us donarà el número
de metres sobre el nivell del mar de la ciutat.
Per fer el programa necessiteu algunes peces:
Aquesta aplicació ha de ser el
projecte M3ex01,
el qual contindrà els diversos fitxers que la constitueixen.
- La primera peça que necessiteu és una classe
que serveix per emmagatzemar les parelles
de valors ciutat-altura. Creeu una nova classe del projecte M3ex01
que es digui Altura. Aquesta classe només
té dos camps (o variables d'instància): un String
que es diu ciutat i un int
que es diu altura. Creeu-les.
- Ara fareu la classe que conté
el mètode executable main(String[]
args). Poseu-li de nom M3ex01. Ha de
tenir mètode main(...), no ho oblideu!
- Dins el mètode main()
heu de crear un objecte Properties
que us servirà per llegir el fitxer de configuració.
Feu que aquest objecte llegeixi les dades
del fitxer conf.properties que heu
de posar a la mateixa carpeta on està la classe M3ex01.
Recordeu que la lectura de fitxers .properties
és al final de la pràctica
tres, que heu de protegir el mètode
main() amb les excepcions
FileNotFoundException i IOException,
i que heu d'importar els paquets corresponents.
- Creeu dins el mètode
main() la variable
String idioma. Ompliu-la
amb la propietat "idioma" del fitxer
de configuració conf.properties.
-
Un cop carregat l'idioma de l'aplicació, carregueu
el fitxer de missatges corresponent a l'idioma tot seguint
el mateix mètode que heu utilitzat per al fitxer de configuració
(podeu utilitzar el mateix objecte Properties).
Si al fitxer de configuració teniu el català com a llengua
(idioma=ca), el fitxer de missatges ha de
ser ca.properties. Si és castellà
(idioma=es), el fitxer de missatges ha de
ser es.properties. Una solució possible
per carregar el fitxer de missatges en funció de la variable
idioma és la següent:
props=new Properties();
in = new FileInputStream(idioma+".properties");
props.load(in); |
Així, si més endavant volguéssiu afegir el francès
al vostre programa, no us cal recopilar res, a conf.properties
poseu idioma=fr i creeu un fitxer fr.properties
amb els missatges.
- Creeu les variables
String benvinguda
i quinaciutat i ompliu-les
amb les propietats del mateix nom de l'objecte Properties
que acabeu de llegir. Per exemple,
String benvinguda=props.getProperty("benvinguda");.
- Prepareu, a partir d'aquestes
variables una sortida similar a:
amb sentències del tipus: System.out.println(benvinguda);.
- Feu la lectura de les dades
del fitxer altures.txt. Aquest fitxer conté,
a cada línia, una parella de dades <ciutat>;<altura>.
El que heu de fer és anar llegint el fitxer i, per a cada línia,
crear un objecte Altura on anotareu la ciutat
i l'altura corresponent. Cada nova línia és un nou objecte
Altura. A mesura que creeu noves altures,
les aneu afegint a un vector. Això
es pot fer de vàries formes. Aquesta és una possibilitat:
Vector v=new
Vector(); // El vector on posem
objectes Altura
Altura aCiutat=new Altura(); //
Un objecte Altura
String ciutat="";
String altura="";
boolean isAltura=false; //
conmutador per omplir ciutat o
//
altura
// -------- Creem el Stream de fitxer
i el llegim --------
int n=0;
char b;
FileInputStream fitxer=new FileInputStream("altures.txt");
try {
while
(n!=-1) {
n=fitxer.read();
b=(char)n;
if
(b!='\n') { // Si no estem
a final
//
de línia
if
(!isAltura && b!=';') {
ciutat=ciutat+b;
}
if
(isAltura) {
altura=altura+b;
}
if
(b==';') {
isAltura=true;
}
}
else {
aCiutat=new
Altura();
aCiutat.altura=Integer.parseInt(
altura.trim());
aCiutat.ciutat=ciutat.trim();
v.add(aCiutat);
ciutat="";
altura="";
isAltura=false;
}
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
fitxer.close();
} |
Investigueu si existeixen alternatives a aquest sistema.
- Un cop llegit i tancat el fitxer de dades, podeu passar
les dades del vector d'Altures a una matriu d'Altures (és
més fàcil de consultar). Podeu raonar perquè no
heu creat directament la matriu d'Altures
en lloc del vector en el moment de
fer la lectura del fitxer de dades.
Per crear una matriu a partir d'un
vector, heu de seguir sempre el mateix
procediment:
Objecte[] unamatriu = new
Objecte[v.size()];
for (int i=0; i<unamatriu.length;i++)
{
unamatriu[i]=(Objecte)v.get(i);
// casting obligatori!!!
} |
- Ara ja podeu fer la lectura
de teclat del nom de la ciutat. Creeu les variables String
laciutat, te, metres i desconeguda. per recollir
les frases de sortida. Feu un bucle while
que us vagi demanant noms de ciutats mentre no s'escrigui la paraula
"final". Quan l'usuari entri el nom de la ciutat, la matriu
recorrerà seqüencialment a la seva recerca. Si el programa
troba el nom, donarà l'altura topogràfica, si no, informarà
que la ciutat no existeix.
Per recórrer la matriu es pot seguir aquest sistema:
for
(int i=0;i<unamatriu.length;i++) {
altures[i].ciutat
// per accedir al camp ciutat
altures[i].altura
// per accedir al camp altura
} |
- El programa ha de funcionar aproximadament així:
- Canvieu d'idioma a conf.properties.
Poseu "es" en lloc de "ca".
Executeu novament el programa i observeu com canvia l'etiquetat del
programa.
|
|
|
|
Exercici 2 : Ordenació alfabètica
àmplia (optatiu) |
|
|
|
Es tracta de modificar l'aplicació
QSortC de la pràctica
1 perquè:
- L'ordenació
lexicogràfica es faci amb independència
de si les paraules han estat escrites en majúscules o en minúscules.
Observeu que ara, tal com està, tota paraula amb inicial majúscula
va abans que qualsevol paraula amb inicial minúscula. La clau
és al mètode static
boolean anteriorA (String obX,String obY):
consulteu la documentació
de la classe java.lang.String
per veure quina modificació cal fer-hi.
- Implementeu a la classe
el mètode
public static String laPrimeraAMajuscula (String
str). Aquest mètode ha de retornar
una cadena (string)
igual a la que se li dóna com a paràmetre,
excepte que la primera lletra ha d'haver estat transformada a majúscula,
si no és que ja ho era.
- Canvieu la línia
System.out.print (matriu[i]+"
"); |
del mètode
static void printMatriu (String[] matriu)
per aquesta altra
System.out.print (laPrimeraAMajuscula(matriu[i])+"
"); |
perquè la impressió es faci amb totes
les inicials majúscules, sense haver canviat les cadenes
(strings)
llegides i emmagatzemades a la matriu
matriu.
Aquesta nova aplicació
ha de ser el projecte M3ex02,
el fitxer ha de ser M3ex02.java
i la classe ha de ser M3ex02.
L'ús a la línia de comanaments
ha de ser aquest:
|
|
|
|
|
Exercici 3: Un vector d'alumnes i un paquet
d'alumnes (optatiu) |
|
|
|
Ara cal transformar i fer l'aplicació
M3ex02, una mica més sofisticada. L'aplicació
corresponent a aquest exercici serà el projecte
M3ex03, el fitxer
ha de ser M3ex03.java i la classe
ha de ser M3ex03. L'ús a la línia
de comanaments ha de ser aquest:
|
|
|
|
|
- Els paràmetres
de l'usuari han de ser tríades
de cadenes, és
a dir, un nombre de cadenes
múltiple de tres. S'entén que són el
nom, el cognom primer
i el cognom segon.
Si no hi ha algun d'aquests elements, l'usuari l'ha de substituir per
un caràcter que
no sigui una lletra.
- El programa recollirà els paràmetres
i de cada tres en farà una instància
de la classe
d110.alumnes.Alumne:
package d110.alumnes;
public class Alumne {
public String nom; //
Tres variables de classe per
public String cognom1; //
emmagatzemar el nom i els
public String cognom2; //
cognoms.
public Alumne (String nm,String cnm1,String
cnm2) {
nom=Alumne.normalitza(nm); //
Emmagatzemament i
cognom1=Alumne.normalitza(cnm1); //
normalització de
cognom2=Alumne.normalitza(cnm2);
// noms i cognoms.
}
static String normalitza (String str)
{ // Normalització
String inicial=str.substring(0,1);
// El primer
//
caràcter
//
de la cadena
if
(inicial.compareTo("A")>=0&& //
És una
inicial.compareTo("Z")<=0)
{ // majúscula?
return
str; // Sí. No facis res
}
else if (inicial.compareTo("a")>=0&& //
És una
inicial.compareTo("z")<=0)
{// minús-
//cula?
inicial=inicial.toUpperCase();
// Sí. Fes-la
String
resta=str.substring(1); //
majúscula i
return
inicial+resta; //
retorna la
//
cadena amb el
//
canvi.
}
else { // No és una lletra
return
""; // Retorna una cadena
buida.
}
}
public boolean compareTo (Alumne alumne)
{
return (cognom1.compareToIgnoreCase(alumne.cognom1))<0;
}
public void imprimeixAlumne () {
System.out.println(cognom1+","+cognom2+";"+nom);
}
}
|
- Aquesta classe,
d110.alumnes.Alumne, tal
com el nom complet ja indica, ha d'estar al paquet
(package) d110.alumnes.
Aquest paquet
heu de posar-lo a la carpeta c:\java\paquets
de la vostra màquina, en una arrel ben diferent
de la localització del codi de la classe
M2ex02.
- Els objectes
de la classe
d110.alumnes.Alumne que
es vagin creant els heu de dipositar en un vector
enlloc d'una matriu, tal
com es feia a l'exercici anterior.
- L'ordenació Quick
Sort s'ha de fer directament sobre el vector.
Això implica que heu de modificar adequadament els mètodes
static void quickSort (Vector vector,int posInici,int
posFinal) i static void intercanvia (Vector
vector,int i,int j). També heu de modificar
el mètode static
boolean anteriorA (Object obX,Object obY)
fent servir el mètode
public boolean compareTo (Alumne alumne) de
la classe d110.alumnes.Alumne.
- La impressió dels noms ben ordenats i en
la forma <cognom1>,<cognom2>;<nom>
cal fer-la aprofitant el mètode
public void imprimeixAlumne () de
la classe d110.alumnes.Alumne.
|
|
|
|
Tramesa al vostre tutor |
|
|
|
Comprimiu la carpeta M3ex01
(i les dues carpetes M3ex02
i M3ex03, i la carpeta
c:\java\paquets\d110 si és que heu fet els exercicis optatius)
en un fitxer ZIP
que es dirà <nom_usuari>_m3.zip
i trameteu-lo al vostre tutor. Recordeu
quina ha de ser l'estructura normalitzada de les
carpetes de cada projecte (vegeu mòdul
1, pràctica 4). |
|
|
|
|
|
|
 |
|
|
|
|