Algoritme
Un algoritme és un programa que pot executar diferents blocs de codi en funció de si es compleixen, o no es compleixen, unes condicions el número de vegades que tu vulguis.
Introducció
Tal com has vist a Computació, un programa pot executar qualsevol mena de fórmula matemàtica.
Però a part d’això, amb el que coneixes fins ara, no es pot fer gaire cosa més.
Tots els algoritmes es basen en una condició que només pot tenir dos valors: cert o fals.
En Typescript tens els tipus boolean que només pot tenir dos valors: true o false
Selecció
Condició
Una variable de tipus boolean ens permet executar un tros de codi si es compleix una condició.
Això es fa amb l’expressió if.
La sentència if (...) avalua la condició dins els parèntesis, i si el resultat és cert (true), executa un bloc de codi.
Crea el fitxer main.ts:
if isDone "Ben fet!"
}
"Adeu!"Si executes el codi pots veure que com que isDone és true, s’executa la sentència console.log("Ben fet!"):
En canvi, si modifiques el codi i dius que isDone és false:
if isDone "Ben fet!"
}
"Adeu!"La sentència console.log("Ben fet!") no s’executa:
A continuació tens el diagrama d’execució:
Comparació
Els operadors de comparació comparen dos valors i retornen un valor de tipus boolean: true o false.
| Operador | Exemple | Explicació |
|---|---|---|
== | a == b | a és igual a b |
!= | a != b | a no és igual a b |
> | a > b | a és més gran que b |
< | a > b | a és menys gran que b |
>= | a >= b | a és més gran o igual que b |
<= | a <= b | a és menys gran o igual que b |
Per exemple:
2 > 1 // true
2 == 1 // false
2 != 1 // trueSi intentes comparar dos tipus diferents, Typescript et diu que t’estas equivocant:
Error. Operator '>' cannot be applied to types 'string' and 'number'
El resultat d’una comparació és pot assignar a una variable, igual que qualsevol valor:
result; // trueSi intentes comparar dos variables amb tipus diferent, Typescript et diu que és un error:
a == bError. This comparison appears to be unintentional because the types 'number' and 'string' have no overlap.
Si compares un valor amb un variable que té valor null, el resultat és false:
dog == "Idefix"else
Molts cops no només has d’executar codi si es compleix una condició, també quan no es compleix aquesta condició (encara que només sigui per dir a l’usuari que la condició no es compleix).
Per això a un if se li pot afegir un else.
Per exemple, aquí tens un programa que permet a l’usuari comprar un drac volador si money és major de 100 monedes d’or 🐉
if money > 100 "Tens un 🐉"
} else "El preu del 🐉 és de 100 🪙"
}
"Adeu 👋"Si executes el codi, pots comprar un drac volador:
> deno.exe
A continuació tens el diagrama d’execució del codi:
A continuació modifica el codi per tal que demani a l’usuari quantes monedes ofereix:
Show solution
if money > 100 "Tens un 🐉"
} else "El preu del 🐉 és de 100 🪙"
}
"Adeu 👋"else if
De vegades vols provar més d’una condició. La clàusula else if et permet fer-ho.
Per exemple:
if year < 2015 'Muy poco...';
} else if year > 2015 'Muy Tarde';
} else '¡Exactamente!';
}Al codi de dalt, TypeScript:
- Primer comprova si
year < 2015. - Si això és fals, continua amb la condició següent
year > 2015. - Si aquesta també és falsa, mostrarà l’última
alert.
Hi podria haver més blocs else if.
Operador ternari ?
De vegades necessites que el valor que assignes a una variable depengui d’alguna condició.
Per exemple:
if age > 18 accessAllowed = "Por supuesto!"
} else accessAllowed = "Ni en sueños!"
}
accessAllowedL’“operador condicional” et permet fer-ho d’una forma més curta i simple.
L’operador es representa amb el signe d’interrogació ?.
La sintaxi és:
;S’avalua condition: si és certa retorna value1, i si no, value2.
Per exemple:
accessAllowedMúltiples ?
Una seqüència d’operadors d’interrogació ? pot retornar un valor que depèn de més d’una condició.
Per exemple:
age < 3 ? '¡Hola, bebé!' :
age < 18 ? '¡Hola!' :
age < 100 ? '¡Felicidades!' :
'¡Qué edad tan inusual!'
messageAl principi pot costar entendre què està passant.
Però si t’hi fixes bé, veuràs que només és una seqüència ordinària de condicions:
- El primer signe d’interrogació comprova si
age < 3. - Si és cert, retorna
'¡Hola, bebé!'. Si no, continua amb l’expressió que hi ha després dels dos punts:, que comprova siage < 18. - Si és cert, retorna
'¡Hola!'. Si no, continua amb l’expressió que hi ha després dels dos punts següents:, que comprova siage < 100. - Si és cert, retorna
'¡Felicidades!'. Si no, continua amb l’expressió que hi ha després dels dos punts:, que retorna'¡Qué edad tan inusual!'.
Aquí ho pots veure amb if..else:
if age < 3 message = '¡Hola, bebé!'
} else if age < 18 message = '¡Hola!'
} else if age < 100 message = '¡Felicidades!'
} else message = '¡Qué edad tan inusual!'
}
messageActivitat
1.- Escriu un script que et pregunta l’edat, i et diu que pots votar si tens més de 17 anys:
Show solution
if edat > 17 "Pots votar!"
}2.- Modifica l’script perquè a més de dir-te que encara no tens edat per votar, et digui quants anys et falten per poder votar.
Show solution
3.- Que passa si l’usuari et diu que té -555 anys?
Show solution
4.- Utilitzant el constructor if..else, escriu un codi que demani un número amb un prompt i que després mostri en un alert:
1, si el valor és més gran que zero,-1, si és més petit que zero,0, si és igual a zero.
Show solution
if value > 0 1;
} else if value < 0 -1;
} else 0;
}
```5.- Reescriu aquesta condició if amb l’operador ternari ?:
if a + b < 4 result = 'Debajo'
} else result = 'Encima'
}Show solution
6.- Reescriu el if..else utilitzant operadors ternaris múltiples ?.
;
if login == 'Empleado' message = 'Hola'
} else if login == 'Director' message = 'Felicidades'
} else if login == null message = 'Sin sesión'
} else message = ''
}
messageShow solution
login == 'Empleado' ? 'Hola' :
login == 'Director' ? 'Felicidades' :
login == null ? 'Sin sesión' : ''
messageOperadors lògics
|| OR
L’operador OR es representa amb dues barres verticals:
;Si qualsevol dels seus arguments és true, retorna true; si no, retorna false.
Hi ha quatre combinacions lògiques possibles:
true || true // true
false || true // true
true || false // true
false || false // falseCom pots veure, el resultat sempre és true excepte quan tots dos operands són false.
La majoria de vegades, l’OR || s’utilitza dins d’un if per comprovar si alguna de les condicions donades és true.
Per exemple:
if hour < 10 || hour > 18 'La oficina esta cerrada'
}Pots posar-hi més condicions:
if hour < 10 || hour > 18 || isWeekend "La oficina esta cerrada." // És cap de setmana
}Donats múltiples valors aplicats a l’operador OR:
L’operador OR || fa el següent:
- Avalua els operands d’esquerra a dreta.
- Per a cada operand, si el resultat és
true, s’atura i retornatrue. - Si tots els operands eren
false, retornafalse.
&& AND
L’operador AND es representa amb dos ampersands &&:
L’AND retorna true si tots dos operands són valors certs, i false en qualsevol altre cas.
true && true // true
false && true // false
true && false // false
false && false // falseUn exemple amb if:
if hour == 12 && minute == 30 "La hora es 12:30"
}Donats múltiples valors aplicats a l’operador AND:
;L’operador AND && fa el següent:
- Avalua els operands d’esquerra a dreta.
- Per a cada operand, si el resultat és
false, s’atura i retornafalse. - Si tots els operands eren valors certs, retorna
true.
La precedència de l’operador AND && és més alta que la de l’OR ||.
Així doncs, el codi a && b || c && d és bàsicament el mateix que si les expressions && estiguessin entre parèntesis: (a && b) || (c && d).
! (NOT)
L’operador booleà NOT es representa amb un signe d’exclamació !.
La sintaxi és força simple:
L’operador accepta un sol argument i fa el següent: retorna el valor contrari.
Per exemple:
!true // false
!5 > 0 //falseLa precedència del NOT ! és la més alta de tots els operadors lògics, així que sempre s’executa primer, abans que && o ||.
Activitat
1.- Escriu una condició if per comprovar que age està entre 40 i 60, tots dos inclosos.
“Inclosos” vol dir que age pot arribar a ser un dels extrems, 40 o 60.
Show solution
if age >= 40 && age <= 60
"You are middle-aged"2.- Escriu una condició if per comprovar que age NO està entre 40 i 60, tots dos inclosos.
Crea dues variants: la primera fent servir el NOT !, i la segona sense fer-lo servir.
Show solution
if !age >= 40 && age <= 60
"You aren't middle age"
if age > 60 || age < 40
"You aren't middle age"3.- Escriu un codi que primer pregunti el nom de l’usuari, i si aquest és admin, pregunti per la contrasenya, i si aquesta és password, doni la benvinguda a l’ususari.
Show solution
if userName != "admin"
"I don't know you"
else
if pass != "password"
"Bad password"
else
"Welcome!"
}
```Repetició
Normalment necessites repetir accions.
Per exemple, mostrar els elements d’una llista un darrere l’altre, o simplement executar el mateix codi per a cada número de l’1 al 10.
Els bucles són una manera de repetir el mateix codi diverses vegades.
While
El bucle while (mentre) té la sintaxi següent:
while condition // codi
// anomenat "cos del bucle"
}Mentre la condició condition sigui certa, s’executarà el codi del cos del bucle.
Per exemple, el bucle de sota imprimeix i mentre es compleixi i < 3:
while i < 3 i
i += 1
}
Cada execució del cos del bucle s’anomena iteració. El bucle de l’exemple de dalt fa 3 iteracions.
Si al codi de dalt hi faltés i += 1, el bucle es repetiria (en teoria) eternament. A la pràctica, el navegador té maneres d’aturar aquests bucles desbocats; i al costat del servidor, pots matar el procés.
while i < 3 i
}El bucle “do…while”
La comprovació de la condició es pot moure sota el cos del bucle amb la sintaxi do..while:
do // cos del bucle
} while conditionEl bucle primer executa el cos, després comprova la condició, i mentre sigui certa, l’executa un cop i un altre.
Per exemple:
do guess = "Guess"
} while guess != "toto"A continuació tens un exemple d’execució:
Aquesta sintaxi només l’has de fer servir quan vols que el cos del bucle s’executi com a mínim un cop, tant si la condició és certa com si no.
Trencar el bucle
Normalment se surt d’un bucle quan la condició es torna falsa.
Però pots forçar-ne la sortida en qualsevol moment amb la directiva especial break.
Per exemple, en aquest bucle mai s’imprimeix res a la consola:
while i < 10 i += 1
break
i
}
`i == `I només s’executa 1 cop!
$ deno test.ts
i == 1A continuació tens un exemple en què es demana a l’usuari que endevini un número:
while tries > 0
if n == guess "Correcte!"
break
}
i =-1
}Pots veure que el bucle acaba abans dels 3 intents perquè l’usuari ha endevinat el número.
La combinació “bucle infinit + break quan calgui” és ideal en situacions on la condició del bucle s’ha de comprovar no al principi ni al final del bucle, sinó al mig o fins i tot en diversos punts del cos.
Continuar amb la iteració següent
La directiva continue atura la iteració actual i força el bucle a començar-ne una de nova (si la condició ho permet).
Per exemple, en aquest bucle mai s’imprimeix res a la consola:
while i < 10 i += 1
continue
i
}
`i == `Però s’executa 10 vegades!
A continuació tens un bucle que va sumant números mentre l’usuari no entri cap valor:
while true
if input == null
break
sum += input
sum
}Pots veure que el programa va sumant tret que l’usuari premi “enter” sense cap valor:
El problema és que si l’usuari introdueix un string que no es pot transforma en number …
Tot és un NaN a partir de llavors.
Modifica el codi per verificar si l’entrada és NaN, i si es cert, continuar amb la propera iteració:
while true
if input == ""
break
if n
continue
sum += input
sum
}Pots verificar que tot el que no sigui un número s’ignora:
Activitats
Demana a l’usuari un número entre 1 i 7 i mostra el nom del dia de la setmana (1 = dilluns, 7 = diumenge). Si el número no està entre 1 i 7, mostra un missatge d’error.
Show solution
;
if day == 1 "Monday";
else if day == 2 "Tuesday";
else if day == 3 "Wednesday";
else if day == 4 "Thursday";
else if day == 5 "Friday";
else if day == 6 "Saturday";
else if day == 7 "Sunday";
else "Invalid day";Demana una nota del 0 al 10 i mostra:
"Fail"si la nota és inferior a5,"Pass"si va de5(inclòs) a6.9,"Good"si va de7a8.9,"Excellent"si va de9a10.
Fes-ho primer amb if..else if..else …
Show solution
;
;
if grade < 5 message = "Fail";
else if grade < 7 message = "Pass";
else if grade < 9 message = "Good";
else message = "Excellent";
message;i després reescriu-ho amb una expressió ternària encadenada.
Show solution
;
;
message;Tens dos booleans:
Escriu un if que imprimeixi "Can enter" si la persona té entrada o és VIP, i "Cannot enter" en cas contrari.
Show solution
if hasTicket || isVIP else Reescriu-ho amb una sola expressió ternària.
Show solution
messageImprimeix tots els números de l’1 al 20 que siguin parells fent servir un bucle while.
Show solution
;
while i <= 20 if i % 2 == 0 i;
}
i += 1;
}
```Amb un bucle do..while, demana a l’usuari que escrigui "yes" per continuar. Atura’t només quan l’usuari escrigui "no".
Show solution
do answer = 'Write "yes" to continue, "no" to stop', "yes"
} while answer != "no"
"Finished"Crea un programa que vagi demanant números i que només sumi els positius a un total.
Atura’t quan l’usuari premi “Enter” sense escriure res (null), o escrigui 0.
Fes servir continue per ignorar els números negatius.
Show solution
;
while true ;
if input == null || input == "" break;
}
;
if n continue;
if n == 0 break;
if n < 0 continue;
sum += n;
"Current sum:", sum;
}
"Final sum:", sum;Fes servir un bucle while (true) amb break per anar demanant contrasenyes fins que l’usuari n’escrigui la correcta ("1234").
- Si l’usuari prem “Cancel·la” (
null), atura el bucle i imprimeix"Cancelled". - Si l’usuari introdueix la contrasenya correcta, imprimeix
"Access granted"i atura’t.
Show solution
;
while true ;
if input == null "Cancelled";
break;
}
if input == password "Access granted";
break;
}
"Wrong password, try again";
}Crea un petit sistema de login i menú:
- Demana un nom d’usuari i una contrasenya.
- El nom d’usuari correcte és
"admin"i la contrasenya correcta és"secret".
- El nom d’usuari correcte és
- Si un dels dos és incorrecte, imprimeix
"Access denied"i atura’t. - Si tots dos són correctes, mostra un menú dins d’un bucle:
- Demana a l’usuari que triï:
1– Mostrar l’hora actual (pots fer simplementconsole.log("12:00"))2– Jugar a endevinar un número (de l’1al10, 3 intents).0– Sortir.
- Demana a l’usuari que triï:
- Fes servir
if/else, operadors lògics i bucles (while+break) per implementar-ho.
Show solution
;
;
if user != "admin" || pass != "secret" "Access denied";
} else "Welcome!";
while true ;
if choice == null break;
}
if choice == "0" "Bye!";
break;
} else if choice == "1" "Time: 12:00";
} else if choice == "2" ;
;
while tries > 0 ;
if input == null break;
;
if n "Not a number";
continue;
}
if n == secret "Correct!";
break;
} else if n < secret "Too small";
} else "Too big";
}
tries -= 1;
`Tries left: `;
}
} else "Unknown option";
}
}
}Crea un programa que demani a l’usuari endevinar un número de l’1 al 100, i li digui si l’ha encertat, o si el número és més gran o més petit.
Show solution
Escriu un codi que et pregunti la data de naixement i torni el símbol astral.
Show solution
data < 220 ? "Acuario" :
data < 321 ? "Pisicis":
data < 420 ? "Aries":
data < 521 ? "Tauro":
data < 621 ? "Géminis":
data < 723 ? "Cáncer":
data < 823 ? "Leo":
data < 932 ? "Virgo":
data < 1023 ? "Libra":
data < 1122 ? "Escorpio":
data < 1222 ? "Sagitario":
data < 1232 ? "Capricornio": "Ni idea!"
astral