Kretanje automobila (objekti) – rešenje
U ovom zadatku vežbamo rad sa klasama i objektima u Javi. Napravićemo klasu Auto, koja čuva podatke o jednom automobilu, i glavnu klasu KretanjeAutomobila, u kojoj unosimo podatke, računamo brzinu i pređeni put i prikazujemo rezultate.
1. Formule koje koristimo
Automobil se kreće iz mirovanja i ubrzava ravnomerno, odnosno njegovo ubrzanje je konstantno. U ovom pojednostavljenom modelu ne uzimamo u obzir otpor vazduha, trenje niti druge sile.
Trenutna brzina računa se formulom:
v = a · t
Pređeni put računa se formulom:
s = a · t² / 2
Ovde je a ubrzanje automobila, t vreme kretanja, v trenutna brzina, a s pređeni put. Ako ubrzanje izražavamo u metrima u sekundi na kvadrat (m/s²), a vreme u sekundama (s), brzina će biti izražena u metrima u sekundi (m/s), a put u metrima (m).
Formule važe pod pretpostavkom da automobil kreće iz mirovanja i da je početni položaj izabran kao nula. Kada bi automobil već imao početnu brzinu, formula za brzinu bila bi v = v₀ + a · t, a za pređeni put s = s₀ + v₀ · t + a · t² / 2.
2. Klasa Auto – opis jednog automobila
Klasa Auto predstavlja nacrt prema kojem pravimo objekte koji predstavljaju pojedinačne automobile. Svaki objekat ima svoje vrednosti atributa, tako da prvi i drugi automobil mogu imati različito ubrzanje i vreme kretanja.
U klasi su definisana četiri atributa:
a– ubrzanje automobila;t– vreme kretanja;v– izračunata trenutna brzina;s– izračunati pređeni put.
Konstruktor Auto() u ovom primeru je prazan, jer se vrednosti atributa dodeljuju kasnije, nakon unosa podataka. U Javi se numerički atributi tipa double, ako im nije dodeljena početna vrednost, automatski inicijalizuju na 0.0.
Metoda toString() vraća tekstualni prikaz objekta. Ovde vraćamo brzinu i pređeni put, da bi rezultat mogao jednostavno da se prikaže na ekranu.
public class Auto {
double v; // trenutna brzina
double s; // pređeni put
double t; // vreme kretanja
double a; // ubrzanje
// Konstruktor
public Auto() {
}
@Override
public String toString() {
return "v=" + v + ", s=" + s;
}
}
Atributi nemaju navedenu oznaku pristupa, kao što su private ili public, pa su dostupni drugim klasama iz istog paketa. To omogućava da u glavnoj klasi direktno koristimo izraze poput auto1.a i auto1.t. U većim projektima obično se preporučuje da atributi budu private, a da im se pristupa preko metoda.
3. Glavna klasa KretanjeAutomobila
U glavnoj klasi najpre pravimo dva objekta klase Auto. Promenljive auto1 i auto2 ne predstavljaju isti automobil: svaka referenca pokazuje na svoj objekat, pa svaki automobil zasebno pamti uneseno ubrzanje i vreme.
Podatke unosimo pomoću objekta klase Scanner. Metoda nextDouble() učitava broj tipa double. U ovom kodu podešavamo Locale.US, pa se decimalni brojevi unose sa tačkom, na primer 3.5 ili 10.25.
import java.util.Locale;
import java.util.Scanner;
public class KretanjeAutomobila {
public static void main(String[] args) {
Auto auto1 = new Auto(); // objekat koji predstavlja prvi automobil
Auto auto2 = new Auto(); // objekat koji predstavlja drugi automobil
// Scanner koristimo za unos podataka sa tastature.
// try-with-resources automatski zatvara Scanner na kraju bloka.
try (Scanner ucitavac = new Scanner(System.in)) {
ucitavac.useLocale(Locale.US); // decimalni brojevi unose se sa tačkom
// Unos podataka za prvi automobil
System.out.println("Unesi ubrzanje prvog automobila");
auto1.a = ucitavac.nextDouble();
System.out.println("Unesi vreme kretanja prvog automobila");
auto1.t = ucitavac.nextDouble();
// Unos podataka za drugi automobil
System.out.println("Unesi ubrzanje drugog automobila");
auto2.a = ucitavac.nextDouble();
System.out.println("Unesi vreme kretanja drugog automobila");
auto2.t = ucitavac.nextDouble();
// Izračunavanje trenutne brzine i pređenog puta prvog automobila
auto1.v = auto1.a * auto1.t;
auto1.s = auto1.a * Math.pow(auto1.t, 2) / 2.0;
// Izračunavanje trenutne brzine i pređenog puta drugog automobila
auto2.v = auto2.a * auto2.t;
auto2.s = auto2.a * Math.pow(auto2.t, 2) / 2.0;
// Ispis rezultata pomoću metode toString()
System.out.println("Auto1{" + auto1.toString() + "}");
System.out.println("Auto2{" + auto2.toString() + "}");
}
}
}
4. Kako radi program?
- Prave se dva objekta klase
Auto. - Za prvi automobil unose se ubrzanje i vreme kretanja.
- Za drugi automobil unose se njegovo ubrzanje i vreme kretanja.
- Za svaki objekat računaju se brzina i pređeni put pomoću odgovarajućih formula.
- Poziva se metoda
toString(), koja formira tekst sa vrednostima brzine i puta, a zatim se rezultat ispisuje.
Važno je da se podaci unose i računaju zasebno za auto1 i auto2. Na primer, izraz auto1.v = auto1.a * auto1.t koristi ubrzanje i vreme prvog automobila, dok izraz auto2.v = auto2.a * auto2.t koristi podatke drugog automobila.
5. Primer izvršavanja
Ako za prvi automobil unesemo ubrzanje 2 i vreme 20, dobijamo brzinu od 40 m/s i pređeni put od 400 m. Za drugi automobil, uz ubrzanje 3.5 i vreme 10.25, dobijamo brzinu od 35.875 m/s i pređeni put od 183.859375 m.
Auto1{v=40.0, s=400.0}
Auto2{v=35.875, s=183.859375}
Java prikazuje vrednosti tipa double bez automatskog zaokruživanja na dve decimale. Ako je potrebno prikazati put sa dve decimale, moguće je upotrebiti, na primer, System.out.printf("s=%.2f%n", auto1.s);.
6. Napomena o metodi toString()
Metoda toString() u klasi Auto vraća samo tekst v=..., s=.... Vitičaste zagrade dodajemo u glavnoj klasi izrazom "Auto1{" + auto1.toString() + "}". Zato metoda toString() ne treba dodatno da vraća završnu vitičastu zagradu — tako se izbegava višak zagrade u ispisu.
