Twitter: @grzegg
Kategoria: java, Tagi: - .

Java [06] – Zmienne cz. II: typy podstawowe – używanie

W poprzedniej części przedstawiłem typy podstawowe typy zmiennych, teraz przyszedł czas, żeby spróbować ich użyć.


Ta strona jest częścią materiałów do kursu “Programowanie w Javie z elementami bioinformatyki dla poczatkujących”. Pozostałe materiały znajdziesz tutaj

Proste operacje na zmiennych podstawowych

Otwórz projekt stworzony w poprzedniej części. Przypominam, że stworzyliśmy tam szereg zmiennych, głównie podstawowych, ale także typu String, na razie jednak nie ma z nich żadnego pożytku. Podstawową czynnością, którą możemy chcieć wykonać na zmiennych, jest wyświetlenie ich wartości. Dopisz zatem linijkę:


System.out.println(wiek);

Uruchom program, powinieneś uzyskać w okienku „Output”:

22

Jak łatwo sprawdzić, taką właśnie wartość została przypisana zmiennej wiek. Przydałoby się jednak, żeby wyświetlaniu wartości zmiennej towarzyszyła informacja czego ta wartość dotyczy. Zmodyfikuj zatem nieco ostatnią linię kodu i dopisz kolejną:


System.out.println("Wiek: " + wiek);
System.out.println("Plec:" + plec);

Teraz wynik niesie więcej informacji:


Wiek: 22
Płeć: K

Zauważ, że operator + w tym przypadku połączył łańcuch znaków z wartością zmiennej i wszystko razem zostało wyświetlone. Co się stanie, gdy użyjemy operatora dodawania przy zmiennych typów liczbowych?


System.out.println("Liczba wszystkich kursów: " + kursy1Rok + kursy2Rok + kursy3Rok);

Otrzymujemy:


Liczba wszystkich kursów: 111413

Raczej mało prawdopodobne, że studentka jest aż tak pracowita. Zastanów się gdzie tkwi błąd. Jeśli nie wiesz, przypomnij sobie część poświęconą obliczeniom.
Tak, zabrakło nawiasów, oddzielających obliczenia od łańcucha znaków. Linia kodu powinna więc wyglądać tak:


System.out.println("Liczba wszystkich kursów: "+(kursy1Rok+kursy2Rok+kursy3Rok));

Tym razem liczba kursów wygląda bardziej prawdopodobnie:


Liczba wszystkich kursów: 38

Następnie policzmy średnią liczbę kursów przypadającą na rok. Matematycznie sprawa jest prosta, trzeba podzielić sumę kursów przez liczbę lat studiów:


System.out.println("Średnia liczba kursów: "+(kursy1Rok+kursy2Rok+kursy3Rok)/3);

Otrzymujemy wynik:


Średnia liczba kursów: 12

Pozornie wszystko wygląda dobrze, ale… zaraz, zaraz, przecież średnia z 11, 14 i 13 nie wynosi równo 12, ale 12 z „hakiem” (~12.67). Najwyraźniej Java „zgubiła” gdzieś część ułamkową wyniku. Stało się tak dlatego, że w całym działaniu użyliśmy wyłącznie liczb całkowitych: trzech zmiennych typu int i jednej liczby zapisanej bez części dziesiętnej (3). W takiej sytuacji wynik także jest traktowany, jako liczba całkowita a część ułamkowa jest po prostu odrzucana.
Łatwo popełnić taki typ błędu. Ani NetBeans IDE ani kompilator go nie wykryje, program będzie działał pozornie prawidłowo ale wyniki będą nieprawidłowe.
Jak zatem linia kodu powinna wyglądać prawidłowo? Na przykład można zapisać liczbę lat jako 3.0:


System.out.println("Średnia liczba kursów: "+(kursy1Rok+kursy2Rok+kursy3Rok)/3.0);

Otrzymany rezultat będzie zgodny z oczekiwaniami:


Średnia liczba kursów: 12.666666666666666

Przyjrzyj się teraz ostatnim dwu linijkom kodu:


System.out.println("Liczba wszystkich kursów: " + (kursy1Rok+kursy2Rok+kursy3Rok));
System.out.println("Średnia liczba kursów: " + (kursy1Rok+kursy2Rok+kursy3Rok)/3.0);

