Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 1.7

W tym zadaniu zrobimy w końcu coś naprawdę przydatnego. Będzie to coś na kształt prostego kalkulatora dwóch liczb. Należało tutaj uważać na fakt, że standardowo metoda nextDouble() klasy Scanner wczytuje liczby z przecinkiem zamiast kropki jako separatorem.

import java.util.Scanner;

public class Odczyt{
  public static void main(String[] args){
	  double a;
	  double b;

	  Scanner odczyt = new Scanner(System.in);

	  System.out.println("Podaj pierwszą liczbę: ");
	  	a = odczyt.nextDouble();
	  System.out.println("Podaj drugą liczbę: ");
	  	b = odczyt.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));
  }
}

Podobnie jak w przykładzie z lekcji importujemy odpowiednią klasę, następnie tworzymy dwie zmienne typu double oraz obiekt Scanner.

Dalej prosimy użytkownika o podanie dwóch liczb i zapisujemy je do wcześniejszych zmiennych.

Na końcu wyświetlamy wyniki naszych działań.

Poćwicz i wykorzystaj inne metody klasy Scanner w innych przykładach.

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
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