Lippujen käsittely JavaScriptissä
Nyt opimme käsittelemään lippuja.
Lippu on erityinen muuttuja, joka
voi saada vain kaksi arvoa: true
ja false. Lippuja käyttämällä voidaan ratkaista
tehtäviä, jotka tarkistavat jonkin puuttumista:
esimerkiksi voidaan tarkistaa, että taulukossa
ei ole alkiota tietyllä arvolla. Aloitetaan.
Ratkaistaan seuraava tehtävä: annettu taulukko
luvuilla, on tarpeen tarkistaa, onko siinä
alkio arvolla 3 vai ei. Jos
on, tulostetaan '+++', jos ei -
tulostetaan '---'.
Aluksi yritetään tulostaa '+++'.
Tätä varten käymme läpi kaikki taulukkomme alkiot
ja if-lauseella kysymme - onko nykyinen
alkio yhtä suuri kuin arvo 3. Jos on, tulostetaan
'+++':
let arr = [1, 2, 3, 4, 5];
for (let elem of arr) {
if (elem == 3) {
console.log('+++');
}
}
Mutta ratkaisumme ei ole kovin hyvä: sillä jos
taulukossa on useita arvoja 3,
niin '+++' tulostuu useita
kertoja. Muutetaan taulukkoamme (tehdään
kaksi alkiota arvolla 3) ja varmistutaan tästä:
let arr = [1, 2, 3, 4, 3, 5];
for (let elem of arr) {
if (elem == 3) {
console.log('+++'); // tulostaa useita kertoja
}
}
Korjataan ongelma: keskeytetään silmukka
break:llä, jos alkio on jo löytynyt:
let arr = [1, 2, 3, 4, 3, 5];
for (let elem of arr) {
if (elem == 3) {
console.log('+++');
break; // keskeytetään silmukka
}
}
Yritetään nyt tehdä niin, että
jos taulukossa ei ole lainkaan alkioita arvolla
3, tulostuisi '---'. Yleinen
väärinkäsitys on lisätä else
if-lauseeseemme - tässä tapauksessa '---'
tulostuu kaikille alkioille, jotka eivät ole
3:
let arr = [1, 2, 3, 4, 5];
for (let elem of arr) {
if (elem == 3) {
console.log('+++'); // tulostuu alkiolla 3
} else {
console.log('---'); // tulostuu alkioilla 1, 2, 4, 5
}
}
Siis, idea lisätä else - huono
idea, ei toimi. Tämän tyyppisten tehtävien
ratkaisemiseen (tällaisia tehtäviä esiintyy tarpeeksi
usein) käytetään niin kutsuttuja lippuja.
Kuten edellä mainittiin, lippu on sellainen
muuttuja, joka voi saada kaksi arvoa:
true tai false.
Tehdään muuttuja flag
seuraavalla arvolla: jos se on yhtä suuri kuin true,
niin taulukossa on alkio 3, ja jos
false, niin sellaista alkiota ei ole.
Aluksi asetetaan muuttuja flag
arvoon false - eli oletetaan,
että alkiota 3 ei ole taulukossa:
let arr = [1, 2, 3, 4, 5];
let flag = false; // oletetaan, että alkiota 3 ei ole taulukossa
Sitten käynnistetään silmukka if-lauseella kuten teimme
aiemmin. Jos silmukka huomaa, että taulukossa
on alkio 3 - niin asetetaan muuttuja flag
arvoon true ja poistutaan silmukasta
break:llä:
let arr = [1, 2, 3, 4, 5];
let flag = false; // oletetaan, että alkiota 3 ei ole taulukossa
for (let elem of arr) {
if (elem == 3) {
flag = true; // alkio on olemassa - määritellään muuttuja flag uudelleen
break; // poistutaan silmukasta
}
}
Vastauksen kysymykseen, onko taulukossa 3
vai ei, voimme antaa vasta silmukan jälkeen.
Ja tämä vastaus meillä on jo: silmukan jälkeen
muuttuja flag on voinut pysyä false
tai vaihtaa arvonsa true:ksi,
jos silmukka havaitsi taulukossa 3:
let arr = [1, 2, 3, 4, 5];
let flag = false;
for (let elem of arr) {
if (elem == 3) {
flag = true;
break;
}
}
// tässä muuttuja flag on joko true tai false
Nyt silmukan jälkeen voimme tehdä if-lauseen, joka
katsoo muuttujaan flag ja tulostaa
näytölle '+++' tai '---':
let arr = [1, 2, 3, 4, 5];
let flag = false;
for (let elem of arr) {
if (elem == 3) {
flag = true;
break;
}
}
if (flag === true) {
console.log('+++');
} else {
console.log('---');
}
Annettu taulukko:
let arr = ['a', 'b', 'c', 'd', 'e'];
Tarkista, onko tässä taulukossa alkio
'c'. Jos on - tulosta '+++',
ja jos ei - tulosta '---'.
Kirjoita koodi, joka tarkistaa onko luku alkuluku vai ei. Alkuluku on jaollinen vain ykkösellä ja itsellään, eikä ole jaollinen muilla luvuilla.