Zauważ, że wyrażenie: kursy1Rok+kursy2Rok+kursy3Rok pojawia się dwukrotnie. Wartości otrzymanej przez zsumowanie kursów z trzech lat używamy w dwu różnych miejscach a przecież można by ją wyliczyć raz, a otrzymaną wartość zapisać w zmiennej. Zmienną następnie można użyć do wyświetlania obliczonej wartości a także użyć w dalszych obliczeniach. Ma to szczególnie znaczenie wtedy, gdy program przeprowadza czasochłonne obliczenia. Wielokrotne przeprowadzanie tych samych obliczeń niepotrzebnie zajmuje czas i zasoby komputera. Warto też dla przejrzystości kodu oddzielić poszczególne etapy obliczeń a także same obliczenia od wyświetlania ich wyników. Zmień zatem wyższy kod w ten sposób:


int liczbaWszystkichKursow = kursy1Rok+kursy2Rok+kursy3Rok;
System.out.println("Liczba wszystkich kursów: "+liczbaWszystkichKursow);
double sredniaLiczbaKursow=liczbaWszystkichKursow/3.0;
System.out.println("Średnia liczba kursów: "+sredniaLiczbaKursow);

Ktoś mógłby narzekać, że zamiast dwóch linijek kodu mamy teraz cztery, a program robi to samo. Trudno jednak zaprzeczyć, że kod jest teraz bardziej czytelny a potrzebne obliczenia przeprowadzamy raz. Ponadto takie rozwiązanie ma jeszcze co najmniej jedną zaletę. Jeśli będziemy chcieli zmienić zmienić sposób obliczania wartości, to będzie trzeba zrobić to tylko w jednym miejscu.

W naszym programie brakuje jeszcze wyświetlenia pozostałych wartości. Umieść następujący fragment kodu , na przykład przed linią wyświetlającą wiek.


System.out.println("Imię i nazwisko:"+imie+" "+nazwisko);
System.out.println("Stan wolny:"+stanWolny);
System.out.println("Motto: "+motto);

Zauważ, że połączyliśmy operatorem dodawania łańcuchy znaków oraz zmienne zawierające łańcuchy znaków. Pomiędzy zmiennymi znajduje się łańcuch zawierający spację, nie chcemy przecież, żeby imię i nazwisko wyświetlało się tak: RóżaKaktusińska.

Kompletny kod:

Zmienna się zmienia

Przyjrzyj się takiej komendzie:


liczba = liczba + 10;

Zapewne gdybyś coś takiego napisał w szkole na klasówce z matematyki, nie skończyłoby się to dobrze. Ale jak wcześniej wspomniałem, znak = ma w Javie inne znaczenie niż w matematyce. Tu oznacza przypisanie wartości a nie równość. W takim wyrażeniu najpierw wykonuje się kod po prawej stronie znaku = a więc pobierana jest wartość zmiennej liczba do niej jest dodawana liczba 10 a następnie uzyskana wartość jest przypisywana zmiennej liczba.

Takie wyrażenia przydatne są na przykład gdy śledzimy zmiany wartości jakichś zmiennych:

Zadanie

Stwórz program, który oblicza ile należy dodać rozpuszczanej substancji do określonej ilości wody aby otrzymać roztwór o żądanym stężeniu (upraszczamy sytuację przyjmując, że 1 ml = 1 g roztworu).
Na przykład wpisujemy jako dane wejściowe, że chcemy mieć 250 ml 3% roztworu a program wylicza, że 7,5 g substancji rozpuszczanej powinno się znaleźć w podanej objętości roztworu i informuje o tym użytkownika.

Ta strona jest częścią materiałów do kursu “Programowanie w Javie z elementami bioinformatyki dla poczatkujących”. Pozostałe materiały znajdziesz tutaj

