Mòdul 3

Pràctica 1: Matrius, vectors i d'altres cucs (I)   
Tornar presentació tema
Pràctica 1 Pràctica 2 Pràctica 3 Pràctica 4 Pràctica 5 Pràctica 6  
     
 

A vegades convé tenir un conjunt de dades, homogènies (totes del mateix tipus) o no, agrupades sota un únic nom de variable.

Tots els llenguatges de programació tracten aquesta qüestió d'una manera o altra i Java ho fa de maneres diverses, des de la més simple (matrius) fins a d'altres força sofisticades. Com és obvi, comencem per les coses senzilles:

 
     
  Matrius:  
     
  Una matriu (array, en anglès) és (de moment) una tirallonga de n dades, totes del mateix tipus, etiquetades des de la primera, amb etiqueta l'enter 0, fins l'última, amb l'etiqueta n-1. (De 0 a n-1 hi ha n nombres: compta bé, si et plau!)  
     
 

Pots imaginar què passa a la memòria de la màquina quan li demanem que guardi les paraules "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres" , "Dissabte" i "Diumenge", ben endreçadetes, amb el nom exempleDeMatriu com a nom de variable:

  1. S'obren set forats, preparats per rebre, cadascun d'ells, un objecte de tipus String (una paraula, vaja).

  2. Cadascun dels forats rep una etiqueta, del 0 al 6. Ara la màquina coneix tot el conjunt com a "exempleDeMatriu" i cadascun dels elements com a "exempleDeMatriu[0]", "exempleDeMatriu[1]", "exempleDeMatriu[2]", etc., fins a "exempleDeMatriu[6]".

  3. Finalment, a cadascun dels forats, s'hi diposita l'objecte String corresponent: "Dilluns" a exempleDeMatriu[0], "Dimarts" a exempleDeMatriu[1], etc.
 
  Com es fa això?  
     
  Hi ha diverses opcions. La més curta és aquesta: es defineix la matriu (amb el tipus String perquè és una matriu de paraules) i en la mateixa línia ja se li assignen els valors, com hem fet moltes vegades amb les variables.  
     

String[] exempleDeMatriu={"Dilluns","Dimarts",
                           "Dimecres","Dijous",
                           "Divendres","Dissabte",
                           "Diumenge"};

 
     
  que és útil en determinats casos, però en molts menys d'allò que pugui semblar a primera vista. Una altra seria aquesta:  
     
// "Avisem" al compilador que ve una matriu de paraules (strings)
String[] exempleDeMatriu;

// El compilador obre set espais per posar-hi una paraula a
// cadascun d'ells

exempleDeMatriu=new String[7];

// Ara ja només cal omplir efectivament aquests espais
exempleDeMatriu[0]="Dilluns";
exempleDeMatriu[1]="Dimarts";
exempleDeMatriu[2]="Dimecres";
exempleDeMatriu[3]="Dijous";
exempleDeMatriu[4]="Divendres";
exempleDeMatriu[5]="Dissabte";
exempleDeMatriu[6]="Diumenge";
 
     
  Fem-ho funcionar!    
     
Posem ara tot això en funcionament. Crea un nou projecte que es digui Matrius i, en aquest projecte, crea la classe MatriusDeParaules amb aquest codi:  
     
 

/**
* Manipulació elemental de matrius I.
*
* @author Carles Romero
* @version 2004/02/06
*/

public class MatriusDeParaules {

    /**
     * Una matriu amb els noms dels dies de la setmana
       en català.
     */
    String[] diesDeLaSetmana={"Dilluns","Dimarts","Dimecres",
                            "Dijous","Divendres","Dissabte",
                              "Diumenge"};

}

 
     
  Ara la compiles i, després, crea un objecte d'aquesta classe. El nom que, per a aquest objecte proposa ja va bé:  
     
 
 
     
  Ara inspeccionarem l'objecte  
     
 
 
     
 

