Gyakorlati alapok
Különutas háromszögezés Héron-képlettel, ellenőrzéseskedéssel
Az alábbi fejezetben külön függvényekbe osztjuk el egy háromszög...
-
3 oldalának bekérését,
-
a bekért adatok ellenőrzését,
-
a háromszög, mint síkidom meglétének ellenőrzését,
-
kerületének és területének számítását,
-
és végül az eredmények kiírását.
Alapértelmezésben bekérés során csak az alsó és felső határt ellenőrizzük, illetve azt, hogy a bekért 3 oldal egyáltalán háromszöget alkot-e. A kerületszámítás egyszerű (a + b + c), a területszámítás pedig a Héron-képlet alapján történik:
...ahol a, b, c a háromszög oldalai, s a háromszög kerületének a fele és T a háromszög területe (Forrás - Source: Wikipédia).
static double adatTomb[]
A legelső probléma a háromszög 3 oldalának bekérése,
illetve ezen adatok egyik függvényből a másikhoz való továbbítása. A
lehetséges megoldások közül én egy double típusú,
3 elemű adattömböt választottam oldalhossz-tárolóként és ezt osztályszinten
deklaráltam, ezáltal minden függvény látja és eléri.
static double[] szamBekeres()
Ez a függvény gondoskodik az oldalak bekéréséről,
egyúttal a bemeneti adatok ellenőrzéséről. Emiatt ezen függvény hívja meg az
adatEllenorzes()
és a haromszogEllenorzes()
függvényeket is. Kimeneti adatként már csak ellenőrzött,
validált értékeket adhat át.
static boolean adatEllenorzes(String
bemenetiAdat)
Tetszőleges feltételekkel ellenőrzi a bemeneti
adatokat. A projekt 1. részében csakis alsó és felső határt ellenőriz.
static boolean haromszogEllenorzes(double
adatTomb[])
Ellenőrzi, hogy a 3 bemeneti adat háromszöget
alkot-e.
static double haromszogKerulet(double
adatTomb[])
Kiszámolja és átadja a háromszög kerületét.
static double haromszogTerulet(double obj, double adatTomb[])
Kiszámolja és átadja a háromszög területét. Érdekessége, hogy egyik bemeneti adatként teljes objektumot, valójában a haromszogKerulet() függvényt várja (double obj), hiszen kimeneti értékéből számoljuk ki s értékét (amelyet persze másképpen is meg lehetne oldani). Az objektum bemeneti paraméterként való szerepeltetéséről részletesen írok az előző, Igazi Para Péter: metódus, mint bemeneti paraméter című fejezetben.
static void kiiras()
Kiírja a végeredményeket. Már csak a számítási
függvényeket hívja meg.
public static void main(String[] args)
Lefuttatja hivatkozott függvényeket.
Nézzük meg a futtatható Java-kódot!
import java.util.*;
import java.math.*;
public class Main {
static double adatTomb[] = new double[3];
static double[] szamBekeres(){
boolean rosszBemenetiAdat = false;
boolean rosszHaromszog = false;
Scanner in = new Scanner(System.in);
String bemenetiAdat = new String();
do{
rosszHaromszog = false;
rosszBemenetiAdat = false;
for(int i = 0; i < adatTomb.length;
i++){
System.out.println("Kérem, hogy adja meg a háromszög " + (i+1) + ".
oldalát!");
bemenetiAdat
= in.nextLine();
rosszBemenetiAdat = adatEllenorzes(bemenetiAdat);
while(rosszBemenetiAdat == true){
rosszBemenetiAdat = false;
System.out.println("Kérem, hogy 0-nál nagyobb és 100-nál kisebb értéket adjon
meg!");
bemenetiAdat = in.nextLine();
rosszBemenetiAdat = adatEllenorzes(bemenetiAdat);
}
adatTomb[i] =
Double.parseDouble(bemenetiAdat);
}
rosszHaromszog =
haromszogEllenorzes(adatTomb);
if(rosszHaromszog == true){
System.out.println("A háromszög oldalai nem alkotnak háromszöget!\n");
}
}while(rosszHaromszog == true);
return adatTomb;
}
static boolean adatEllenorzes(String bemenetiAdat){
Scanner in = new Scanner(System.in);
boolean rosszAdat = false;
double adat = 0;
adat = Double.parseDouble(bemenetiAdat);
if(adat <= 0 || adat > 50){
rosszAdat = true;
return rosszAdat;
}
return rosszAdat;
}
static boolean haromszogEllenorzes(double adatTomb[]){
boolean rosszAdat = true;
if((adatTomb[0] + adatTomb[1] > adatTomb[2])
&& (adatTomb[1] + adatTomb[2] >
adatTomb[0])
&& (adatTomb[0] + adatTomb[2] >
adatTomb[1])){
rosszAdat = false;
}
return rosszAdat;
}
static double haromszogKerulet(double adatTomb[]){
return adatTomb[0] + adatTomb[1] + adatTomb[2];
}
static double haromszogTerulet(double obj, double adatTomb[]){
double s = obj / 2;
return Math.sqrt(s * (s - adatTomb[0]) * (s - adatTomb[1]) *
(s - adatTomb[2]));
}
static void kiiras(){
System.out.println("A háromszög kerülete: " +
haromszogKerulet(adatTomb));
System.out.println("A háromszög területe: " +
haromszogTerulet(haromszogKerulet(adatTomb), adatTomb));
}
public static void main(String[] args) {
adatTomb = szamBekeres();
kiiras();
}
}
Végeredmény:
Kérem, hogy adja meg a háromszög 1. oldalát!
4
Kérem, hogy adja meg a háromszög 2. oldalát!
1
Kérem, hogy adja meg a háromszög 3. oldalát!
1
A háromszög oldalai nem alkotnak háromszöget!
Kérem, hogy adja meg a háromszög 1. oldalát!
0
Kérem, hogy 0-nál nagyobb és 100-nál kisebb értéket adjon meg!
101
Kérem, hogy 0-nál nagyobb és 100-nál kisebb értéket adjon meg!
3
Kérem, hogy adja meg a háromszög 2. oldalát!
4
Kérem, hogy adja meg a háromszög 3. oldalát!
5
A háromszög kerülete: 12.0
A háromszög területe: 6.0
Amint az fentebb említésre került, az adatEllenorzes() tetszőleges feltételekkel ellenőrzi a bemeneti adatokat. A projekt 1. részében csakis alsó és felső határt validáltunk. Az olvasó házi feladata az legyen, hogy próbálja az alábbi, jóval komplexebb (de még mindig a double adattípusra tervezett) adatellenőrző függvényt a projektbe illeszteni (Amikor a hócipőnk tele van és előbb ki akarunk lépni /a függvényből/ című fejezet):
static boolean adatEllenorzes(String bemenetiAdat){
Scanner in = new Scanner(System.in);
boolean rosszAdat = false;
char karakter;
double adat = 0;
if(bemenetiAdat.length() < 1 || bemenetiAdat.length() > 10){
rosszAdat = true;
return rosszAdat;
}
for(int i = 0; i < bemenetiAdat.length(); i++){
karakter = bemenetiAdat.charAt(i);
if(karakter == '1'
|| karakter
== '2'
|| karakter
== '3'
|| karakter
== '4'
|| karakter
== '5'
|| karakter
== '6'
|| karakter
== '7'
|| karakter
== '8'
|| karakter
== '9'
|| karakter
== '0'
|| karakter
== '.'){
continue;
}
else
rosszAdat =
true;
return
rosszAdat;
}
if((bemenetiAdat.charAt(0) == '.') || (bemenetiAdat.charAt(bemenetiAdat.length()
- 1) == '.')){
rosszAdat = true;
return rosszAdat;
}
int szamlalo = 0;
for(int i = 0; i < bemenetiAdat.length(); i++){
if(bemenetiAdat.charAt(i) == '.'){
szamlalo++;
}
}
if(szamlalo > 1){
rosszAdat = true;
return rosszAdat;
}
adat = Double.parseDouble(bemenetiAdat);
if(adat < 1 || adat > 20){
rosszAdat = true;
return rosszAdat;
}
return rosszAdat;
}
static void kiiras(double adat){
System.out.println("Az adat (" + adat + ") ellenőrizve!");
}
public static void main(String[] args){
double adat = 0;
adat = szamBekeres();
kiiras(adat);
}
}