Mikäs mulla on tuon ao ohjelmanpätkän kanssa ongelmana? Iski sokeus eikä löydy virheet! Ja palauttaakin pitäisi toimivana harjoituksena.
Oon jakanut interfeissin, luokat ja ohjelmat tässä kommenttiviivalla, "oikeasti" ne on omia kokonaisuuksiaan.
Yksinkertainen on tietysti kaunista, olisiko muita ajatuksia homman toteutukseen...
Ilman määrittelyä, toivottavasti ajatus selviää koodista :)
public interface Muoto { public static final double PII = 3.14; public int pinta_ala(); }
import java.math.*; // Tämä luokka on Muoto-luokan aliluokka class Suorakulmio implements Muoto { // Muuttujat private double korkeus, leveys; // Rakentaja public Suorakulmio() { korkeus = 0; leveys = 0; } // Funktiot, joilla asetetaan korkeus ja leveys public void aseta_korkeus (Double annettu_korkeus) { korkeus = annettu_korkeus.doubleValue(); } public void aseta_leveys (Double annettu_leveys) { leveys = annettu_leveys.doubleValue(); } // Muoto rajapinnan pinta-ala funktio public int pinta_ala() { // Laskee pinta-alan ja palauttaa lasketun arvon return (int) Math.round(korkeus * leveys); } }
import java.math.*; // Tämä luokka on Muoto-luokan aliluokka class Ympyra implements Muoto { // Muuttuja public double radius; // Rakentaja public Ympyra() { radius = 0; } // Funktio, jolla asetetaan säde public void aseta_sade(Double annettu_sade) { radius = annettu_sade.doubleValue(); } // Muoto rajapinnan pinta-ala funktio public int pinta_ala() { // Laskee pinta-alan ja palauttaa lasketun arvon return (int) Math.round (PII * radius * radius); } }
import java.io.*; public class Ohjelma { public static void main(String argv[]) { // Muuttujat String stringi; int int_tyyppi; int pinta_ala = 0; // SYötteidenluku BufferedReader syote = new BufferedReader(new InputStreamReader(System.in)); // Kysytään lasketaanko ympyrän vai suorakulmion ala System.out.println("Lasketaanko pinta-ala ympyralle (1) vai suorakulmiolle (2)?"); stringi = syote.readLine(); // Muutetaan integer-tyypiksi ja ilmoitetaan virheellisestä valinnasta try { int_tyyppi = Integer.parseInt(stringi); } catch (Exception e) { System.out.println(); System.out.println("Et syöttänyt numeroa"); return; } // YMPYRÄVASTAUS OSUUS if (int_tyyppi == 1) { Double sade; // Kysytään ympyrän säde System.out.println("Anna ympyran sade ?"); stringi = syote.readLine(); // Muutetaan vastaus Double-tyyppiseksi ja ilmoitetaan virheistä try { sade = Double.valueOf(stringi); } catch (Exception e) { System.out.println(); System.out.println("Et syöttänyt numeroa"); return; } // Lasketaan pinta-ala ja asetetaan säde ympyräluokan funtioilla // ja sijoitetaan lopputulos pinta_ala-muuttujaan Ympyra y = new Ympyra(); y.aseta_sade(sade); pinta_ala = y.pinta_ala(); } // SUORAKAIDEVASTAUS OSUUS else if (int_tyyppi == 2) { Double pituus; Double korkeus; // Kysytään suorakulmion sivun pituus ja ilmoitetaan virheistä System.out.println("Anna suorakulmion sivun pituus ?"); stringi = syote.readLine(); // Muutetaan vastaus Double-tyyppiseksi ja ilmoitetaan virheistä try { pituus = Double.valueOf(stringi); } catch (Exception e) { System.out.println(); System.out.println("Et syöttänyt numeroa"); return; } // Kysytään suorakulmion korkeutta ja ilmoitetaan virheistä System.out.println("Anna suorakulmion korkeus ?"); stringi = syote.readLine(); // Muutetaan vastaus Double:ksi ja ilmoitetaan virheistä try { korkeus = Double.valueOf(stringi); } catch (Exception e) { System.out.println(); System.out.println("Et syöttänyt numeroa"); return; } // Asetetaan korkeus ja pituus, lasketaan pinta-ala ja sijoitetaan lopputulos // pinta_ala-muuttujaan suorakulmaluokan funtioita hyväksikäyttäen Suorakulmio s = new Suorakulmio(); s.aseta_leveys(pituus); s.aseta_korkeus(korkeus); pinta_ala = s.pinta_ala(); } // Väärin vastattu, poistutaan ohjelmasta else { System.out.println("Vastattava vain numeroin"); return; } // Tulostetaan pinta-ala System.out.println("Pinta-ala on " + pinta_ala + " neliota"); } }
50€ palkaksi sille joka tuon debuggaa.
Vai käsitinkö jonkin asian väärin?
Kooditagit ois aika kova sana, eihän tuosta ota erkkikään selvää...
Myös virheiden antaminen olisi kova juttu, olisi paljon nopeampaa kuin, että jokainen auttaja debugittaa tota. Kääntyykö se, mitä se tulostaa, mitä virheilmoituksia etc. Miksi metodeille pitää double tuoda luokassa?
catch (Exception e) { System.out.println(); System.out.println("Et syöttänyt numeroa");
Virhe voi olla tuossa mikä tahansa.
No toihan on ihan hirveetä toi koodi mut noi sun
readLine():es pitää olla try catch:in sisällä (jokainen) ja sit toi stringi muuttuja kantsii alustaa esim String stringi = "";
Ja sit kannattaa miettii tota Muoto interface:a et olisko parempi tehdä se abstractiks luokaks
maka78:lle kiitti, muokkasin kotona kiireessä ja noi try-catchit meni vähän väärään väliin (tai niitä itse asiassa jäi pois)
Ja tosiaan, näyttää ihan hirveälle! Sisennykset jäi johonkin lähetettäessä tuo viritys tänne sivuille. Ja sisältö... se nyt on varmaan karseaa, eka kerta ku javalla jotain väsään.
Mikkis75 kirjoitti:
Sisennykset jäi johonkin lähetettäessä tuo viritys tänne sivuille.
HTML-muotoilu ei tunne sisennyksiä, sen takia koodi on laitettava [code] ja [/code]-tagien väliin, jolloin foorumi osaa muotoilla siihen ne sisennykset.
Ei ne sisennykset varsinaisesti minnekään ole kadonnut. Ne näkyy ainakin view sourcella tai sitten lainaamalla tuon tekstin. (tai sitten pasteaa tuon koodin johonkin editoriin ja antaa sen sisentää koodi uudestaan)
Tuossa alla korjailtu versio koodista, tätä sen siis piti tehdä... Kääntyy ja tekee määritelmän mukaiset temput, itse koodista puolestaan, no ei edelleenkään kaunista.
public interface Muoto { public static final double pii = 3.14; public int pinta_ala(); } ////////////////////////////////////7 import java.math.*; // Tämä luokka on Muoto-luokan aliluokka class Ympyra implements Muoto { // Muuttuja säde public double sade; // Rakentaja Ympyrä public Ympyra() { sade = 0; } // Funktio, jolla asetetaan säde public void aseta_sade(Double asetettu_sade) { sade = asetettu_sade.doubleValue(); } // muoto rajapinnan pinta-ala funktio public int pinta_ala() { // Laskee pinta-alan ja palauttaa lasketun arvon return (int) Math.round (sade * sade * pii); } } /////////////////////////////////////////// // Tämä luokka on Muoto-luokan aliluokka class Suorakulmio implements Muoto { // Muuttujat private double sivu1; private double sivu2; // Rakentaja public Suorakulmio() { sivu1 = 0; sivu2 = 0; } // Funktiot, joilla asetetaan sivujen pituudet public void aseta_sivu1 (Double asetettu_sivu1) { sivu1 = asetettu_sivu1.doubleValue(); } public void aseta_sivu2 (Double asetettu_sivu2) { sivu2 = asetettu_sivu2.doubleValue(); } // muoto rajapinnan pinta-ala funktio public int pinta_ala() { // Laskee pinta-alan ja palauttaa lasketun arvon return (int) Math.round(sivu1 * sivu2); } } //////////////////////////////////////// import java.io.*; public class Ohjelma { public static void main(String argv[]) { String vastaus; int muunnettu_vastaus; int pinta_ala = 0; BufferedReader syote = new BufferedReader(new InputStreamReader(System.in)); // Lasketaan ympyrän tai suorakulmion pinta-ala try { System.out.println(); System.out.println("Lasketaanko pinta-ala"); System.out.println(); System.out.println("ympyralle ( valitse 1)"); System.out.println(); System.out.println("vai suorakulmiolle (valitse 2)"); vastaus = syote.readLine(); // Muutetaan vastauksen tyyppiä valinta vertailua varten muunnettu_vastaus = Integer.parseInt(vastaus); } catch (Exception e) { System.out.println("Kayta lukua 1 tai 2"); return; } // Ympyrävastausosuus if (muunnettu_vastaus == 1) { Double sade; // Kysytään ympyrän säde try { System.out.println(); System.out.println("Anna ympyran sade:"); vastaus = syote.readLine(); sade = Double.valueOf(vastaus); // Annetaan virhevalinnan ilmoitus, jos valitaan negatiivinen säde if (sade < 0) { System.out.println(); System.out.println("Kayta positiivisia lukuja"); return; } } catch (Exception e) { System.out.println(); System.out.println("Kayta lukuarvoja"); return; } // Lasketaan luokan Ympyra funtioilla pinta-ala ja sijoitetaan tulos muuttujaan pinta_ala Ympyra y = new Ympyra(); y.aseta_sade(sade); pinta_ala = y.pinta_ala(); } // Suorakaidevastausosuus else if (muunnettu_vastaus == 2) { Double sivu1; Double sivu2; // Kysytään suorakulmion 1. sivun pituutta try { System.out.println(); System.out.println("Syota ensimmaisen sivun pituus:"); vastaus = syote.readLine(); sivu1 = Double.valueOf(vastaus); // Annetaan virhevalinnan ilmoitus, // jos valitaan negatiivinen 1. sivunpituus if (sivu1 < 0) { System.out.println(); System.out.println("Kayta positiivisia lukuja"); return; } } catch (Exception e) { System.out.println(); System.out.println("Kayta lukuarvoja"); return; } // Kysytään suorakulmion 2. sivun pituutta try { System.out.println(); System.out.println("Syota toisen sivun pituus:"); vastaus = syote.readLine(); sivu2 = Double.valueOf(vastaus); if (sivu2 < 0) { System.out.println(); System.out.println("Kayta positiivisia lukuja"); return; } } catch (Exception e) { System.out.println(); System.out.println("Kayta lukuarvoja"); return; } // Lasketaan luokan Suorakulma funtioilla pinta-ala ja sijoitetaan tulos muuttujaan pinta_ala Suorakulmio s = new Suorakulmio(); s.aseta_sivu1(sivu1); s.aseta_sivu2(sivu2); pinta_ala = s.pinta_ala(); } // Tehdään virhevalinnan vertailut, jos valitaan yli 2 tai negatiivinen luku else if (muunnettu_vastaus > 2) { System.out.println(); System.out.println("Kayta valinnassa lukuja 1 tai 2"); return; } else if (muunnettu_vastaus < 1) { System.out.println(); System.out.println("Kayta valinnassa lukuja 1 tai 2"); return; } // Tulostetaan näytölle laskun tulos System.out.println(); System.out.println("Pinta-ala on " + pinta_ala + " m2"); } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.