Podstawowe wejście - Klasa Scanner

Aplikacje, które operują na danych zapisanych na sztywno w kodzie programu w większości przypadków są mało użyteczne. Java oferuje jednak gotowe klasy, które w prosty sposób pozwolą odczytać dane wprowadzane przez użytkownika na klawiaturze. Dzięki temu Twoje aplikacje staną się dużo bardziej użyteczne i atrakcyjne dla docelowego użytkownika.

Klasa Scanner

Klasa Scanner jest bardzo uniwersalna i w ogólności pozwala skanować tekst w poszukiwaniu kolejnych napisów, czy liczb, rozdzielonych wskazanym separatorem. Możemy dzięki niej wygodnie przeglądać zawartość plików, czy kod źródłowy stron internetowych, ale w tej lekcji skupimy się na jej wykorzystaniu w celu odczytania danych z konsoli od użytkownika. Do wyświetlania danych w konsoli posługiwaliśmy się strumieniem, który był przypisany do obiektu System.out . W przypadku odczytu będziemy korzystali z kolei ze strumienia System.in. Najczęściej jest to strumień reprezentujący dane wpisywane do konsoli systemu podczas działania aplikacji.

Na początek napiszmy program, który wczyta od użytkownika informację o jego imieniu, a następnie wyświetli powitanie.

import java.util.Scanner;

class Hello {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Jak masz na imię?");
        String firstName = scan.nextLine();

        System.out.println("Witaj " + firstName);
    }
}

Klasa Scanner znajduje się w pakiecie java.util. Oznacza to tyle, że jeżeli chcemy z niej skorzystać, to musimy ją na samym początku zaimportować.

Kurs Java

Rozpoczynamy od utworzenia obiektu typu Scanner , ponieważ chcemy coś wczytać od użytkownika. Tak jak wspominałem, jest to dosyć uniwersalna klasa i w zależności od tego, co przekażemy do konstruktora, to Scanner będzie pozwalał na odczyt danych z określonego źródła. Ponieważ powyżej obiekt utworzyłem zapisując new Scanner(System.in), to dane będą odczytywane z konsoli.

Wczytywanie tekstu

Metoda nextLine() wstrzymuje działanie programu do momentu, w którym użytkownik wpisze coś w konsoli i zatwierdzi enterem. Metoda ta zwraca w wyniku napis, który zapamiętujemy w zmiennej firstName, a następnie wykorzystujemy ją do wyświetlenia powitania dla użytkownika.

scanner hello

Wczytywanie innych danych

Oprócz metody nextLine() , klasa Scanner oferuje szereg dodatkowych metod, które pozwalają na odczyt danych innych typów.

  • nextInt() - odczytuje kolejną liczbę całkowitą
  • nextDouble() - odczytuje kolejną liczbę zmiennoprzecinkową,
  • nextBoolean() - odczytuje kolejną wartość typu boolean,
  • oraz analogiczne metody dla typów byte, short, long, float. Nie istnieje metoda do wczytywania pojedynczego znaku typu char.

Pełną listę metod znajdziesz w dokumentacji klasy Scanner.

Kiedy kropka, a kiedy przecinek

Przy korzystaniu z klasy Scanner popularne jest występowanie wyjątku InputMismatchException. Może on być związany z konfiguracją maszyny wirtualnej. Przykładowo jeżeli uruchamiasz program na komputerze z polskim systemie operacyjnym z domyślnymi ustawieniami, do przy wczytywaniu liczb zmiennoprzecinkowych, oczekiwanym separatorem będzie przecinek. Jeżeli jednak ten sam program uruchomisz na systemie anglojęzycznym z lokalizacją ustawioną na Stany Zjednoczone, to oczekiwanym separatorem dziesiętnym będzie kropka. W celu ustandaryzowania tego zachowania, możesz wymusić z jakiej lokalizacji ma korzystać Scanner . Służy do tego metoda useLocale() , która jako argument przyjmuje wartość typu Locale.

import java.util.Locale;
import java.util.Scanner;

