Wczytywanie danych - Scanner

Spis treści

Zadanie

Utwórz dwie zmienne typu double. Następnie przy użyciu klasy Scanner pobierz od użytkownika dwie liczby i wykonaj na nich dodawanie, odejmowanie, mnożenie i dzielenie, wyświetlając wyniki w kolejnych liniach na konsoli.

Rozwiązanie poniżej ↓ Nie zaglądaj przed samodzielną próbą rozwiązania!

Rozwiązanie

W tym zadaniu zrobimy w końcu coś naprawdę przydatnego. Będzie to prosty kalkulator wykonujący podstawowe operacje na dwóch liczbach. Należało tutaj uważać na fakt, że standardowo metoda nextDouble() klasy Scanner wczytuje liczby z przecinkiem zamiast kropki jako separatorem (chyba, że mamy system operacyjny z językiem innym niż polskim, wtedy będzie odwrotnie).

import java.util.Scanner;

class ScanCalc{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);

        System.out.println("Podaj pierwszą liczbę: ");
        double a = scan.nextDouble();
        System.out.println("Podaj drugą liczbę: ");
        double b = scan.nextDouble();

        System.out.println(a+"+"+b+"="+(a+b));
        System.out.println(a+"-"+b+"="+(a-b));
        System.out.println(a+"*"+b+"="+(a*b));
        System.out.println(a+"/"+b+"="+(a/b));
    }
}

Na początku tworzymy obiekt typu Scanner . Następnie prosimy użytkownika o podanie dwóch liczb, które zapamiętujemy w zmiennych a i b. Po zapamiętaniu liczb wykorzystujemy je do obliczenia wyników poszczególnych działań arytmetycznych. Należy tutaj uważać na co, żeby obliczanie wyników było w dodatkowych nawiasach klamrowych. Jeśli o nich zapomnisz, to możesz otrzymać nieprawidłowy wydruk lub błędy kompilacji.


Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

Kamil

Heh, po tym przykładzie widzę, że nie tylko znajomość pewnych komend/funkcji itp jest ważna, ale również odpowiednie myślenie przy pisaniu kodu. U mnie kod jest 3 razy dłuższy, a robi to samo! ;) import java.util.Scanner; public class Cw1_7{ public static void main(String[] args){ double pl; double dl; Scanner odczyt = new Scanner(System.in); System.out.println("Podaje pierwsza liczbe:"); pl = odczyt.nextDouble(); System.out.println("Podaj druga liczbe:"); dl = odczyt.nextDouble(); //dodawanie double dodawanie = pl + dl; System.out.println("Wynik dodawania:"); System.out.println(dodawanie); //odejmowanie double odejmowanie = pl - dl; System.out.println("Wynik odejmowania:"); System.out.println(odejmowanie); //mnozenie double mnozenie = pl * dl; System.out.println("Wynik mnozenia:"); System.out.println(mnozenie); //dzielenie double dzielenie = pl / dl; System.out.println("Wynik dzielenia:"); System.out.println(dzielenie); } }

Paweł

Myślałem, że w moim kodzie jest jakiś błąd, ale po skopiowaniu kodu z rozwiązania jest to samo: Podaj pierwszą liczbę: 1,1 Podaj drugą liczbę: 2,2 1.1+2.2=3.3000000000000003 1.1-2.2=-1.1 1.1*2.2=2.4200000000000004 1.1/2.2=0.5 1.1+2.2=3.3000000000000003 << dlaczego takie coś występuje?

Heniu

Witam, mam ten sam problem. Zna może ktoś przyczynę takich wyników?

Sławek Ludwiczak

Wynika to ze sposobu przechowywania wartości przez komputer. W systemie dwójkowym nie da się przedstawić niektórych liczb, można co najwyżej przedstawić ich bardzo dokładne przybliżenie - i to właśnie tutaj widać. Tutaj znajdziesz dokładniejszą odpowiedź na swój problem: http://javastart.pl/efektywne-programowanie/javatraps-004/

Kris

Dlaczego podane jest tutaj: http://firstclassthoughts.co.uk/java/traps/java_double_traps.html Rozwiązań jest sporo, ale wydaje mi się ze najlepszym jest: DecimalFormat df = new DecimalFormat("#########.###"); df.format(liczba).

Kris

albo ewentualnie coś takiego jeśli chcemy otrzymać liczbę: Double lalala = new Double(Math.round(glebokoscDo * 100.0) / 100.0);

Nitr0Skay

Dlaczego jak w konsoli podaję zmiennoprzecinkową z kropką zamiast przecinka to wywala błąd ?? Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at java.util.Scanner.nextDouble(Unknown Source) at Lekcja8.main(Lekcja8.java:10) Kiedy podaję z przecinkiem wszystko jest w porządku.

Robert

A mi wyskakuje błąd: resource leak: odczyt is never closed co to oznacza?

jaro

musisz zamknąć Scanner: odczyt.close();

kixub

Można też sczytać od razu dwie liczby bez proszenia o każdą z osobna, wtedy wystarczy podawać je po spacji. Mam rację? double a,b; Scanner x=new Scanner(System.in); System.out.println("Podaj dwie liczby: "); a=x.nextDouble(); b=x.nextDouble(); System.out.println(a*b+"\n"+a/b+"\n"+(a+b)+"\n"+(a-b));

Robert

W tym programie, w moim też nie działają liczby zmiennoprzecinkowe, trzeba wpisywać całkowite. Dlaczego? import java.util.Scanner; public class Konwersje3 { public static void main(String[]args){ double a, b; double suma; double różnica; double iloraz; double iloczyn; Scanner odczyt = new Scanner(System.in); System.out.println("Podaj a:"); a = odczyt.nextDouble(); System.out.println("Podaj b:"); b = odczyt.nextDouble(); suma = a+b; System.out.println("suma = "+suma); różnica = a-b; System.out.println("różnica = "+różnica); iloraz= a/b; System.out.println("iloraz = "+iloraz); iloczyn= a*b; System.out.println("iloczyn = "+iloczyn); } }

Dawid

Podawaj liczby z przecinkiem a nie z kropka