Unitat Didàctica 1:
En aquesta unitat aprendràs:
IO.println()var i constants final? :switchIO.readln()El HelloWorld!™️ es el clàssic primer programa que veu tot programador. Aquí el tens en Java 26:
Observa la sintaxi:
void main() és el punt on la màquina comença a executar el teu programa.{ ... } delimiten el cos d'ordres que formen el programa.println(...) indica a l'ordinador que mostri un text a la pantalla i salti a la línia següent.;).Un literal és un valor fix que apareix directament escrit al codi font del programa. La màquina distingeix diferents tipus de dades segons la seva naturalesa:
Són números sense part decimal. Poden ser positius o negatius. Per millorar la llegibilitat de nombres llargs, Java permet fer servir guions baixos (_):
S'escriuen amb un punt (.) com a separador decimal (no amb una coma):
Qualsevol seqüència de caràcters envoltada entre cometes dobles ("..."):
Un sol caràcter envoltat entre cometes simples ('...'):
Només poden tenir dos valors: true o false. Són la base per a prendre decisions:
Per recordar dades que necessitarem més endavant, reservem un espai a la memòria RAM i li donem un nom. Aquest espai s'anomena variable.
Com es veu a la memòria de l'ordinador?
Inferència de tipus amb var:
En Java modern podem utilitzar la paraula clau var quan inicialitzem la variable immediatament. El compilador dedueix el tipus automàticament:
Un operador és un símbol especial que indica a l'ordinador que realitzi una operació matemàtica, relacional o lògica sobre un o diversos valors, anomenats operands.
La combinació d'operadors, variables i literals s'anomena expressió. Tota expressió, en avaluar-se, produeix un únic valor d'un tipus concret.
Són els operadors matemàtics bàsics per realitzar càlculs numèrics:
+ : Suma- : Resta* : Multiplicació/ : Divisió% : Mòdul o residu de la divisió enteraPrecedència aritmètica: Igual que a les matemàtiques escolars, *, / i % tenen prioritat respecte a + i -. Pots fer servir parèntesis ( ) per forçar o clarificar l'ordre d'avaluació:
Tipus dels operands i divisió entera:
El tipus del resultat depèn del tipus dels operands utilitzats:
int), el resultat és obligatòriament un int. A la divisió, es descarta la part decimal (es trunca cap a zero).float o double), el resultat es promociona automàticament a decimal.Ús de suma i resta amb cadenes (String) i caràcters (char):
String: Quan l'operador + s'utilitza i un dels operands és un text, Java no suma matemàticament, sinó que concatena (uneix) les dades en una nova cadena de text (String):
char): A Java, els caràcters s'emmagatzemen a la memòria amb el seu codi numèric Unicode/ASCII (per exemple, 'A' és 65, 'B' és 66, i 'a' és 97). Per tant, es poden sumar i restar amb nombres o entre ells:
Operadors d'assignació composta (+=, -=, *=, /=, %=):
Són una drecera molt habitual per modificar el valor d'una variable i reassignar el resultat a ella mateixa en un sol pas:
Operadors unaris d'increment i decrement (++, --):
Permeten sumar o restar 1 a una variable numèrica de manera ràpida. S'escriuen després del nom de la variable (post-increment i post-decrement):
x++ : Incrementa el valor de la variable en 1 (equivalent a x = x + 1).x-- : Decrementa el valor de la variable en 1 (equivalent a x = x - 1).Permeten comparar dos valors entre si. El resultat d'una comparació és SEMPRE un valor booleà (boolean: true o false):
== : Igual a!= : Diferent de< : Menor que> : Major que<= : Menor o igual que>= : Major o igual queMolt important: Com es comparen les cadenes de text (String)?
L'operador == en cadenes de text no compara el text contingut, sinó si les dues variables apunten exactament a la mateixa referència física a la memòria RAM. Si compares cadenes amb ==, el teu programa tindrà errors imprevisibles!
Per comparar el contingut d'un text cal utilitzar sempre el mètode .equals() o .equalsIgnoreCase():
A diferència dels aritmètics i relacionals (que ja coneixes de les matemàtiques bàsiques), els operadors lògics són nous per a molts estudiants. S'utilitzen per combinar múltiples condicions o invertir-ne el resultat. Els seus operands han de ser de tipus boolean i retornen sempre un boolean:
&& (AND lògic / conjunció "I"):
Retorna true únicament si TOTS DOS operands són true. Si un d'ells (o tots dos) és false, el resultat final és false.
Exemple de la vida quotidiana: "Per conduir legalment cal tenir 18 anys o més I tenir el carnet vigent".
|| (OR lògic / disjunció "O"):
Retorna true si ALMENYS UN dels operands és true (o si tots dos ho són). Només retorna false quan tots dos operands són falsos.
Exemple de la vida quotidiana: "Tens descompte al transport si ets menor de 25 anys O si ets pensionista".
! (NOT lògic / negació):
És un operador unari que inverteix el valor de la condició: converteix true en false, i false en true.
Exemple de la vida quotidiana: "Si NO està plovent, sortirem a córrer".
Avaluació en curtcircuit (Short-circuit Evaluation):
Java optimitza l'avaluació d'expressions lògiques d'esquerra a dreta i s'atura tan bon punt el resultat final ja és segur:
A && B: si A és false, el resultat serà fals amb total certesa; per tant, Java mai no arriba a avaluar B.A || B: si A és true, el resultat serà cert amb total certesa; per tant, Java tampoc no avalua B.Això és clau per escriure condicions segures, com ara evitar divisions per zero:
Precedència entre operadors lògics:
Si s'escriuen diversos operadors lògics seguits sense parèntesis, l'ordre d'avaluació és:
! (Negació: màxima prioritat)&& (AND: té prioritat sobre l'OR, equivalent a la multiplicació)|| (OR: menor prioritat, equivalent a la suma)Als programes reals és habitual combinar operadors aritmètics, de comparació i lògics en una única expressió. Java resol cada part seguint una jerarquia de precedència estricta:
Jerarquia de precedència general en Java (de major a menor prioritat):
( ): Màxima prioritat absoluta. Utilitza'ls sempre per garantir l'ordre desitjat i facilitar la lectura del codi!++, --, !, (càsting)*, /, %+, - (i concatenació de text +)<, >, <=, >===, !=&&||? : i Expressions switch=, +=, -=, *=, /=, %= (prioritat mínima)? :)L'operador ternari és una construcció concisa i elegant que permet escollir entre dos valors possibles segons una condició booleana. És l'únic operador del llenguatge que compta amb tres operands:
Com funciona?
condicio (que ha de resultar en un boolean: true o false).true, l'operador retorna el resultat de l'expressió situada abans dels dos punts (:).false, l'operador retorna el resultat de l'expressió situada després dels dos punts.Tipus de retorn: Les dues branques (valor cert i valor fals) han de retornar valors de tipus compatibles entre si (per exemple, ambdues cadenes String o ambdues valors numèrics):
Mentre que l'operador ternari (? :) és ideal per escollir entre dos valors segons una condició booleana, les expressions switch permeten avaluar un valor i seleccionar el resultat corresponent entre múltiples opcions possibles d'una forma molt neta, segura i directa.
A diferència de les estructures tradicionals, una expressió switch:
->) a cada cas, sense necessitat d'escriure break (evitant errors de caiguda accidental).case 1, 2, 3 ->).default.Quan treballem amb dades, molt sovint necessitem transformar un valor d'un tipus a un altre. En Java hem de distingir dos escenaris clarament diferenciats segons la naturalesa de les dades:
int i double).String).Quan convertim entre tipus numèrics primitius, trobem dues situacions:
int a double). Com que el tipus destí té més capacitat de bits, no hi ha cap perill de pèrdua d'informació i Java ho fa automàticament:
double a int). Com que hi pot haver pèrdua de precisió o desbordament, el compilador ens obliga a indicar el tipus destí explícitament entre parèntesis (tipus):
Què passa si tenim el text "42" i volem tractar-lo com a nombre? Un String NO és un tipus primitiu numèric, sinó una seqüència de caràcters de text emmagatzemada com a objecte. Per tant, no és possible fer un càsting directe:
Per obtenir el valor numèric real a partir dels caràcters d'un text cal interpretar o analitzar el text símbol a símbol. Aquest procés s'anomena en informàtica parsing. Java proporciona funcions estàndard per fer aquest procés:
Integer.parseInt(text) : Analitza el text i en retorna el valor enter (int).Double.parseDouble(text) : Analitza el text i en retorna el valor decimal (double).Compte amb el contingut del text!
Si el text que passem a Integer.parseInt() o Double.parseDouble() no és un número vàlid (per exemple, conté lletres com "hola" o caràcters invàlids), el programa s'aturarà amb un error en temps d'execució (NumberFormatException) perquè la màquina no pot interpretar caràcters no numèrics com a xifres.
Fins ara, els nostres programes només mostraven informació fixa amb println(). Però els programes reals són interactius: demanen dades a l'usuari a través de la consola i calculen respostes segons el que aquest introdueixi.
En Java 26 podem llegir el que l'usuari escriu pel teclat mitjançant la instrucció IO.readln():
Com funciona IO.readln()?
IO.readln() retorna SEMPRE un text (String). Encara que l'usuari escrigui un número com el 42, la màquina rep la cadena "42".Com que el que l'usuari escriu és sempre un String, si intentem fer operacions matemàtiques directament amb l'operador +, Java concatenarà el text en lloc de sumar-lo:
Per poder operar amb nombres introduïts per l'usuari, apliquem el que hem après a la secció anterior: fem servir el parsing (Integer.parseInt() o Double.parseDouble()) sobre el text llegit:
Posa a prova el que has après completant els qüestionaris interactius auto-avaluables i els reptes de programació.