class ScanLocal {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useLocale(Locale.US); //wprowadzanie liczb z kropką jako separatorem
        //scanner.useLocale(Locale.GERMANY); //wprowadzanie danych z przecinkiem

        System.out.println("Podaj pierwszą liczbę:");
        double first = scanner.nextDouble();
        System.out.println("Podaj drugą liczbę:");
        double second = scanner.nextDouble();
        double sum = first + second;

        System.out.println("Suma wprowadzonych liczb to " + sum);
    }
}

W powyższym przykładzie liczby będzie należało wprowadzać z kropką, niezależnie od tego, gdzie uruchomimy program. Jeżeli usuniesz komentarz z wiersza z Locale.GERMANY, to liczby należałoby zawsze wprowadzać z przecinkiem.

Czyszczenie strumienia wejścia

Jeżeli korzystając ze Scannera na zmianę będziesz wczytywać liczby oraz napisy, to po każdym wczytaniu liczby wywołaj także pustą metodę nextLine() . Dzięki temu pozbędziesz się ze strumienia wejścia zbędnego znaku entera, który nie jest konsumowany przez metody nextInt() , czy nextDouble().

import java.util.Scanner;

class MixScan {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj liczbę:");
        int number = scanner.nextInt();
        System.out.println("Podaj napis:");
        String word = scanner.nextLine();

        System.out.println(word + " " + number);
    }
}

Wynik powyższego programu będzie następujący:

scanner podaj liczbe

Program nie czeka na wprowadzenie napisu. Jeżeli po wczytaniu liczby wywołasz dodatkową metodę nextLine(), to program będzie zachowywał się zgodnie z oczekiwaniami.

import java.util.Scanner;

class MixScan {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Podaj liczbę:");
        int number = scanner.nextInt();
        scanner.nextLine(); //potrzebne, jeśli wczytujemy napis po wczytaniu liczby
        System.out.println("Podaj napis:");
        String word = scanner.nextLine();

        System.out.println(word + " " + number);
    }
}
scanner to działa

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.

Zbychu

Witam podczas próby kompilacji taki potwór -> error: Class names, 'Witaj', are only accepted if annotation processing is explicitly requested o co camone ??

Slawek

kompiluj przy użyciu javac Witaj.java Nie zapominaj o rozszerzeniu .java. Uruchamia się bez rozszerzenia przez: java Witaj

Jan

Ale w javie to jest zagmatwane w c++ jest: cin >> a; W pascalu: Read(a); A tu takie pogmatwane ;(

Zbyszek

Może nie zagmatwane, ale rzeczywiście, w c++ cin >> a załatwia to co w Javie jest w trzech linijkach(!).

DDO

Bo to w najwiekszym uproszczeniu gotowa klasa ststyczna :-) Utowrz klase ktora wykona ten kod i ustwa ja jako statyczna.

Patrycjusz

Witam, Ja zapisałem to tak: import java.util.Scanner; public class Witaj{ public static void main(String[] args){ Scanner odczyt = new Scanner(System.in); String imie = odczyt.nextLine(); System.out.println("Witaj "+imie); } } Czy to nie robi żadnej różnicy, bo jeśli nie to tylko plik może ważyć ciut mniej :-), nie wiele ale zawsze...

xnikixx

nie robi to roznicy po prostu tak sie pisze zeby kod byl bardziej czytelny ale jesli wolisz to moze byc tak

Witek

Witam Ja napisałem kod trochę inaczej niż Sławek i Ty . Programy robią dokładnie to samo, ale są niewielkie różnice w kodzie. Kolega Sławek napisał tak, aby wszyscy wiedzieli co było zrobione po kolei. (moje gg: 6800421) Mój kod tego programu: import java.util.Scanner; public class Witaj { /** * @author Witek */ public static void main(String[] args) { String imie; Scanner odczyt; System.out.println("Podaj imie: "); odczyt = new Scanner(System.in); imie = odczyt.nextLine(); System.out.println("Witej " + imie); } }

Fryko

