Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: JavaScript: Kun luku on yli 99, if-lauseet toimivat väärin

Sivun loppuun

codenoob [18.11.2020 18:18:51]

#

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>

Grez [18.11.2020 19:20:53]

#

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)

noutti [18.11.2020 21:49:53]

#

Laita inputteihin type="number"

Grez [18.11.2020 22:12:44]

#

noutti kirjoitti:

Laita inputteihin type="number"

Eipä se vaikuttaisi asiaan millään tavalla. number tyyppisen inputinkin value on tyypiltään tekstiä.

HTML5 [18.11.2020 22:56:56]

#

Number-tyyppisillä kentillä on tosin valueAsNumber-getteri, jolla arvon saa suoraan lukuna.

Lebe80 [18.11.2020 23:18:35]

#

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

noutti [19.11.2020 10:17:13]

#

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!

Metabolix [19.11.2020 12:24:30]

#

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.

Grez [19.11.2020 12:44:14]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta