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.