Żeby miało ręce i nogi;) import java.util.Scanner; public class Witaj{ public static void main(String [] args){ System.out.println("Jak masz na imie?"); String imie; Scanner odczyt = new Scanner(System.in); imie = odczyt.nextLine(); System.out.println("Witaj " + imie); } }

Tomas

Witam. Mam mały problem z podawaniem imion do tablicy za pomocą scannera . Do kompilacji używam programu NetBeans 7.0 a kod programu wygląda tak : import java.util.Scanner; public class program{ public static void main(String[]agrs){ String [] tablica = new String [5]; String imie; for(int i=0;i>5;i++){ System.out.println("Podaj imię: "); Scanner odczyt = new Scanner(System.in); imie = odczyt.nextLine(); tablica[i]= imie; } for(String x : tablica) System.out.println("Witaj: "+x); } } Wynik działania programu wygląda następująco : Witaj: null Witaj: null Witaj: null Witaj: null Witaj: null Mógłby ktoś mi wytłumaczyć dlaczego nie mogę wprowadzić imion z klawiatury ? Z góry dzięki za odp. pozdrawiam

Slawek

w pierwszej pętli for masz błędny warunek, ma być znak mniejszości, a nie większości. Poza tym zmienną odczyt lepiej zadeklaruj przed ciałem pętli, powinno unikać się powielania obiektów, jeśli można do czegoś wykorzystać tylko jeden egzemplarz.

Tomas

Aj rzeczywiście głupi błąd w pierwszej pętli. Dzięki wielkie za pomoc Sławku :)

Miradokus

W jakie sposób użyć metody useLocale(Locale)), tak aby w Zadaniu 1.7 nie występował błąd wyjątku, gdy wprowadzam liczby z użyciem "." - kropki? Jakiś przykład byłby bardzo pomocny.

Slawek

<pre class="java">import java.util.Locale; import java.util.Scanner; public class Test { public static void main(String[] agrs) { double liczba; Scanner odczyt = new Scanner(System.in); odczyt.useLocale(Locale.US); System.out.println("Podaj liczbe: "); liczba = odczyt.nextDouble(); System.out.println("Twoja liczba to: " + liczba); } }</pre>

snt.banzai

Mam pytanie jak będzie prezentował się poprawny zapis metody useLocale() bez odwoływania się do niej w nagłówku?

Kamiler65

Radzę wszystkim przepisać to 10 razy i zapamiętacie cały kod.

Kamiler65

import java.util.Scanner; public class Skaner{ public static void main(String[] args){ System.out.println("Jak masz na imie?"); String imie; Scanner odczyt=new Scanner(System.in); imie=odczyt.nextLine(); System.out.println("Witaj " + imie ); System.out.println("Nie wiedziałem że można śie tak głupio nazywać."); } }

Witek

Witam Mam mały dylemat odnośnie sposobu wprowadzania danych np.: z klawiatury. W tej książce „Java zadania z programowania z przykładowymi rozwiązaniami.” autor: Mirosław Kubiak i nie tylko, w celu czytania danych z klawiatury korzystają z klas InputStreamReader oraz BufferedReader. My natomiast korzystamy z klasy Scanner i tu mam dylemat w jakim przypadku mam skorzystać z klasy Scanner, a w jakim z tamtych dwóch klas. Szukałem w internecie, ale nic nie znalazłem odnośnie kiedy użyć jednej, albo drugiej opcji do wprowadzania danych. Może ktoś mi wytłumaczyć. Z góry dziękuję Pozdrawiam Witek

Slawek

Klasa Scanner jest najprostszym z rozwiązań, natomiast BufferedReader dużo bardziej uniwersalnym. Jak sama nazwa wskazuje klasa BufferedReader tworzy także pewien bufor przy odczycie danych - sprawdzi się więc dużo lepiej przy odczycie dużych porcji danych, albo przy programach, które pobierają dane z neta. Generalnie pomimo tego, że Scanner jest bardziej rozbudowaną klasą, udostępnia więcej metod, to jednak BufferedReadera częściej się używa tyle, że trzeba dopisać odpowiednie metody dodające mu odpowiedniej funkcjonalności. Przy odczycie z klawiatury osobiście preferuję Scanner też głównie dlatego, że mogę za jego pomocą odczytywać różne dane Stringi, liczby bez konieczności ich późniejszego parsowania (nextInt, nextLine ...).

