Operatory matematycze i logiczne
Ważnym zagadnieniem w programowaniu jest matematyka i umiejętność wykonywania różnych operacji matematycznych. Omówimy je w tej lekcji, dzięki czemu będziemy mogli tworzyć proste programy typu kalkulator.
Operatory matematyczne
W przypadku operacji na liczbach, do dyspozycji mamy wszystkie podstawowe operatory matematyczne:
- + dodaje 2 liczby
- - odejmuje dwie liczby
- * znak mnożenia
- / dzielenie całkowite
- % (modulo) reszta z dzielenia
Poniższy kod przedstawia ich działanie.
class Operators {
public static void main(String[] args) {
int a = 17;
int b = 4;
int c = a + b; //=21
System.out.println(c);
c = a - b; //=13
System.out.println(c);
c = a * b; //=68
System.out.println(c);
c = a / b; //=4 ponieważ 4*4=16 i zostaje reszty 1
System.out.println(c);
c = a % b; //=1 reszta z dzielenia
System.out.println(c);
}
}
Oczywiście nie musimy tutaj używać zmiennych, poprawny jest także poniższy zapis.
int c = 17 + 4; //=21
Jeżeli chodzi o kolejność wykonywania działań, to w Javie obowiązują standardowe prawa matematyki. Dla następującego przykładu:
int result = 2 + 2 * 2; //6
w wyniku otrzymamy 6. Jeżeli chcielibyśmy najpierw wykonać dodawanie, a dopiero później mnożenie, to należy zmienić kolejność wykonywania działań korzystając z nawiasów okrągłych.
int result = (2 + 2) * 2; //8
W programowaniu wyróżniamy dwa rodzaje dzielenia. Pierwsze to dzielenie całkowitoliczbowe. Przykładowo 7 / 2 w wyniku wcale nie daje 3.5, tylko 3. Dzieje się tak dlatego, że w sytuacji, gdy dzielimy przez siebie dwie liczby całkowite, to w wyniku także otrzymujemy liczbę całkowitą, część dziesiętna wyniku jest ucinana. Jeżeli chcesz otrzymać w wyniku liczbę zmiennoprzecinkową, to co najmniej jeden ze składników działania także powinien być liczbą zmiennoprzecinkową, np. 7.0 / 2 w wyniku da 3.5.
Istnieją także przydatne skrócone operatory.
int a = 17;
double b = 4.0;
a += b; //a = a+b
a -= b; //a = a-b
a *= b; //a = a*b
a /= b; //a = a/b
a %= b; //a = a%b
Pozwalają one na szybkie wykonywanie operacji na dwóch zmiennych. Działanie jest jednak identyczne z tym podanym w komentarzu.
Bardzo ważną rolę w programowaniu odgrywają również operatory inkrementacji oraz dekrementacji . Służą one do zwiększania lub zmniejszania wartości zmiennej o 1 i zapisujemy je jako ++ lub --. Są dzięki temu bardzo często wykorzystywane w pętlach, czyli takich instrukcjach sterujących, które pozwalają wykonywać fragment naszego kodu w kółko.
Istnieją dwa rodzaje inkrementacji i dekrementacji:
-prefixowe - zwiększają wartość przed przypisaniem
-postfixowe - zwiększają wartość zmiennej po przypisaniu
int a = 5;
int b = 3;
int c = a+b++; //c = a + b, a dopiero później b = b + 1;
c = (a++)+b; //c = a + b, a następnie a = a + 1
Nawias w ostatniej linii został wstawiony dla czytelności, równie dobrze można napisać +++. Analogicznie zachowuje się operator -- (dwa minusy). Wyrażenia w Javie są przetwarzane od lewej do prawej strony.
Porównania i operatory logiczne
Do porównywania dwóch wartości ze sobą można używać poniższych operatorów:
- == sprawdza równość
- != różny
- >= większy równy
- <= mniejszy równy
- > , < większy, mniejszy
Zwracają one w wyniku wartość logiczną true lub false. Wynik porównania można przypisać do zmiennej typu boolean, albo przekazać go np. bezpośrednio do wyświetlenia. Przykładowo:
boolean result = a == b;
System.out.println(result); //false, bo a jest różne od b
System.out.println(a >= 0); //true, bo a jest większe od 0
System.out.println(b != 10); //false, bo 10 jest równe 10
Przydatny bywa także operator trójargumentowy postaci:
warunek? wyrażenie1 : wyrażenie2;
Jeśli warunek zwróci wartość true to zwracany jest wynik wyrażenie1 w przeciwnym wypadku wyrażenie2.
Istnieją również operatory logiczne, czyli koniunkcja && ("i") i alternatywa || ("lub"). Koniunkcja w wyniku daje true tylko wtedy, gdy oba warunki, które nią łączymy są prawdą, natomiast alternatywa daje false tylko wtedy, gdy oba warunki będą false.
Są one przydatne w sytuacji, gdy chcemy żeby kilka warunków było (lub nie) spełnionych w tym samym czasie. Przykładowo jeśli będziemy musieli sprawdzić "czy liczba jest dodatnia i jednocześnie parzysta". Działanie operatorów:
int a = 5;
int b = 3;
boolean result1 = a > b; //true, bo 5 większe od 3
boolean result2 = a < b; //false, bo 5 większe od 3
boolean result3 = a == b; //false, bo a jest różne od b
boolean koniunkcja1 = result1 && result3; //false, bo true&&false daje false
Dodatkowo trzeba tutaj dodać, że nie powinniśmy porównywać łańcuchów, ani innych typów obiektowych przy pomocy operatora ==. Służy do tego metoda equals() , o której możesz poczytać w innym artykule. Operator == w przypadku typów obiektowych porównuje referencje, a nie faktyczne obiekty. W przypadku typu String jest mały haczyk.
class EqualTest {
public static void main(String[] args) {
String ja = "Slawek";
String ty = "Slawek";
boolean porownanie1 = ja == ty;
boolean porownanie2 = ja.equals(ty);
System.out.println(porownanie1);
System.out.println(porownanie2);
}
}
Skoro napisów nie powinno się porównywać przy pomocy operatora ==, to w wyniku można oczekiwać false i true . Tymczasem otrzymamy dwa razy true.
Problem w tym, że gdyby napisy nie były utworzone na sztywno w kodzie programu jako "Sławek", tylko np. wczytane od użytkownika z konsoli, albo z pliku, to otrzymalibyśmy false. Dzieje się tak z powodu optymalizacji pamięci wykonywanej niejawnie przez wirtualną maszynę javy. Z tego powodu napisy bezpiecznie jest porównywać zawsze przy pomocy metody equals().
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.
YeeeZooo
W pierwszym przykładzie są drobne błędy obliczeniowe w komentarzu ;) w trzecim piszesz, że "wystarczy zadeklarować przynajmniej jedną ze zmiennych jako typ zmiennoprzecinkowy." Niestety mnie wychodzi, że jedną zmienną a lub b i koniecznie wynik czyli c, do tego jeśli np: double b, to także double c, nie można np: float b i double c, dziwi mnie to trochę bo float zawiera się w double więc powinno działać, odwrotnie jakby było to powinien być błąd, bo wynik straciłby precyzję.
Slawek
Niekoniecznie. Dzięki rzutowaniu wystarczy właśnie, aby tylko jeden z typów był typem zmiennoprzecinkowym. Dziwne też, że piszesz o tym, że int a; float b; double c;, gdzie c jest wynikiem Ci nie działa, bo powinno. Nie można double b i float c, właściwie można o czym dowiesz się z lekcji kolejnych (rzutowanie i konwersja) przez wymuszenie typu. W sumie powinienem dopisać małą oczywistość, o którą możliwe, że też Tobie chodzi, że wynik musi być oczywiście zmiennoprzecinkowy.
YeeeZooo
Tak chyba chodziło mi o tą oczywistość :) bo zrozumiałem to trochę inaczej jak czytałem pierwszy raz, myślałem, że wynik sam się dostosuje, do "obszerniejszego typu" swoja drogą szkoda, że tak nie jest ale widocznie jeszcze czegoś nie widzę.
Karvis
Od kiedy 17+4 = 19 ? :P itp. Pozdrawiam ;)
Slawek
ale babola strzeliłem, dzięki za poprawkę, bo aż wstyd :)
Lothid
c = a-b; //=13 c = a*b; //=68 Wciąż w tych są błędy ;) Działanie operatorów: int c = ab więc c=1; nie rozumiem co miałeś na myśli z tym ab, nie mówiąc o nie rozumieniu tego przez kompilator :)
Slawek
szczerze mówiąc musiałem to kopiować z eclipsa i jakiś komentarz mi się tam musiał wkraść, bo sam nie wiem co to miało być ;) Dzięki za czujność.
Jack
Może chodziło o to, że nie można pomijać znaku mnożenia np. ab tylko musi być a*b?
Nhandu
moze sie czepiam ale prosiles zeby literowki zglaszac :) "Nawiasy okrągłe służą to wyznaczania kolejności wykonywania działań,..." zamiast "to" powinno byc "do" :) btw. swietny kurs, wszystko lopatologicznie, dlugo czegos takiego szukalem. Pozdrawiam
Krzysztof
Poniżej mój kod. Dzielę double x = 7 przez double y = 2 i dostaję double z = 3.0 Skąd ten błąd? <pre name="code" class="java"> public class Operatory1{ public static void main(String[] args){ int a = 7; int b = 2; int c = 7/2; double x = 7; double y = 2; double z = 7/2; System.out.println("a/b = "+c); System.out.println("x/y = "+z); } } </pre>
Slawek
Przy zmiennej z dzielisz 7/2, a nie x/y. Czyli wykonujesz coś takiego: double z = (double) (7/2) Najpierw dzielisz całkowicie uzyskujesz wynik 3 i dopiero następuje konwersja na typ double, czyli 3.0.
Szapko
Ciekawy kurs, mam nadzieję, że się czegoś nauczę ;) Przy okazji, warto byłoby opisać co to jest koniunkcja (&&) i alternatywa (||), a przynajmniej wspomnieć, że przy alternatywie warunek zostaje spełniony gdy chociaż jeden ze zmiennych/liczb itp. spełnia wymagania. Niektórzy mogą tego nie wiedzieć.
Witek
Super, podoba mi się ten kurs
KP
c=a+++b to to samo co c=(a++)+b ale nie to samo co c=a+(++b)
gabir
"c=a+++b to to samo co c=(a++)+b ale nie to samo co c=a+(++b)" Masz rację, łatwo to sprawdzić: public class Kalkulator{ public static void main(String[] args){ int a = 3; int b = 5; int c = a+++b; System.out.println("c="+c); System.out.println("a="+a); System.out.println("b="+b); } }
DDO
Tutaj pojawia się pierwszeństwo operatorów, preinkrementacja jest wazniejsza od dodawania
=(^_^)=
"przecież chcemy, aby 7/2=3.5, a nie 3." A w kodzie piszesz 17/4 ;)
Slawek
zdanie nie odnosiło się bezpośrednio do kodu, to taki przykład tylko :)
Michał
Hej, co jest tu źle? import TerminalIO.KeyboardReader; public class Kalkulator{ public static void main(String[] args){ int a, b , c; KeyboardReader reader1 = new KeyboardReader(); KeyboardReader reader2 = new KeyboardReader(); KeyboardReader reader3 = new KeyboardReader(); a=reader1.readInt(„podaj a”); b=reader2.readInt(„podaj b”); c=reader3.readInt(„podaj c”); System.out.print(„a+b=”+(a+b)); } }
Michał
Już nieważne.
Krzysiek
Nawias w ostatniej linii został wstawiony dla czytelności, równie dobrze można napisać +++. Analogicznie zachowuje się znak — (dwa minusy). To dlaczego z nawiasem działa a bez nie działa chodź komiluje. Z nawiasem public class Test{ public static void main(String[] args){ double a = 17; double b = 12; double c = 5; a/=c; b*=b; c+=a; System.out.println(a); System.out.println(b); System.out.println(c); double d = a+(++b); System.out.println(d); System.out.println(b); } } 3.4 144.0 8.4 148.4 /* tutaj dodało 145.0 jedynkę*/ Bez nawiasu: public class Test{ public static void main(String[] args){ double a = 17; double b = 12; double c = 5; a/=c; b*=b; c+=a; System.out.println(a); System.out.println(b); System.out.println(c); double d = a+++b; System.out.println(d); System.out.println(b); } } 3.4 144.0 8.4 147.4 /*tutaj nie 144.0 dodło jedynki*/
Łukasz
Nie rozumiem jak działa to polecenie: int a = 5; int b = 3; int c = a+b++; //c=a+b, a dopiero później b = b+1; c = a+(++b); //b = b+1, a następnie c=a+b Mianowicie, nie wiem jaki powinien byc wynik:) Jeśli na poczatek zrobie c=a+b, to otrzymam c=8. Pózniej wstawiam b=b+1 i powinno wyjsc c=9. A nie wychodzi. Z drugiej strony c=a+(++b) powinno wyjsc tyle samo, ze wzgledu na przemiennosc dodawania?:) (mam wrazenie ze chyba tu czegos nie zaczaiłem) Z ciekawosci wpisałem formule d = a*b++ d = a*(++b) i te wyniki tez nie pokrywaja sie z tym co oczekiwałem. Prosze o wskazowki jak rozumiec te działania:)
Slawek
Bo widzisz tutaj nie chodzi o to, że A+B++ to to samo co A+B+1, tylko: int a = 5; int b = 3; int c = a+b++; to: int c = a+b; b++; //czyli b=b+1; natomiast int c = a+(++b); to b=++b; //czyli b=b+1 c=a+b; :)
uważka
b++; //czyli b=b+1; może chodzi o to, że w tym fragmencie kodu - przez brak pętli - nie widać, że faktycznie b++ = b=b+1 ;)
DDO
No to sru.... int a=5; //postinkrementacja int b=a++; //a++ zwraca wartosc a do b po czym podnosi o 1 swoja wartosc, czyli teraz a wynosi 6 System.out.println(a); //zwraca 6 //preinkrementacja a=5; b=++a; // czyli inaczej b = a+1 czyli 6, natomiast a =6 To samo stosujemy z a-- i --a Trzeba znać pierwszeństwo operatorów, np int c,a,b; a=1; b=2; c=a--+b; widac jasno ze chodzi o c=(a--)+b; lecz i tak wynikiem bedzie 3 bo znak a-- zwraca wartosc a po czym zmniejsza ja o 1; wiec c=(a--)+b to c=a+b; c-=1;
seklerek
Jak wyświetlić 3 cyfry w 1 linijce? Gdy piszę: <code>System.out.println("A = "+a);</code> to wszystko jest ok, ale gdy chcę wpisać: <code>System.out.println("A = "+a"B = "+b"C = "+c);</code> To niestety program się nie kompiluje. Jaki jest sposób na wyświetlenie tego? ----------- Oprócz tego, mam drugi problem, też związany z wyświetlaniem. Chcę napisać: <code>System.out.print("A, B, C= "+a+b+c);</code> i liczby wyświetlają się prawidłowo (456.0), ale bez odstępu przez co wygląda to jak liczba 456. Jak wstawić odstęp pomiędzy tym? Proszę o pomoc ;)
Slawek
<code> System.out.print("A, B, C= "+a+" "+b+" "+c); </code> podobnie w pierwszym przykładzie - wstaw dodatkowe plusy.
seklerek
Ok, teraz działa ;) Dziękuję za odpowiedź!
Piki
Teraz działa, też miałem problem, żeby wyświetlić w jednej linijce (w jednym println) więcej niż jedną zmienną. Ale jak się usunie spację w cudzysłowie (zakładam, że to jest tylko po to by były odstępy między liczbami) i zostawi (+a++b++c) to już nie działa. Dlaczego?
S
Bo jest za dużo plusów. Jak nie chcesz odstępów to wystarczy tak jak w pierwszym poście: ("A, B, C="+a+b+c)
DDO
To co podoba mi się w Javie to jej znak dodawania ciagow lepszy niz .(kropka) w PHP
Bartek
Slawek dzieki za kurs tlumaczenie lopatologiczne jest bardzo przydatne :) moj kalkulator ponizej troche zbyt rozwiazly ale chcialem miec wszystko czarno na bialym w konsoli: public class Operatory_cw{ public static void main(String[] args){ double a = 1.3; double b = 3.7; double c = 2.2; double d = (a+b)*c; double e = a-b/c; System.out.println("zmienna a wynosi " +a); System.out.println("zmienna b wynosi " +b); System.out.println("zmienna c wynosi " +c); System.out.println("wynik dzialania (a+b)*c wynosi " +d); System.out.println("wynik dzialania a-b/c wynosi " +e); a++; b++; c++; System.out.println("teraz zmienna a wynosi " +a); System.out.println("teraz zmienna b wynosi " +b); System.out.println("teraz zmienna c wynosi " +c); boolean f = (a+b)>c; boolean g = a==b; System.out.println("porownanie (a+b)>c jest " +f); System.out.println("porownanie a=b jest " +g); } }
Bywa
Witam, niedawno zacząłem Twój kurs java, uważam, że jest to bardzo dobry kurs, na pewno najlepszy jaki do tej pory znalazłem, dla początkujących. Wyjaśniasz wszystko i to w prosty sposób, czego nie ma w innych kursach. Wielkie dzięki, może za jakiś czas zacznę programować tak na prawdę :D Ale w tym momencie chciałbym Cię poprosić o sprawdzenie mojego programu, chciałem rozwiązać zadanie 1.3, jestem ciekaw czy zaliczyłbyś mi takie coś: <code>public class Test3 { public static void main(String[] args) { double a = 10.0; double b = 5.0; double c = 2.0; double aa = (a+b)*c; System.out.println(aa); double bb = a-b/c; System.out.println(bb); double aaa = a++; double ba = b++; double cc = (aaa+bb); boolean porownanie1 = cc>aa; System.out.println(porownanie1); boolean porownanie2 = a!=b; System.out.println(porownanie2); } }</code>
Bywa
Jeszcze jedno, zmieniłem troszkę treść zadania, co pewnie zauważyłeś, ale chodzi głównie o to, czy jak na ten poziom program jest zrobiony dobrze/czy dałoby się to zapisać prościej.
Marek
public class Test{ public static void main(String[] args){ String ja = "Slawek"; String ty = "Slawek"; boolean porownanie1 = ja==ty; boolean porownanie2 = ja.equals(ty); System.out.println(porownanie1); System.out.println(porownanie2); } } >Można się spodziewać, że będzie to najpierw false, a później true. Dlaczego piszesz, że można się spodziewać, że będzie to najpierw false skoro zarówno zmienna "ja" jak i "ty" są identyczne (taki sam ciąg znaków) ? Można się spodziewać, że najpierw będzie true. Proszę o wyjaśnienie. Pozdrawiam Marek
Michał
Też na początku tego nie załapałem, ale poszukałem informacji na stronach obcojęzycznych. Wydaje mi się że dobrze by było podać tutaj drugi przypadek w którym wyniki obu porównań są różne.
DDO
Inne klasy :-)
notknow
Cytując: "Dodatkowo trzeba tutaj dodać, że nie powinniśmy porównywać łańcuchów, ani innych typów obiektowych przy pomocy operatora ==. Służy do tego metoda equals. Operator == w przypadku typów obiektowych porównuje referencje, a nie faktyczne obiekty." Gdyby typy ja i ty nie były zapisane w tym samym miejscu w pamięci to mimo tej samej wartości zwróciły by false
Marek
a skąd wiadomo, że zmienne są zapisane w tym samym lub innym miejscu w pamięci ? ;-)
Marek
Wszystko rozbija się w tym przypadku o działanie wirtualnej maszyny. Stringi, które są dokładnie takie same, są przez maszynę wirtualną lokowane w jednym miejscu pamięci (całkiem sprytne), dlatego porównanie dwóch takich samych napisów w Javie za pomocą operatora == zwróci nam true. Zrozumiałem Pozdrawiam Marek
lukas
dlaczego w poniższym przypadku wynikiem jest liczba 13, jeśli można to proszę o wytlumaczenie <code> int i = 10; while (i++ <= 10) { i++; } System.out.println(i); </code> wy
Marcin
i=10 Sprawdzenie warunku pętli wynik TRUE oraz i++ czyli 11 Wewnątrz pętli i++ czyli 12 Ponowne sprawdzenie warunku pętli wynik FALSE (12>10), ale i tak jeszcze raz wykona sie i++ czyli 13
lukas
czyli najpierw sprawdzenie warunku a dopiero inkrementacja ?? nie pamiętałem kolejności :D
dee
Jest taki kodzik: boolean b; boolean bValue = (b = true); // Evaluates to true if (bValue) System.out.println("TRUE"); else System.out.println("FALSE"); if (bValue = false) System.out.println("TRUE"); else System.out.println("FALSE"); if (bValue == false) System.out.println("TRUE"); else System.out.println("FALSE"); $ TRUE $ FALSE $ TRUE Dlaczego bValue == false zwraca wartość TRUE ? Będę wdzięczny za odpowiedź:)
Slawek
Ponieważ, 2 linijki nad porównaniem masz przypisanie bValue = false.
dee
Czemu jest to traktowane jako przypisanie ? Przecież to jest sprawdzanie warunku - jeśli bValue = false to wtedy ma drukować TRUE, jeśli nie to FALSE. Nie rozumiem czemu odbywa się tu przypisanie wartości false dla bValue ?
Slawek
Przypisanie to =, porównanie to ==
Adam
przeczytałem wszystko a nie umiem napisać kalkulatora :(
Adam
napisałem wreszcie
Michal
Jestem jeszcze trochę młody i nie potrafię dodawać liter nie można pisać, np 1+6? Bo nie wiem jaka to liczba a b lub c Proszę o pomoc
Lesny
Jeśli masz poniżej 10 lat: nie przejmuj się! Ja też zaczynalem na HLL(High Leve Launguage), dokładnie C++. Jest tam wiele podobnych rzeczy. Kiedy miałem 10 lat nie mogłem pojąć zmiennych, a teraz robię skomplikowane obliczenia na tablicach i pętlach. Daj sobie narazie spokój i wróć jak podrośniesz :) z czasem samo Ci przyjdzie. A tak nawiasem: reszta z dzielenia(%) to modulo :)
DDO
Najprostrzy jezyk do nauki (podstaw ) to PHP. Żadnych restrykcji odnośnie typów.
Paweł
Ja nie rozumiem dlaczego przy: double a = 1.1; double b = 2.2; double c = 3.3; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println("a + b +1 jest rowne " + (a+b++)); zwraca mi wartość 3.3 a nie 4.3
Sławek Ludwiczak
Bo a+b++ to tak samo jak: a+b (tutaj wyświetlasz) dopiero po tej operacji b++, musiałbyś zrobić a+(++b) :)
ElCacto
A mi działa. Chciałem się doszkolić w tablicach bo na tym kulałem i wymyśliłem tak: ------------------------------------------------------------------------- class Operatory_a{ public static void main(String[] args){ double dane[] = new double[] {10,5,3}; boolean what; System.out.println("a = " + dane[0]); System.out.println("b = " + dane[1]); System.out.println("c = " + dane[2] + "\n"); System.out.println("Operatory matematyczne\n======================"); System.out.println("(a + b) * c: " + ((dane[0] + dane[1]) * dane[2])); System.out.println("a - b / c: " + (dane[0] - dane[1] / dane[2])); System.out.println("\nInkrementacja + 1\n================="); dane[0] += 1; dane[1] += 1; dane[2] += 1; System.out.println("teraz:\na = " + dane[0] + "\nb = " + dane[1] + "\nc = " + dane[2]); System.out.println("\nPorównania\n=========="); what = (dane[0] + dane[1]) > dane[2]; System.out.println("(a+b)>c?: " + what); what = dane[0] == dane[1]; System.out.println("a = b?: " + what); } } ---------------------------------------------------------------------------------------------- co prawda o wiele dłuższe niż potrzeba ale tu chodzi o naukę nie? Ogólnie wielkie dzięki za ten tutorialik jest najlepszy jaki znalazłem w sieci. Przez niego chce mi się programować!
Mateusz
public class siedem { public static void main (String[] args) { double a,b,c; a=3.5; b=4.2; c=2.1; System.out.println((a+b)*c); System.out.println(a-b/c); a++; b++; c++; //System.out.println("Czy ("+a+" + "+b+")>"+c+"?"+((a+b)>c)); System.out.println("Czy "+a+"+"+b+">"+c+"? "+((a+b)>c)); if (a==b) { System.out.println("Tak! "+a+" = "+b); } else { System.out.println("Nie! "+a+" != "+b); } } } Ja zrobiłem coś prostszego niż kolega wyżej =)
Nick
kiepsko pokazane boolean jak ktoś nigdy tego nei uzywał :/
projekt997
a mi kompiluje program (z tego 1 kodu)ale kiedy wpisze \>java Operatory to nic mi nie wyświetla , podobnie jest z resztą kodów choć przepisywałem po 3 razy i potem całość skopiowałem. nadal nic
Xazar
Nie jestem pewien, bo być może nie rozumiem tego dobrze, ale chyba masz błąd Sławku w przykładzie gdzie przedstawiasz inkrementację i dekrementację: c = (a++)+b; //a = a+1, a następnie c=a+b Nie powinno to wyglądać tak?: c = ++a+b; //wtedy dopiero najpierw doda 1 do a, a następnie obliczy a+b Pozdrawiam.
Sławek Ludwiczak
tak jest, był błąd, dzięki :)
karol202
Mam pytanie. Do czego służy operator & i | (nie && i ||)? Gdy robię taki program: int a = LICZBA1; int b = LICZBA2; int c = a & b; System.out.println(c); To wyskakuje mi w konsoli jakaś dziwna liczba. Powie ktoś jak działa ten operator?
Sławek Ludwiczak
Są to operatory bitowe (suma i iloczyn). Do czego służą możesz poczytać w necie, nie będę tutaj tłumaczył, bo to kwestia operacji arytmetycznych i trzeba by temu poświęcić chwilę czasu.
Piki
Albo wiele tu nie rozumiem, albo wiele pomyłek ;) 1.Wszystkie przykłady ze skrótami: a += b; // A= A+B - w komentarzu powinno być C=A+B? 2. c = a+b++; //c=a+b, a dopiero później b = b+1; c = (a++)+b; //c=a+b, a następnie a = a+1 Oba komentarze, mimo innego słówka, wg mnie przekazują dokładnie tę samą treść. Drugi powinien być chyba //a = a+1, a następnie c=a+b? Przynajmniej tak ja to rozumiem, ale ja jestem bardzo zielony więc proszę o wyjaśnienie :)
Sławek Ludwiczak
Więc po kolei... 1. a+=b to dokładnie to co a = a+b. Nie ma tutaj żadnego c, jest to skrótowy zapis. 2 i 3. Generalnie przekazują podobną treść. <a>Drugi powinien być chyba //a = a+1, a następnie c=a+b?</a> No właśnie nie i po to są te przykłady, żebu pokazać, że w przypadku operatorów inkrementacji działania nie wykonują się po kolei tak jak zwykłe dodawanie. Żeby to lepiej zobrazować dobrze jest sobie uruchomić np taki kod: <pre name='code' class='java'> public class Demo{ public static void main(String[] args) { int a = 1; int b = 1; int c = (a++)+b; System.out.println(c); c = a+b; System.out.println(c); } } </pre> i widzisz, np bardzo istotny jest w tym przypadku nawias, bo działania c=a+(++b) dałoby zupełnie inny wynik :) Możliwe, że lekcja jest nieco chaotyczna i ciężka do zrozumienia (tak jak i często z tymi operatorami bywa), ale błędów merytorycznych nie powinno być.
Piki
Ok, zaraz zrobię drugie podejście do rozumienia :) Dzięki
JJ
Dlaczego nie mozna bylo zastosowac tutaj a.equals(b)? sprobowalem i wyskoczyl mi blad, zastanawiam się dlaczego.
Pawel
Dlaczego a = a++ nie zinkrementuje wartości a, natomiast wprowadzenie dodatkowej zmiennej np b = a++ już to zrobi? int a = 1; a = a++; System.out.println(a); // DAJE WARTOŚĆ 1 int b = a++; System.out.println(a); // TEN KOD DA WARTOŚĆ 2
kylu38
Ja też tego nie pojmuję rozumie to że gdy użyję metody println(a=a++); to wynik będzie 1 bo wyświetlenie wartości będzie wykonane przed postinkremętacją ale przecież zgodnie z tym co zostało napisane wcześniej: int c = b++; //c=b, a dopiero później b = b+1; to a z równania: int a=1; int a=a++ powinno dać a=a// czyli 1 a następnie do a powinno dodać 1 czyli a powinno być 2 i w metodzie println powinno dać 2 a nie 1. Czy mógłby ktoś to wytłumaczyć
Mariusz
Mógłby ktoś rozwiązać dla mnie poniższe działania? Nie rozumiem totalnie działania inkrementacji i dekrementacji, a na ich podstawi wydaje mi się, że dam radę wyciągnąć jakieś wnioski i się tego nauczyć: int a = 7; int b = 4; 1) a+b++ = ? 2) a++b = ? 3) a+++b = ? 4) a++b+ = ? 5) (a++)+b = ? 6) ++a+b = ? 7)++a-b = ? 8) a-b-- = ? 9) a--b = ? 10) a---b = ? 11) a--b- = ? 12) (a--)-b = ? 13) --a-b = ?
Drelka
hej wiem, ze to darmowy kurs, za co powinienem byc wdzieczny i nie marudzic, ale wiele slow jest tutaj dla mnie niezrozumialych i powoli odnosze wrazenie, ze na kazdej kolejnej lekcji autor coraz bardziej wyprzedza zakres wiedzy, ktory ja i inni poczatkujacy zyskalismy do tej pory coraz czesciej musze korzystac ze zrodel zewnetrznych - fora internetowe, inne strony, e-booki prócz tego kurs jest spoko, moze to po prostu ja tak ciezko lapie...
Sławek Ludwiczak
naprawdę mi też bardzo ułatwiłoby poprawianie wszelkich rzeczy w kursie odnoszenie się do konkretów i rzeczy niezrozumiałych. W komentarzach (których jest kilka tysięcy na stronie) wiele wątpliwości zostało rozwianych, dlatego też zachęcam do ich studiowania :)
Sławek Ludwiczak
Problem jest tego typu, że tak naprawdę bez interakcji z "uczniem" nie jest się w stanie przewidzieć wszystkich możliwych problemów. Gdy prowadzę jakieś szkolenia ze stażystami u siebie w firmie zawsze proszę ich żeby pytali jeśli coś nie jest jasne i wtedy sprawa się rozwiązuje, tutaj dowiaduję się o problemach ze zrozumieniem dopiero z komentarzy. Cenię sobie Twoje uwagi i chętnie bym wprowadził poprawki, ale obawiam się, że sprowadziłoby się to prawdopodobnie do przeredagowania całego kursu. W planach mam stworzenie wersji PDF kursu i prawdopodobnie wtedy dopiero może to nastąpić. Dzięki za wyczerpujący komentarz.
Drelka
hej, dzięki za szybką odpowiedź no to konkrety: 1) Nie rozumiem jak "a" może równać się czemuś innemu niż "a", np.: a-=b; a/=b; itp. operatory inkrementacji/dekrementacji - jak to zwiększamy/zmniejszamy wartość zmiennej o 1? na prawdę nie wiem jak to ma dzialać i czemu sużyć (wspomnialeś o pętlach, jednak nie wiem jeszcze co to takiego, a mogę się jedynie domyślać) 2) Bylo krótkie wyjaśnienie w lekcji "Typy danych" na temat tego czym jest boolean, jednak nie wykorzystywaliśmy go przed tą lekcją. Nie bylo powiedziane jak dziala. Fakt - można to zrozumieć jeśli ktoś czyta wszystko po kolei i dokladnie, a później (tak jak ja) wraca do tego czego nie zrozumial i czyta raz jeszcze. Szybciej skumal bym gdyby przyklady byly prostsze, a tutaj pierwsze fragmenty kodu z użyciem boolean lączą się z operatorami koniunkcji i metodą equals, które w tym kursie są dla mnie nowością. Jak mial bym opisać to lopatologicznie: To tak jak w szkole, nauczyciel który jest doświadczony, często posluguje się slowami, wyrażeniami, ktore dla mlodych uczniów są niezrozumiale. W pierwszych lekcjach pisales, żeby się nie przejmować jeśli ktoś czegoś na początku nie zrozumie, jednak ja co lekcję muszę sięgać do innych zródel wiedzy. Przechodzę kolejne lekcje i tkwię w nich, póki nie zrozumiem wszystkiego co jest w nich zawarte, zdając sobie sprawę, że ulatwi mi to przejście kolejnych etapów kursu. ps. Czytam komentarze i staram się traktować je jako dodatkowe źródlo wiedzy (te z Twoimi wypowiedziami), na tyle na ile jestem w stanie zrozumieć , ponieważ w niektórych widzę operatory (prawdopodobnie) z kolejnych lekcji - while, what, $. ps2. Przepraszam za problem ;)
Bronislaw
W tytule drobna literówka "Operatory matematyczne" a nie "Operatory matematycze" :)
Druid
Dlaczego przy typie zmiennoprzecinkowym "double", konkretnie "double 'g'" , program wyświetla wynik=3 nie wykonując działania 3%z 6? Domyślam się, że otrzymuję resztę. double a, b, c; a = 3; b = 6; c = 3.6; double d = (a+c)/b; double e = (c+b)/a; double g = a%(b);
wppwpl
Jestem początkującym, jeżeli chodzi o Javę. Nie rozumiem pojęcia "double", mógłby ktoś mi to wytłumaczyć??
Grzegorz
Double czyli liczby zmiennoprzecinkowe, jeśli chcesz otrzymać wynik działania np 3,5345 to musisz użyć typu double gdyż int go nie wyświetli poprawnie.
Redziu
ja mam taki problem... public class Test{ public static void main(String[] args){ double a,b,c; a=1.0; b=2.0; c=3.0; System.out.println("(a+b)*c = "+(a+b)*c); System.out.println("a-b/c = "+(a-b*c)); } } i jak daje w cmd w odpowiednim już folderze javac Test.java to wyskakuje mi 1 error, a mianowicie znaku minus jak jest linijka System.out.println("a-b/c = "+(a-b*c)); to ten drugi minus... wie ktoś o co chodzi?
Redziu
Dobra... już wiem... ale mam następny problem... kiedy już w konsoli wpisuje java Test pokazują mi się 2 działania: (a+b)*c = 9.0 a-b/c = -5.0 i właśnie dziwi mnie to drugie działanie... dlaczego wychodzi mi -5 ??? no bo b/c = 2/3 = ok. 0,6 i teraz a-0,6=0.4 ale gdyby było 6 (przestawiony przecinek z 0,6) to byłoby w tedy -5... ja coś źle jarzę czy jakiś błąd w programie? (wychodzi na to samo)
Redziu
im idiot... niepotrzebnie pisze tyle komentarzy... oczywiście, że błąd w pisowni programu... jak mam linijkę: System.out.println(„a-b/c = „+(a-b*c)); to zły jest drugi znak w DZIAŁANIU... powinno być / a nie *... im idiot... XD ale przynajmniej znajduję własne błędy :D
Redziu
Jeszcze JEDNO... XD... przy tym drugim działaniu: a-b/c gdzie a = 1 b = 2 c = 3 powinien wyjść wynik: a-b/c = 333333333333333337 ??? b/c = 2/3 = 0.666666666666666667 a-0.66666666666666667 = 1-0.66666666666666667 = 0.33333333333333333 a nie 0.333333333333333337 wiem, że to wielkiej różnicy nie robi (nawet małej ;p) ale moim zdaniem jest tutaj coś nie tak ;)
Husky
Czy jest jakiś sposób na zmianę zmiennych z konsoli poleceń (bez zmiany kodu programu i kompilacji)?
Iskandar
http://javastart.pl/podstawy-jezyka/podstawowe-wejscie-wyjscie/
szczepan
Co w tym jest nie tak ( http://ideone.com/TbAqVi ): int a = 5; System.out.println("a = " + a); int b = 3; System.out.println("b = " + b); int c = (++a++)+b+++(a+++b); Dostaję errora: Main.java:7: error: unexpected type int c = (++a++)+b+++(a+++b); ^ required: variable found: value 1 error Rozumiecie co chciałem zrobić w zmiennej 'c'? Najpierw preinkrementacja na zmiennej 'a', potem na tej samej zmiennej postinkrementacja a potem dodanie do zmiennej b. Następnie postinkrementacja na zmiennej 'b' a następnie całość dodać do sumy 'a + b' które są w końcowym nawiasie, oczywiście wcześniej zmienna 'a' też musi zostać postinkrementowana. Na moją logikę, wychodzi to tak: c = 6 [plus inkrementacja o 1] + 3 [plus inkrementacja o 1] + (5 [plus inkrementacja o 1] + 3); tak więc teraz c = 9 [plus 2 jeszcze z wcześniejszych inkrementacji czeka na dodanie do tej dziewiątki] + 8 [plus 1 czeka na dodanie do tej ósemki] a więc c = 11 + 9 = 20. Gdzie błąd myślowy?
lolo
Zapis ++i++ jest błędny. Gdyby było to możliwe to program by zwrócił inny wynik niż wyszło Ci z obliczeń. Moim zdaniem było by to 18. Jednak mogę się mylić, bo wynik w tym przypadku jest zależny od kolejności wykonywanych działań i czy program postawi sobie nawias ((++a++)+b++)+(a+++b) czy (++a++)+(b+++(a+++b)). Z twojego toku myślowego wynika, że działania wykonują się dwu etapowo. One są wykonywane liniowo wg kolejności wykonywanych działań.
szczepan
A czemu ten zapis "++i++" jest błędny? Java w ogóle nie akceptuje takiego zapisu (in/de)krementacji czy to zupełnie zabronione przez logikę programowania, niezależnie od języka?
lolo
Wydaje mi się, że to jest zabronione przez logikę programowania gdyż w c też taki zapis był błędny.
Lee
Witam, Czy może ktoś szczegółowo opisać na czym polega inkrementacja i dekrymentacja? Jeśli wyniki podane w komentarzach w przedstawionym kodzie są prawidłowe, proszę o wyjaśnienie dlaczego są prawidłowe. Nie mam żadnego doświadczenia z programowanie, a informacje znalezione w necie są pobieżne i niezrozumiałe dla mnie. Z góry dziękuję za pomoc. public class Inde{ public static void main(String[] args){ int a = 5; int b = 3; int c = a+b++; //WYNIK C = 8 int d = (a++)+b; //WYNIK D = 9 int e = a+(++b); // WYNIK E = 11 int f = a+++b; //WYNIK F = 11 System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); System.out.println("\n"); int h = a-b--; //WYNIK H = 2 int i = (a--)-b; //WYNIK I = 3 int j = a-(--b); //WYNIK J = 3 int k = a---b; //WYNIK K = 3 System.out.println(h); System.out.println(i); System.out.println(j); System.out.println(k); } }
lolo
1. W kodzie masz błędy. Zamiast -- masz –. Ale to możliwe, że to blog to tak zamienia tak samo jak w każdym kodzie zmienia cudzysłowowa. 2. Co to jest inkrementacja i dekrementacja? Jest to napisane w treści tej lekcji. Inkrementacja jest to zwiększenie wartości zmiennej o 1. A dekrementacja jest to zmniejszenie zawartości zmiennej o 1. 3. Dlaczego pytasz czy wyniki działań z kodu są w komentarzach prawidłowe jak wyświetlasz w kodzie je niżej i sam możesz zobaczyć czy się one zgadzają z twoimi przewidywaniami. 4.Dlaczego wyniki są jakie są? Przeanalizujemy to krok po kroku Przypisujesz wartości a=5 i b=3 Przypisujesz do zmiennej c wynik z działania a(5) + b(3) a następnie zwiększasz b o 1(teraz b =4) wynik to 8 Przypisujesz do zmiennej d wynik z działania a(5) + b(4) a następnie zwiększasz a o 1(teraz a =6) wynik to 9 Przypisujesz do zmiennej e wynik z działania a(6) + b(4) ale przed wykonaniem tego działania zwiększasz o 1 i tak naprawdę działanie to a(6) + b(5) i dlatego jest 11. Przypisujesz do zmiennej f wynik z działania a(6) + b(5) a następnie zwiększasz a o 1(teraz a =7) i dlatego wynik tego działania to tak samo jak we wcześniejszym to 11. Przypisujesz do zmiennej h wynik z działania a(7) - b(5) a następnie zmniejszasz b o 1(teraz b =4) wynik to 2 Przypisujesz do zmiennej i wynik z działania a(7) - b(4) a następnie zmniejszasz a o 1(teraz a =6) wynik to 3 Przypisujesz do zmiennej j wynik z działania a(6) - b(4) ale przed wykonaniem działania zostaje zmniejszone b o 1 i teraz działanie wygląda tak a(6) - b(3) wynik to 3 Przypisujesz do zmiennej k wynik z działania a(6) - b(3) a następnie zmniejszasz a o 1(teraz a =5). wynik to 3
Lee
Wielkie dzięki. Pisałem skrótowo, żeby się nie rozwodzić za bardzo, ale świetnie odczytałeś moją prośbę. Dokładnie chodziło mi o wyjaśnienia w pkt. 4. Teraz inkrementacja i dekrymentacja jest dla mnie jasna. Bardzo Ci dziękuję jeszcze raz.
Grzesiek
System.out.println(oochar); System.out.println("k"); System.out.println(oochar!="k"); Dlaczego w ostatnim zawsze wyświetla mi true, nawet jak oochar to "k"?
lolo
Spróbuj użyć ' pojedynczych zamiast " pdwójnych apostrofów
tomee
Błąd. Operator ? : "warunek? wyrażenie1 : wyrażenie2;", wcale nie działa tak jak opisałeś. Operator ten zwraca jedną z wartości, a nie wykonuje wyrażenia jak podkreśliłeś.
majonez
Do czego służy typ boolean skoro bez podania typu porównując liczby czy stringi również pokazuje wynik falsa/true i wyświetla na konsoli?
lolo
np. zamiast kilka razy wykonywać porównanie możesz zrobić raz i wynik wpisać do zmiennej a nie za każdym razem przeprowadzać operacje porównania. Albo zależy ci na pamięci(to raczej nie javowy argument) i zamiast używać inta jako flagi możesz użyć boolena.
michal
Jak porównać ze sobą dwie liczby int? bo equal() działa tylko do stringów
Adam
Najprościej rozwiązanie można napisać tak: public class Test{ public static void main(String[] args){ double a, b, c; a = 2.0; b = 3.0; c = 4.0; System.out.println ("(a+b)*c ="+(a+b)*c); System.out.println ("a-b/c = "+(a-b)/c); a = ++a; b = ++b; c = ++c; /*System.out.println (a); //Sprawdzenie czy zmienna zostala zwiekszona o 1 */ boolean porownanie1 = (a+b)>c; boolean porownanie2 = a==b; System.out.println (porownanie1); System.out.println (porownanie2); } }
Janosch
Ja to z kolei zrobiłem tak: public class Zadanie_1_3 { public static void main(String[] args) { double a=1.0, b=2.0, c=3.0, wynik; System.out.println("Operator a = " + a + "\nOperator b = " + b + "\nOperator c = " + c); wynik = (a+b)*c; System.out.println("Wynik działania (a+b)*c = " + wynik); wynik = a-b/c; System.out.println("Wynik działania a-b/c = " + wynik); //Operatory inkrementacji a++; b++; c++; System.out.println("Operator a = " + a + "\nOperator b = " + b + "\nOperator c = " + c); System.out.println("Wynik działania a-b/c = " + a); //Porównanie ze sobą boolean porownanie1 = (a+b)>c; boolean porownanie2 = a==b; System.out.println("Wynik porównania (a+b)>c to " + porownanie1); System.out.println("Wynik porównania a==b to " + porownanie2); } }
Janosch
Mała poprawka, linijka 18 System.out.println(„Wynik działania a-b/c = ” + a); jest niepotrzebna.
ichika60h
Zakładając, że boolean a = 10; boolean b = 5; boolean c = 5; a-b/c = 10-5/5=9 Wiadomo, że pierwsze jest dzielenie, natomiast nigdzie nie wspomniałeś o tym w kursie. Kompilując kod i patrząc na rezultat wychodziłem z założenia, że wszystko się robi od lewej do prawej czyli 10-5/5=5/5=1
Lolo
Operacje matematyczne są wykonywane zazwyczaj(bo to wszystko zależy od kompilatora) tak samo jak w normalnym życiu czyli pierwszeństwo mają mnożenie i dzielenie a później są wykonywane dodawanie i odejmowanie idąc od lewej do prawej. Najlepiej pisząc program używać nawiasów do określenia kolejności wykonywanych działań żeby nie zdarzyło się, że kompilator inaczej to skompiluje niż chcieliśmy a poza tym zapis z nawiasami jest bardziej przejrzysty przy czytaniu takiego kodu. Oczywiście nie ma sensu bawić się w nawiasy przy prostych formułach w których np. dodajemy lub odejmujemy od siebie tylko kilka zmiennych.
ichika60h
<blockquote> <a href="#comment-14399" rel="nofollow"> <strong><em>ichika60h:</em></strong> </a> Zakładając, że boolean a = 10; boolean b = 5; boolean c = 5; a-b/c = 10-5/5=9 Wiadomo, że pierwsze jest dzielenie, natomiast nigdzie nie wspomniałeś o tym w kursie. Kompilując kod i patrząc na rezultat wychodziłem z założenia, że wszystko się robi od lewej do prawej czyli 10-5/5=5/5=1 </blockquote> Zamiast boolean miało być double ^^"
Kamil
Operatory matematycze - w nagłówku brakuje "N" w matematyczne
xnikixx
Nie należy jednak tego praktykować, jest to bardzo zły nawyk i może prowadzić do ciężkich do wykrycia błędów. Nie należy jednak tego praktykować, jest to bardzo zły nawyk i może prowadzić do wykrycia ciężkich błędów. Chyba o to ci chodzilo.
Lolo
Wersja Sławka jest poprawna, choć poprawniej to zdanie brzmiałoby: Nie należy jednak tego praktykować, jest to bardzo zły nawyk i może prowadzić do błędów ciężkich do wykrycia.
xyz
Przydałoby się jeszcze wyjaśnienie dotyczące działania operatorów typu shift (<<i>>).
xyz
Coś ucięło mój komentarz, w nawiasie miało być "<>".