Treść zadania:
Zadanie 5. (23 pkt)
Na nośniku DANE znajduje się plik tekstowy o nazwie trojkaty.txt.
W pliku tym zapisane są w oddzielnych liniach wspÛłrzędne wierzchołkÛw kilku trÛjkątÛw.
W każdej linii zapisano 6 wspÛłrzędnych odpowiadających kolejno wspÛłrzędnym wierzchołkÛw
A, B, C (xa, ya, xb, yb, xc, yc).
WspÛłrzędne wierzchołkÛw oddzielone są od siebie za pomocą co najmniej jednej spacji.
Wykonaj następujące polecenia, posługując się wybranym językiem programowania:
a) UtwÛrz funkcję obliczającą długość odcinka na bazie podanych wspÛłrzędnych.
b) UtwÛrz funkcję określającą, czy można zbudować trÛjkąt o obliczonych długościach
bokÛw.
c) UtwÛrz funkcję określającą typ tego trÛjkąta (rÛwnoboczny, rÛwnoramienny,
rÛżnoboczny).
d) UtwÛrz funkcję pozwalającą obliczyć pole dowolnego trÛjkąta.
e) Napisz program, ktÛry wczyta dane z pliku trojkaty.txt i, wykorzystując napisane
wcześniej funkcje, obliczy długości bokÛw, sprawdzi możliwość zbudowania trÛjkąta
o takich długościach bokÛw, określi rodzaj każdego trÛjkąta oraz obliczy jego pole,
a wyniki tych obliczeń wyprowadzi na ekranie oraz zapisze do pliku rezultaty.txt.
Przykład zapisu do pliku:
rÛwnoboczny Pole=16
nie można zbudować trÛjkąta
rÛżnoboczny Pole=26,25
rÛwnoramienny Pole=30.56
Pamiętaj, że ocenie podlega rÛwnież styl programowania (odpowiednie nazwy zmiennych,
stosowanie komentarzy oraz wcięć w zapisie kodu).
Do oceny oddajesz plik ............................... zawierający kompletny program (z procedurami
i funkcjami) napisanymi w wybranym przez Ciebie języku programowania oraz plik rezultaty.txt.
Mój kod:
/**
*
* Matura 2004 zadanie 5 - Trójkąty
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Trojkaty {
public static void main(String[] args) {
// Lista współrzędnych
ArrayList<Double> AL = new ArrayList<Double>();
// Lista trójkątów
ArrayList<Trojkat> TL = new ArrayList<Trojkat>();
try {
// Plik do odczytu
FileReader FR = new FileReader(new File("trojkaty.txt"));
BufferedReader BF = new BufferedReader(FR);
// Plik do zapisu
PrintStream PS = new PrintStream("rezultaty.txt");
String linia;
// Dopóki są nowe linie
while((linia = BF.readLine()) != null) {
//Rozkład lini
StringTokenizer ST = new StringTokenizer(linia, " ");
while(ST.hasMoreTokens()) {
// Pojedyńcza współrzedna
double l = Double.parseDouble(ST.nextToken());
AL.add(l);
}
// Dodanie trójkąta do listy
TL.add(new Trojkat(AL));
// Czyszcenie listy współrzędnych
AL.clear();
}
// Zamknięcie pliku
FR.close();
// Wypisanie wszystkich wsłaśnosci trójkąta
for(int i = 0; i < TL.size(); i++) {
System.out.println("Długosci boków: " + "\n"
+ "|AB| = " + TL.get(i).DlAB + "\n"
+ "|AC| = " + TL.get(i).DlAC + "\n"
+ "|CB| = " + TL.get(i).DlBC + "\n"
+ "jest = " + TL.get(i).typ + "\n"
+ "Pole: = " + TL.get(i).Pole + "\n"
+ TL.get(i).CMozna + "\n"
);
// Zapis do pliku
PS.print("|AB| = " + TL.get(i).DlAB);
PS.println();
PS.print("|AC| = " + TL.get(i).DlAC);
PS.println();
PS.print("|CB| = " + TL.get(i).DlBC);
PS.println();
PS.print("jest = " + TL.get(i).typ);
PS.println();
PS.print("Pole: = " + TL.get(i).Pole);
PS.println();
PS.print(TL.get(i).CMozna);
PS.println();
PS.println();
}
// Zamknięcie pliku
PS.close();
}
catch(IOException e) {
}
}
}
class Trojkat {
public Trojkat(ArrayList<Double> x) {
// Przypisanie wartości do pól
Xa = x.get(0);
Ya = x.get(1);
Xb = x.get(2);
Yb = x.get(3);
Xc = x.get(4);
Yc = x.get(5);
// Obliczanie długość odcinka |AB|
AB();
// Obliczanie długość odcinka |AC|
AC();
// Obliczanie długość odcinka |BC|
BC();
// Określenie typu trójkąta
Typ();
// Obliczanie pla trójkąta
Pole();
// Sprawdzenie czy możliwe jest zbudowanie trójkąta
CzyMozna();
}
// długość odinka ze wzoru: |AB| = sqrt((Xb-Xa)2 + (Yb-Ya))
public void AB() {
this.DlAB = Math.sqrt(Math.pow((Xb-Xa), 2) + Math.pow((Yb-Ya), 2));
}
public void AC() {
this.DlAC = Math.sqrt(Math.pow((Xc-Xa), 2) + Math.pow((Yc-Ya), 2));
}
public void BC() {
this.DlBC = Math.sqrt(Math.pow((Xc-Xb), 2) + Math.pow((Yc-Yb), 2));
}
public void Typ() {
if(DlAB == DlAC && DlBC == DlAB) this.typ = "rownoboczny";
else if(DlAB == DlAC || DlAB == DlBC) this.typ = "rownoramienny";
else if(DlAB != DlAC && DlBC != DlAB) this.typ = "roznoboczny";
}
public void Pole() {
if(this.typ.equalsIgnoreCase("rownoboczny")) this.Pole = (Math.pow(DlAB, 2) * Math.sqrt(3)) / 2;
else if(this.typ.equalsIgnoreCase("roznoboczny")) this.Pole = DlAB + DlAC + DlBC / 2;
else if(this.typ.equalsIgnoreCase("rownoramienny")) {
double podstawa = DlAB;
if(podstawa == DlAC) podstawa = DlBC;
else podstawa = DlAB;
this.Pole = (podstawa * (podstawa/2)) / 2;
}
}
public void CzyMozna() {
if(DlAB + DlAC > DlBC && DlAB + DlBC > DlAC && DlBC + DlAC > DlBC) CMozna= "Można";
else CMozna = "Nie można";
}
public String CMozna;
public String typ;
public double Pole;
public double DlAB, DlAC, DlBC;
public double Xa, Ya, Xb, Yb, Xc, Yc;
}