Witek

Dzięki. Fajnie to wyjaśniłeś, takiej odpowiedzi szukałem. Teraz będę wiedział, której z klas użyć. Pozdrawiam Witek

szeri

Świetny kurs. Mam w domu Thinking in Java, ale tutaj dużo szybciej uczę się przydatnych rzeczy. Swoją drogą również nie mogłem się połapać jak użyć useLocale, ale w końcu się udało. Dzięki za komentarze.

Arkadiusz

W API Javy jest bardzo fajny przykład wykorzystania klasy Scanner String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close();

Jędrzej

Chciałbym zauważyć iż można niczego nie importować lecz wpisywać nazwy pakietów przy tworzeniu. Przykład programu! <code> public class Scanner{ public static void main(String[] args){ java.util.Scanner S = new java.util.Scanner(System.in); String SS = S.nextLine(); } }</code>

Slawek

słuszna uwaga, a nawet nie pomyślałem, żeby o tym napisać :)

Edzio94

Mam pytanie - Czy musimy tutaj robić obiekt odczyt klasy Scanner? Probowałem to zrobić bez robienia obiektu, lecz wtedy nie wyskakują mi wszystkie opcje i nie widzi mi np funkcji Nextline. Chodzi mi tutaj szczególnie o fakt, ze tworzymy obiekt dla klasy Scanner, a dla klasy Math (w poprzednim ćwiczeniu) już nie i chciałbym się dowiedzieć czemu tak jest? Czy zawsze musimy tworzyć obiekty? Czemu bez stworzenia obiektu wyskakują mi także niektóre funkcje, a niektóre nie? (Scanner.class.funkcje), lecz nie wszystkie?

g

no i wypadało by dodać, że program powinien być uruchamiany w konsoli/trybie tekstowym. odpalenie go np w Eclipse nie daje żadnego efektu.

Marcin

u mnie wszystko działa w eclipse, więc nie wiem w czym problem.

DDO

daje efekt ale musisz wpisac w Eclipse masz okno Console tam wpisujesz tekst :-),

Bartek

Kurde nie działa mi to skopiowałem kod nawet dla pewności wkleiłem do eclipsea i nie mogę podać imienia :(

Bartek

W cmd mi działa ale w eclipse nie :(

poczatkujaca

Ja też na początku myślałam, że ten program nie działa mi w eclipse. Klikałam run eclipse chwile myślał i dalej nic się nie działo. Ale później zorientowałam się, że trzeba kliknąć na dole w zakładkę console i tam wpisywać imię :)

alfa

Witam, czy na końcu kodu nie trzeba czasem jeszcze dopisać odczyt.close(); , jeśli tego nie dopisze to program nie kończy się wykonywać

Michał

mi w cmd nie działa a w konsoli wyswietla mi że nie zna słowa "odczyt." po prostu wyświetla go jako błąd proszę o pomoc

mat

Description Resource Path Location Type Resource leak: 'odczyt' is never closed

Killrog

Te tutoriale są naprawdę przyjazne laikom. Wiedza jest podawana w takich ilościach, że codziennie gdy siadam do nauki, widzę, że rzeczywiście poznaję coś nowego - to bardzo motywuje!

Anonim

czy będzie błędem odrazu: string imie = odczyt.nextLine Zamiast: String imie imie = odczyt.nextLine();

Tomek

Tam jest chyba blad, bynajmniej mi w blueJ sie zwiesza podczas kompilacji. Sam jestem totalnym zoltodziobem, ale dodalem jedna linijke, zeby podal to imie, bo z czego ma je zczytac jesli nie ma mozliwosci jego wprowadzenia: System.out.println("Podaj swoje imie?"); imie = odczyt.nextLine();

Odmulator

"Resource leak: ‚odczyt’ is never closed" Wystarczy zamknąć odczyt i błąd zniknie, wystarczy dodać na końcu linjke odczyt.close();

yamii

Hej wszystkim. Sugeruję dodać linijkę "System.out.println("Podaj swoje imię: ");" do powyższego kodu. Nowi użytkownicy Eclipse mogą nie zorientować się, że należy wpisać swoje imię w pustą konsolę.

Grzegorz

Czy możliwe jest używanie kropki i przecinka jednoczesnie tzn. w pierwszej zmiennej liczna z przecinkiem, a w drugiej liczby z kropką? Jeśli tak, to jak?

Rafał Mikołajczuk

nie da się, jeśli chcesz używać float lub double to tylko 4.5 . Jeśli chcesz już koniecznie wyświetlić jakąś liczbę jako 4.5 lub 4,5 , to proponuje String :P

3DK

Mam mały problem. Przy każdym "if" wyskakuje mi taki błąd krytyczny "Incompatible operand types String and char". Nie potrafię tego pchnąć dalej. kod wklejam na forum, bo jest za długi żeby go wrzucić tutaj http://forum.javastart.pl/Thread-Podstawowe-wej%C5%9Bcie-wyj%C5%9Bcie

Nism0

Hej, 3DK - dzieje sie tak dlatego ze probujesz porownac znak ( czyli typ char) ze zmienna typu String. Piszac 'z' przesylasz znak, a piszac "z" przesylasz String. Diabel tkwi w szczegolach. PS: przepraszam za brak polskich znakow diakrycznych ale pisze z telefonu ;) Pozdrawiam

