11 Valg og logiske uttrykk
I kapittel 10 gjorde knappene det samme hver gang. Nå lærer du å få programmet til å velge selv: Kjører bilen for fort? Er du gammel nok? Lagre alt du lager i dette kapitlet i mappen kap11-valg.
11.1 Logiske uttrykk
sant-eller-usant.html
5 > 3 er et logisk uttrykk. Det er et spørsmål med bare to mulige svar: true, som betyr sant, eller false, som betyr usant. Det finnes ingen tredje mulighet. Logiske uttrykk er grunnlaget for alle valg et program gjør.
- Les koden ovenfor, og gjett hva som står på siden når du trykker på knappen.
- Lag filen
sant-eller-usant.htmli mappenkap11-valg, og test. - Bytt ut
5 > 3med uttrykkene i tabellen nedenfor, ett om gangen. Skriv av tabellen, og gjett før du trykker på knappen.
| Uttrykk | Gjetning | Resultat |
|---|---|---|
5 < 3 |
||
5 === 5 |
||
5 !== 5 |
||
10 >= 10 |
||
3 <= 2 |
||
"Ola" === "Ola" |
||
"Ola" === "ola" |
| Tegn | Betyr | Eksempel | Resultat |
|---|---|---|---|
=== |
er lik | 5 === 5 |
true |
!== |
er ikke lik | 5 !== 5 |
false |
> |
større enn | 7 > 10 |
false |
< |
mindre enn | 7 < 10 |
true |
>= |
større enn eller lik | 10 >= 10 |
true |
<= |
mindre enn eller lik | 12 <= 10 |
false |
Ett likhetstegn er noe helt annet enn tre. pris = 100 gir variabelen verdien 100. pris === 100 spør om verdien er 100. Blander du dem, får du feil som er vanskelige å finne.
- Bytt ut uttrykket med
5 = 5, og trykk på knappen. Hva skjer? - Hvorfor tror du
"Ola" === "ola"girfalse?
Gi meg ti logiske uttrykk i JavaScript med tall og tekst, ett om gangen. La meg svare true eller false, og forklar hvorfor hvis jeg svarer feil.
11.2 if og else
fartskontrollen.html
<h1>Fartskontrollen</h1>
<label for="inpFart">Hvor fort kjørte bilen?</label>
<input type="number" id="inpFart">
<button onclick="sjekk()">Sjekk</button>
<p id="txtSvar"></p>
<script>
const fartsgrense = 80;
function sjekk() {
let fart = Number(inpFart.value);
if (fart > fartsgrense) {
txtSvar.textContent = "For fort!";
}
}
</script>Du er fartskontrollen. Noen skriver inn hvor fort en bil kjørte, og programmet avgjør hva som skjer. Med if kjører programmet noen kodelinjer bare når et logisk uttrykk er true.
| Del | I koden | Hva det er |
|---|---|---|
| Nøkkelordet | if |
starter valget |
| Vilkåret | (fart > fartsgrense) |
et logisk uttrykk, true eller false |
| Blokka | { ... } |
kodelinjene som kjøres når vilkåret er true |
- Les koden ovenfor. Hva skjer når du skriver 95? Hva skjer når du skriver 70?
- Lag filen
fartskontrollen.html, og test med 95 og 70.
Programmet sier ingenting når farten er grei. Med else bestemmer du hva som skal skje når vilkåret er false.
- Utvid koden som vist nedenfor, og test på nytt.
fartskontrollen.html
- Skriv av tabellen nedenfor, og gjett hva som står på siden. Test deretter.
| Du skriver | Gjetning | Resultat |
|---|---|---|
95 |
||
80 |
||
79 |
- Hvorfor blir 80 «Farten er grei»? Hva må du endre i vilkåret for at 80 skal regnes som for fort? Endre tilbake.
- «For fort!» er lite presist. Lag variabelen
let over = fart - fartsgrense;rett underlet fart, og endre teksten til for eksempel «For fort! 15 km/t over grensen.».
else har aldri noe vilkår. Den fanger opp alt som ikke passet i if.
11.3 Flere valg med else if
fartskontrollen.html
if (fart === fartsgrense) {
txtSvar.textContent = "Akkurat på fartsgrensen. Godt kjørt!";
} else if (fart < fartsgrense) {
txtSvar.textContent = "Farten er grei.";
} else if (over <= 10) {
txtSvar.textContent = `For fort! ${over} km/t over. Du får bot.`;
} else {
txtSvar.textContent = `Altfor fort! ${over} km/t over. Førerkortet ryker.`;
}Med else if kan du ha så mange vilkår du vil. JavaScript tester vilkårene ett for ett, ovenfra og ned.
- Les koden ovenfor. Det tredje vilkåret sier bare
over <= 10. Hvorfor trenger det ikke også å si at farten er over grensen? - Erstatt hele
if-setningen i fartskontrollen med koden ovenfor. - Skriv av tabellen nedenfor, og gjett hva som står på siden. Test deretter.
- Hva skjer hvis flere av vilkårene er
true? Bytt rekkefølgen på to av vilkårene, og test igjen.
| Du skriver | Gjetning | Resultat |
|---|---|---|
75 |
||
80 |
||
85 |
||
120 |
Nedenfor ser du to rekkefølger av de samme vilkårene.
Kode A
if (over > 10) {
txtSvar.textContent = "Altfor fort!";
} else if (over > 0) {
txtSvar.textContent = "For fort!";
} else {
txtSvar.textContent = "Farten er grei.";
}Kode B
if (over > 0) {
txtSvar.textContent = "For fort!";
} else if (over > 10) {
txtSvar.textContent = "Altfor fort!";
} else {
txtSvar.textContent = "Farten er grei.";
}- Hvilken av kodebitene er riktig? Hva skjer med en bil som kjører 120 i den andre?
if tester det første vilkåret. else if tester det neste, men bare hvis alle vilkårene over var false. else fanger opp alt som er igjen. Rekkefølgen er en del av koden.
11.4 Tekst eller tall?
sant-eller-usant.html
Alt brukeren skriver i et tekstfelt, er en streng. Skriver brukeren 5, får programmet "5", og ikke tallet 5. === sammenligner både verdien og typen. En streng er aldri lik et tall.
- Les koden ovenfor. Gjett hva som står på siden når du skriver 5 og trykker på knappen.
- Utvid
sant-eller-usant.htmlmed et tekstfelt, og endre funksjonen som vist ovenfor. Test. - Skriv av tabellen nedenfor. Skriv 5 i feltet, og prøv hvert uttrykk.
| Uttrykk | Gjetning | Resultat |
|---|---|---|
skrevet === 5 |
||
skrevet === "5" |
||
Number(skrevet) === 5 |
||
skrevet == 5 |
- Uttrykket med
==gir et annet svar enn det første.==gjør om strengen til et tall før den sammenligner. Hvorfor er det likevel lurt å bruke===ogNumber?
Bruk === og !==. De sier tydelig hva du mener, og avslører det hvis du har glemt Number. Du vil se == i kode andre har skrevet, og nå vet du hva den gjør.
Et tomt felt gir den tomme strengen "". Det kan programmet sjekke før det regner.
- Utvid funksjonen
sjekki fartskontrollen som vist nedenfor. Trykk på knappen uten å skrive noe.
fartskontrollen.html
returnavslutter funksjonen. Hva skjer hvis du fjernerreturn;?
11.5 Og, eller og ikke
karusellvakten.html
<h1>Karusellvakten</h1>
<p>Du må være minst 12 år eller høyere enn 140 cm.</p>
<label for="inpAlder">Alder:</label>
<input type="number" id="inpAlder">
<label for="inpHoyde">Høyde i cm:</label>
<input type="number" id="inpHoyde">
<button onclick="sjekk()">Sjekk</button>
<p id="txtSvar"></p>
<script>
function sjekk() {
let alder = Number(inpAlder.value);
let hoyde = Number(inpHoyde.value);
if (alder >= 12 || hoyde > 140) {
txtSvar.textContent = "Du kan kjøre karusellen!";
} else {
txtSvar.textContent = "Beklager, du kan ikke kjøre.";
}
}
</script>Noen ganger holder det ikke med ett spørsmål. Med && og || setter du sammen to logiske uttrykk til ett. Med ! snur du et uttrykk.
| Tegn | Navn | Gir true når |
|---|---|---|
&& |
og | begge uttrykkene er true |
|| |
eller | minst ett av uttrykkene er true |
! |
ikke | uttrykket er false |
- Les koden ovenfor. Hvem får kjøre karusellen?
- Lag filen
karusellvakten.html. Skriv av tabellen nedenfor, og fyll inn hvem som får kjøre, før du tester.
| Alder | Høyde | Gjetning | Resultat |
|---|---|---|---|
| 13 | 150 | ||
| 11 | 150 | ||
| 13 | 120 | ||
| 11 | 135 | ||
| 12 | 140 |
- Bytt ut
||med&&, og test tabellen på nytt. Hvilke rader endret svar? Hvorfor? - Endre tilbake til
||. Skriv om vilkåret med!, slik at det spør om personen ikke får kjøre. Bytt om på de to blokkene.
Tegnet | skriver du på et norsk tastatur med tasten til venstre for 11, ofte sammen med AltGrAltGr. Du trenger to av dem: ||.
- Karusellen har også en øvre grense: Ingen over 190 cm får kjøre. Skriv vilkåret med parenteser:
(alder >= 12 || hoyde > 140) && hoyde <= 190. Hvorfor trengs parentesene?
Forklar forskjellen på && og || i JavaScript med et eksempel fra hverdagen, for eksempel reglene for å få kjøre en karusell eller få rabatt på kino. Still meg deretter tre spørsmål for å sjekke at jeg har forstått det.
11.6 Tilfeldige tall
fartskontrollen.html
Det tar tid å skrive inn fart etter fart. La programmet lage farten selv. Math.random() gir et tilfeldig tall mellom 0 og 1, for eksempel 0.4718. Med noen få steg gjør vi det om til et heltall fra 50 til 120.
| Steg | Kode | Eksempel |
|---|---|---|
| 1. Lag et tilfeldig tall | Math.random() |
0.4718 |
| 2. Gang med 71 | Math.random() * 71 |
33.49 |
| 3. Rund ned | Math.floor( ... ) |
33 |
| 4. Legg til 50 | Math.floor(Math.random() * 71) + 50 |
83 |
- Les koden ovenfor. Kodelinje 2 skriver en verdi inn i feltet. Hva gjør kodelinje 3?
- Legg til funksjonen nederst i
<script>i fartskontrollen, og en knapp med teksten Neste bil som kaller den. Trykk mange ganger. Får du alle fire svarene fra 11.3? - Hvorfor må vi gange med 71, og ikke med 70, for å få tall fra 50 til 120?
Math.floor runder alltid ned, også 9.99 blir 9. Math.ceil runder alltid opp, også 9.01 blir 10. Math.round runder av slik du har lært i matematikken.
- Skriv av tabellen nedenfor, og fyll den ut.
| Tall | Math.floor |
Math.ceil |
Math.round |
|---|---|---|---|
2.83 |
2 |
3 |
3 |
7.01 |
|||
9.5 |
|||
4 |
Fartskontrollen skal telle hvor mange biler som er sjekket.
- Lag variabelen
let antall = 0;underfartsgrense, og et avsnitt medid="txtAntall". Legg til kodelinjeneantall++;og en kodelinje som viser «Kontrollerte biler: 4» i funksjonensjekk. Hvorfor målet antall = 0;stå utenfor funksjonen?
Math.floor(Math.random() * N) + 1 gir et tilfeldig heltall fra 1 til N. En terning er Math.floor(Math.random() * 6) + 1.
Oppsummering
I dette kapitlet har du laget programmer som velger hva de skal gjøre. Du har brukt logiske uttrykk, if, else if og else, sammenlignet tekst og tall, satt sammen vilkår med && og ||, og laget tilfeldige tall.
Valg
fartskontrollen.html
<label for="inpFart">Fart:</label>
<input type="number" id="inpFart" value="95">
<button onclick="sjekk()">Sjekk</button>
<p id="txtSvar"></p>
<script>
const fartsgrense = 80;
function sjekk() {
let fart = Number(inpFart.value);
let over = fart - fartsgrense;
if (fart <= fartsgrense) {
txtSvar.textContent = "Farten er grei.";
} else if (over <= 10) {
txtSvar.textContent = `For fort! ${over} km/t over.`;
} else {
txtSvar.textContent = `Altfor fort! ${over} km/t over.`;
}
}
</script>Nettleser
Merk deg følgende:
- Et logisk uttrykk er alltid
trueellerfalse. - JavaScript tester vilkårene ovenfra og ned, og kjører bare blokka til det første som er
true. =gir en verdi.===sammenligner verdi og type.- Det brukeren skriver i et tekstfelt, er en streng. Bruk
Number.
Logiske uttrykk
| Kode | Betyr |
|---|---|
a === b, a !== b |
er lik, er ikke lik |
a > b, a < b |
større enn, mindre enn |
a >= b, a <= b |
større enn eller lik, mindre enn eller lik |
a && b |
både a og b er true |
a || b |
minst én av a og b er true |
!a |
a er false |
inpFart.value === "" |
feltet er tomt |
Tilfeldige tall
| Kode | Gir |
|---|---|
Math.random() |
et tilfeldig tall fra og med 0 til 1 |
Math.floor(Math.random() * 6) + 1 |
et tilfeldig heltall fra 1 til 6 |
Math.floor(9.99) |
9 |
Math.ceil(9.01) |
10 |
Oppgaver
Oppgave 11.1
oppg1-rett-feil.html
<input type="number" id="inpAlder">
<button onclick="sjekk()">Sjekk</button>
<p id="txtSvar"></p>
<script>
function sjekk() {
let alder = Number(inpAlder.value);
if alder >= 18 {
txtSvar.textContent = "Du er myndig.";
} elseif (alder = 17) {
txtSvar.textContent = "Bare ett år igjen!";
} else {
txtSvar.textContent = "Du er ikke myndig.";
}
}
</script>Koden ovenfor har tre feil. Skriv av koden i filen oppg1-rett-feil.html, og rett feilene.
Oppgave 11.2
} else {txtSvar.textContent = "Velkommen inn!";if (inpPassord.value === "kanelsnurr") {}txtSvar.textContent = "Feil passord.";
Lag filen oppg2-passord.html med et tekstfelt med id="inpPassord", en knapp og et avsnitt. Sett sammen kodelinjene inne i en funksjon som sjekker passordet.
Oppgave 11.3
alder er 15 og hoyde er 160. Gjett om hvert av uttrykkene nedenfor er true eller false. Sjekk svarene dine i sant-eller-usant.html.
Oppgave 11.4
Lag filen oppg4-billettluka.html, der brukeren skriver inn alderen sin og får vite hva billetten koster.
| Alder | Pris |
|---|---|
| under 12 år | 80 kr |
| 12–17 år | 120 kr |
| 18–66 år | 180 kr |
| 67 år og over | 110 kr |
Lag en testtabell, og test særlig alderne 11, 12, 17, 18, 66 og 67.
Oppgave 11.5
Lag filen oppg5-terning.html med en knapp som kaster en terning og viser hva den ble. Får du en sekser, skal det også stå «Sekser!».
B-oppgaver
Oppgave 11.6
Lag filen oppg6-fornoyelsespark.html med to felt for alder og høyde, og én knapp for hver av tre attraksjoner med ulike krav. Karusellen krever minst 12 år eller over 140 cm, berg-og-dal-banen krever både minst 12 år og over 140 cm, og radiobilene krever minst 8 år. Når brukeren ikke får kjøre, skal programmet si hvilket krav som mangler.
Oppgave 11.7
Lag spillet Gjett tallet i filen oppg7-gjett-tallet.html. Programmet trekker et tilfeldig tall fra 1 til 100 når siden lastes inn. Brukeren gjetter, og programmet svarer «For høyt», «For lavt» eller «Riktig!». Vis hvor mange forsøk brukeren har brukt.
Oppgave 11.8
Lag en quiz med tre spørsmål i filen oppg8-quiz.html. Hvert spørsmål har et tekstfelt og en knapp. Programmet skal si om svaret er riktig, og telle poeng. Hva skjer hvis brukeren skriver svaret med stor forbokstav? Undersøk toLowerCase.
Oppgave 11.9
Et år er et skuddår hvis det kan deles på 4, unntatt hvis det kan deles på 100. Men år som kan deles på 400, er likevel skuddår. Lag filen oppg9-skuddar.html, som sjekker om et år er et skuddår. Bruk %, && og || i ett vilkår, og test med 2024, 2026, 1900 og 2000.