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

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:

 

www.informatika-programozas.hu

 

...ahol abc 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!

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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);
    }
}