Nism0

Z tego co widze, to tam nie ma bledu jako takiego, a jedynie drobnu warning , ktory mowi o tym ze zmienna wynik moze zostac uzyta jako niezainicjowana. Wez daj tam po prostu int wynik = 0; i powinno nyc ol ;)

3DK

Wygląda na to, że dział jak trzeba. Pytanie jeszcze tylko odnośnie "Resource leak: 'odczyt1' is never closed". Czemu mi to wyskakuje? Zakładam że da się na pewno coś z tym zrobić, pytanie tylko jak? P.S Jak to jest, że inni mogą tu mega długie kody wklejać, i to normalnie jest wyświetlane?

Nism0

<blockquote> <a href="#comment-11723" rel="nofollow"> <strong><em>3DK:</em></strong> </a> Wygląda na to, że dział jak trzeba. Pytanie jeszcze tylko odnośnie „Resource leak: ‚odczyt1′ is never closed”. Czemu mi to wyskakuje? Zakładam że da się na pewno coś z tym zrobić, pytanie tylko jak? P.S Jak to jest, że inni mogą tu mega długie kody wklejać, i to normalnie jest wyświetlane? </blockquote> Ty też możesz, używając tagów <blockquote><code> </code> </blockquote> ;)

Sławek Ludwiczak

właściwie to większość komentarzy z długim kodem jest usuwana. Komentarze powinny odnosić się do drobnych kwestii - jeśli pytanie jest związane z implementacją - pytamy na forum.

Nism0

<blockquote> Pytanie jeszcze tylko odnośnie „Resource leak: ‚odczyt1′ is never closed”. Czemu mi to wyskakuje? Zakładam że da się na pewno coś z tym zrobić, pytanie tylko jak? </blockquote> A jakiego IDE używasz ? Ja korzystam z Eclipse i u mnie nie widać nic szczerze mówiąc, program działa OK. Natomiast, mała uwaga : <code> if("+".equals(c)){ wynik=liczba1+liczba2; } if("-".equals(c)){ wynik=liczba1-liczba2; } if("*".equals(c)){ wynik=liczba1*liczba2; } if("/".equals(c)){ wynik=liczba1/liczba2; } </code> Powyższy zapis, można nieco uprościć (uprościć, w znaczeniu działania programu ), mianowicie , powyższy kod, wykona się niezależnie od tego co poda użytkownik bo masz same if'y . Konkretnie : sprawdzasz co podał aż 4 razy, a można to zrobić tak naprawdę alternatywą , czyli zamiast kolejnych if'ów, dać else if. To spowoduje, że jeśli wykona się instrukcja z bloku if (lub else if) , który jest wyżej w kodzie, to reszta nie zostanie wykonana , bo i po co, skoro odpowiednia opcja została już użyta. Taka mała ergonomia ;)

