Mòdul 2   

Pràctica 4: Les sentències de control condicionals.
Tornar presentació tema
    Pràctica 1 Pràctica 2 Pràctica 3 Pràctica 4 Pràctica 5 Pràctica 6  
     
  En aquesta pràctica aprendràs a afegir als teus programes sentències de control condicionals. Amb aquestes eines podràs fer que els teus mètodes prenguin decisions en funció de l'estat dels objectes.

 
     
  La sentència condicional if  
     
 

Si repasses el funcionament del programa que has analitzat en aquest mòdul observaràs que gairebé no tens control sobre el que passa com a conseqüència de les accions que vas fent. Han d'existir instruments que ens permetin escriure en Java coses similiars a aquestes: "si el saldo de la targeta és zero, no deixis que l'usuari faci la trucada" o "si una trucada és a l'estranger, aplica la tarifa internacional".

Aquesta feina la fan les sentències de control condicional. No són les úniques, més endavant descobriràs que també hi ha sentències de control d'iteració.

La més simple de les sentències condicionals és el condicional if. Si has estudiat programació d'ordinadors abans ja sabràs que es tracta d'una sentència molt popular, present d'alguna forma o altra en gairebé tots els llenguatges de programació.

La seva forma és la següent:

if (un test que dóna cert o fals) {
    coses a fer si él test és cert
} else {
    coses a fer si el test és fals
}

El test, que sempre es posa entre parèntesis, ha de ser qualsevol sentència Java que generi un resultat de tipus boolean (és a dir una variable lògica que pot prendre els dos valors de la lògica formal). El tipus boolean és un dels tipus primitius de Java. A la classe Mobil has utilitzat un munt de variables de tipus int, un altre tipus primitiu de Java.

Tot seguit tens alguns exemples de sentències que tornen un valor boolean. Habitualment són sentències que comparen valors. Posem un valor a l'esquerra, afegim un operador de comparació i un altre valor a la dreta. Si s'acompleix la sentència de comparació, el valor de retorn és true, cert. Si no s'acompleix, el valor de retorn es false, fals.

saldo>=50000
ja l'has vist a la pràctica anterior. El test retorna true si el saldo és més gran o igual a 50000.

saldo<10000
Retorna true si el saldo és inferior a 10000.

saldo==2500
Retorna true si el saldo és igual a 2500.

saldo>=2500 && saldo<5000
Retorna true si el saldo és superior o igual a 2500 i inferior a 5000.

saldo>10000 || trucades==0
Retorna true si el saldo és superior a 10000 o el número de trucades és 0. I també retorna true si es compleixen les dues condicions alhora.

10000>1
Retorna true.

1>2
Retorna false.

true
Doncs, retorna true.

 
     

Vigila a l'hora de fer les sentències de comparació. L'expressió saldo=2500 no és una sentència de comparació, és una sentència d'assignació. Significa que saldo pren el valor 2500. Com que no retorna un valor boolean, si utilitzes aquesta expressió a la zona de test d'una sentència if el compilador et farà saltar un error.

  • Adona't, doncs, que el signe d'igual per fer una comparació s'escriu amb dos signes = un a continuació de l'altre. Per exemple trucades==0
  • Adona't, també, que es poden fer comparacions múltiples fent servir les partícules lògiques i (&&) i o (||).
 
     
 


La secció else no és obligatòria, pots escriure una sentència d'aquest tipus:

if (un test que dóna cert o fals) {
    coses a fer si él test és cert
}
si el test és fals, el programa continua sense executarse el contingut de l'if

Estirant cap a la simplicitat, les claus {} tampoc no són obligatòries si només hi ha una línia a dins del cos de l'if:

if (un test que dóna cert o fals) només faré això si és cert;
 
     

Anem a donar una mica de vida al mòbil afegint alguna sentència if. El nostre programa és molt generós amb els usuaris: els deixa fer trucades encara que no tinguin saldo. El teu cap de projecte no pot estar massa content de la teva eficàcia com a programador. T'encarrega que modifiquis el programa perquè quan algú vol fer una trucada només sigui possible si el saldo és positiu. Cas que el saldo sigui insuficient, el programa ha d'emetre un avís.

