Tehtävän ohjeena käyttää if-rakennetta:
Mikäli ylinopeutta ei ole, niin ohjelma tulostaa ”Toivota hyvää matkaa!”
Jos ylinopeutta on yli 20 kilometriä tunnissa, niin ohjelma tulostaa ”Kysy tulot ja laske päiväsakko”.
Mikäli ylinopeutta on 1– 20 kilometriä tunnissa, niin ohjelma tulostaa ”Määrää liiikennevirhemaksu!”.
Lisäksi ohjelma tulostaa tarvittaessa liikennavirhemaksun määrän. Maksu määräytyy seuraavalla tavalla:
Nopeusrajoituksen rikkominen enintään 60 km/h alueella:
ylinopeus 1 - 10 km/h 100 euroa
ylinopeus 11 - 15 km/h 170 euroa
ylinopeus 16 - 20 km/h 200 euroa
Nopeusrajoituksen rikkominen yli 60 km/h alueella:
ylinopeus 1 - 10 km/h 70 euroa
ylinopeus 11 - 15 km/h 140 euroa
ylinopeus 16 - 20 km/h 170 euroa
Seuraavalla koodilla ohjelma toimii kuten pitää. Mutta jostain mystisestä syystä kun nopeus muuttuu isommaksi kuin 99km/h niin tulostukseksi muuttuu "Toivota hyvää matkaa!". Tässä on päätä raavittu sivulta, edestä sekä takaa enkä ymmärrä mistä tälläinen virhetulostus johtuu?
<!DOCTYPE html> <html lang="fi"> <head> <meta charset="UTF-8"> <title>Tutkapoliisin apuohjelma</title> </head> <body onload="alusta();"> <h1><p style="color:blue;">Nopeustutka</p></h1> Nopeusrajoitus: <br> <input id="nopeusRajoitus"/> <br><br> Auton nopeus: <br> <input id="nopeus"/> <br><br> <button type="button" onclick="tarkastaNopeus();">Tutki</button> <br/> <div id="tulostusAlue"></div> <script>
function alusta(){ document.getElementById("nopeusRajoitus").focus(); } function tarkastaNopeus(){ let tulostus = ""; document.getElementById("tulostusAlue").innerHTML = ""; let nopeus = document.getElementById("nopeus").value; let nopeusrajoitus = document.getElementById("nopeusRajoitus").value; let ylinopeus = nopeus-nopeusrajoitus; while (nopeusrajoitus<61){ if (0 < ylinopeus && ylinopeus <11){ let sakko= 100; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else if (10 < ylinopeus && ylinopeus<16){ let sakko= 170; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else if (10 < ylinopeus && ylinopeus<21){ let sakko= 200; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else { break; } } while (nopeusrajoitus>60){ if (0 < ylinopeus && ylinopeus <11){ let sakko= 70; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else if (10 < ylinopeus && ylinopeus<16){ let sakko= 140; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else if (10 < ylinopeus && ylinopeus<21){ let sakko= 170; tulostus = "Määrää liikennevirhemaksu " + sakko + " euroa!"; break; } else { break; } } if (nopeus<=nopeusrajoitus){ tulostus="Hyvää matkaa!"; } else if (ylinopeus>20){ tulostus= "Kysy tulot ja laske päiväsakko"; } document.getElementById("tulostusAlue").innerHTML = tulostus; }
</script> </body> </html>
Kannattaa huomioida, että muuttujat nopeus ja nopeusrajoitus ovat merkkijonoja, eivät numeroita.
"Maija" on pienempi kuin "Matti"
"100" on pienempi kuin "80".
100 on suurempi kuin 80
Yksinkertainen korjaus olisi muuttaa rivi
if (nopeus<=nopeusrajoitus)
muotoon
if (ylinopeus<=0)
Laita inputteihin type="number"
noutti kirjoitti:
Laita inputteihin type="number"
Eipä se vaikuttaisi asiaan millään tavalla. number tyyppisen inputinkin value on tyypiltään tekstiä.
Number-tyyppisillä kentillä on tosin valueAsNumber
-getteri, jolla arvon saa suoraan lukuna.
Aloitusviestiä ei saa poistaa ongelman ratkettua
Aloitusviesti pitää pitää sellaisenaan, korkeintaan alkuperäisen viestin perään teksti: "edit: ratkaistu"
Tämä vaikuttaa suuresti hakukonenäkyvyyteen, jolloin samanlaista ongelmaa googlaillessa saisi ratkaisun löytämällä vaikkapa tämän kyseisen aiheen
Grez kirjoitti:
noutti kirjoitti:
Laita inputteihin type="number"
Eipä se vaikuttaisi asiaan millään tavalla. number tyyppisen inputinkin value on tyypiltään tekstiä.
Hyvä huomio!
Herää myös kysymys, miksi käytetään while-silmukkaa eikä ohjeen mukaista if-lausetta. Koodi olisi selvempi, jos se olisi järjestetty tehtävänannon mukaisesti. Lukuvälien toteutukseen voi käyttää selvemmin yhtä ehtoa kerrallaan elsen ansiosta:
if (x > 20) {} else if (x > 15) {} else if (x > 10) {} else if (x > 0) {}
Lebe80 kirjoitti:
Aloitusviestiä ei saa poistaa ongelman ratkettua
Onneksi ylläpidolla on tähän ratkaisu.
Metabolix kirjoitti:
Herää myös kysymys, miksi käytetään while-silmukkaa eikä ohjeen mukaista if-lausetta.
Kyllähän siitä herää paljonkin kysymyksiä, mainitsemasi lisäksi esimerkiksi, että miksi saman tekstin tulostus on toteutettu 6 kertaa erikseen?
Itse ajattelin kuitenkin että vastaan vain kysymykseen ja antaa tehtävän tarkastajan antaa palautetta huonosta koodista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.