Enrera
Mòdul 3
Iniciació a la programació en Java
  Exercicis
   
 
   
  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.

  1. 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.

  2. 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!

  3. 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.

  4. Creeu dins el mètode main() la variable String idioma. Ompliu-la amb la propietat "idioma" del fitxer de configuració conf.properties.

  5. 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.

  6. 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");
    .

  7. Prepareu, a partir d'aquestes variables una sortida similar a:


    amb sentències del tipus: System.out.println(benvinguda);.

  8. 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.

  9. 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!!!
        }

  10. 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
        }

  11. El programa ha de funcionar aproximadament així:


  12. 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è:

  1. 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.

  2. 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.

  3. 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:

   
 
  1. 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.

  2. 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);
        }

    }


  3. 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.

  4. 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.

  5. 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.

  6. 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).
   
   
 
Amunt