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?

  1. Prave se dva objekta klase Auto.
  2. Za prvi automobil unose se ubrzanje i vreme kretanja.
  3. Za drugi automobil unose se njegovo ubrzanje i vreme kretanja.
  4. Za svaki objekat računaju se brzina i pređeni put pomoću odgovarajućih formula.
  5. 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);.

Primer rezultata nakon pokretanja Java programa za dva automobila
Primer prikaza rezultata nakon pokretanja aplikacije.

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.