6 komentarzy Java [06] – Zmienne cz. II: typy podstawowe – używanie

  • Dzień dobry, pokażę moją propozycję zadania z końca artykułu:

    package …….;

    import java.io.*;
    public class Zadanie2
    {
    public static void main(String[] args)
    throws IOException
    {
    double mr, cp, ms;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(„Program oblicza ile należy dodać rozpuszczanej substancji do określonej ilości wody aby otrzymać roztwór o żądanym stężeniu.”);
    System.out.println(„Podaj ilość roztworu w ml:”);
    mr = Double.parseDouble(br.readLine());
    System.out.println(„Podaj stężenie roztworu w % :”);
    cp = Double.parseDouble(br.readLine());
    ms = mr*cp*0.01;
    System.out.print(„Jeśli chcesz otrzymać ” + mr + „g roztworu o stężeniu ” + cp + „%, „);
    System.out.println(„to w podanej objętości roztworu powinno się znaleźć ” + ms + „g substancji rozpuszczanej.”);
    }
    }

    Jestem otwarta na sugestie, co można poprawić (np. nie do końcu czuję typy zmiennych, czy może zostać 0.01 i czy typ double jest odpowiedni). Oczywiście nie ukrywam, że wzorowałam się na przykładzie z książki :)

    Serdecznie pozdrawiam!

  • Jeszcze raz ja, bo od strony chemicznej program sknociłam, „program oblicza ile należy dodać rozpuszczanej substancji aby otrzymać określoną ilość roztworu o żądanym stężeniu.”. Muszę sobie przypomnieć chemie :)

  • package …..;

    import java.io.*;
    public class Zadanie3
    {
    public static void main(String[] args)
    throws IOException
    {
    double mw, cp, ms;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(„Program oblicza ile należy dodać rozpuszczanej substancji do określonej ilości wody, aby otrzymać roztwór o żądanym stężeniu.”);
    System.out.println(„Podaj ilość wody w ml:”);
    mw = Double.parseDouble(br.readLine());
    System.out.println(„Podaj stężenie roztworu w % :”);
    cp = Double.parseDouble(br.readLine());
    ms = (cp*mw)/(100-cp);
    System.out.print(„Aby otrzymać roztwór o masie ” + (mw+ms) + „g i o stężeniu ” + cp + „%, „);
    System.out.println(„to w podanej ilości wody powinno się znaleźć ” + ms + „g substancji rozpuszczanej.”);
    }
    }

  • Mariusz

    Witam.
    Wiem, że dawno publikował Pan te lekcje, ale dopiero biorę się za programowanie.

    Rozwiązania(IntellijIdea 15):

    Wersja prosta- ta, którą dałem radę napisać opierając się na Pana lekcjach od lekcji [01] do [06]

    public class Roztwor {
    public static void main (String args[]){

    double roztwor, substancja;
    int woda;

    woda = 250;
    roztwor = 3.5;

    // obliczanie ile nalezy g substancji nalezy dodac, aby otrzymac roztwor o podanym stezeniu
    substancja = (woda * (roztwor/100));

    System.out.println(„Aby otrzymać roztwor o stężeniu ” + roztwor + ” % należy dolać do ” + woda + ” ml wody ” + substancja + ” gram substancji rozpuszczalnej”);

    Wersja 2ga z użytym Scannerem, którego nauczyłem się w innych tutorialach:

    Scanner podaj = new Scanner(System.in);

    System.out.print(„Podaj ilość wody w [g/ml]: „);
    int woda= podaj.nextInt();

    System.out.print(„Podaj stężenie roztworu w [%]: „);
    double roztwor= podaj.nextDouble();
    double substancja = (woda * (roztwor/100));
    System.out.print(„Aby otrzymać roztwór o stężeniu : ” + roztwor + ” % należy dolać do ” + woda + ” ml wody ” + substancja + ” gram substancji rozpuszczalnej”);

  • Croatoran

    /**
    * Created by Croatoran on 25.01.17.
    * IntelliJ IDEA 2016.3.3
    * System Linux Mint 18.1 Cinnamon

    Stwórz program, który oblicza ile należy dodać rozpuszczanej substancji do określonej ilości wody
    aby otrzymać roztwór o żądanym stężeniu (upraszczamy sytuację przyjmując, że 1 ml = 1 g roztworu).
    Na przykład wpisujemy jako dane wejściowe, że chcemy mieć 250 ml 3% roztworu a program wylicza,
    że 7,5 g substancji rozpuszczanej powinno się znaleźć w podanej objętości roztworu i informuje o tym użytkownika.

    */

    public class Zadanie {
    public static void main(String args[]) {

    double roztwor, substancja;
    int woda;

    woda = 250;
    roztwor = 7.5;

    // obliczanie ile należy dodać g substancji do określonej ilości wody,
    // aby otrzymać roztwór o żądanym stężeniu

    substancja = (woda * (roztwor / 100));

    System.out.print(„Aby otrzymać roztwór o stężeniu ” + roztwor + ” należy dolać do ” + woda);
    System.out.println(„ml wody „+ substancja + ” gram substancji rozpuszczalnej”);

    }
    }

  • piotrino

    W najprostszy sposób jaki można (według mnie):)

    package pl.javastart.firt;
    import java.util.Scanner;
    public class ZadanieRoztwor {

    /**
    * @param args
    */
    public static void main(String[] args) {
    int DaneWejsciowe;
    Scanner odczyt = new Scanner(System.in);//obiekt do odebrania danych od użytkownika

    System.out.println(„System informuje ile substancji rozpuszczanej powinno się znaleźć w podanej objętości roztworu „);

    double procent = 3;

    System.out.println(„Podaj dane wejsciowe roztworu 3%: „);
    DaneWejsciowe = odczyt.nextInt();

    System.out.println(” Substancji rozpuszczanej w substancji podanej powinno być: ” + (DaneWejsciowe * procent)/100);

    }

    }

Leave a Reply to Croatoran Cancel reply