Podaci u Javi: tipovi, promenljive i unos

Lekcija 2 od 16 · Java

Svaki podatak u programu čuva se u promenljivoj određenog tipa. Tip određuje koliko memorije podatak zauzima, koje vrednosti može da ima i koje operacije su dozvoljene. U ovoj lekciji su prosti tipovi Jave, deklaracija i dodela, konstante, konverzije tipova i unos podataka pomoću klase Scanner.

Pre nego što počneš: potrebno predznanje – uvod u Javu (prvi program).
Kako da učiš: svaki primer prekucaj i pokreni, a zadatke na kraju prvo reši sam/a; uputstvo i rešenje otvori tek posle toga. Svi programi su u Javi (Java 17 ili novija); svaki je preveden i pokrenut i daje navedeni izlaz.

Promenljive: deklaracija i dodela

Promenljiva se pre upotrebe deklariše: navodi se tip, pa ime. Vrednost se zadaje operatorom dodele =, odmah ili kasnije.

public class Main {
    public static void main(String[] args) {
        int brojUcenika;            // deklaracija
        brojUcenika = 28;           // dodela vrednosti
        double prosek = 4.37;       // deklaracija sa početnom vrednošću
        char ocena = 'A';           // jedan znak – jednostruki navodnici
        boolean polozio = true;     // logička vrednost: true ili false
        String ime = "Marija";      // tekst – dvostruki navodnici (String nije prost tip)

        System.out.println(ime + " ima prosek " + prosek);
        System.out.println("U odeljenju je " + brojUcenika + " ucenika.");
        System.out.println("Ocena: " + ocena + ", polozio: " + polozio);
    }
}

Ime promenljive počinje slovom, a dalje može da sadrži slova, cifre i _. Po dogovoru se piše camelCase: brojUcenika, prosekOcena. Velika i mala slova se razlikuju – ime i Ime su dve različite promenljive.

Prosti tipovi podataka

Java ima 8 prostih (primitivnih) tipova. Njihova veličina je ista na svakom računaru:

TipVeličinaOpseg vrednostiPrimer
byte1 bajt−128 … 127byte b = 100;
short2 bajta−32 768 … 32 767short s = 2000;
int4 bajtaoko ±2,1 milijardeint n = 150000;
long8 bajtovaoko ±9,2 · 1018long l = 8000000000L;
float4 bajtaoko 7 značajnih cifarafloat f = 3.14f;
double8 bajtovaoko 15 značajnih cifaradouble d = 3.14159;
char2 bajtajedan Unicode znakchar c = 'Ž';
boolean–true ili falseboolean ok = false;

Za cele brojeve najčešće se koristi int, a kada vrednosti mogu preći 2 milijarde – long (broj se završava slovom L). Za realne brojeve koristi se double.

public class Main {
    public static void main(String[] args) {
        System.out.println("int:  " + Integer.MIN_VALUE + " .. " + Integer.MAX_VALUE);
        System.out.println("long: " + Long.MAX_VALUE);

        int max = Integer.MAX_VALUE;
        System.out.println("max + 1 = " + (max + 1));   // prekoračenje: prelazi na najmanji int
        long veliki = (long) max + 1;
        System.out.println("kao long: " + veliki);
    }
}

Prekoračenje (overflow) se ne prijavljuje kao greška – rezultat je jednostavno pogrešan. Na takmičenjima je to česta greška: kada se množe veliki brojevi, koristi long.

Konstante: final

Vrednost koja se ne menja deklariše se rečju final. Imena konstanti pišu se velikim slovima:

public class Main {
    public static void main(String[] args) {
        final double PDV = 0.20;            // stopa poreza – ne menja se
        final int BROJ_DANA_U_NEDELJI = 7;

        double cenaBezPdv = 1250.0;
        double cena = cenaBezPdv * (1 + PDV);
        System.out.println("Cena sa PDV-om: " + cena);
        System.out.println("Dve nedelje imaju " + 2 * BROJ_DANA_U_NEDELJI + " dana.");
        // PDV = 0.18;   // greška pri prevođenju: final promenljiva se ne može menjati
    }
}

Konverzija tipova

Kada se manji tip dodeljuje većem (int → long → double), konverzija je automatska. Obrnuto se mora napisati eksplicitno, kastovanjem: (int) x. Tada se decimale odsecaju.

