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 Computation, 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:
let isDone: boolean = true
}
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:
let isDone: boolean = false
}
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:
// true
// false
// trueSi intentes comparar dos tipus diferents, Typescript et diu que t’estas equivocant:
let result: boolean = "eee" > 4Error. Operator '>' cannot be applied to types 'string' and 'number'
El resultat d’una comparació és pot assignar a una variable, igual que qualsevol valor:
let result: boolean = 5 > 4 // assignar el resultat de la comparació
; // trueSi intentes comparar dos variables amb tipus diferent, Typescript et diu que és un error:
let a: number
let b: string
Error. 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:
let dog : string | null = null
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 🐉
let money = 230
}
}
Si executes el codi, pots comprar un drac volador:
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
let money: number =
}
}
else if
A veces queremos probar más de una condición. La clausula else if nos permite hacer esto.
Por ejemplo:
let year =
;
} ;
} ;
}En el código de arriba, TypeScript:
- Primero revisa si
year < 2015. - Si esto es falso, continúa a la siguiente condición
year > 2015. - Si esta también es falsa, mostrará la última
alert.
Podría haber más bloques else if.
Operador ternario ?
A veces necesitamos que el valor que asignemos a una variable dependa de alguna condición.
Por ejemplo:
let age =
let accessAllowed: string
accessAllowed = "Por supuesto!"
} accessAllowed = "Ni en sueños!"
}
El “operador condicional” nos permite ejecutar esto en una forma más corta y simple.
El operador está representado por el signo de cierre de interrogación ?.
La Sintaxis es:
let result = condition ? value1 : value2;Se evalúa condition: si es verdadera entonces devuelve value1 , de lo contrario value2.
Por ejemplo:
let age =
let accessAllowed = ? "Por supuesto!" : "Ni en sueños!"
Múltiples ?
Una secuencia de operadores de signos de interrogación ? puede devolver un valor que depende de más de una condición.
Por ejemplo:
let age =
let message =
? '¡Hola, bebé!' :
? '¡Hola!' :
? '¡Felicidades!' :
'¡Qué edad tan inusual!'
Puede ser difícil al principio comprender lo que está sucediendo.
Pero después de una mirada más cercana, podemos ver que es solo una secuencia ordinaria de condiciones:
- El primer signo de pregunta revisa si
age < 3. - Si es cierto, devuelve
'¡Hola, bebé!'. De lo contrario, continúa a la expresión que está después de los dos puntos:, la cual revisa siage < 18. - Si es cierto, devuelve
'¡Hola!'. De lo contrario, continúa con la expresión que está después de los dos puntos siguientes:, la cual revisa siage < 100. - Si es cierto, devuelve
'¡Felicidades!'. De lo contrario, continúa a la expresión que está después de los dos puntos:, la cual devuelve'¡Qué edad tan inusual!'.
Aquí lo podemos ver utilizando if..else:
let age =
let message: string
message = '¡Hola, bebé!'
} message = '¡Hola!'
} message = '¡Felicidades!'
} message = '¡Qué edad tan inusual!'
}
Activitat
1.- Escriu un script que et pregunta l’edat, i et diu que pots votar si tens més de 17 anys:
Show solution
let edat: number | null =
}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.- Usando el constructor if..else, escribe un código que obtenga a través de un prompt un número y entonces muestre en un alert:
1, si el valor es mayor que cero,-1, si es menor que cero,0, si es igual a cero.
Show solution
let value =
;
} ;
} ;
}
```5.- Reescriba esta condición if usando el operador ternario ‘?’:
let a = 5
let b = 8
let result: string
result = 'Debajo'
} result = 'Encima'
}Show solution
let a = 5
let b = 8
let result = ? 'Debajo' : 'Encima'6.- Reescriba el if..else utilizando operadores ternarios múltiples ?.
let login :string | null = null
let message;
message = 'Hola'
} message = 'Felicidades'
} message = 'Sin sesión'
} message = ''
}
Show solution
let login: string | null = null
let message =
? 'Hola' :
? 'Felicidades' :
? 'Sin sesión' : ''
Operadors lògics
|| OR
El operador OR se representa con dos símbolos de linea vertical:
let result: boolean = a || b;Si cualquiera de sus argumentos es true, retorna true, de lo contrario retorna false.
Hay cuatro combinaciones lógicas posibles:
// true
// true
// true
// falseComo podemos ver, el resultado es siempre true excepto cuando ambos operandos son false.
La mayoría de las veces, OR || es usado en una declaración if para probar si alguna de las condiciones dadas es true.
Por ejemplo:
let hour = 9
}Podemos pasar mas condiciones:
let hour = 12
let isWeekend = true
// Es fin de semana
}Dado múltiples valores aplicados al operador OR:
let result: boolean = value1 || value2 || value3El operador OR || realiza lo siguiente:
- Evalúa los operandos de izquierda a derecha.
- Para cada operando, si el resultado es
true, se detiene y retornatrue. - Si todos los operandos eran
false, retornafalse.
&& AND
El operador AND es representado con dos ampersands &&:
let result: boolean = a && bAND retorna true si ambos operandos son valores verdaderos y false en cualquier otro caso.
// true
// false
// false
// falseUn ejemplo con if:
let hour = 12
let minute = 30
}Dado múltiples valores aplicados al operador AND:
let result: boolean = value1 && value2 && value3;El operador AND && realiza lo siguiente:
- Evalúa los operandos de izquierda a derecha.
- Para cada operando, si el resultado es
false, se detiene y retornafalse. - Si todos los operandos fueron valores verdaderos, devuelve
true
La precedencia del operador AND && es mayor que la de OR ||.
Así que el código a && b || c && d es básicamente el mismo que si la expresiones && estuvieran entre paréntesis: (a && b) || (c && d).
! (NOT)
El operador booleano NOT se representa con un signo de exclamación !.
La sintaxis es bastante simple:
let result: boolean = !valueEl operador acepta un solo argumento y realiza lo siguiente: retorna el valor contrario.
Por ejemplo:
// false
//falseLa precedencia de NOT ! es la mayor de todos los operadores lógicos, así que siempre se ejecuta primero, antes que && o ||.
Activitat
1.- Escribe una condición if para comprobar que age está entre 40 y 60 inclusive.
“Inclusive” significa que age puede llegar a ser uno de los extremos, 40 o 60.
Show solution
let age = 50
2.- Escribe una condición if para comprobar que age NO está entre 40 y 60 inclusive.
Crea dos variantes: la primera usando NOT !, y la segunda sin usarlo.
Show solution
let age = 90
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
let userName =
let pass =
}
```Repetició
Usualmente necesitamos repetir acciones.
Por ejemplo, mostrar los elementos de una lista uno tras otro o simplemente ejecutar el mismo código para cada número del 1 al 10.
Los Bucles son una forma de repetir el mismo código varias veces.
While
El bucle while (mientras) tiene la siguiente sintaxis:
// código
// llamado "cuerpo del bucle"
}Mientras la condición condition sea verdadera, el código del cuerpo del bucle será ejecutado.
Por ejemplo, el bucle debajo imprime i mientras se cumpla i < 3:
let i: number = 0
i += 1
}
Cada ejecución del cuerpo del bucle se llama iteración. El bucle en el ejemplo de arriba realiza 3 iteraciones.
Si faltara i += 1 en el ejemplo de arriba, el bucle sería repetido (en teoría) eternamente. En la práctica, el navegador tiene maneras de detener tales bucles desmedidos; y en el lado del servidor, podemos eliminar el proceso.
let i: number = 0
}El bucle “do…while”
La comprobación de la condición puede ser movida debajo del cuerpo del bucle usando la sintaxis do..while:
// cuerpo del bucle
} El bucle primero ejecuta el cuerpo, luego comprueba la condición, y, mientras sea un valor verdadero, la ejecuta una y otra vez.
Por ejemplo:
let guess: string | null
guess =
} A continuació tens un exemple d’execució:
Esta sintaxis solo debe ser usada cuando quieres que el cuerpo del bucle sea ejecutado al menos una vez sin importar que la condición sea verdadera.
Rompiendo el bucle
Normalmente, se sale de un bucle cuando la condición se vuelve falsa.
Pero podemos forzar una salida en cualquier momento usando la directiva especial break.
Per exemple, en aquest bucle mai s’imprimeix res a la consola:
let i: number = 0
i += 1
break
}
I només s’executa 1 cop!
$ deno test.
i == 1A continuació tens un exemple en que es demana a l’usuari que adivini un número:
const guess = 5
let tries = 3
let n : number | null =
break
}
i =-1
}Pots veure que el bucle acaba abans dels 3 intents perquè l’usuari ha adivinat el número.
La combinación “bucle infinito + break según sea necesario” es ideal en situaciones donde la condición del bucle debe ser comprobada no al inicio o al final de el bucle, sino a la mitad o incluso en varias partes del cuerpo.
Continuar a la siguiente iteración
La directiva continue detiene la iteración actual y fuerza al bucle a comenzar una nueva (si la condición lo permite).
Per exemple, en aquest bucle mai s’imprimeix res a la consola:
let i: number = 0
i += 1
continue
}
Però s’executa 10 vegades!
A continuació tens un bucle que va sumant números mentres l’usuari no entri cap valor:
let sum: number = 0
let input: string | null =
break
sum +=
}Pots veure que el programa va sumant a menys que l’usuari apreti “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ó:
let sum = 0
let input =
break
let n =
continue
sum +=
}Pots verificar que tot el que no sigui un número s’ignora:
Activitats
Ask the user for a number between 1 and 7 and show the name of the day of the week (1 = Monday, 7 = Sunday). If the number is not between 1 and 7, show an error message.
Show solution
let day = ;
;
;
;
;
;
;
;
;Ask for a grade from 0 to 10 and show:
"Fail"if the grade is less than5,"Pass"if it is from5(included) to6.9,"Good"if it is from7to8.9,"Excellent"if it is from9to10.
Do it first with if..else if..else …
Show solution
let grade = ;
let message: string;
message = "Fail";
message = "Pass";
message = "Good";
message = "Excellent";
;and then rewrite it with a chained ternary expression.
Show solution
let grade = ;
let message = ? "Fail" : ? "Pass" : ? "Good" : "Excellent";
;You have two booleans:
let hasTicket: boolean = true
let isVIP: boolean = falseWrite an if that prints "Can enter" if the person has a ticket or is VIP, and "Cannot enter" otherwise.
Show solution
Rewrite it with a single ternary expression.
Show solution
let message = ? "Can enter" : "Cannot enter"
Print all numbers from 1 to 20 that are even using a while loop.
Show solution
let i: number = 1;
;
}
i += 1;
}
```Using a do..while loop, ask the user to type "yes" to continue. Stop only when the user writes "no".
Show solution
let answer: string | null
answer =
}
Create a program that keeps asking for numbers and adds only the positive ones to a total sum.
Stop when the user presses “Enter” without typing anything (null), or types 0.
Use continue to ignore negative numbers.
Show solution
let sum: number = 0;
let input: string | null = ;
break;
}
let n: number = ;
continue;
break;
continue;
sum += n;
;
}
;Use a while (true) loop with break to repeatedly ask for passwords until the user types the correct one ("1234").
- If the user presses “Cancel” (
null), stop the loop and print"Cancelled". - If the user enters the correct password, print
"Access granted"and stop.
Show solution
const password = "1234";
let input: string | null = ;
;
break;
}
;
break;
}
;
}Create a small login and menu system:
- Ask for a username and password.
- The correct username is
"admin"and the correct password is"secret".
- The correct username is
- If either is wrong, print
"Access denied"and stop. - If both are correct, show a menu in a loop:
- Ask the user to choose:
1– Show current time (you can justconsole.log("12:00"))2– Play a guessing game (number from1to10, 3 tries).0– Exit.
- Ask the user to choose:
- Use
if/else, logical operators, and loops (while+break) to implement it.
Show solution
let user = ;
let pass = ;
;
} ;
let choice = ;
break;
}
;
break;
} ;
} const secret = 7;
let tries = 3;
let input = ;
break;
let n = ;
;
continue;
}
;
break;
} ;
} ;
}
tries -= 1;
;
}
} ;
}
}
}Crea un programa que pregunti a l’usuari adivinar un número del 1 al 100, i li digui si ha acertat, o 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
const dia =
const mes =
const data = mes * 100 + dia
const astral = data < 120 ? "Capricornio" :
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!"