Kapittel 3 Kontrollstrukturer (valg og løkker) 25 Kontrollstrukturer (valg og løkker) Etter dette kapitlet skal du kunne sammenligne verdier med sammenligningsoperatorer gjennomføre valg med if-setninger utvide if-setninger med else if og else sammenligne flere variabler ved hjelp av logiske operatorer lage tilfeldige tall med Math.random() bruke while-løkker og for-løkker for å gjenta kode finne antall forekomster av en bokstav i en tekst pssst Du finner videoer og andre ressurser på nettstedet på Lokus. I forrige kapittel så vi på datatypen boolean, som enten er sann (true) eller usann (false). I dette kapitlet skal vi se på hvordan vi kan bruke denne datatypen til å styre hvilke deler av en kode som blir gjennomført. I figur 3.1 på neste side kan du se et enkelt gjettespill der brukeren skal gjette på et tall som gutten «tenker på». Denne appen har ulike utfall, avhengig av hva brukeren skriver inn. Vi ønsker at det skal skrives ut korte beskjeder som angir om tallet brukeren gjetter, er for høyt, for lavt eller riktig. 3.1 Valg For å kunne skrive ut «For høyt», «For lavt» eller «Riktig!» i gjettespillet, må vi altså foreta et valg. Vi må velge hva som skal skrives ut. I figur 3.2 kan du se et flytdiagram som illustrerer koden vi må skrive. En hendelse fyres av når knappen trykkes, deretter må vi lagre tallet som brukeren gjetter, i en variabel (som i fahrenheit-eksemplet i forrige kapittel). Når vi har brukerens tall, kan vi sammenligne det med det riktige tallet (tallet gutten «tenker på»).
26 Kontrollstrukturer (valg og løkker) Figur 3.1: Hvilket tall tenker gutten på? Du kan prøve denne enkle appen på elevnettstedet. Hvis tallene er like, skriver vi «Riktig!». Hvis de ikke er like, må vi sjekke om tallet er større enn det riktige tallet. Hvis det er større, skriver vi «For høyt», hvis det ikke er større, skriver vi «For lavt». Et flytdiagram er et fint verktøy som kan brukes til å planlegge apper. Det blir lettere å skrive koden når vi vet hva vi ønsker at koden skal gjøre, og i hvilken rekkefølge koden skal utføres. når knappen trykkes motta tallet brukeren har skrevet JA er riktig tall gjettet? Skriv Riktig! NEI JA er tallet høyere enn riktig tall? Skriv For høyt NEI Skriv For lavt Figur 3.2: Flytdiagram som viser hvordan valg behandles i gjettespillet. Vi skal snart se på hvordan vi foretar valg, men først må vi se på hvordan vi kan sammenligne verdier.
Kontrollstrukturer (valg og løkker) 27 Sammenligningsoperatorer I eksemplet ovenfor må vi ha en variabel som inneholder det «riktige» tallet: var riktigtall = 42; Vi må også ha en variabel som inneholder tallet brukeren gjetter: var gjettet; Vi kjenner ikke innholdet i variabelen gjettet og må derfor skrive kode som tar hensyn til det. La oss først anta at brukeren gjetter 17: gjettet = 17; Nå kan vi sjekke om brukeren har gjettet riktig: console.log(gjettet == riktigtall); // skriver ut false Legg merke til at vi her bruker to likhetstegn (==) for å sjekke om de to verdiene er like. Ikke glem at ett likhetstegn (=) tilordner verdier (setter venstresiden lik høyresiden). De to likhetstegnene er et eksempel på en sammenligningsoperator. I tabell 3.1 kan du se en oversikt over sammen/-lignings/-operatorene vi finner i JavaScript. Operator Beskrivelse Eksempel == Lik verdi 4 == "4" // true === Lik verdi og lik datatype 4 === "4" // false!= Ikke lik verdi 7!= 5 // true!== Ikke lik verdi eller datatype 4!== "4" // true > Større enn 5 > 3 // true < Mindre enn 3 < 3 // false <= Mindre enn eller lik 3 <= 3 // true >= Større enn eller lik 4 >= 5 // false Tabell 3.1: Sammenligningsoperatorer De to likhetstegnene (==) sammenligner bare verdiene. Det vil si at de ikke sammenligner datatyper. For å sammenligne verdi og datatype, må vi bruke tre likhetstegn (===). Det er derfor lurt å bruke tre likhetstegn ved sammenligning av variabler, fordi vi ofte ønsker at de også skal ha samme datatype.
28 Kontrollstrukturer (valg og løkker) console.log(5 == "5"); // skriver ut true console.log(5 === "5"); // skriver ut false Hvis vi vil undersøke om noe ikke er likt, kan vi bruke operatoren!=. Den sammenligner to verdier og gir true hvis de ikke er like. For å sammenligne både verdi og datatype, kan vi bruker operatoren!==. Da får vi true hvis verdiene eller datatypene ikke er like: console.log(5!= 4); // skriver ut true console.log(5!= 5); // skriver ut false console.log(5!= "5"); // skriver ut false console.log(5!== 4); // skriver ut true console.log(5!== "5"); // skriver ut true For å sjekke om tallet til brukeren i gjetteapplikasjonen er større enn eller mindre enn det riktige tallet, kan vi bruke > (større enn) og < (mindre enn): console.log(gjettet > riktigtall); // skriver ut false console.log(gjettet < riktigtall); // skriver ut true Oppgaver 3.1 Lag først variablene var a = 3;, var b = 7;, var c = "7";. Hvilket utfall (true eller false) forventer du fra disse kodene? Prøv kodene i konsollen etter at du har foreslått resultatet (du kan skrive kodene nedenfor rett inn i console.log();). a b == c b b === c c a < b d a <= b e a > b f a!= b g b!= c h b!== c 3.2 Gjør om verdien til én av variablene i hver av deloppgavene ovenfor, slik at resultatet blir det omvendte av hva det er nå (altså at de deloppgavene som gir false skal gi true, og omvendt). if-setninger Nå som vi har verktøyene vi trenger for å sammenligne verdier, kan vi skrive koden som foretar valget vårt. Til det bruker vi en if-setning (en «hvis»- setning). Den fungerer for eksempel slik: hvis du har gjort som du skal, så får du en sjokolade. Men hvis du ikke har gjort som du skal, vil ingenting skje. Vi kan bruke en if-setning for å se om brukeren har gjettet riktig:
Kontrollstrukturer (valg og løkker) 29 if (gjettet === riktigtall) { console.log("riktig!"); Vi skriver altså if etterfulgt av betingelsen vår i parenteser (gjettet === riktigtall). Hvis betingelsen er sann (true), vil det som står mellom sløyfeparentesene ({ og ) skje. Hvis betingelsen er usann (false), vil ingenting skje. Det vil si at maskinen hopper over koden mellom sløyfeparentesene og fortsetter med å utføre koden etter dem. Alternativt kan vi sjekke om gjettet tall ikke er lik det riktige tallet: if (gjettet!== riktigtall) { console.log("feil!"); Vi kan bygge ut en if-setning med en else-bit (en «ellers»-bit), slik at noe også kan skje hvis betingelsen er usann (false): if (gjettet === riktigtall) { console.log("riktig!"); else { console.log("feil!"); Her vil det som står mellom de første sløyfeparentese skje hvis betingelsen (gjettet === riktigtall) er sann (true). Mens det som står mellom sløyfeparentesene etter else vil skje hvis betingelsen er usann (false). For å fullføre eksemplet vårt må vi også undersøke om det gjettede tallet er mindre enn, eller større enn, det riktige tallet. Vi kan slå sammen flere ifsetninger ved å skrive else if for å få til det: if (gjettet === riktigtall) { console.log("riktig!"); else if (gjettettall < riktigtall) { console.log("for lavt"); else if (gjettettall > riktigtall) { console.log("for høyt"); Hvis den første betingelsen (gjettet === riktigtall) er sann, vil "Riktig!" bli skrevet ut. Hvis den første betingelsen er usann, og den andre betingelsen (gjettet < riktigtall) er sann, vil "For lavt" bli skrevet ut. Og hvis de to første betingelsene er usanne, og den tredje betingelsen (gjettet > riktigtall) er sann, vil "For høyt" bli skrevet ut. I dette eksemplet er egentlig siste del overflødig. Hvis tallet ikke er riktig eller hvis tallet ikke er for lavt, må tallet være for høyt. Vi kan derfor forenkle den siste delen av koden:
30 Kontrollstrukturer (valg og løkker) if (gjettet === riktigtall) { console.log("riktig!"); else if (gjettettall < riktigtall) { console.log("for lavt"); else { console.log("for høyt"); Legg merke til at vi bruker else i stedet for else if nederst i denne koden. Vi trenger ikke å teste om tallet er høyere enn det riktige tallet, fordi tallet må være høyere når det ikke er likt eller lavere. Oppgaver 3.3 En berg- og dalbane i en fornøyelsespark kan bare kjøres om du er over 100 cm høy. Skriv en if-setning som tester om en person er høy nok. 3.4 En annen berg- og dalbane kan bare kjøres om høyden din er over 100 cm og under 180 cm. Skriv en if-setning som tester om en person kan kjøre med denne berg- og dalbanen. Kodeblokker I kapittel 2 så vi på setninger (eng. statements) i JavaScript. En setning er en kodebit som avsluttes med et semikolon. I dette kapitlet bruker vi også sløyfeparenteser ({ og ) i koden vår. Kode som omsluttes av sløyfeparenteser, kalles en kodeblokk. En kodeblokk inneholder oftest én eller flere setninger kode, men de kan også være tomme. Sløyfeparentesene lar oss avgrense kode, slik at vi for eksempel kan bruke if-setninger for å angi hvilke kodeblokker som skal gjennomføres. Logiske operatorer Foreløpig har vi sett på hvordan vi kan sammenligne to variabler, men hva om vi ønsker å sammenligne flere samtidig? La oss si at vi har en nettside der en bruker skal skrive inn alderen sin. Da vil vi få variabelen var alder;. På nettsiden vil vi skrive ut en tekst hvis brukeren er en tenåring. Det kan vi gjøre med if-setninger slik: if (alder >= 13) { if (alder <= 19) { console.log("du er en tenåring");
Kontrollstrukturer (valg og løkker) 31 Her har vi brukt to if-setninger inni hverandre, der vi først sjekker om brukeren er 13 år eller eldre (med operatoren større eller lik). Hvis brukeren er 13 år eller eldre, sjekker vi om hun er 19 år eller yngre (med operatoren mindre eller lik). Hvis hun også er 19 år eller yngre skriver vi ut meldingen "Du er en tenåring". Hvis vi i stedet bruker en logisk operator, kan vi få til det samme på en enklere måte. Logiske operatorer lar oss sjekke flere betingelser samtidig. I dette tilfellet kan vi bruke operatoren && (og), for å sjekke om alderen er 13 år eller høyere og om alderen samtidig er 19 år eller lavere: if (alder >= 13 && alder <= 19) { console.log("du er en tenåring"); I kapittel 2 så vi at en operator gir oss én verdi basert på flere verdier (for eksempel 2 + 3 = 5). En logisk operator gjør det samme, men med datatypen boolean. Vi gjør om flere boolean-verdier til én. I eksemplet ovenfor blir betingelsen alder >= 13 && alder <= 19 true så lenge både alder >= 13 og alder <= 19 gir true. Vi har også operatoren (eller), som lar oss undersøke om minst én betingelse er sann. Vi kan for eksempel skrive ut en beskjed til alle som ikke er tenåringer: if (alder < 13 alder > 19) { console.log("du er ikke en tenåring"); Her blir teksten "Du er ikke en tenåring" skrevet ut hvis alderen er mindre enn 13 eller hvis alderen er større enn 19. Altså hvis brukeren ikke er en tenåring. Det vil si at kodebiten alder < 13 alder > 19 blir true hvis enten alder < 13 gir true, eller hvis alder > 19 gir true I figur 3.3 kan du se en illustrasjon av de to logiske operatorene && og. Det grønne området viser hvilke verdier for x som gjør at betingelsen blir sann. Det finnes også en tredje logisk operator,! (ikke), som gir oss det omvendte av et resultat. Det vil si at true gjøres om til false, og omvendt: console.log(!true); // skriver ut false console.log(!false); // skriver ut true
32 Kontrollstrukturer (valg og løkker) -10 0 10 20 x > 3 && x < 13-10 0 10 20 x < 2 x > 11 Figur 3.3: Illustrasjon av de logiske operatorene && (og) og (eller). Vi kommer ikke til å bruke denne operatoren så mye, fordi vi ofte kan oppnå det vi ønsker med sammenligningsoperatorene. Men den er veldig nyttig hvis vi har en verdi med datatypen boolean: var myndig = true; Da kan vi bruke! (ikke) for å skrive ut en beskjed til alle som ikke er myndige: if (!myndig) { console.log("du er ikke myndig."); Operator Beskrivelse Eksempel && Og (begge er sanne) (a > 10 && b > 2) // true Eller (én eller begge er sanne) (a > 8 b > 5) // false! Ikke!(a > b) // false Tabell 3.2: Logiske operatorer. Her er var a = 7; og var b = 3;.
Kontrollstrukturer (valg og løkker) 33 Oppgaver 3.5 Lag først variablene var a = 3; og var b = 7;. Hvilket utfall (true eller false) forventer du fra disse kodene? Prøv kodene i konsollen etter at du har foreslått resultatet. a (a!= 2) && (b < 10) b (a > 3) && (b === 7) c (a > 2) (b === 8) d (a === 2) (b > 8) e!(b === 10) f!(b > a) 3.6 Bruk logiske operatorer for å løse oppgave 3.4. Tilfeldige tall (Math.random) Vi har tidligere sett på de innebygde objektene Console og String. Et annet objekt vi har stor glede av, er matematikk-objektet Math. For å lage uforutsigbare situasjoner i spill og andre apper, bruker vi metoden Math.random(), som gir oss et tilfeldig tall som er større enn eller lik 0 og mindre enn 1. Vi får altså et nytt tilfeldig tall hver gang vi skriver Math.random(): console.log(math.random()); // 0.013074025867976236 console.log(math.random()); // 0.9319828796502934 console.log(math.random()); // 0.8053305842128071 Tallene vi får går fra og med 0, og opp til (men ikke med) 1. Hvis vi ønsker et av de hele tallene 0, 1 eller 2, kan vi gange det tilfeldige tallet med 3 og runde ned til nærmeste hele tall. Ganger vi et tall mellom 0 og 1 med 3, får vi et tall mellom 0 og 3. Siden tallet vi startet med måtte være mindre enn 1, så ender vi med et tall som er mindre enn 3. Dersom vi runder ned, altså fjerner alle sifre etter komma, sitter vi igjen med 0, 1 eller 2. For å runde ned må vi bruke metoden Math.floor(): var tilfeldig = Math.random() * 3; // 1.06965824116858 console.log(math.floor(tilfeldig)); // 1 tilfeldig = Math.random() * 3; // 2.568852403415863 console.log(math.floor(tilfeldig)); // 2 tilfeldig = Math.random() * 3; // 0.08042433925622894 console.log(math.floor(tilfeldig)); // 0 I figur 3.4 kan du se hvordan vi gjør om tallet vi får fra Math.random() til andre tilfeldige sekvenser.
34 Kontrollstrukturer (valg og løkker) Math.random() (større enn eller lik 0 og mindre enn 1) Math.random() * 5 (større enn eller lik 0 og mindre enn 5) (Math.random() * 5) + 5 (større enn eller lik 5 og mindre enn 10) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Figur 3.4: Vi kan bruke Math.random() til å lage tilfeldige sekvenser. Vi kan bruke tilfeldige tall når vi ønsker at noe tilfeldig skal skje. Hvis vi kombinerer et tilfeldig tall med en if-setning, kan vi for eksempel lage en «kompliment-generator»: var tilfeldig = Math.floor(Math.random * 3); if (tilfeldig === 0) { console.log("du er den beste koderen i landet!"); else if (tilfeldig === 1) { console.log("steve Jobs kan ikke måle seg med deg!"); else if (tilfeldig === 2) { console.log("du er den neste Mark Zuckerberg!"); Oppgaver 3.7 En «Magic 8-ball» er en kule som svarer på typiske ja/nei-spørsmål, med svar som «Ja, garantert», «Ikke regn med det» og «Spør senere». Det vil si at vi for eksempel kan stille spørsmålet: «Vinner jeg i lotto til helgen?» og få svaret «Tviler på det». Lag din egen tekstbaserte «Magic 8-ball» som gir et tilfeldig svar. SPØR SENERE 3.2 Løkker Vi havner ofte i situasjoner der vi vil gjøre den samme operasjonen mange ganger. En løkke lar oss gjenta en kodeblokk et bestemt antall ganger, eller til en betingelse ikke lenger er sann (true). Det er blant annet løkker som gjør
Kontrollstrukturer (valg og løkker) 35 datamaskiner til så effektive regnemaskiner. Hvis vi for eksempel skal «telle» fra 1 til 100 uten en løkke, må vi skrive: console.log(1); console.log(2); console.log(3); // osv. osv. osv. console.log(99); console.log(100); I stedet for å skrive 100 linjer med kode, kan vi gjøre dette raskt og enkelt ved å bruke en løkke. I denne boka er det i hovedsak to løkkevarianter vi bruker: while-løkker og for-løkker. while-løkker En while-løkke lar oss gjenta noe så lenge en gitt betingelse er sann (true): while (betingelse er sann) { kode Vi lager en while-løkke med kodeordet while, etterfulgt av en betingelse i parentes. Så lenge betingelsen er sann, blir koden mellom sløyfeparentesene ({ og ) gjentatt. Vi kan derfor «telle» til 100 med ganske lite kode: var i = 1; while (i <= 100) { // Så lenge i er mindre enn eller lik 100 console.log(i); // Skriv ut verdien til i i++; // Øker verdien til i med 1 I koden ovenfor lager vi først variabelen i, med verdien 1. Det er vanlig å bruke bokstavene i, j og k som variabelnavn for slike tellere i løkker. Deretter lager vi en while-løkke, der koden gjentas så lenge verdien til i er mindre enn eller lik 100. I selve kodeblokken (mellom sløyfeparentesene) skrives i til konsollen, før verdien til i økes med én (i++). Dette blir da gjentatt for verdiene 1, 2, 3,..., 98, 99, 100, før løkken slutter (fordi i ikke lenger er mindre enn eller lik 100). I figur 3.5 vises deler av utskriften vi får fra denne koden. I eksemplet ovenfor vet vi hvor mange ganger løkken skal gjentas (100 ganger). En while-løkke brukes vanligvis når vi ikke vet hvor mange ganger noe skal gjentas. I figur 3.6 vises en illustrasjon av dette. Flytdiagrammet beskriver en robot som skal kjøre rett fram, så lenge den ikke møter noen hindringer. Vi kan ikke vite hvor langt roboten må kjøre før den møter en hindring, så vi vet
36 Kontrollstrukturer (valg og løkker) Figur 3.5: Her vises deler av resultatet av koden som teller til 100. Teksten til høyre i figuren viser filnavn og linjenummer. ikke hvor mange ganger løkken skal gjentas, men vi vet når løkken skal stoppes (når roboten er innenfor 10 cm av en hindring). Derfor egner en while-løkke seg godt til denne oppgaven. start NEI Over 10 cm til hindring? JA slutt Kjør videre Figur 3.6: Flytdiagram for en robot som skal kjøre til den treffer en hindring Vi kan bruke Math.random() for å se på en slik situasjon der vi ikke vet når en while-løkke skal avsluttes. Husk at Math.random() gir et tall som er større enn eller lik 0 og mindre enn 1. Vi kan for eksempel «trekke» tilfeldige tall, helt til vi har et som er større enn eller lik 0,9: var tall = 0; while (tall < 0.9) { // Så lenge tallet er mindre enn 0.9 console.log(tall); // Skriv ut tallet tall = Math.random(); // Trekk et nytt tall
Kontrollstrukturer (valg og løkker) 37 for-løkker En for-løkke er ikke veldig ulik en while-løkke. Hvis vi vil telle til 100 med en for-løkke, kan vi skrive: for (var i = 1; i <= 100; i++) { console.log(i); Denne løkken starter med å lage variabelen i og gi den verdien 1. Deretter angir vi at løkken skal gjentas så lenge i er mindre enn eller lik 100 (i <= 100). Til slutt angir vi at verdien til i skal økes med én (i++) etter hver gjentagelse av løkken. Vi bruker semikolon for å skille mellom de tre delene. Vi angir altså en start-verdi, en stopp-betingelse og en endring: for (start; betingelse; endring) { kode I figur 3.7 vises en illustrasjon av hvordan denne løkken fungerer. Legg merke til at vi her gjør det samme som i while-løkken vi brukte tidligere i kapitlet. Forskjellen er at vi samler den delen av koden som har med gjentagelsen å gjøre på ett sted. Dette gjør koden lettere å lese, og reduserer faren for feil. Hva tror du skjer hvis vi glemmer å øke verdien til i? Som nevnt tidligere bruker vi while-løkker når vi ikke vet hvor mange ganger noe skal gjentas. Hvis vi vet, eller lett kan finne, antall gjentagelser, bruker vi en for-løkke. I neste avsnitt skal vi se på et eksempel på det. start NEI er i <= 100? JA i++ slutt console.log(i); Figur 3.7: Flytdiagram som viser gangen i en for-løkke.
38 Kontrollstrukturer (valg og løkker) Oppgaver 3.8 Lag en while-løkke som skriver ut tallene fra 0 til 50. 3.9 Lag en for-løkke som skriver ut tallene fra 0 til 50. Sammenlign denne løkken med løkken du skrev i forrige oppgave. 3.10 Lag en løkke som skriver ut alle tallene i 3-ganger n opp til 999 (0, 3, 6, 9, 12, 15 osv.). 3.11 Lag en løkke som skriver ut alle partallene mellom 1 og 100. 3.12 Lag en løkke som summerer alle tallene fra 1 til 100, men som bare skriver ut summen i konsollen. 3.13 Lag en løkke som skriver ut følgende til konsollen: # ## ### #### (Hint: Lag en tom tekstvariabel før løkken, og husk at operatoren += også kan brukes på tekst.) 3.14 Gjør om på koden du skrev i forrige oppgave slik at den siste linjen inneholder 50 emneknagger (#). 3.15 Lag en løkke som skriver ut alle tallene fra 20 til 20 bortsett fra 13 og 13. 3.16 Lag en løkke som skriver ut alle versene i sangen «99 flasker med brus»: 99 flasker med brus på hylla, 99 flasker med brus. Ta en ned og send den rundt, 98 flasker med brus på hylla. 98 flasker med brus på hylla, 98 flasker med brus. Ta en ned og send den rundt, 97 flasker med brus på hylla. 97 flasker med brus på hylla, 97 flasker med brus. Ta en ned og send den rundt, 96 flasker med brus på hylla.... Ingen flere flasker på hylla, ingen flasker igjen. Gå i butikken og kjøp noen fler, 99 flasker med brus på hylla. (Hint: Se på versene og se hva som endrer seg, og hva som er det samme.) 3.17 Utfordring: Lag en løkke som skriver ut tallene fra 1 til 100. Hvis et tall er delelig på 3, skal du i stedet for tallet skrive "Fizz", og hvis et tall er delelig på 5, skal du i stedet for tallet skrive "Buzz". Hvis et tall er delelig på både 3 og 5, skal du skrive "FizzBuzz". Husk at modulusoperatoren (%) lar oss undersøke om et tall er delelig på et annet.
Kontrollstrukturer (valg og løkker) 39 Lete gjennom en tekst I kapittel 2 så vi på datatypen string og metodene vi kan bruke på variabler med denne datatypen. Der så vi at kan finne lengden til en tekst ved å bruke egenskapen length: var sitat = "You shall not pass!"; console.log(sitat.length); // skriver ut 19 Vi kan også hente ut enkelttegn fra en tekst (husk at det første tegnet har index 0): var sitat = "You shall not pass!"; console.log(sitat[0]); // skriver ut "Y" console.log(sitat[2]); // skriver ut "u" console.log(sitat[9]); // skriver ut " " (et mellomrom) Vi kan kombinere disse egenskapene med en for-løkke og skrive ut én og én bokstav: for (var i = 0; i < sitat.length; i++) { console.log(sitat[i]); Legg merke til at vi her starter å telle fra 0 (var i = 0), og at løkken skal holde på så lenge verdien til i er mindre enn sitatets lengde (i < sitat.length). Sitatets lengde er 19, men fordi tegnenes index starter på 0, har det siste tegnet index 18. Derfor gjentas løkken så lenge verdien til i er mindre enn sitatets lengde, og ikke mindre enn eller lik sitatets lengde. En naturlig anvendelse av for-løkker på tekster, er å telle antall forekomster av en bokstav. String-objektet har metoden indexof(), som lar oss finne ut om en tekst inneholder et tegn, men den metoden gir oss bare den første forekomsten av tegnet. For å finne antall forekomster, kan vi bruke en for-løkke slik: var sitat = "You shall not pass!"; var antall = 0; for (var i = 0; i < sitat.length; i++) { if (sitat[i] === "s") { antall++; console.log(antall); // skriver ut 3
40 Kontrollstrukturer (valg og løkker) Her lager vi variabelen antall utenfor løkken. Den skal vi bruke til å telle antall forekomster av bokstaven «s» i sitatet. I for-løkken bruker vi en if-setning for å undersøke om gjeldende bokstav er en «s» (if (sitat[i] === "s")). Hvis gjeldende bokstav er en s, øker vi antallet med én (antall++). Etter løkken skriver vi ut verdien til variabelen antall, som er 3, fordi bokstaven «s» har tre forekomster i sitatet. Oppgaver 3.18 Hvorfor bruker vi i < sitat.length (mindre enn) og ikke i <= sitat.length (mindre enn eller lik) i koden ovenfor? 3.19 Lag tekstvariabelen alfabet = "abcdefghijklmnopqrstuvwxyzæøå";. Du skal deretter lage en app som lager tilfeldige ord. Bruk Math.random() for å hente ut tilfeldige bokstaver fra teksten i variabelen alfabet. Lag noen tilfeldige ord med ulik lengde. 3.20 Utfordring: Du skal lage en krypteringsapp som gjør om en tekst ved å flytte alle bokstaver ett hakk til høyre i alfabetet. Teksten «hei» vil for eksempel bli til «ifj». Her bør du lage en tom variabel som skal inneholde det nye ordet, og en løkke som går gjennom ordet som skal krypteres. For å få til dette kan du bruke metoden indexof slik: var index = alfabet.indexof("h"); var nyindex = index + 1; nyttord += alfabet[nyindex]; Hvis du vil ha med mellomrom og tegn i originalteksten, må du legge dem til i alfabetvariabelen. Du bør også legge til et ekstra tegn på slutten, slik at bokstaven «å» også kan krypteres, eller du kan behandle bokstaven «å» på en annen måte, for eksempel gjøre den om til en «a». Lag også en tilsvarende kode som finner det riktige ordet fra det krypterte ordet.
Kontrollstrukturer (valg og løkker) 41 Sammendrag Vi kan sammenligne verdier med sammenligningsoperatorer (se tabell 3.1 på side 27). En if-setning lar oss foreta valg: if (betingelse) { kode Vi kan utvide if-setninger med else if og else: if (betingelse 1) { kode else if (betingelse 2) { kode else { kode Med logiske operatorer (&&, og!) kan vi gjøre flere tester samtidig, og vi kan gjøre om et testresultat til det motsatte av hva det var. Metoden Math.random() gir oss et tilfeldig tall som er større enn eller lik 0 og mindre enn 1. Metoden Math.floor() runder et tall ned til nærmeste heltall. En while-løkke lar oss gjenta kode så lenge en betingelse er sann: while (betingelse) { kode En for-løkke lar oss gjenta kode et bestemt antall ganger: for (start; betingelse; endring) { kode