Nism0

<blockquote>„Resource leak: ‚odczyt1′ is never closed”. </blockquote> Kompilator rzuca warningiem, bo nie zamykasz otwartego strumienia. Dobrą praktyką jest, zamykanie strumienia danych ( podobnie jak otwierasz plik, dobrze by było go na koniec zamknąć jeśli nie będziemy już z niego korzystać ). Jeśli tworzysz i otwierasz obiekt strumienia wejścia np: <code> Scanner input = new Scanner(System.in); </code> to na koniec wypadałoby go zamknąć, instrukcją : <code> input.close(); </code>

3DK

Ok. Też używam eclipse. Zmieniłem tak jak mówiłeś, dodatkowo zmieniłem jeszcze z nextLine na nextDouble co daje mi możliwość wpisywania liczb z ułamkami. Cały kod jak zwykle na forum tutaj wrzucę tylko wycinek if'ów, dla przetestowania <code> if("+".equals(c)){ wynik=liczba1+liczba2; } else if("-".equals(c)){ wynik=liczba1-liczba2; } else if("*".equals(c)){ wynik=liczba1*liczba2; } else if("/".equals(c)){ wynik=liczba1/liczba2; } </code>

3DK

Ach i jeszcze jedno. Program działa ok. To co mi wyskakuje to tylko warningi, które wyskakują przy scannerach.

James

Do tych co uważają, że jest to zagmatwane: zastanówcie się teraz przez krótką chwile, po jaką cholerę wam komendy konsolowe?

Stan