i, com és d'esperar, només hi haurà la variable diesDeLaSetmana, la qual podem, també, inspeccionar:

 
     
 
 
     
  veure'n la longitud (length), que és 7, i què hi ha a cadascun dels seus set espais:  
     
 
 
     
  Tot remenant una matriu...  
     
  Fins aquí, la nostra classe MatriusDeParaules només és un dipòsit de dades estàtic, mort... Cal incorporar-hi alguns mètodes per fer-la més interessant..  
     
  Comencem amb un mètode que ens permetrà recuperar què hi ha a qualsevol dels set espais. Afegeix aquest codi a sota de la definicio de diesDeLaSetmana:  
     
/**
* Manipulació elemental de matrius I.
*
* @author Carles Romero
* @version 2004/02/06
*/
public class MatriusDeParaules {

    /**
     * Una matriu amb els noms dels dies de la setmana en català.
     */
    String[] diesDeLaSetmana={"Dilluns","Dimarts","Dimecres",
                            "Dijous","Divendres","Dissabte",
                              "Diumenge"};

    /**
     * Mètode que retorna què hi ha a la matriu diesDeLaSetmana,
     * element per element
     * @param n la posició de la qual demanem què hi ha
     * @return la paraula que hi ha a la posició n
     */

    public String queHiHa (int n) {
        return diesDeLaSetmana[n];
    }
}
 
     
  Ara, com abans, torna a compilar i crea un objecte de la classe MatriusDeParaules. Però ara executa el mètode que acabes d'implementar:  
     
 
 
     
  Com que el mètode String queHiHa(int n) necessita el paràmetre enter n per executar-se, BlueJ te'l demana:  
     
 
 
     
  I, en acceptar, et retorna (return) el String que ocupa el quart lloc (índex 3!) a la matriu diesDeLaSetmana:  
     
 
 
     
  Què passa si demanes un índex inexistent, posem un 8, quan els índexs van de 0 a 6? Provem-ho: torna a demanar l'execució del mètode String queHiHa(int n), però ara posa-li un 8 com a paràmetre.  
     
 
 
     
  La Màquina Virtual de Java ha vist que no podia complir l'ordre i escup una excepció ArrayIndexOutOfBoundsException (que és més o menys "Excepció d'Index de la Matriu Fora de Límits"). Llavors, la capta, t'ensenya la línia de codi on hi ha hagut l'error (línia 23, en gris) i et mostra l'excepció i el valor que l'ha produït (8).  
     
Aquests errors són errors en temps d'execució i el compilador no els pot detectar: el teu programa pot tenir la sintaxi absolutament correcta però estar farcit d'errors d'aquesta mena!  
     
  Ara canviem-hi coses...    
     
  Ara farem per canviar les paraules que hi ha enmagatzemades a la matriu diesDeLaSetmana. Afegeix aquest nou mètode a la classe MatriusDeParaules:  
     
/**
* Manipulació elemental de matrius I.
*
* @author Carles Romero
* @version 2004/02/06
*/
public class MatriusDeParaules {

    /**
     * Una matriu amb els noms dels dies de la setmana en català.
     */
    String[] diesDeLaSetmana={"Dilluns","Dimarts","Dimecres",
                            "Dijous","Divendres","Dissabte",
                              "Diumenge"};

    /**
     * Mètode que retorna què hi ha a la matriu diesDeLaSetmana,
     * element per element
     * @param n la posició de la qual demanem què hi ha
     * @return la paraula que hi ha a la posició n
     */
    public String queHiHa (int n) {
        return diesDeLaSetmana[n];
    }

    /**
     * Mètode que posa una paraula a una certa posició de la
     * matriu diesDeLaSetmana.
     * @param paraula la paraula que volem posar
     * @param n la posició en la qual la volem posar
     */

    public void posaParaula (String paraula,int n) {
        diesDeLaSetmana[n]=paraula;
    }
}
 
     
  Compila, crea un objecte de la classe MatriusDeParaules i demana el mètode void posaParaula (String paraula,int n):  
     
 
 
     
  Ara són dos paràmetres: la paraula (que, com que és un String, has de posar entre cometes!) i la posició. I com que el mètode és void, no ens retorna res: BlueJ traga la paraula i no ens diu res més...  
     
  Però la feina ja està feta: podem inspeccionar l'objecte, com abans, i la seva matriu diesDeLaSetmana:  
     
 
 
     
  o bé executar el mè