Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Operatory matematycze i logiczne

Ważnym zagadnieniem w programowaniu jest matematyka i różne funkcje matematyczne. Omówimy je na tej lekcji, dzięki czemu będziemy mogli tworzyć proste programy. Na zakończenie będziesz musiał napisać prosty kalkulator.

Wcześniej poznałeś już jeden z operatorów matematycznych jakim jest +, nie będziesz zaskoczony, jeśli napiszę, że pozostałe standardowe operatory także tutaj występują. Mamy do dyspozycji:

+ dodaje 2 liczby

- odejmuje dwie liczby

* znak mnożenia

/ dzielenie całkowite

% reszta z dzielenia

Poniższy kod przedstawia ich działanie.

public class Operatory{
  public static void main(String[] args){
	  int a = 17;
	  int b = 4;
	  int c = a+b; //=21
	  c = a-b;     //=13
	  c = a*b;     //=68
	  c = a/b;     //=4 ponieważ 4*4=16 i zostaje reszty 1
	  c = a%b;     //=1 reszta z dzielenia
  }
}

Oczywiście można w ten sposób działać również na zwykłych liczbach, więc poprawny jest poniższy zapis.

int a = 17;
int b = 4;
int c = (a+b)/3;  //=7

Nawiasy okrągłe służą do wyznaczania kolejności wykonywania działań, jednak obowiązują także standardowe prawa. W naszym jednak przypadku pominięcie nawiasu spowodowałoby otrzymanie nieprawidłowego wyniku.

No dobrze. Jak więc poradzić sobie z dzieleniem, przecież chcemy, aby 7/2=3.5, a nie 3. W tym przypadku wystarczy zadeklarować przynajmniej jedną ze zmiennych jako typ zmiennoprzecinkowy.

int a = 17;
double b = 4.0;
double c = a/b; //=4.25

Istnieją także bardzo przydatne skrótowe 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

Jak widać pozwalają one na szybkie wykonywanie operacji na dwóch zmiennych. Działanie jest jednak identyczne z tym podanym po znaku komentarza.

Bardzo ważną rolę w programowaniu odgrywają również operatory inkrementacji oraz dekrementacji. Służą one do zwiększania/zmniejszania wartości zmiennej o 1. Są dzięki temu bardzo często wykorzystywane w pętlach.

Istnieją ich dwa rodzaje:

-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ę znak -- (dwa minusy). Wyrażenia w Javie są przetwarzane od lewej do prawej strony.

Kolejną ważną rzeczą są operatory porównawcze i logiczne.

Do porównywania 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.

Istnieją również operatory logiczne, czyli koniunkcja && i alternatywa || .

Przydatny bywa także operator trój argumentowy postaci:

warunek? wyrażenie1 : wyrażenie2;

Jeśli warunek zwróci wartość true wykonywane jest wyrażenie1 w przeciwnym wypadku wyrażenie2.

Działanie operatorów:

int a = 5;
int b = 3;
boolean prawda = a>b; //prawda=true
boolean falsz = a<b;  //falsz=false
boolean porownanie = a==b;  //porownanie=false
boolean koniunkcja = (a>b)&&(a!=b); //true prawda i prawda = prawda

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. Jest tutaj też mały haczyk. Spójrz na poniższy przykład i zastanów się co pojawi się na ekranie?

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. Niestety, albo stety otrzymamy dwa razy true, ponieważ maszyna wirtualna zorientowała się, że oba łańcuchy są identyczne, sprawiła więc, że zarówno zmienna ja jak i ty wskazują na to samo miejsce w pamięci (ta sama referencja). Nie należy jednak tego praktykować, jest to bardzo zły nawyk i może prowadzić do ciężkich do wykrycia błędów. Do porównywania Stringów i innych obiektów zawsze używaj metody equals, jeśli jest ona prawidłowo napisana to w pierwszej kolejności porównuje właśnie równość fizyczną za pomocą ==, więc złożoność obliczeniowa jest praktycznie identyczna.

Zadania do samodzielnego wykonania.

1.3 Napisz prosty kalkulator, w którym będziesz przechowywał 3 zmienne typu double o nazwach a,b,c. Wypróbuj wszystkie operatory matematyczne:

(a+b)*c

a-b/c

użyj operatorów inkrementacji i zwiększ wszystkie zmienne o 1.

Teraz porównaj ze sobą, czy:

(a+b)>c

czy a=b?

Przedstaw wyniki w konsoli.

Rozwiązanie.

<- Poprzednia LekcjaNastępna Lekcja ->

Komentarze

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.

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

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?

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?


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);

}
}
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.

KP

c=a+++b to to samo co c=(a++)+b ale nie to samo co c=a+(++b)

Witek

Super, podoba mi się ten kurs

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ć.

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ę:
System.out.println("A = "+a);
to wszystko jest ok, ale gdy chcę wpisać:
System.out.println("A = "+a"B = "+b"C = "+c);
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ć:
System.out.print("A, B, C= "+a+b+c);
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


System.out.print("A, B, C= "+a+" "+b+" "+c);

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ś:
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);
}
}

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.

lukas

dlaczego w poniższym przypadku wynikiem jest liczba 13, jeśli można to proszę o wytlumaczenie


int i = 10;
while (i++ <= 10)
{
i++;
}
System.out.println(i);


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

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

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

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 :-)

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

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 :)

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ść.
Drugi powinien być chyba //a = a+1, a następnie c=a+b?
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:


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);
}
}

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

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.

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 :)

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 ;)

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.

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



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

Zamiast boolean miało być double ^^"
Kamil

Operatory matematycze - w nagłówku brakuje "N" w matematyczne

xyz

Przydałoby się jeszcze wyjaśnienie dotyczące działania operatorów typu shift (<>).

xyz

Coś ucięło mój komentarz, w nawiasie miało być "<>".

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.