Tipus bàsics de dades
Objectius
- Saber què s’entén per objecte i com es declara.
- Entendre què és un tipus bàsic o elemental de dades.
- Conèixer quines classes de valors pot guardar cada tipus de dades.
- Entendre el concepte de variables i constants.
- Conèixer les operacions disponibles per a cada tipus de dades.
- Aprendre què és una expressió i com s’avalua.
Introducció
Els algorismes i programes requereixen manipular informació. Habitualment, a partir d’unes dades d’entrada, retorna unes dades de sortida.
Tota aquesta informació es guarda en els objectes, els quals en memòria quedaran codificats en codis binaris (seqüències de zeros i uns), tant si es tracta d’una lletra com d’un nombre. Els tipus de dades ens permeten assignar el tipus d’aquests objectes, la qual cosa defineix quina longitud tenen en memòria en bytes (1 byte = 8 bits, on un bit és un 0 o un 1) i com els interpretem, així com quins valors poden guardar i les operacions que podem fer amb ells.
En aquesta unitat s’introdueixen els tipus bàsics o elementals, que ens permetran definir objectes simples. Més endavant, veurem com construir nous tipus més complexos a partir d’aquests.
1. Tipus elementals i objectes
Cal guardar la informació que manipula un programa a la memòria de l’ordinador. En els inicis de la programació, quan es programava en llenguatge màquina, per a accedir i manipular la informació correctament calia conèixer l’adreça de la memòria on estava guardada cada dada i el nombre de bytes necessaris per a representar-la. Calia fer totes les operacions comptant bytes i coneixent les adreces, la qual cosa complicava molt la programació.
Per a facilitar la programació, va aparèixer el concepte de variable. Una variable és un nom simbòlic que fa referència a una informació concreta guardada en memòria. Ara bé, no s’ha de pensar en una variable únicament com una adreça de memòria ja que té més informació associada. De fet, una variable consta, com a mínim, dels següents atributs o característiques:
- Nom o identificador: identifica la variable.
- Tipus: indica quins valors es poden guardar dins de la variable i determina l’espai en memòria necessari per a fer-ho.
- Valor emmagatzemat de la variable en un moment concret.
- Adreça: indica l’adreça de memòria on està emmagatzemada la variable.
- Visibilitat: indica en quines parts del programa o algorisme es pot utilitzar la variable.
Ara pot semblar complex parlar de tots aquests atributs, però, com s’anirà veient, són conceptes fonamentals amb els quals es treballa constantment.
Hi ha alguns casos en què interessa que el valor de la variable no es pugui modificar mai durant l’execució del programa. Els llenguatges de programació permeten identificar d’una manera especial aquests objectes que no volem modificar. S’anomenen constants. Així, una constant és una variable que no es pot modificar. Té els mateixos atributs que una variable, excepte que només té un valor possible.
Vegem amb més detall els atributs o característiques de les variables.
- Nom o identificador d’una variable. Una variable pot tenir qualsevol nom simbòlic que vulguem donar-li. És recomanable que el nom ajudi a entendre el tipus d’informació que guarda. Per exemple, si volem guardar el saldo d’un compte bancari, podríem anomenar la variable saldo, i si volem guardar el cost d’un bé, podem anomenar-la cost. Cal tenir en compte que, en tots dos exemples, el valor que guardarà la variable serà un nombre real, però el nom ajuda a entendre el significat del contingut de la variable dins del programa.
- Tipus de dades d’una variable. El tipus de dades descriu el conjunt de possibles valors que pot prendre una variable i, per tant, també el conjunt d’operacions que es poden realitzar amb ella. Veurem que hi ha tipus elementals de dades i també tipus més complexos que es tractaran més endavant.
- Valor d’una variable. El valor guardat d’una variable és el valor concret que té en un moment donat de l’execució del programa. El valor anirà canviant segons les operacions que es facin amb ella i sempre haurà de ser un valor dins del rang de valors vàlids segons el tipus definit per la variable.
- Adreça de memòria d’una variable. L’adreça de memòria és un enter que indica en quina posició de la memòria està guardat el valor de la variable. Internament, durant l’execució, l’adreça s’utilitza per a saber on guardar i on trobar el valor de la variable a cada moment. En llenguatge algorísmic no es pot treballar amb l’adreça directament, però en el llenguatge C sí que es pot, com es veurà més endavant.
- Visibilitat de la variable. Un algorisme està format per diferents parts, com s’estudiarà en una propera unitat. Les variables només seran visibles en determinades parts de l’algorisme segons on estiguin definides. Per exemple, en un bloc, cada veí pot veure i canviar els mobles de casa seva, però no pot veure ni canviar els dels altres veïns. En canvi, els mobles de l’entrada a l’edifici són compartits i visibles per a tots els veïns. Amb les variables passa el mateix.
1.1. Tipus elementals
1.1.1. Tipus enter
El tipus enter és un dels més utilitzats a l’hora de programar. Ara bé, cal tenir en compte que el tipus enter en informàtica no és idèntic al concepte matemàtic del tipus enter. Des del punt de vista matemàtic, el nombre d’enters és infinit, però la memòria de l’ordinador no ho és i, per tant, el rang de valors que es pot assignar a una variable de tipus enter està entre dos valors concrets, un enter mínim MININTEGER i un enter màxim MAXINTEGER. Aquests valoris límit dependran de l’ordinador que s’utilitzi.
En síntesi:
Identificador | integer |
---|---|
Rang de valors | des de MININTEGER fins a MAXINTEGER |
Operadors interns | - (canvi de signe), + ,- , * , div, mod |
Operadors externs | =, ≠, < , > , ≤ , ≥ |
Exemples | 3, -123, 9876, 0 |
Nota 1: recordeu que els operadors interns són aquells que fan que el resultat d’operar dos valors d’un tipus retorni un valor del mateix tipus, mentre que els operadors externs són aquells el resultat de l’operació dels quals és un valor d’un tipus diferent.
Exemples:
8 * 4 = 32, el resultat de multiplicar dos enters és un altre enter.
56 + 20 = 76, el resultat de la suma de dos enters retorna un altre enter.
En canvi:
8 > 45 = fals, el resultat és de tipus booleà (tipus que s’estudiarà a continuació).
Nota 2: dels operadors indicats, els menys coneguts són div i mod, que precisament en programació s’utilitzen bastant. Recordem que quan fem una divisió tenim el següent:
dividend = quocient * divisor + resta
L’operador div retorna el quocient de la divisió de dos enters. El resultat és també un enter. Per exemple:
45 div 3 = 15
45 div 2 = 22
30 div 7 = 4
L’operador mod retorna la resta de la divisió entera. Per exemple:
45 mod 2 = 1
30 mod 7 = 2
345 mod 10 = 5
Nota 3: fixeu-vos que la divisió (/)no s’ha inclòs a la llista d’operadors ja que no és un operador vàlid per al tipus enter.
1.1.2. Tipus real
En programació interessa també poder representar valors numèrics que no siguin enters, sinó que tinguin decimals.
El tipus anomenat real és l’utilitzat per a aquests valors, però cal tenir en compte que, tal com ocorre amb els enters, els reals que es poden representar no són infinits, sinó que hi ha un real mínim, MINREAL, i un real màxim, MAXREAL. Aquests valors límit depenen de l’ordinador amb el qual treballem. A més, no tots els reals són representables. Recordem que, des del punt de vista matemàtic, entre dos reals, per exemple 1.0 i 2.0, hi ha també un nombre infinit de possibles valors reals. En programació el nombre de reals que es poden representar depenen de la precisió utilitzada (nombre de bytes que s’utilitzen per a representar un real). Això fa que les operacions amb reals siguin delicades i calgui pensar bé en l’ordre en què es volen fer els càlculs, abans de programar-los.
En síntesi:
Identificador | real |
---|---|
Rang de valors | des de REALMIN fins a REALMAX |
Operadors interns | - (canvi de signe), + ,- , * , / |
Operadors externs | =, ≠, <, >, ≤, ≥ |
Exemples | 3.0 , -123.56 , 5.0E 8, 49.22E 8, 1.0E5 |
Nota 1: des d’un punt de vista informàtic, els enters i els reals són dos tipus diferents i no tenen res a veure entre ells, ja que la manera de representar-los internament és molt diferent. Això no vol dir que no es pugui operar entre ells però, com veurem més endavant, cal convertir els reals a enters o viceversa abans de poder operar entre ells.
Nota 2:compte amb les divisions! Abans de dividir cal comprovar sempre que el divisor sigui diferent de 0. Si es divideix per 0 durant l’execució del programa es produirà un error i el programa deixarà de funcionar.
1.1.3. Tipus caràcter
Un altre tipus de dada molt comuna és el tipus caràcter, que serveix per a representar lletres, dígits, símbols de puntuació i altres símbols utilitzats normalment en informàtica.
Internament els caràcters estan representats per nombres. A cada caràcter li correspon un nombre. El conjunt de correspondències entre caràcters i nombres es diu codi. Hi ha diferents codis, però el més utilitzat i que s’ha convertit en estàndard és el codi ASCII (American Standard Code for Information Interchange), que utilitza un byte per a representar cada caràcter. Per tant, es poden representar fins a 256 caràcters diferents. En aquest codi, la «á» (a accentuada), per exemple, es considera un caràcter. A internet, es pot trobar la llista completa de codis ASCII.
Precisament pel fet d’haver-hi un nombre darrere de cada caràcter, es pot definir un ordre dins dels caràcters i, per tant, realitzar operacions de comparació entre ells. El codi ASCII assegura que les lletres estan ordenades alfabèticament, però cal tenir en compte que les majúscules i minúscules no estan les unes a continuació de les altres.
Una variable de tipus caràcter només guarda un únic caràcter. Més endavant ja es veurà com es poden representar cadenes de caràcters per a poder guardar paraules o frases completes.
En síntesi:
Identificador | char |
---|---|
Rang de valors | Conjunt finit de valors que depèn del codi utilitzat per l’ordinador. |
Operadors interns | No n’hi ha. |
Operadors externs | =, ≠, <, >, ≤, ≥ |
Exemples | ‘a’, ‘A’, ‘?’, ‘@’, ‘à’ |
Nota: cal tenir en compte que no és el mateix el número 1 que el caràcter ‘1’. El primer valor es pot assignar a una variable de tipus enter, el segon, a una variable de tipus caràcter.
1.1.4. Tipus booleà
El tipus booleà és el tipus més simple que existeix ja que només admet dos valors: true (cert) o false (fals). El seu nom procedeix de l’àlgebra de Boole i pren de l’àlgebra els operadors lògics and, or i not. Recordem breument com funcionen els operadors lògics. Si a i b són dues expressions de tipus booleà, el resultat dels operadors és el següent:
a | b | a and b | a or b | not a |
---|---|---|---|---|
true | true | true | true | false |
true | false | false | true | false |
false | true | false | true | true |
false | false | false | false | true |
En síntesi:
Identificador | boolean |
---|---|
Rang de valors | false, true |
Operadors interns | and, or, not, =, ≠, <, >, ≤, ≥ |
Operadors externs | no n’hi ha |
Exemples | false, true |
A part dels operadors lògics també es poden utilitzar els operadors de comparació (que anomenem relacionals), tal com es fa en altres tipus. Per a poder comparar, no obstant això, cal saber quin és l’ordre dels dos valors booleans. Per convenció, false és menor que true. Per tant:
a | b | a < b | a > b | a = b | a ≤ b | a ≥ b |
---|---|---|---|---|---|---|
true | true | false | false | true | true | true |
true | false | false | true | false | false | true |
false | true | true | false | false | true | false |
false | false | false | false | true | true | true |
L’ús del tipus booleà és molt important en la programació, ja que permet prendre decisions dins del programa o algorisme, és a dir, segons el resultat de la comparació de determinats valors el programa executarà unes instruccions o unes altres.
1.2. Declaració d’objectes
Per a poder utilitzar objectes (variables o constants) en un algorisme, primer cal haver-los declarat, és a dir, indicar el seu nom i les seves característiques. Hem d’indicar a l’algorisme quins objectes s’utilitzaran, el tipus de cadascun d’ells i si són variables o constants.
1.2.1. Declaració de constants
La sintaxi en llenguatge algorísmic per a declarar constants és la següent:
const
constName: type = value;
end const
#define constName value
On constName és el nom que donem a la constant, type el seu tipus i value el valor de la constant. El primer caràcter del nom ha de ser sempre alfabètic. La resta poden ser alfabètics, numèrics o el caràcter ‘_’. No pot haver-hi espais entre els caràcters.
Per convenció, els noms de les constants se solen escriure sempre en majúscules. Vegem alguns exemples:
const
PI: real = 3.1415926;
MAX_STUDENTS: integer = 50;
IVA: integer = 21;
BLANC_CHAR: char = ' ';
end const
#define MAX_STUDENTS 50
#define IVA 21
#define BLANC_CHAR ' '
La declaració de constants és molt útil i recomanable per a tots els valors fixos que s’utilitzin en un algorisme.
1.2.2. Declaració de variables
La sintaxi en llenguatge algorísmic per a declarar variables és la següent:
var
variableName: type;
end var
On variableName és el nom de la variable i type el tipus. Igual que amb les constants, el primer caràcter del nom ha de ser sempre alfabètic. La resta poden ser alfabètics, numèrics o de caràcter ‘_’. No pot haver-hi espais entre els caràcters.
Si hi ha diverses variables del mateix tipus, podem escriure:
var
variableName1, variableName2, varaibleName3: type;
end var
Per convenció, els noms de les variables s’escriuen en minúscula i, si el nom de la variable està format per dues paraules, la primera lletra de les paraules, exceptuant la de la primera paraula, s’escriu en majúscula. Vegem-ne alguns exemples:
var
roomLength: real;
roomWidth: real;
currentNumberStudents: integer;
readChar: char;
end var
float roomWidth;
int currentNumberStudents;
char readChar;
Nota: a les declaracions de variables i constants es pot veure una sèrie de paraules en negreta. Aquestes paraules formen part de la sintaxi del llenguatge algorísmic i serveixen perquè el compilador (l’intèrpret del codi escrit) entengui a cada moment què es vol fer. Aquestes paraules es diuen paraules clau (o reservades) del llenguatge i no es poden utilitzar com a noms ni de variables ni de constants. Cada llenguatge de programació té les seves paraules clau, encara que la majoria són coincidents entre els diferents llenguatges.
D’ara endavant, sempre que vegem en un algorisme paraules en negreta, són paraules clau del llenguatge algorísmic. Si s’escriu un algorisme en paper, es poden indicar les paraules clau en un altre color o bé subratllar-les. D’aquesta manera es podran distingir de la resta.
2. Tipus enumeratius
El llenguatge algorísmic, així com la majoria de llenguatges de programació, permet definir nous tipus de dades combinant tipus elementals.
Més endavant, veurem de manera generalitzada com definir aquests nous tipus, però hi ha un que s’utilitza extensament i que presentem a continuació. Són els tipus enumeratius.
El tipus enumeratiu és un tipus de dades que consisteix a definir un conjunt finit de valors, que s’enumeren en la pròpia definició. Aquest tipus permet agrupar un conjunt de constants.
La sintaxi per a definir-los és la següent:
type
typeName = {VALUE1, VALUE2, VALUE3, ... , VALUEN};
end type
typedef enum { VALUE1, VALUE2, VALUE3, ... , VALUEN } typeName
Com hem dit, VALUE1, VALUE2, ... són constants. Cada value es representa internament amb un valor numèric creixent començant per 0.
Per exemple, si es vol treballar amb els dies de la setmana podem definir el tipus i les següents variables:
type
daysOfTheWeek = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
end type
var
firstDay: daysOfTheWeek;
lastDay: daysOfTheWeek;
end var
daysOfTheWeek firstDay;
daysOfTheWeek lastDay;
Les variables firstDay i lastDay només podran tenir algun dels valors definits en el tipus enumeratiu.
2.1. Operacions amb tipus enumeratius
Els únics operadors que es poden aplicar als tipus enumeratius són els operadors relacionals externs (=, ≠, <, >, ≤, ≥) . L’ordre en què s’enumeren els valors és el que s’utilitza per a establir les relacions de menor a major. Així doncs, seguint el mateix exemple MONDAY < TUESDAY podríem escriure: firstDay > secondDay
3. Expressions
Les expressions ens permeten fer càlculs en un llenguatge de programació. Una expressió és una combinació finita d’operands (constants, variables i funcions) i d’operadors (+, - <=, etc.) que segueix unes normes de sintaxi establertes i que té com a resultat un valor d’algun dels tipus elementals del llenguatge.
Segons el tipus resultant, les expressions poden ser aritmètiques (resultat numèric) o lògiques (resultat booleà).
Alguns exemples d’expressions:
- Expressió aritmètica que dona com a resultat un enter i que només utilitza constants:
5 * 90 + 7 *(3 + 9) - Expressió aritmètica que dona com a resultat un real i que utilitza una constant definida (PI) i una variable de tipus real (radius):
2 * PI+ radius - Expressió lògica que dona com a resultat un booleà i que utilitza constants:
6 + 9 * 8 > 78
Dins d’una expressió, els operands no es poden combinar de qualsevol manera. Fa falta disposar d’una sintaxi per a saber si una expressió està ben escrita, així com unes normes que indiquin com avaluar-la.
3.1. Sintaxi d’una expressió
Com hem comentat, els operands no es poden combinar de qualsevol manera amb els operadors. Cal definir una sintaxi per a saber si una expressió està ben escrita. A continuació, es defineix com construir expressions sintàcticament correctes.
- Un valor és una expressió. Per exemple:
5 , 3.1416, ‘a’
- Una variable és una expressió. Per exemple:
radius, numberOfStudents,
- Una constant és una expressió. Per exemple:
PI, MAX_STDENTS, IVA
- Si E1 i E2 són expressions i op és un operador binari, E1 op E2 també ho és. Per exemple:
5+6, radius * 8 +9, a > b, i < max
- Si E és una expressió, (E) també ho és. Per exemple:
(radius * 8 +9)
- Si E és una expressió i op és un operador unari, op E també ho és. Per exemple:
-7, -(radius * 8 +9)
- Si E1, E2, ... , són expressions i f és una funció, f(E1,E2,...,En) també ho és. Per exemple:
sinus(90), sqr(25)
3.2. Semàntica d’una expressió
Ara bé, no totes les expressions sintàcticament correctes es poden avaluar. També cal que siguin semànticament correctes, és a dir, que tinguin sentit.
Perquè una expressió sigui semànticament correcta no pot relacionar dues expressions (operands) de diferents tipus amb un operador binari, ni tampoc pot aplicar un operador unitari a una expressió d’un tipus incorrecte.
Per exemple, no té sentit comparar un caràcter, diguem ‘a’, amb un enter, diguem 5.
Recordem una vegada més que, des del punt de vista informàtic, els enters i els reals són tipus diferents i, per tant, semànticament és incorrecte barrejar-los directament. Exemples d’expressions semànticament incorrectes:
6 + 8.8 | Perquè suma un enter i un real. |
---|---|
true < 35 | Perquè compara un booleà amb un enter. |
‘c’ + 34 < ‘b’ | Perquè suma un caràcter amb un enter. |
45 < 56 < 90 | Compara primer dos enters i el resultat que és un booleà es compara amb un enter. |
Així doncs, en escriure expressions cal tenir en compte tant els aspectes sintàctics com els semàntics. En un llenguatge de programació, el compilador detectarà els errors sintàctics i pot indicar advertiments (warnings) amb els errors semàntics.
3.3. Prioritat dels operadors
A l’hora d’avaluar una expressió (obtenir el seu valor resultant), cal saber quins operadors avaluen primer i com s’utilitzen els parèntesis, és a dir, conèixer la prioritat dels operadors.
Primer cal avaluar sempre les expressions que estan dins dels parèntesis i després avaluar sempre els operadors amb prioritat més alta (sent 1 la prioritat més alta).
prioritat | operadors |
---|---|
1 | (canvi de signe), no |
2 | *, /, div, mod |
3 | + , - |
4 | , ≠, >, <, ≤, ≥ |
5 | i |
6 | o |
A igual prioritat, els operadors s’operen d’esquerra a dreta.
4. Funcions de conversió de tipus
Hem vist que en programació no és semànticament correcte operar enters amb reals, la qual cosa pot semblar que limita els càlculs que es poden fer.
Però a l’hora de programar disposem de funcions de conversió de tipus. És a dir, funcions que, donat un valor d’un tipus, el converteix en un altre. Les funcions disponibles en llenguatge algorísmic són:
- IntegerToReal, que converteix un enter en real.
- RealToInteger, que donat un real retorna la seva part entera.
- CodeToChar, que donat un codi ASCII retorna el caràcter corresponent.
- CharToCode, que donat un caràcter retorna el seu codi ASCII.
Exemples:
- realToInteger(789.78) = 789.
- codeToChar(65) = ‘A’.
- charToCode(‘s’) = 115.
- integerToReal(10) = 10.0.
5. Exemples
5.1. Exemple 03_01: decidir els tipus de dades
Enunciat:
Volem guardar informació d’una persona en diferents objectes. En concret, ens interessen l’edat, el sexe i la mitjana mensual d’ingressos per als últims n mesos, on n serà una constant del programa amb valor 18. Definiu la constant n i les variables age, sex i salary que permetin guardar aquestes dades en llenguatge algorísmic i en llenguatge C. Justifiqueu la decisió del tipus de dades.
Solució:
El primer que cal fer és decidir els tipus de dades que tenim. En el cas de n, serà un valor numèric positiu, ja que és el nombre de mesos. En el cas de l’edat, serà un valor enter. En el cas del sexe, tenim dos possibles valors, home i dona, que podem representar amb un caràcter H per a home i D per a dona. Finalment, la mitjana del sou serà un valor real, ja que necessitem almenys dos decimals (quantitat mínima en euros). Amb aquestes decisions, la definició en llenguatge algorísmic quedaria de la següent manera:
const
D: integer = 18;
end const
var
age: integer;
sex: char;
salary: real;
end var
#define D 18
/* Declaració de variables */
int age;
char sex;
float salary;
Cal tenir en compte que, si no hi ha una especificació molt precisa en les dades, hi ha altres possibles solucions. Per exemple, el sexe el podríem definir també com un tipus enumerat amb dos possibles valors (MAN i WOMAN). En aquest cas, la solució seria:
const
N: integer = 18;
end const
type
tSex = {MAN, WOMAN}
end type
var
age: integer;
sex: tSex;
salary: real;
end var
#define N 18
/* Definició de tipus */
typedef enum { MAN, WOMAN } tSex;
/* Declaració de variables */
int age;
tSex sex;
float salary;
5.2. Exemple 03_02: anàlisi d’expressions
En aquest exemple es mostra un exercici per a analitzar la validesa d’un conjunt d’expressions a partir de la definició d’objectes en llenguatge algorísmic.
Enunciat:
Donades les definicions de tipus, constants i variables següents, relacioneu-les amb les classes d’una escola:
type
tName = {LITTLE, MEDIUM, OLDER} /* possibles noms de les classes*/
end type
var
class1, class2, class3: integer; /*variables que indiquen el nombre d’alumnes de cada classe*/
sorted: boolean;
percent, average: real;
name1, name2, name3: tName; /*variables per a guardar els noms de les classes */
end var
Indiqueu si són correctes o no les instruccions i expressions següents. En cas que no ho siguin, especifiqueu el motiu o motius:
a) sorted = class1 > class2 > class3
b) average:= integerToReal(class1 + class2 + class3) / 3.0
c) name1 = LITTLE or OLDER
d) percent:= class1 div class1 + classe2 * 100
Solució:
a) Incorrecta. Ja que tots els operands tenen la mateixa prioritat, s’avaluen d’esquerra a dreta i, per tant, tindrem (sorted = class1), on es comparen dues variables de tipus diferents.
b) Correcta.
c) Incorrecta. En primer lloc s’avalua (name1 = LITTLE) que és correcta i retornarà un booleà, però després aquest booleà s’avaluaria amb l’operand o amb OLDER i, per tant, tenim variables de tipus diferents.
d) Incorrecta. Assignació d’un enter a un real. A la variable percent, que és de tipus real, se li assigna el resultat d’una expressió que és de tipus integer.
5.3. Exemple 03_03: avaluació d’expressions
En aquest exemple es mostra l’avaluació pas a pas d’un conjunt d’expressions en llenguatge algorísmic.
Enunciat:
Donades les definicions de l’exemple 2 i tenint en compte els següents valors de les variables:
class1 = 50, class2 = 30, class3 = 40, sorted= true, name1= LITTLE, name2 = MEDIUM, name3 = OLDER
Calculeu el resultat de les següents expressions:
- a) sorted= (class1 > class2 and class3 >(class2 + 10))
- b) name1 = LITTLE or sorted and name2 > name3
- c) class1 * 5 + class2 * 10 div 2 – class3 div 4 + 5 *2
Solució:
a) Recordem que cal avaluar l’expressió segons la prioritat dels operadors, tenint en compte que a igual prioritat s’opera d’esquerra a dreta. Encara que no s’ha indicat de forma explícita, les variables cal substituir-les pel seu valor per a poder avaluar l’expressió.
sorted = (class1 > class2 and class3 >(40)) | Avaluem el contingut dels parèntesis primer i substituïm la variable sorted pel seu valor. |
---|---|
true = (true and class3 >(40)) | Després, les desigualtats. La primera dona resultat true ja que el valor de class1 és major que la de class2. |
true = (true and false) | La segona desigualtat dona false ja que class3 té el valor 40. |
true = (false) | Com true no és igual a false el resultat final és false. |
false |
b)
true or sorted and name2 > name3 | Primer cal avaluar la desigualtat i substituir la variable sorted pel seu valor. |
---|---|
true or true and false | Després s’avalua l’and, que té major prioritat. |
true or false | Per últim s’avalua l’or. |
true |
c)
50 * 5 + class2 * 10 div 2 – class3 div 4 + 5 * 2 | S’avalua la primera multiplicació. |
---|---|
250 + class2 * 10 div 2 – class3 div 4 + 5 * 2 | Com la multiplicació i l’operador div tenen la mateixa prioritat, la subexpressió class2 * 10 div 2, s’ha d’avaluar d’esquerra a dreta, és a dir, primer la multiplicació i després la divisió entera. |
250 + 300 div 2 – class3 div 4 + 5 * 2 | |
250 + 150 – class3 div 4 + 5 * 2 | S’avalua l’altra divisió entera. |
250 + 150 – 10 + 5 * 2 | S’avalua la multiplicació. |
250 + 150 – 10 + 10 | S’avaluen les summes i les restes. |
400 |
5.4. Exemple 03_04: definició d’expressions
En aquest exemple es mostra com definir expressions en llenguatge algorísmic.
Enunciat:
Donades les definicions de l’exemple 2, construïu expressions en llenguatge algorísmic que calculin el que es demana:
a) Expressió que comprova si hi ha una classe de nom LITTLE.
b) Expressió que calculi el nombre d’alumnes que tindria la classe1 si augmentem la capacitat en un 5%.
c) Expressió que indiqui si hi ha alguna classe en la qual el nombre d’alumnes superi la mitjana en 15.
Solució:
a)
(name1 = LITTLE) or (name2 = LITTLE) or (name3 = LITTLE)
Perquè l’expressió representi el que s’ha sol·licitat cal comprovar si alguna de les variables name1, name2 o name3 té el valor LITTLE. Per a això hem d’escriure tres comparacions, una per a cada variable. És a dir, hem d’escriure les expressions:
(name1 = LITTLE), (name2 = LITTLE), (name3 = LITTLE)
Però, a més, aquestes tres expressions s’han de combinar per a obtenir el resultat final desitjat. Per si mateixes no donen el resultat esperat i a més són tres expressions, no una única. Com s’han de combinar? Si el que volem és que l’expressió final sigui certa si almenys una de les expressions anteriors és certa, l’operador que hem d’usar és l’operador or.
L’expressió final que soluciona el problema serà:
(name1 = LITTLE) or (name2 = LITTLE) or (name3 = LITTLE)
b)
La primera solució que podem pensar per a aquest exercici és escriure directament l’expressió class1 *1.05, però, encara que matemàticament això és correcte, en programació no ho és ja que els operadors de l’anterior multiplicació són de tipus diferents. La variable class1 està definida de tipus enter, no real. Per tant, cal convertir-la primer en real i escriurem:
integerToReal(class1) * 1.05
Però això ens donarà un nombre d’alumnes que no necessàriament serà un nombre enter, per tant, necessitem convertir de nou el resultat a enter. La solució final és:
realToInteger( integerToReal(class1) * 1.05 )
c) Aquest exercici combina les casuístiques dels dos anteriors. D’una banda, cal comparar de manera individual si cada classe té o no més alumnes que la mitjana més 15 i després combinar les tres expressions per a crear una única. Això donaria les tres expressions següents, aplicant els canvis de tipus necessaris:
integerToReal(class1) >= (integerToReal(class1+class2+class3)/3.0) + 15.0
integerToReal(class2) >= (integerToReal(class1+class2+class3)/3.0) + 15.0
integerToReal(class3) >= (integerToReal(class1+class2+class3)/3.0) + 15.0
Finalment, cal combinar-les amb un operador or per a obtenir l’expressió final:
( integerToReal(class1) >= (integerToReal(class1+class2+class3)/3.0) + 15.0) or
( integerToReal(class2) >= (integerToReal(class1+class2+class3)/3.0) + 15.0) or
( integerToReal(class3) >= (integerToReal(class1+class2+class3)/3.0) + 15.0)
Nota: per a obtenir expressions que facin aquests càlculs i que siguin correctes en llenguatge algorísmic, és important conèixer bé el sistema de tipus d’aquest i per a quins tipus es pot aplicar cada operador. És possible que s’hagin d’utilitzar les funcions de conversió de tipus en alguns casos.
Resum
En aquesta unitat hem vist els tipus de dades en llenguatge algorísmic (booleà, caràcter, enter i real). També hem vist com crear tipus enumerats. A més, hem treballat amb l’avaluació i construcció d’expressions. Finalment hem vist les conversions de tipus.
Al vídeo següent podem veure un resum de la definició d’expressions:
En el següent vídeo podeu veure un resum sobre l'avaluació d'expressions: