Moi,
Aloitin tänään javan opiskelun javala.cs.tut.fi-sivulla ja nyt olis tällänen tehtävä:
lainaus:
Toteuta annettuun luokkaan staattinen metodi onRekisteriNumero(String s), joka palauttaa true, jos annettu merkkijono on auton rekisterinumero ja false muutoin. Oikeellisuuden tarkistamiseksi riittää, että katsotaan, että:
- merkkijonon pituus on 7 JA
- merkkijonosta löytyy viivamerkki '-' indeksistä 3 (hyväksytään siis myös esim. 123-ABC)Esimerkkejä oikeista: "ABC-123", "444-AAA"
Esimerkkejä väärästä: "313", "ABC+123"
Olen kirjoittanu tälläisen koodin:
package com.javala.exercise; public class StaticMethodExercise { public static boolean onRekisteriNumero(String s){ boolean tulos; string merkki=s.charAt(3); if (s.length()==7 & merkki.equals("-")) { tulos=true; }else{ tulos=false; } return tulos; } }
Tuo heittää nyt virhettä mitä en ymmärrä:
StaticMethodExercise.java: cannot find symbol symbol : class string location: class com.javala.exercise.StaticMethodExercise string merkki=s.charAt(3); ^ 1 error
Missä vika? Miksei tuota stringiä voi luoda?
Mitä nyt itse huomasin, niin ensinnäkin tuo string-muuttujan määrittely on kirjoitettu väärin. Javassa isolla ja pienellä alkukirjaimella on ero, joten string on tässä tapauksessa kirjoitettava isolla alkukirjaimella. Toiseksi tuo s.charAt(3) palauttaa char-muotoisen arvon, joten luultavasti se koko string-tyypin käyttäminen on virhe.
Ok, no oikeastaan sitä ei tarvitsekaan turhaan laittaa erikseen muuttujaan vaan jotenkin näin?
public static boolean onRekisteriNumero(String s){ boolean tulos; if (s.length()==7 && s.charAt(3)==('-')) { tulos=true; }else{ tulos=false; } return tulos; }
Jos charAt hakee isommasta indeksistä kuin 2, tuosta tulee virhe:
java.lang.NullPointerException at com.javala.exercise.StaticMethodExercise. onRekisteriNumero(StaticMethodExercise.java:67) at com.javala.exercise.StaticMethodExercise. runExercise(StaticMethodExercise.java:53) at com.javala.exercise. ExerciseMain.main(ExerciseMain.java:181)
s saattaa sisältää jotain näistä: "ABC-123", "444-AAA", "313", "ABC+123"
Sinun pitää ensin tarkistaa, että pituus on tarpeeksi suuri, ja vasta sitten hakea merkki. Jos funktiollesi syötetään teksti "ABC", se kaatuu juuri noin, koska yrität hakea olemattoman merkin.
Edit: Muokkasitkin viestisi. Nyt saat vielä entistä selvemmän ilmoituksen: et ole tarkistanut, onko s mahdollisesti null. Nyt ei varmasti ole kyse enää tietystä indeksistä, vaan mikä tahansa s.-alkuinen tuottaa virheen.
Edit2: Lue Javalan opetusosuudet! Niissä on kaikki tehtävissä tarvittava tieto, ja lisäksi kannattaa olettaa, että suunnilleen kaikkia asioita tarvitaan tehtävissä.
EDIT: Kiitos!
Näin sain sen toimimaan:
public static boolean onRekisteriNumero(String s){ boolean tulos=false; if (s !=null && s.length()==7 && s.charAt(3)==('-')){ tulos=true; } return tulos; }
EDIT2: ja kiitos Antti ;D
Poistin viestini, kun ongelma jo ratkesi...
Lisähaasteena voit vielä yrittää lyhentää metodia niin, että siinä ei ole muuttujaa eikä ehtolausetta.
En keksinyt mitään tapaa ilman ehtolausetta. Voisitko kertoa miten tuo onnistuu?
Tee niin että metodin sisältönä on vain sopiva return-rivi.
Jep tuon kyllä ymmärsin, mutta miten saisin sen sisältämään true tai false ilman if-lausetta? Tuota en keksi.
EDIT: Mulla oli toisella selaimella toisella tunnuksella sisällä. Enpä muista miksi tuon (lysergic) olin tehnyt :D Siitä on varmaan aikaa
Haha, näin ne tuplatunnusten tekijät jäävät kiinni. :D
Muuta ensin metodia niin, ettet käytä erillistä muuttujaa. (Lue oppaista, miten return tekee.) Lue sitten uudestaan ehtolauseista: mitä if-lauseessa kuuluu olla sulkujen välissä? Lopuksi yhdistä nämä asiat.
Voit käyttää mietiskelysi apuna tätä funktiota, jossa yhden rivin ratkaisu lienee ilmeinen:
public static boolean funktio(boolean ehto) { boolean apu; if (ehto) { // if (ehto == true) apu = true; } else { apu = false; } return apu; }
public static boolean funktio(boolean ehto) { return ehto; }
En vaan keksi tuohon mun omaan..
Tee aivan sama muutos.
Noin lyhyessä pätkässä ei ole kovin monta vaihtoehtoa; olisit tässä ajassa vaikka kokeillut kaikki läpi. :)
Mitä ihmettä? :D Eihän se voi toimia.
Täysin sama olisi
public static boolean onRekisteriNumero(String s){ return s; }
Ja vähän järkevämpi
public static boolean onRekisteriNumero(String s){ return == (s !=null && s.length()==7 && s.charAt(3)==('-')); }
Mutta ei kumpikaan voi toimia. Mitä siis tarkoitit?
EDIT: Yksi =-merkki lisää.
Mikä on omassa koodissasi ehto? Täysin sama on se, että palautat suoraan kyseisen ehdon (ts. ehdon tarkistamisesta syntyvän totuusarvon, jos nyt teknisesti puhutaan).
Tuossa =-merkissä ainakaan ei ole mitään järkeä. Ei tämä ole mikään Basic. Ethän edelliseenkään kirjoittanut "return = tulos".
Tuo on tiedossa. Mulla ei vaan ole mitään hajua miten saan tuon totuusarvon ilman if-lausetta, kuten tuossa yritin sanoa jonkun aikaa sitten.
Et vastannut perustavanlaatuiseen apukysymykseeni. "Mitä if-lauseessa kuuluu olla sulkujen välissä?" Tämä varmaan selviää oppaasta, ja aiempi koodinikin johdattelee aika tehokkaasti. Kun vastaat tähän ja ajattelet hetken, keksit toivottavasti yhteyden tuon esittämäni ehto-parametrin ja oman if-lauseesi ehtona olevan lausekkeen välillä.
Edit: Lisää johdattelevia kysymyksiä, ettei tarvitse samasta vääntää:
Millainen arvo tulee lausekkeesta (1 + 1)?
Millainen arvo tulee lausekkeesta (1 == 1)?
Millainen arvo tulee lausekkeesta (a == b && c == d)?
Millainen arvo if-lauseen ehtona kuuluu olla?
Millainen arvo funktiosi kuuluu palauttaa?
Olen varma että, jos laittaisit valmiin koodin, oppisin sen siitäkin.
Mutta tuo:
return == (s !=null && s.length()==7 && s.charAt(3)==('-'));
on ilmeisesti aika lähellä oikeaa?
No selvä.
return s != null && s.length() == 7 && s.charAt(3) == '-';
Olen kuitenkin varma, että sinulle olisi enemmän hyötyä noiden muutaman varsin yksinkertaisen kysymyksen ratkaisemisesta. Lausekkeet ja tietotyypit ovat aivan välttämättömiä ymmärtää, jos on tarkoitus oikeasti ohjelmoida jotain.
Muuten, eikö funktion pitäisi tarkistaa myös, että ensimmäiset merkit ovat kirjaimia ja viimeiset numeroita?
Kiitos!
Kyllähän sen kannattaisi tarkistaa tuokin, mutta ohjeessa ei pyydetä niin. Voisihan tuota vielä parantaa noin harjoituksen vuoksi.
Mutta voihan rekisteri olla nykyään melkein millanen vaan, kun on noita erikoisrekkareita.
Aihe on jo aika vanha, joten et voi enää vastata siihen.