Olen koodausta aloittelela ja päätin aloittaa verkkokurssilla, mutta ongelmana on se , että en saa apua juuri silloin kun sitä tarvitsen. Seuraava kysymys ammattilaisille helppo, mutta itse olen paininut tämän kanssa jo kohta koko päivän enkä saa suoritettua tehtävää onnistuneesti.
Eli kyseinen tehtävä ja koodi jonka olen kyhännyt on seuraavanlainen:
lainaus:
Tee ohjelma, joka kysyy käyttäjältä ympyrän säteen ja laskee annetun säteen perusteella ympyrän pinta-alan. Lopuksi pinta-ala tulostetaan näytölle. Piin arvona käytetään likiarvoa 3.142. Käyttäjän oletetaan syöttävän kokonaislukuja.
Vihje:
Ympyrän pinta-ala lasketaan kaavalla:
A = π · r2, jossa r on ympyrän säde.Ohjelma kirjoitetaan luokkaan, jonka nimi on ŽAlaŽ.
Esimerkkituloste:
Anna ympyrän säde:3
Ympyrän ala annetulla säteellä: 28.278
Ohjelman tarkastus ei huomioi tyhjiä merkkejä eikä erottele isoja ja pieniä kirjaimia
Sitten kyhäelmäni:
import java.io.*; public class Ala { public static void main(String[] args) { int ympyrän_säde; double ympyrän_ala; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("Anna ympyrän säde: "); ympyrän_säde = Integer.parseInt(in.readLine()); ympyrän_ala = 3.142 * ympyrän_säde * ympyrän_säde; System.out.println("Ympyrän ala annetulla säteellä: " + ympyrän_ala); } catch(Exception e) { System.out.println("Antamasi syöte oli virheellinen..."); } } }
Ja tuloksena :
Anna ympyrän säde: 443
Ympyrän ala annetulla säteellä: 616614.358
ensimmäinen testitulostus on oikein, mutta toinen näyttää seuraavaa virhettä:
Anna ympyrän säde: 45
Ympyrän ala annetulla säteellä: 6362.549999999999
"Virhe tulostuksessa: ohjelmasi tulosti "6362.549999999999", vaikka tulostuksen olisi pitänyt olla "6362.55"
Eli jostain syystä näyttää liian tarkan arvon. Miten saan korjattua kyseisen ongelman? Kiitos jos joku viitsii vauvautua auttamaan, alkaa olla hyvin epätoivoinen olo tämän ongelman kanssa..
jojojojo kirjoitti:
Kiitos jos joku viitsii vauvautua auttamaan, alkaa olla hyvin epätoivoinen olo tämän ongelman kanssa..
Vauvaksi en viitsi ryhtyä, mutta olisiko DecimalFormat ratkaisu?
DecimalFormat df = new DecimalFormat("#.###"); System.out.println("Ympyrän ala annetulla säteellä: " + df.format(ympyrän_ala));
Kiitos. En kuitenkaan vieläkään pelkästään näillä ohjeilla osaa tuota saada toimimaan.. Mitä muuta on tehtävä kuin tuo kyseinen koodinpätkä? Huom olen todella aloittelija näissä hommissa..
jojojojo kirjoitti:
Kiitos. En kuitenkaan vieläkään pelkästään näillä ohjeilla osaa tuota saada toimimaan.. Mitä muuta on tehtävä kuin tuo kyseinen koodinpätkä? Huom olen todella aloittelija näissä hommissa..
Sinun pitää liittää ohjelman alkuun vielä sopiva import-lause, jolla kyseinen paketti tulee ohjelmalle näkyväksi.
import java.text.DecimalFormat;
Kiitos tuostakin uudesta vinkistä. Tämä tehtävä vaatii kuitenkin, että desimaaleissa käytetään pilkun sijasta pistettä, eikä hyväksy tätä ratkaisua.. Mikä tässä tilanteessa ratkaisuksi?
Grezin ratkaisu on tosielämässä oikea ratkaisu luvun muotoiluun. Koulutehtävän tyypillinen ratkaisu olisi joko tulostus metodilla System.out.format formaatilla %.3f, jolloin esimerkissä tulee viimeiseksi desimaaliksi nolla, tai kotikutoinen ”pyöristys” kolmen desimaalin tarkkuuteen seuraavalla kaavalla:
tulos = Math.round(1000 * tulos) / 1000;
Sinänsä "jännää" että järjestelmässä, jossa tehtävät ilmeisesti tarkistetaan, käytetään localena suomea (tai muuta jossa pilkku on desimaalierotin), mutta ei sitten kuitenkaan hyväksytä pilkkua desimaalierottimeksi.
Metabolixin ehdottamat ratkaisut on toimivia, tai sitten voi pistää DecimalFormatin käyttämään pistettä desimaalierottimena:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(); symbols.setDecimalSeparator('.'); DecimalFormat df = new DecimalFormat("#.###", symbols);
Lisäys:
Sinänsähän tuon tehtävän varmasti saisi helpoiten ratkaistua "hyväksytysti" muuttamalla vaan alkuperäisestä koodista rivin:
ympyrän_ala = 3.142 * ympyrän_säde * ympyrän_säde;
Muotoon:
ympyrän_ala = ympyrän_säde * ympyrän_säde * 3.142;
Melkein veikkaan että tämä pyöristyshaaste on ikään kuin puskista tullut ylimääräinen juttu, eikä ole oikeasti edes tarkoitettu tehtävän osaksi.
Suuri kiitos kaikille avusta. Tuo viimeinen yksinkertainen piin arvon heittäminen tuohon loppuun tosiaan sai ohjelman toimimaan tehtävän edellyttämällä tavalla. Mutta minkä takia asia ratkeaa vain tuota paikkaa vaihtamalla?
Johtuu laskujärjestyksestä. Jos lasketaan ensin kokonaislukujen tulo, niin mahdollinen liukulukulaskun pyöristysvirhe tulee vasta ihan viimeisessä kertolaskussa. Jos kerrotaan heti kokonaisluku ja liukuluku, niin tulee kaksi liukulukulaskua, joissa kummassakin voi tulla pyöristysvirheitä.
3.142 * 45 = 141.39 (liukuluku)
141.39 * 45 = 6362.549999999999
45 * 45 = 2025 (kokonaisluku)
2025 * 3.142 = 6362.55
Toki pyöristysvirhe voi tulla joka tapauksessa, esim.
77 * 77 * 3.142 = 18628.917999999998
Aihe on jo aika vanha, joten et voi enää vastata siihen.