Obre el i modifica el mètode truca de la següent forma:

/**
* Fa una trucada del número de passos que triem. Decrementa
* el nostre saldo en funció del preu de cada pas
*/
public void truca(int passos) {
    trucades++;
    if ((passos*preu)<saldo) {
        saldo-=(passos*preu);
    }else{
        System.out.println
            ("Trucada impossible, saldo insuficient");
    }
}

 

 
  • Recordes que trucades++ equival a trucades+=1 i també a trucades=trucades+1?
    Oi que és raonable que cada vegada que truquem fem això?
 
     
 

Crea un objecte i fes algunes trucades; quan et quedis sense saldo per fer una trucada el programa t'ho indicarà.

Modifica ara el mètode truca perquè, en el moment que l'usuari vulgui fer una trucada per a la qual no tingui saldo, el programa indiqui el saldo disponible, el preu de la trucada i l'import amb què s'ha de recarregar la targeta perquè la trucada sigui possible.

 
     

Exercicis: Si tens més ganes de treballar, aquestes són algunes de les coses que pots fer afegint sentències if al programa:

  • Com que demanar el saldo amb printSaldo costa diners (una unitat monetària), avisa l'usuari que la targeta no té fons quan es vulgui executar printSaldo i el saldo sigui només 0 o 1.
  • Controla la càrrega excessiva d'una targeta. Impedeix que un saldo pugui ser superior a 100000 unitats monetàries.
  • Premia els usuaris fidels: quan s'arribi a les 10 trucades, regala 10 unitats monetàries a l'usuari i avisa'l del premi.
  • Vigila els "llestos" que intentin fer trucades amb una quantitat negativa de passos i així recarregar la targeta fraudulentament. Filtra que el número de passos no pugui ser negatiu.
 
  La sentència condicional switch  
 


Sempre que hagis d'establir condicions amb números enters pots utilitzar la sentència condicional switch. És molt eficaç quan l'arbre d'alternatives té moltes branques.

Imagina el següent problema. Hem de fer una utilitat que serveixi per a classificar les trucades en la següent categoria: barates, cares i molt cares. Si una trucada suposa 1 o 2 passos és barata. Si en costa entre 3 i 10 és cara i si en costa més és molt cara. Aquest tipus de situació és complicada de resoltre amb sentències if. El que s'utilitza són sentències switch.

Modifica el mètode truca() de la forma següent, amb una sentència condicional switch que després explicarem:

/**
* Fa una trucada del número de passos que triem. Decrementa
* el nostre saldo en funció del preu de cada pas
*/
public void truca(int passos) {
    trucades++;

    if ((passos*preu)<saldo) {
        saldo-=(passos*preu);
    }else{
        System.out.println
            ("Trucada impossible, saldo insuficient");
    }

    switch(passos) {
        case 1:
        case 2: System.out.println("La trucada és barata");
                break;
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 10: System.out.println("La trucada és cara");
                 break;
        default: System.out.println
             ("La trucada és molt cara");
    }
}

Fes diferents trucades i observa com et respon el programa.

La sentència funciona així:

  • definim quin enter serà avaluat, en el nostre cas, el número de passos gastats en la trucada switch(passos).

  • A l'entrar a la sentència, el programa va cap al case que encaixa amb el valor de l'enter passos o, si el valor no és a la llista, cap a default.
    • Per exemple, si el número de passos és 3, el programa intentar executar totes les sentències que hi ha dins dels case posteriors al case 3, de dalt a baix, fins a trobar-se amb un break o arribar al final de la llista. Així doncs, si el número de passos és 3, el programa entra a case 4, case 5, etc fins arribar a case 10, executa el System.out.println() i com que després es troba un break, salta al final de la sentència de control.
    • Si el número de passos fos 1, el programa entraria pel case 1, no trobaria res, passaria al case 2, executaria el System.out.println() del case 2 i com després es trobaria amb el break, saltaria al final de la sentència de control.

  • Molta atenció, doncs, a no deixar-se els break: és un error freqüentíssim de principiant!
 
     
  Molt bé! En aquesta pràctica has après algunes qüestions bàsiques que ja et fan possible l'escriptura de