Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Pyöristysvirhe Viope-tehtävässä

Sivun loppuun

anttu123 [11.11.2020 17:51:27]

#

Eli tehtävänanto menee näin:

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Ž.

Alla mitä itse sain aikaan.

Ja sitten herjaus miksi testi 2 ei mene läpi. (Testi 1 on OK)

Virhe tulostuksessa: ohjelmasi tulosti "6362.549999999999", vaikka tulostuksen olisi pitänyt olla "6362.55"

Eli siis minun aikaansaannoksella antaa vastauksen useamman desimaalin tarkkuudella kuin tuo kone haluaa.

import java.io.*;

public class Ala {
	public static void main(String[] args) {
	int säde;
	double pii = 3.142;
	double pinta_ala;

	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		try {
			System.out.print("Anna ympyrän säde: ");
			säde = Integer.parseInt(in.readLine());

			pinta_ala = pii * säde * säde;
			System.out.println("Ympyrän ala annetulla säteellä: " + pinta_ala);

		} catch(Exception e) {
			System.out.println("Antamasi syöte oli virheellinen...");
		}
	}
}

Metabolix [11.11.2020 18:06:50]

#

Joskus ratkaiseva ero pyöristyksessä voi tulla laskujärjestyksessä, joten kokeile laskea säde * säde * pii. Sinänsä on äärettömän tyhmää tehdä tehtävä, jossa vaaditaan täsmälleen oikea tuloste liukulukuja sisältävästä laskusta mutta ei määritellä mitään pyöristyssääntöä. Toisaalta kun säde on kokonaisluku, voisit joka tapauksessa pyöristää tuloksen kolmen desimaalin tarkkuuteen ennen tulostusta.

anttu123 [12.11.2020 01:06:26]

#

Metabolix kirjoitti:

(11.11.2020 18:06:50): Joskus ratkaiseva ero pyö­ris­tyk­sessä voi...

Kiitos vastauksesta tää auttoi ja tehtävä meni läpi! Ongelma on siinä etten osaa eikä kurssilla ole vielä käsitelty mitään pyöristykseen liittyvää. Ei taidot riitä. :D

Grez [12.11.2020 09:55:10]

#

Metabolix kirjoitti:

Sinänsä on äärettömän tyhmää tehdä tehtävä, jossa vaaditaan täsmälleen oikea tuloste liukulukuja sisältävästä laskusta mutta ei määritellä mitään pyöristyssääntöä.

Niin toisaalta koodarin yleissivistykseen kuuluu tietää että liukuluvut on epätarkkoja. Voi olla että se jää paremmin mieleen tuollaisen tehtäväkokemuksen jälkeen, kuin oppikirjassa mainittuna.

Ilmeisesti sama tehtävä oli viimekin vuonna tapetilla:
https://www.ohjelmointiputka.net/keskustelu/31501-java-desimaalien-pyöristäminen/sivu-1

Väittäisin että tässä kysyjä ei ole vaivautunut hakemaan onko asiasta jo aikaisemmin keskustelua. Viestin kirjoitusohjeissa lukee:

lainaus:

Ennen uuden keskustelun avaamista on hyvä tarkistaa, onko Ohjelmointiputkassa aikaisemmin keskusteltu samasta asiasta. Sivun oikeassa ylänurkassa olevalla hakukoneella voit etsiä yhtä aikaa vanhoista keskusteluista, koodivinkeistä ja oppaista. Kannattaa myös kokeilla Google-hakua.

The Alchemist [13.11.2020 08:23:47]

#

Minusta outoa on se, että tehtävänannossa erikseen kehotetaan käyttämään kaavaa pii * säde * säde, mutta tällä tavoin tuotetut vastaukset eivät kuitenkaan mene läpi. Eli jopa vastausten tarkistaja itse käyttää erilaista laskutapaa, joten tiukasti tulkiten tehtävän tarkistajassa on bugi.

Grez [13.11.2020 08:40:14]

#

The Alchemist kirjoitti:

Minusta outoa on se, että tehtävänannossa erikseen kehotetaan käyttämään kaavaa pii * säde * säde, mutta tällä tavoin tuotetut vastaukset eivät kuitenkaan mene läpi. Eli jopa vastausten tarkistaja itse käyttää erilaista laskutapaa, joten tiukasti tulkiten tehtävän tarkistajassa on bugi.

Itse asiassa tehtävänannossa vihjataan käyttämään kaavaa π · r², joten ehkä tarkistajan koodi on

pii * Math.pow(säde,2)

anttu123 [13.11.2020 14:33:16]

#

Grez kirjoitti:

(13.11.2020 08:40:14): ”– –” Itse asiassa tehtä­vä­nan­nossa vihjataan...

En usko että tarkoituksena on käyttää tuota kaavaa, sillä mikään teoria osuus tässä kohdassa ei ole vielä käsitellyt moista. Eli tehtävien on kuitenkin tarkoitus vastata opiskelijan sen hetkistä tasoa.

Grez [13.11.2020 15:04:14]

#

Varmaan myöskin pii * (säde*säde) toimisi. Laskujärjestys kuitenkin on normaalisti niin että potenssit lasketaan ennen kertolaskuja. Toki täydellisessä maailmassa (jossa ei tule pyöristysvirheitä) kertolaskujen järjestystä voi muuttaa ja säde*säde*pii = pii*säde*säde.


Sivun alkuun

Vastaus

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

Tietoa sivustosta