Można coś zrobić, żeby eclipse nie ignorował nextLine()? Bo u mnie zachowuje się jakby linii: String nazwa = odczyt.nextLine(); po prostu nie było :(

Sławek Ludwiczak

a nie przypadkiem readLine zamiast nextLine? Wklej kod na forum może, będzie łatwiej się odnieść

Stan

readLine wogóle nie wchodzi, przy nextLine : System.out.println("Podaj nazwę pliku:"); String nazwa = odczyt.nextLine(); System.out.println("Podaj współrzędne pkt:"); wynik: Podaj nazwę pliku: Podaj współrzędne pkt: wpisuje: cos.txt i wywala: 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.nextInt(Unknown Source) at java.util.Scanner.nextInt(Unknown Source)

Stan

Znalazłem rozwiązanie: Scanner odczyt=new Scanner(System.in); Scanner odczyt2=new Scanner(System.in); Scanner odczyt3=new Scanner(System.in); Przy każdej zmianie typu wczytywanej zmiennej muszę tworzyć nowy obiekt Scanner?Czy da się inaczej?

Michał Kasprzak

Moje rozwiązanie wygląda tak: http://pastebin.com/USEwhfFw Wystarczył 1 obiekt klasy Scanner do odczytu obu liczb, nie potrzebny był osobny obiekt dla każdej liczby. W sumie, ten program jest już całkiem funkcjonalny, ale pobiera on jedynie 2 liczby, co jest ograniczeniem, bo niezbyt często wykonuje się obliczenia typu 2+2 w praktyce ;)

Mroczny

//Ja napisałem to tak :) ładniej brzmi :) jak rozmowa z botem :) import java.util.Scanner; public class Witaj { private static Scanner odczyt; public static void main(String[] args) { String imie; odczyt = new Scanner(System.in); System.out.print("Cześć, jak masz na imie? "); imie = odczyt.nextLine(); System.out.println("Witaj " + imie); } }

Mroczny

\\ Drugi pomysł ale z Samochodem ! :) import java.util.Scanner; public class WitajPraca { public static void main(String[] args) { String samochod; Scanner odczyt = new Scanner(System.in); System.out.print("Jakiej marki masz samochód "); samochod = odczyt.nextLine(); System.out.print("A więc samochód masz marki "+samochod+ " a powiesz mi jakiego koloru on jest? "); String kolor; kolor = odczyt.nextLine(); System.out.print("Oooo... Extra! wiec masz "+samochod+" o kolorze "+kolor+"m"); }

leili

Dopisałam pracę domową do zapytania o imię: import java.util.Scanner; public class Witaj{ public static void main(String[] args){ System.out.println("Podaj swoje imię"); String imie; //W NIM ZAPISZEMY SWOJE IMIE double liczba1; double liczba2; double doda, odej, mnoz, dziel; Scanner odczyt = new Scanner(System.in); //OBIEKT DO ODEBRANIA DANYCH OD UŻYTKOWNIKA imie = odczyt.nextLine(); System.out.println("Witaj "+imie); //WYŚWIETLAMY POWITANIE System.out.println("Teraz podaj dwie liczby"); Scanner pobierz = new Scanner(System.in); liczba1 = pobierz.nextDouble(); Scanner pobierz2 = new Scanner(System.in); liczba2 = pobierz2.nextDouble(); System.out.println("Twoje liczby to: "+liczba1); System.out.println(" oraz: "+liczba2); System.out.println("Program przedstawi wyniki dodawania, odejmowania, mnożenia " + "i dzielenia Twoich liczb"); doda = liczba1+liczba2; odej = liczba1-liczba2; mnoz = liczba1*liczba2; dziel = liczba1/liczba2; System.out.println("wynik dodawania: "+doda ); System.out.println("wynik odejmowania: "+odej); System.out.println("wynik mnożenia: "+mnoz); System.out.println("wynik dzielenia: "+dziel); } }

Maciek

Mam nadzieję, że jeszcze ktoś tu zagląda bo mam problem z którym nie mogę sobie poradzić bez zbędnego tworzenia kodu. Chodzi o "idiotoodporny" kalkulator, który rozwiązujący równania zapisane jako np. a+b czy c/d, tzn. wpisujemy jedną linijkę w której będzą liczby i znak działania jaki ma zostać wykonany. Poniżej newralgiczny kawałek kodu: double a,b,wynik; char znak; Scanner odczyt = new Scanner(System.in); String rownanie = odczyt.nextLine(); if(rownanie==a+znak+b){ switch(znak){ case '+': wynik=(a+b); break; W kompilacji wyrzuca Incompatible types string and double ze wskazaniem na pierwszy znak równości w warunku if'a. Zastosowanie equals() daje informację o braku zainicjalizowania zmiennych. W C++ wszystko takie coś działa pod postacią if(cin&gt;&gt;'double'&gt;&gt;'char'&gt;&gt;'double'). A tutaj nie mam pomysłu jak to ogarnąć bez tysiąca linijek kodu...

Janosch

Może coś takiego Ci się przyda? Mój kod wkleiłem na forum, poniżej masz linka. http://forum.javastart.pl/Thread-Podstawowe-wej%C5%9Bcie-wyj%C5%9Bcie?pid=980#pid980

Maciek

Skopiowałem Twój kod i... ...skompilował się bez błędów. Wykonał się również bez błędów. Na pewno masz dobrze javę zainstalowaną? Chociaż pewnie tak, jeśli wcześniejsze lekcje przebrnąłeś bez takich problemów.

klk

Potrzebuje programu rozwiązującego układ równań metoda wyznaczników. Pomoże ktoś???

Janosch

Prosisz, masz ;) Powinien liczyć dobrze, sprawdź sobie. http://forum.javastart.pl/Thread-Podstawowe-wej%C5%9Bcie-wyj%C5%9Bcie?pid=981#pid981

Albert

Programowałem w C++ i tam trzeba pozamykać pliki jak się je otworzyło, bo później ktoś może mieć nieupoważniony dostęp. Czy w tym przykładzie zapisu do pliku nie trzeba dodać odczyt.close(); i in.close(); ?