public class Main {
    public static void main(String[] args) {
        int a = 7, b = 2;
        System.out.println(a / b);              // 3   – deljenje dva int-a je celobrojno
        System.out.println((double) a / b);     // 3.5 – jedan operand je double
        System.out.println(a / 2.0);            // 3.5

        double x = 9.87;
        int odseceno = (int) x;                 // 9 – decimale se odsecaju, ne zaokružuje se
        long zaokruzeno = Math.round(x);        // 10
        System.out.println(odseceno + " " + zaokruzeno);

        char c = 'A';
        int kod = c;                            // 65 – kod znaka
        char sledeci = (char) (c + 1);          // 'B'
        System.out.println(kod + " " + sledeci);

        int broj = Integer.parseInt("123");     // tekst -> broj
        String tekst = String.valueOf(456);     // broj -> tekst
        System.out.println(broj + 1);
        System.out.println(tekst + 1);
    }
}

Poslednja dva reda pokazuju razliku: 123 + 1 je sabiranje, a "456" + 1 je spajanje teksta.

Unos podataka: klasa Scanner

Podaci sa tastature čitaju se objektom klase Scanner iz paketa java.util. Za svaki tip postoji metoda:

MetodaČita
nextInt()ceo broj (int)
nextLong()ceo broj (long)
nextDouble()realan broj
next()jednu reč (do razmaka)
nextLine()ceo red teksta
nextBoolean()true ili false
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Ime: ");
        String ime = sc.next();
        System.out.print("Godine: ");
        int godine = sc.nextInt();
        System.out.print("Visina u metrima: ");
        double visina = sc.nextDouble();

        System.out.println();
        System.out.println(ime + " ima " + godine + " godina i visok je " + visina + " m.");
        System.out.println("Za 5 godina imace " + (godine + 5) + " godina.");
        sc.close();
    }
}

Realan broj se unosi sa tačkom ili zarezom, zavisno od jezika podešenog na računaru. Ako unos 1.62 izazove grešku InputMismatchException, napravi Scanner sa new Scanner(System.in).useLocale(java.util.Locale.US).

Oprez sa nextLine() posle nextInt(): nextInt() ne pročita kraj reda, pa prvi nextLine() vrati prazan tekst. Rešenje je jedan „prazan“ poziv sc.nextLine(); pre čitanja reda.

Formatiran ispis: printf

System.out.printf ispisuje vrednosti po šablonu, kao u jeziku C. Najčešće oznake: %d ceo broj, %f realan broj, %.2f na dve decimale, %s tekst, %n novi red.

public class Main {
    public static void main(String[] args) {
        String proizvod = "Sveska";
        int komada = 3;
        double cena = 149.9;
        System.out.printf("%s x %d = %.2f din%n", proizvod, komada, komada * cena);
        System.out.printf("|%5d|%-8s|%8.1f|%n", 42, "Java", 3.14159);
    }
}

Broj između % i slova je širina polja; znak minus poravnava ulevo. Decimalni separator zavisi od jezika sistema – na srpskom podešavanju ispis može biti 449,70.

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje. Rešenja su provereno tačna na primerima iz teksta.

ZADATAK 01Težina: lako

Pravougaonik

Učitavaju se dužine stranica pravougaonika a i b (realni brojevi). Ispisati obim i površinu na dve decimale, u dva reda.

Primer

Ulaz

3.5 2

Izlaz

O = 11.00
P = 7.00
ZADATAK 02Težina: lako

Sekunde u sate

Učitava se broj sekundi s (0 ≤ s < 109). Ispisati vreme u obliku h:mm:ss.

Primer 1

Ulaz

3725

Izlaz

1:02:05

Primer 2

Ulaz

59

Izlaz

0:00:59
ZADATAK 03Težina: srednje

Proizvod velikih brojeva

Učitavaju se dva cela broja a i b (1 ≤ a, b ≤ 2 000 000 000). Ispisati njihov zbir i proizvod.

Primer

Ulaz

2000000000 3

Izlaz

2000000003
6000000000
Česte greške i saveti
  • Tekst se piše u dvostrukim navodnicima ("A" je String), a znak u jednostrukim ('A' je char).
  • 7 / 2 je 3 – ako treba 3.5, bar jedan operand mora biti double.
  • Lokalna promenljiva mora dobiti vrednost pre prve upotrebe, inače program neće da se prevede.
  • Broj veći od 2 147 483 647 ne staje u int: koristi long i slovo L na kraju konstante.
  • Posle nextInt() a pre nextLine() pozovi jedan prazan sc.nextLine();.

Proveri znanje

Otvori kviz

Podaci u Javi

1. Koji tip se koristi za broj 8 000 000 000?




2. Koliko je (int) 9.99?




3. Šta ispisuje System.out.println("5" + 3);?




4. Kojom metodom klase Scanner se čita ceo red teksta?