Gyakorlati alapok

Rozsdás szögfüggvények adatbekérésből

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A trigonometrikus, más néven szögfüggvények eredetileg egy derékszögű háromszög egyik szöge (a lenti képen c és b közötti) és oldalai hányadosai közötti összefüggéseket írják le. A szögfüggvények alapvető fontosságúak a hétköznapi geometriai számításoknál, a periodikus jelenségek leírásakor (körmozgás, akusztika, stb.), valamint a műszaki élet számos területén.

 

Adott tehát egy derékszögű háromszög 2 befogója (a és b)...

www.informatika-programozas.hu

...amelyből Pithagorasz tétele alapján képesek vagyunk kiszámolni c átfogó értékét:

 

a2 + b2 = c2

 

Ezután már minden adat rendelkezésünkre áll a szögfüggvények meghatározásához. A kérdéses szöget hagyományosan görög alfával jelölik (α), ettől én most eltekintek és egyszerűen szögnek nevezem:

A futtatható Java-kód nem lesz nehéz, hiszen alapelemei már kellő mélységben ismertetésre kerültek például a Pithagorasz tétele egyszerű adatbekéréssel című fejezetben. Az érthetőség végett a műveleteket elemeire bontottam és nem sűrítettem, így lesz a cNegyzet és c külön double típusú változóban:

 

double cNegyzet = (a * a) + (b * b);
double c = Math.sqrt(cNegyzet);

 

Ez ugyan több memóriát foglal és kissé lassúbb (milliszekundumban mérve), viszont a kód legalább olvasható marad a Tisztelt Olvasó számára és ez a legfontosabb. Persze külön házi feladat lehet a kód optimalizálása, azaz tömörebb megfogalmazása.

 

A System.out.println() függvényben lévő \n jel sortörést okoz kiíráskor; nélküle 1 sorban íródott volna ki az összes szögfüggvény.

 

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

 

 

 

 

 

 

 

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Kérem, hogy adja meg az egyik oldalhosszt (a)!");
    String oldal = in.nextLine();
    double a = Double.parseDouble(oldal);
    System.out.println("Kérem, hogy adja meg az egyik oldalhosszt (b)!");
    oldal = in.nextLine();
    double b = Double.parseDouble(oldal);
    double cNegyzet = (a * a) + (b * b);
    double c = Math.sqrt(cNegyzet);
    System.out.println("C értéke: " + c);
    System.out.println("Szögfüggvényei: "
        + "\nsin szög = " + a/c
        + "\ncos szög = " + b/c
        + "\ntg szög = " + a/b
        + "\nctg szög = " + b/a
        + "\nsec szög = " + c/b
        + "\ncsc szög = " + c/a);
    }
}

 

Végeredmény (például):

Kérem, hogy adja meg az egyik oldalhosszt (a)!
3
Kérem, hogy adja meg az egyik oldalhosszt (b)!
4
C értéke: 5.0
Szögfüggvényei:
sin szög = 0.6
cos szög = 0.8
tg szög = 0.75
ctg szög = 1.3333333333333333
sec szög = 1.25
csc szög = 1.6666666666666667

 

A fenti kód "kézzel" barkácsolta össze a szögfüggvények értékeit. Most nézzük meg, hogy a Java alkotói által alkotott, beépített szögfüggvények (java.math.*;) ugyanazon eredményeket dobják-e ki. Ehhez először veszünk egy azonos befogóhosszokkal rendelkező háromszöget (a = b), mert ekkor α szög 45 fok.

 

Végeredmény (például):

Kérem, hogy adja meg az oldalhosszt (a = b)!
4
C értéke: 5.656854249492381
Szögfüggvényei:
sin szög = 0.7071067811865475
cos szög = 0.7071067811865475
tg szög = 1.0
ctg szög = 1.0
sec szög = 1.4142135623730951
csc szög = 1.4142135623730951

 

A probléma, hogy nem tudjuk közvetlenül fokban (degree) használni a Java beépített szögfüggvényeit, mert azok double típusú radiánt várnak. Természetesen erre a Java alkotói is gondoltak, így a csomagban elérhető fok-radián váltó is (Math.toRadians()), először tehát ezt kell használnunk, majd a radiánértéket betenni a szögfüggvényekbe.

 

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

 

 

 

 

 

 

 

 

import java.util.Scanner;
import java.math.*;

public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Kérem, hogy adja meg az oldalhosszt (a = b)!");
    String oldal = in.nextLine();
    double a = Double.parseDouble(oldal);
    double b = a;
    double c = Math.sqrt((a * a) + (b * b));
    double radian = Math.toRadians(45);
    System.out.println("C értéke: " + c);
    System.out.println("Szögfüggvényei: "
        + "\nsin szög = " + Math.sin(radian)
        + "\ncos szög = " + Math.cos(radian)
        + "\ntg szög = " + Math.tan(radian));
    }
}

 

Végeredmény (például):

Kérem, hogy adja meg az oldalhosszt (a = b)!
4
C értéke: 5.656854249492381
Szögfüggvényei:
sin szög = 0.7071067811865475
cos szög = 0.7071067811865476
tg szög = 0.9999999999999999

 

A kézi szögfüggvények közül hirtelenjében 3 darabot találtam meg a matematikai csomagban: a szinusz, a koszinusz és a tangens függvényeket. Az értékek egyeznek azzal a kis, elhanyagolható különbséggel, hogy tangens értéke csak közelítőleg 1 (tg szög = 0.9999999999999999); ez nagy valószínűséggel a lebegőpontos számokkal történő számoláskor fellépő szórások eredménye. (Már csak azért is, mert tangens értéke a jelen esetben a/b szerint 4/4 = 1.)