Podstawowe wejście - Klasa Scanner
Spis treści
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ć.
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.
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:
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);
}
}
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>>'double'>>'char'>>'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(); ?