Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Ndarja e modulit Java. Veprimet aritmetike

Operatorët unarë ndiqen nga operatorët aritmetikë sipas renditjes së përparësisë. Ky grup përfshin katër operatorët më të zakonshëm: mbledhje, zbritje, shumëzim, pjesëtim. Dhe jo vetëm ata. Ekziston gjithashtu një operator modul, i shënuar me%. Operatorët aritmetikë ndahen në dy grupe. Grupi i parë, më prioritar përmban *, /,%. Në të dytën, përkatësisht, + dhe -.

Shumëzimi dhe pjesëtimi (* dhe /)

Operatorët * dhe / kryejnë shumëzim dhe pjesëtim në të gjitha llojet primitive numerike dhe char. Pjesëtimi me zero rezulton në Përjashtim aritmetik.

Me siguri po pyesni veten pse po ju them për shumëzimin dhe pjesëtimin, të cilat i keni njohur që në klasën e parë. Megjithatë, në programim kemi të bëjmë me disa kufizime që lidhen me paraqitjen e numrave në një kompjuter. Këto kufizime zbatohen për të gjitha formatet numerike, nga bajt në dyfish. Por ato janë më të dukshme për llojin int.

Nëse jeni duke shumëzuar ose pjesëtuar dy numra, rezultati llogaritet duke përdorur aritmetikën e numrave të plotë dhe ruhet në int ose në gjatësi. Nëse numrat janë shumë të mëdhenj, atëherë rezultati do të jetë më i madh se numri maksimal që mund të përfaqësohet në këta numra. Kjo do të thotë që rezultati nuk do të jetë në gjendje të kodohet saktë nga kompjuteri dhe nuk do të ketë kuptim. Për shembull, lloji i bajtit përdoret për të paraqitur numra në rangun -128 deri në 127. Nëse shumëzojmë 64 dhe 4, rezultati 256, i cili ka nëntë karaktere në 100,000,000 binar, kodohet si 0 sepse bajt përdor vetëm 8 karaktere.

Merrni parasysh ndarjen. Nëse ndani në aritmetikë numër të plotë, rezultati duhet të jetë numër i plotë. Kjo do të thotë që pjesa e pjesshme do të humbasë. Për shembull, 7/4 na jep 1.75, por në aritmetikë të plotë do të ishte 1.

Kështu, nëse keni të bëni me shprehje komplekse, mund të zgjidhni një sekuencë shumëzimesh dhe ndarjesh. Por mbani në mend se shumëzimi mund të rezultojë në vërshoj, dhe ndarja - te humbja e saktësisë... Dituria popullore beson se kryerja e shumëzimeve, dhe më pas e ndarjeve, në shumicën e rasteve, jep rezultatin e saktë. Le të shqyrtojmë një shembull:

1.int a = 12345, b = 234567, c, d;
2.gjatë e, f;
3.
4.c = a * b / b; // duhet të jetë e barabartë me a = 12345
5.d = a / b * b; // duhet gjithashtu të jetë e barabartë me a = 12345
6. System.out.println (“a është“ + a +
7. "\ nb është" + b +
8. "\ nc është" + c +
9. “\ nd është“ + d);
10.
11.e = (e gjate) a * b / b;
12.f = (i gjatë) a / b * b;
13. System.out.println (
14. “\ ne is“ + e +
15. “\ nf është“ + f);

Rezultati i punës së këtij fragmenti do të japë sa vijon:

A është 12345
b është 234567
c është -5965
d është 0
e është 12345
f është 0

Mos u ngatërroni nga vlerat numerike në këtë shembull. Gjëja e rëndësishme është që kur bënim shumëzimin fillimisht, morëm një tejmbushje (c është -5965) kur e koduam atë për të shtypur int. Megjithatë, mund të marrim rezultatin e saktë nëse e përfundojmë në një lloj më të gjatë, si p.sh. Në të dyja rastet, aplikimi i ndarjes së parë do të jetë katastrofik për rezultatin, pavarësisht nga gjatësia e llojit të tij.

Moduli i ndarjes%

Rezultati i ndarjes së modulit është pjesa e mbetur e ndarjes. Për shembull, 7/4 është e barabartë me 1 me një mbetje prej 3. Prandaj, 7% 4 = 3. Zakonisht operandët janë të tipit integer, por ndonjëherë operatori zbatohet për numrat me pikë lundruese. Ju gjithashtu duhet të jeni të vetëdijshëm për disa nga veçoritë e këtij operatori kur operandët janë negativë.

Për operandët negativë ose thyesorë, rregulli është: zbres operandin e djathtë nga i majti derisa i fundit të jetë më i vogël se i pari. Shembuj:

17%5 = ? 17-5=12>5; 12-5=7>5; 7-5=2<5. Значит 17%5 = 2

21%7? 21-7=14>7; 14-7=7=7; 7-7=0<7. Значит 21%7 = 0

7.6%2.9? 7.6-2.9=4.7>2.9; 4.7-2.9=1.8<2.9. Значит 7.6%2.9=1.8

Shënim: shenja e rezultatit (pozitive ose negative) përcaktohet tërësisht nga shenja e operandit të majtë, domethënë dividenti.

Kur ndarja modulore kryhet në numra thyesorë, thelbi i këtij operacioni është të zbresësh pjesëtuesin disa herë. Rezultati mund të jetë gjithashtu një numër thyesor.

Një rregull i thjeshtë praktik për operandët negativë është heqja e shenjës minus nga operandët, pjesëtimi i modulit me operandët pozitivë dhe më pas parazgjedhja e rezultatit me një minus nëse operandi i majtë (dividend) ishte negativ.

Ndarja e modulit, si ndarja normale, mund të krijojë një Përjashtim Aritmetik nëse pjesëtuesi (operandi i djathtë) është zero.

Shumica e operacioneve në llojet primitive kryhen jo duke përdorur metoda, por duke përdorur karaktere speciale të quajtura shenjë operimi.

Operacioni i caktimit

Caktimi i një ndryshoreje të vlerës së një konstante, një ndryshoreje tjetër ose një shprehjeje (variabla dhe/ose konstante të ndara nga shenjat e funksionimit) quhet operacioni i caktimit dhe tregohet me shenjën " = ", për shembull: x = 3; y = x; z = x; Në Java, lejohet të ripërdoret operacioni i caktimit në një shprehje, për shembull: x1 = x2 = x3 = 0; Ky operacion kryhet nga e djathta në majtas, pra variablit x3 fillimisht i caktohet vlera 0, më pas x2 i caktohet vlera x3 (0) dhe në fund x1 i caktohet vlera x2 (0). Shenjat e operacionit që përdorin numrat si argumente bien në dy kategori: unare shenja (unare) për operacione me një argument dhe binare(binare) me dy argumente.

Operacione unare

Operacionet unare të mëposhtme përcaktohen në Java:
  • unary minus "-" - ndryshon shenjën e një numri ose shprehje në të kundërtën;
  • unary plus "+" - nuk kryen asnjë veprim në një numër ose shprehje;
  • komplementi në bit "~" (vetëm për numrat e plotë) - përmbys të gjitha bitet e fushës së numrave (ndryshon 0 në 1 dhe 1 në 0);
  • rritja "++" (vetëm për numrat e plotë) - rrit vlerën e ndryshores me 1;
  • zvogëlimi "-" (vetëm për numrat e plotë) - zvogëlon vlerën e ndryshores me 1.
Shembuj të veprimeve unare "+" dhe "-": int i = 3, j, k; j = - i; // j = -3 k = + i; // k = 3 Një shembull i një veprimi të komplementit bit: int a = 15; int b; b = ~ a; // b = -16 Numrat a dhe b janë int, d.m.th. përfaqësohen nga brenda si numra të plotë të nënshkruar binare me një gjatësi prej 32 bit, kështu që paraqitja binar e numrave a dhe b do të duket kështu: a = 00000000 00000000 00000000 00001111 b = 11111111 111111111111 mund të shihni të gjithë këtë bit zero në numrin a janë ndryshuar ato në b, dhe ato në a janë ndryshuar në zero bit. Paraqitja dhjetore e b është –16. Shenjat e funksionimit të rritjes dhe zvogëlimit mund të vendosen ose para ose pas ndryshores. Këto opsione janë emëruar në përputhje me rrethanat parashtesë dhe postfiks duke regjistruar këto operacione. Shenja e operatorit në shënimin e prefiksit kthen vlerën e operandit të saj pas duke vlerësuar një shprehje. Për shënimin postfiks, shenja e funksionimit së pari kthen vlerën e operandit të tij dhe vetëm pas kësaj llogarit rritjen ose zvogëlimin, për shembull: int x = 1, y, z; y = ++ x; z = x ++; Variablës y do t'i caktohet vlera 2, sepse së pari vlera e x do të rritet me 1, dhe më pas rezultati do t'i caktohet ndryshores y. Variablës z do t'i caktohet vlera 1, sepse së pari ndryshores z do t'i caktohet një vlerë dhe më pas vlera e x do të rritet me 1. Në të dyja rastet, vlera e re e x do të jetë 2. Duhet të theksohet se në Java, ndryshe nga C, operacionet e zvogëlimit dhe rritjes mund të aplikohen edhe për variablat realë (të tipeve float dhe dyfishtë). Shenjat e funksionimit binar ndahen në operacione me rezultat numerik dhe operacione krahasimi, rezultati i të cilave është një vlerë boolean.

Operacionet aritmetike binare

Java përcakton sa vijon operacionet binare aritmetike:
  • shtimi "+";
  • zbritja "-";
  • shumëzimi " * ";
  • ndarja "/";
  • duke llogaritur pjesën e mbetur të pjesëtimit të numrave të plotë "%" (kthimin e mbetur të pjesëtimit të numrit të parë me të dytin, dhe rezultati do të ketë të njëjtën shenjë si dividenti), për shembull, rezultati i veprimit 5% 3 do të jetë 2, dhe rezultati i veprimit (-7) % (- 4) do të jetë -3. Në Java, operacioni mund të përdoret gjithashtu për ndryshore reale (të tilla si float ose double).
Shembuj të veprimeve aritmetike binare: int x = 7, x1, x2, x3, x4, x5; x1 = x + 10; // x1 = 17 x2 = x - 8; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x / 4; // x4 = 1 (kur ndahen numrat e plotë // pjesa e pjesshme është hedhur poshtë) x5 = x% 4 // x5 = 3 (mbetja e pjesëtimit// 7 nga 4)

Operacionet bitwise

  • Operacionet në bit trajtojnë vlerat numerike origjinale si fusha bit dhe bëjnë si më poshtë për to:
  • vendosja e bitit në i-pozicioni i 1-të i fushës së rezultatit, nëse të dy bitet janë in i-Pozicionet e operandeve janë të barabarta me 1, ose me 0, përndryshe - në bit AND ("&");
  • vendosja e bitit në i-pozicioni i saj i fushës së rezultatit në 1, nëse të paktën një bit in i Pozicioni i -të i operandëve është i barabartë me 1, ose me 0, përndryshe - OR ("|");
  • vendosja e bitit në i-pozicioni i 1-të i fushës së rezultatit, nëse bitat janë në i-Pozicionet e operandëve nuk janë të barabarta me njëri-tjetrin, ose me 0, përndryshe - ekskluzive OR ("^");
  • Zhvendosja majtas e biteve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit nuk ndryshon në këtë rast) - zhvendosja në të majtë në të majtë, duke marrë parasysh shenjën "<< ";
  • zhvendosja në të djathtë të biteve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit nuk ndryshon në këtë rast) - zhvendosja në të djathtë në të djathtë, duke marrë parasysh " >>" shenjë;
  • zhvendosja në të djathtë të biteve të fushës së operandit të parë nga numri i biteve të përcaktuar nga operandi i dytë (biti i shenjës së numrit zhvendoset gjithashtu në këtë rast) - zhvendosja në të djathtë në të djathtë pa marrë parasysh " >>>" shenjë.
Shembuj të operacioneve në bit:
  1. Bitwise DHE

    int x = 112; int y = 94; int z; z = x & y; // z = 80: 00000000 00000000 00000000 01010000
  2. Në mënyrë bitale OSE

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x | y; // z = 126: 00000000 00000000 00000000 01111110
  3. OSE ekskluzive bitwise

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x ^ y; // z = 46: 00000000 00000000 00000000 00101110
  4. Zhvendosni majtas, duke marrë parasysh shenjën

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Zhvendosni djathtas, duke marrë parasysh shenjën

    int x = - 17, z; z = x >> 2; // z = -5: 11111111 11111111 11111111 11111011
  6. Zhvendosni djathtas pa marrë parasysh shenjën

    int x = - 17, z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

Operacione të kombinuara

Në Java, për operacione aritmetike binare, mund të përdorni të kombinuara Shenjat e operacionit (të përbëra): operacioni identifikues = shprehje Kjo është ekuivalente me operacionin e mëposhtëm: identifikues = shprehje e veprimit identifikues Shembuj:
  1. Shprehja x + = b do të thotë x = x + b.
  2. Shprehja x - = b do të thotë x = x - b.
  3. Shprehja x * = b do të thotë x = x * b.
  4. Shprehja x / = b do të thotë x = x / b.
  5. Shprehja x% = b do të thotë x = x% b.
  6. Shprehja x & = b do të thotë x = x & b.
  7. Shprehja x | = b do të thotë x = x | b.
  8. Shprehja x ^ = b do të thotë x = x ^ b.
  9. Shprehja x<<= b означает x = x << b .
  10. Shprehja x >> = b do të thotë x = x >> b.
  11. Shprehja x >>> = b do të thotë x = x >>> b.

Operacionet e krahasimit

Java përcakton operatorët e mëposhtëm krahasimi:
  • "==" (e barabartë), "! =" (jo e barabartë),
  • ">" (më e madhe se), "> =" (më e madhe ose e barabartë),
  • " < " (меньше) " <= " (меньше или равно)
kanë dy operandë dhe kthejnë një vlerë boolean që korrespondon me rezultatin e krahasimit ( i rremë ose e vërtetë). Vini re se kur krahasoni dy vlera për barazinë në Java, si në C dhe C ++, simbolet " == "(dy shenja të barabarta pa hapësirë), në ndryshim nga operatori i caktimit, i cili përdor "" = ". Përdorimi i simbolit" = "kur krahason dy vlera ose shkakton një gabim përpilimi ose prodhon një rezultat të pasaktë. Shembuj të operacioneve të krahasimit: boolean është e barabartë, nuk është e barabartë, është më e madhe, është më e madheOrE barabartë, është më e vogël, është më pakOrE barabartë; int x1 = 5, x2 = 5, x3 = 3, x4 = 7; është e barabartë = x1 == x2; // është e barabartë = e vërtetë nuk është e barabartë = x1 = x2; // nuk është e barabartë = false është më e madhe = x1> x3; // është më i madh = i vërtetë // është më i madh ose i barabartë = i vërtetë është më i madh ose i barabartë = x2> = x3; është më pak = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

Operacionet Boolean

Operacionet Boolean ekzekutohen në variablat boolean dhe rezultati i tyre është gjithashtu një vlerë e tipit logjike... Operacionet boolean të mëposhtme përcaktohen në Java:
  • mohim "!" - zëvendësimi i falsifikuar me të vërtetën, ose anasjelltas;
  • DHE operacioni "&" - rezultati është i vërtetë vetëm nëse të dy operandët janë të vërtetë, përndryshe rezultati është i rremë;
  • OSE operacion "|" - rezultati është i vërtetë vetëm nëse të paktën një nga operandët është i vërtetë, përndryshe rezultati është i rremë.
  • Operacioni XOR "^" - rezultati është i vërtetë vetëm nëse operandët nuk janë të barabartë me njëri-tjetrin, përndryshe rezultati është i rremë.
Operatorët "&", "|" dhe "^" mund të përdoren, si dhe operatorët përkatës në bit, në operatorët e caktimit të përbërë: "& =", "| =" dhe "^ =" Përveç kësaj, operacionet " = janë të zbatueshme për operandët Boolean. = "(e barabartë) dhe"! = "(jo e barabartë). Siç mund ta shihni nga përkufizimi i OR dhe AND, operacioni OR vlerësohet në true kur operandi i parë është i vërtetë, pavarësisht nga vlera e operandit të dytë, dhe operatori AND vlerëson false kur operandi i parë është false, pavarësisht vlera e operandit të dytë. Java përcakton dy operacione të tjera boolean: versionet e dyta të AND dhe OR, të njohura si operacione logjike të qarkut të shkurtër: AND i shkurtuar "&&" dhe OR i shkurtuar "||". Duke përdorur këto operacione, operandi i dytë nuk do të vlerësohet fare, gjë që është e dobishme në rastet kur funksionimi i saktë i operandit të djathtë varet nga fakti nëse operandi i majtë është i vërtetë apo i gabuar. Shembuj të operacioneve boolean: boolean isInRange, isValid, isNotValid, isEqual, isNotEqual; int x = 8; isInRange = x> 0 && x< 5 ; // isInRange = false isValid = x >0 || x> 5; // isValid = e vërtetë ështëNotValid =! eshte e vlefshme; // isNotValid = false është e barabartë = ështëInRange == është Valid; // isEqual = false // isNotEqual = e vërtetë ështëNotEqual = ështëInRange! = është e vlefshme

Operacioni i kushtëzuar

Një veprim i kushtëzuar shkruhet në formën shprehje-1?Shprehja-2: shprehje-3. Në këtë rast, shprehja-1 vlerësohet fillimisht, e cila duhet të japë një vlerë boolean, dhe më pas, nëse shprehja-1 është e vërtetë, shprehja-2 vlerësohet dhe kthehet si rezultat i operacionit, ose (nëse shprehja-1 është false ), dhe shprehja-3 kthehet si rezultat i operacionit. Një shembull i një operacioni të kushtëzuar: x = n> 1? 0: 1; Variablës x do t'i caktohet vlera 0 nëse n> 1 (shprehja n> 1 vlerësohet me e vërtetë) ose 1 nëse n≤1 (shprehja n> 1 vlerësohet në false).

Vjetërsia e operacioneve

Veprimet në shprehje kryhen nga e majta në të djathtë, megjithatë, sipas përparësisë së tyre. Pra, veprimet e shumëzimit në shprehjen y = x + z * 5; do të ekzekutohet para veprimit të mbledhjes sepse përparësia e veprimit të shumëzimit është më e lartë se përparësia e veprimit të mbledhjes. Prioritetet e funksionimit (sipas uljes së prioritetit) në Java janë paraqitur në tabelë. një.
Kllapat rrisin përparësinë e operacioneve që janë brenda tyre. Pra, nëse futni kllapa në shprehjen e mësipërme: y = (x + z) * 5; atëherë fillimisht do të kryhet veprimi i mbledhjes dhe më pas operacioni i shumëzimit. Ndonjëherë kllapat përdoren thjesht për ta bërë shprehjen më të lexueshme, për shembull: (x> 1) && (x<= 5 ) ;

Konvertimi i llojit dhe derdhja gjatë kryerjes së operacioneve

Në caktimet dhe shprehjet aritmetike mund të përdoren fjalë për fjalë, variabla dhe shprehje të llojeve të ndryshme, p.sh.: double y; bajt x; y = x + 5; Ky shembull shton variablin bajt x në 5 (int), dhe ia cakton rezultatin ndryshores së dyfishtë y. Në Java, si në gjuhën C, konvertimet e tipit në vlerësimin e shprehjeve mund të kryhen automatikisht, ose duke përdorur një operator cast. Megjithatë, rregullat e hedhjes janë disi të ndryshme nga ato të gjuhës C dhe në përgjithësi janë më strikte se në gjuhën C. Kur kryeni një operacion caktimi, konvertimi i tipit ndodh automatikisht nëse transformimi i zgjeruar(konvertimi i zgjerimit) dhe të dy llojet janë të pajtueshme... Transformimet zgjeruese janë transformime bajt® shkurt® ndër® gjatë® noton® dyfishtë... Për zgjerimin e konvertimeve, llojet numerike, duke përfshirë numrin e plotë dhe pikën lundruese, janë të pajtueshme me njëri-tjetrin. Megjithatë, llojet numerike nuk janë të pajtueshme me llojet char dhe boolean. Llojet char dhe boolean nuk janë as në përputhje me njëri-tjetrin. Java gjithashtu kryen konvertimin automatik të tipit kur ruan një konstante të numrit të plotë literal (e cila është e tipit int si parazgjedhje) në variabla të tipit bajt, të shkurtër ose të gjatë (megjithatë, nëse literali ka një vlerë jashtë gamës së vlerave të vlefshme për këtë lloji, shfaqet një mesazh gabimi: humbje e mundshme e saktësisë). Nëse konvertimi është një konvertim ngushtues, d.m.th., po kryhet byte ¬ i shkurtër ¬ char ¬ int ¬ i gjatë ¬ ¬ ¬ dyfish, atëherë një konvertim i tillë mund të rezultojë në humbje të saktësisë ose shtrembërim të numrit. Prandaj, me ngushtimin e konvertimeve, kur programi kompilohet, shfaqet një mesazh diagnostikues për papajtueshmërinë e tipit dhe skedarët e klasës nuk krijohen. Ky mesazh do të shfaqet gjithashtu kur përpiqeni të konvertoni shprehjet e tipit byte ose short në një variabël të tipit char. Nëse megjithatë është e nevojshme të kryhen konvertime të tilla, përdoret një operacion cast, i cili ka formatin e mëposhtëm: ( lloji i konvertimit) kuptimi, ku lloji i konvertimit përcakton llojin në të cilin duhet të konvertohet e dhëna kuptimi, për shembull, si rezultat i ekzekutimit të operatorëve: bajt x = 71; simboli char = (char) x; ndryshorja e simbolit do të vendoset në "G". Nëse një vlerë me pikë lundruese i caktohet një lloji të plotë, atëherë (nëse vlera e pikës lundruese ka një pjesë të pjesshme), ndodh gjithashtu një konvertim i qartë i tipit cungim(prerje) numrat. Pra, si rezultat i ekzekutimit të operatorit int x = (int) 77.85; ndryshorja x do të vendoset në 77. Nëse vlera e caktuar është jashtë kufijve konvertimet e tipit , atëherë rezultati i konvertimit do të jetë pjesa e mbetur e pjesëtimit të vlerës me modulin e diapazonit të llojit të caktuar (për numrat e tipit bajt, moduli i diapazonit do të jetë 256, shkurt - 65536, për int - 4294967296 , dhe për një kohë të gjatë - 18446744073709551616). Për shembull, si rezultat i deklaratës byte x = (byte) 514; ndryshorja x do të vendoset në 2. Kur konvertoni numra të plotë ose numra realë në të dhëna të tipit char, konvertimi në një karakter ndodh nëse numri origjinal është në intervalin nga 0 në 127, përndryshe karakteri merr vlerën "?". Kur kryeni konvertime aritmetike dhe bit, të gjitha vlerat e bajtit dhe të shkurtër, si dhe char, zgjerohen në int, (ndërsa vlera numerike e kodit të karakterit përdoret në llogaritjet për char) atëherë, nëse të paktën një operand është i llojit të gjatë , lloji i shprehjes së numrit të plotë zgjerohet në të gjatë. Nëse njëri prej operandëve është i tipit float, atëherë lloji i shprehjes së plotë zgjerohet në float, dhe nëse njëri prej operandëve është i tipit double, atëherë lloji i rezultatit do të jetë i dyfishtë. Pra, nëse variablat deklarohen bajt a, c; i shkurtër b; atëherë në shprehjen a + b * c - 15 L + 1,5F + 1,08 - 10; së pari, përpara se të llogaritet a + b * c, vlerat e variablave do të zgjerohen në int, më pas, meqenëse konstantja 15 është e llojit të gjatë, rezultati i llogaritjes do të rritet në shumë kohë përpara zbritjes. Pas kësaj, duke qenë se literali 1.5 është i tipit float, rezultati i llogaritjes së a + b * c - 15L do të zgjerohet në float përpara se të shtohet në këtë literal. Përpara se të kryeni mbledhjen me numrin 1.08, rezultati i llogaritjeve të mëparshme do të zgjerohet në dyfish (pasi konstantat reale janë të tipit double si parazgjedhje) dhe, së fundi, përpara se të kryeni mbledhjen e fundit, do të jetë literal 10 (int si parazgjedhje). zgjeruar në dyfish. Kështu, rezultati i vlerësimit të shprehjes do të jetë i tipit double. Shtesat automatike të tipit (veçanërisht shtesat e shkurtra dhe bajt në int) mund të shkaktojnë gabime të njohura keq në kohën e përpilimit. Për shembull, në operatorët: bajt x = 30, y = 5; x = x + y; përpara se të kryhet mbledhja, vlera e variablave x dhe y do të zgjerohet në int dhe më pas do të shfaqet një mesazh gabimi kur tentohet të caktohet rezultati i një llogaritjeje të tipit int në një variabël të tipit byte. Për të shmangur këtë është e nevojshme të përdoret një konvertim i qartë i tipit në operatorin e dytë: x = (byte) (x + y); Ju duhet të vendosni shprehjen x + y në kllapa sepse përparësia e castit të mbyllur në kllapa është më e lartë se përparësia e veprimit të mbledhjes. Meqë ra fjala, nëse e shkruani operatorin e dytë si: x + = y; nuk do të ketë mesazh gabimi. Lidhja me të parën

Le të kuptojmë një nga qasjet për futjen e të dhënave nga rrjedha standarde përmes një klase java.util.Skaner... Le ta bëjmë këtë duke përdorur shembullin e një detyre të thjeshtë nga faqja shumë e dobishme e-olimp.com

Detyrë

Fut një numër nga transmetimi standard. Duke supozuar se ky është një numër i plotë dyshifror pozitiv, printoni secilën shifër veç e veç (të ndarë me një hapësirë) në rrjedhën standarde të daljes. Rendi i numrave nuk duhet ndryshuar.

Testet

Asnjë rast specifik nuk supozohet në algoritëm. Ne bëjmë tre teste - numrin më të vogël të diapazonit të vlefshëm, më të madhin dhe disa vlera nga mesi i diapazonit.

hyrje Dilni
10 1 0
99 9 9
54 5 4

Zgjidhje

Le të përdorim klasën java.util.Skaner, për të futur të dhëna në format të plotë. Dhe le të llogarisim të dy numrat e tij.

Shfaqja e shifrave të një numri të plotë dyshifror

Java

klasa Main (publike statike void main (String args) hedh java.lang.Exception (java.util.Scanner i = new java.util.Scanner (System.in); int n = i.nextInt (); System.out. println (n / 10 + "" + n% 10);))

Klasa kryesore (

public static void main (String args) hedh java. gjuha. përjashtim (

java. dobi. Skaneri i = java e re. dobi. Skaner (System. In);

int n = i. NextInt ();

Sistemi. jashtë. println (n / 10 + "" + n% 10);

Shpjegimet

  1. Ne përshkruajmë variablin i lloji java.util.Skaner dhe menjëherë caktojeni vlerën e një objekti të ri të kësaj klase. Konstruktori bën objektin Skaner‘Por nga stdin. ato. i bëhet një shtesë e hyrjes standarde. Kjo na lejon të lexojmë një numër të plotë dhe jo vetëm ta lexojmë atë me metodën lexoni() një bajt në një kohë.
  2. Duke përdorur metodën NextInt() lexoni një sekuencë numrash dhe kthejeni atë në një numër të plotë. Ne e ruajmë numrin në variablin n.
  3. n/ 10 - numri i dhjetësheve në numër. Dhjetrat do të jenë dhjetë herë më pak se vetë numri. Kryhet ndarja e numrave të plotë - ndarja e numrave të plotë.
  4. n% 10 - llogaritni pjesën e mbetur të pjesëtimit me dhjetë - numrin e njësheve - shifrën më të djathtë të numrit.
  5. n/ 10 + "" + n% 10 - futni një vijë të vetme hapësinore midis dy numrave të plotë. Në këtë rast, numrat konvertohen gjithashtu në paraqitjen e vargut dhe të tre vargjet janë të lidhura - që quhet bashkim i vargut. Kështu funksionon operacioni "+" me të dhënat e vargut.

Përshpejtoni I/O

Me gjithë komoditetin e kësaj qasjeje, ajo është mjaft e ngadaltë dhe ndonjëherë detyrat nuk funksionojnë në kohë. Mund ta përshpejtoni ndjeshëm punën duke përdorur StreamTokenizer dhe PrintWriter.
Kjo do të rrisë sasinë e kodit, por do të kursejë kohë.

Përshpejtimi I/O

Java

import java.io *; import java.util.*; klasa Main (static StreamTokenizer in = StreamTokenizer i ri (i ri BufferedReader (i ri InputStreamReader (System.in))); static PrintWriter out = New PrintWriter (System.out); static int nextInt () hedh IOException (in.nextToken (in.nextToken); (int) in.nval;) boshllëku publik statik kryesor (String args) hedh java.lang.Exception (int n = nextInt (); out.println (n / 10 + "" + n% 10); out.flush ( )))

import java. io. *;

import java. dobi. *;

Klasa kryesore (

static StreamTokenizer në = StreamTokenizer i ri (i ri BufferedReader (i ri InputStreamReader (Sistemi. në)));

static PrintWriter out = printWriter i ri (System. out);

static int nextInt () hedh IOException (


Studimi si "Zhvillues i Lojërave" + punësim

Operatorët Java

Gjuha Java përdor operatorët e zakonshëm + - * / aritmetikë për të treguar mbledhjen, zbritjen, shumëzimin dhe ndarjen.

Operatori / tregon ndarjen e numrave të plotë nëse të dy argumentet e tij janë numra të plotë. Përndryshe, ky operator tregon ndarjen me pikë lundruese. Pjesa e mbetur e ndarjes së numrave të plotë (d.m.th., funksioni mod) shënohet me simbolin%.
Për shembull, 15/2 është 7, 15% 2 është 1 dhe 15. 0/2 është 7. 5.

Vini re se pjesëtimi i numrave të plotë me 0 bën një përjashtim, ndërsa pjesëtimi me 0 i numrave me pikë lundruese rezulton në pafundësi ose NaN.

Operatorët aritmetikë mund të përdoren për të inicializuar variablat.

int n = 5;
int a = 2 *n; // Vlera e ndryshores a është 10.

Është i përshtatshëm për të përdorur operatorët binar aritmetikë stenografi në operatorët e caktimit.

Për shembull, operatori
x + = 4;
ekuivalente me operatorin
x = x + 4;

(Operatorët e shkurtuar të caktimit krijohen duke vendosur parashtesa të një karakteri operacioni aritmetik, si * ose%, përpara karakterit =, si * = ose% =.)

Një nga qëllimet e deklaruara të gjuhës Java është pavarësia e makinës.

Llogaritjet duhet të çojnë në të njëjtin rezultat, pavarësisht se cila makinë virtuale i drejton ato. Për aritmetikën me pikë lundruese, kjo është çuditërisht e vështirë. Lloji i dyfishtë përdor 64 bit për të ruajtur vlerat numerike, por disa procesorë përdorin regjistra me pikë lundruese 80-bitësh. Këta regjistra ofrojnë saktësi shtesë në fazat e ndërmjetme të llogaritjes. Le të marrim shprehjen e mëposhtme si shembull:

dyfishi w = x * y / z;

Shumë procesorë Intel vlerësojnë shprehjen x * y dhe e ruajnë këtë rezultat të ndërmjetëm në një regjistër 80-bit, më pas e ndajnë atë me vlerën e ndryshores z dhe e rrumbullakosin përgjigjen në 64 bit në fund. Kjo mund të përmirësojë saktësinë e llogaritjeve dhe të shmangë tejmbushjet. Megjithatë, ky rezultat mund të jetë i ndryshëm nëse një procesor 64-bit përdoret në të gjitha llogaritjet.

Për këtë arsye, specifikimi origjinal i Makinës Virtuale Java deklaroi se të gjitha llogaritjet e ndërmjetme duhet të rrumbullakosen. Kjo zemëroi komunitetin e informatikës. Nuk janë vetëm llogaritjet e rrumbullakosura që mund të shkaktojnë tejmbushje. Në fakt, ato janë më të ngadalta se llogaritjet më të sakta, sepse operacionet e rrumbullakosjes kërkojnë një kohë të caktuar. Si rezultat, zhvilluesit e gjuhës Java ndryshuan mendje, duke kërkuar të zgjidhin konfliktin midis performancës optimale dhe riprodhueshmërisë së shkëlqyer të rezultateve.

Si parazgjedhje, zhvilluesit e makinave virtuale tani lejojnë saktësi të zgjeruar në llogaritjet e ndërmjetme. Megjithatë, metodat e shënuara me fjalën kyçe striktefp duhet të përdorin operacione të sakta me pikë lundruese për të siguruar rezultate të riprodhueshme. Për shembull, metoda kryesore mund të etiketohet me fjalë kyçe siç tregohet më poshtë:
publike statike striktefp void kryesore (args varg)

Në këtë rast, të gjitha komandat brenda metodës kryesore do të kryejnë operacione të sakta në numrat me pikë lundruese.

Detajet e këtyre operacioneve janë të lidhura ngushtë me mënyrën se si funksionojnë procesorët Intel. Si parazgjedhje, rezultatet e ndërmjetme mund të përdorin metrikën e zgjeruar, por jo mantisën e zgjeruar. (Cip-et e Intel mbështesin rrumbullakimin e mantisës pa sakrifikuar performancën.) Prandaj, ndryshimi i vetëm midis llogaritjes së paracaktuar dhe llogaritjes së saktë është se llogaritja e saktë mund të tejmbushet, ndërsa llogaritja e paracaktuar jo.

Nëse vështrimi juaj zbehet gjatë leximit të këtij shënimi, mos u shqetësoni. Për shumicën e programuesve, kjo pyetje është krejtësisht e parëndësishme. Vërshimet me pikë lundruese nuk ndodhin në shumicën e rasteve. Ne nuk do të përdorim fjalën kyçe striktefp në këtë libër.

Operatorët e rritjes dhe zvogëlimit

Programuesit, natyrisht, e dinë se një nga veprimet më të zakonshme në variablat numerike është shtimi ose zbritja e një. Në gjuhën Java, si në gjuhët C dhe C ++, ekzistojnë operatorë të rritjes dhe zvogëlimit: operatori x ++ shton një në vlerën aktuale të ndryshores x dhe operatori x zbret një prej saj.

Për shembull kodin
int n = 12;
n ++;
e bën vlerën e ndryshores n të barabartë me 13.

Për shkak se këta operatorë ndryshojnë vlerën e një ndryshoreje, ata nuk mund të aplikohen për vetë numrat. Për shembull, operatori 4 ++ nuk është i vlefshëm.

Ekzistojnë dy lloje të këtyre operatorëve. Më sipër tregon formën "postfix" të operatorit, në të cilën karakteret e operatorit vendosen pas operandit. Ekziston edhe një formë "prefiksi" - ++ n.
Të dy këta operatorë rrisin vlerën e ndryshores me një. Dallimi midis të dyve shfaqet vetëm kur këta operatorë përdoren brenda shprehjeve. Forma e prefiksit të operatorit të rritjes së pari shton një në vlerën e një ndryshoreje, ndërsa forma e postfiksit përdor vlerën e vjetër të asaj ndryshore.

int m = 7;
int n = 7;
int a = 2 * ++ m; // Tani a është 16 dhe m është 8.
int b = 2 * n ++; // Tani b është 14 dhe n është 8.

(Meqenëse ishte operatori ++ që i dha emrin gjuhës C ++, kjo ishte arsyeja e shakasë së parë me të. Dashamirësit theksojnë se edhe emri i kësaj gjuhe përmban një gabim: "Ndër të tjera , kjo gjuhë duhet të quhet ++ C, sepse ne duam ta përdorim këtë gjuhë vetëm pasi ta përmirësojmë. ")

1. Veprimet themelore aritmetike

Tabela e mëposhtme liston veprimet bazë aritmetike të përdorura në gjuhën Java:

Le të shqyrtojmë disa rregulla për të punuar me veprime aritmetike:

  • Shprehjet vlerësohen nga e majta në të djathtë, përveç nëse shtohen kllapa ose disa veprime kanë përparësi.
  • Operacionet *, /, dhe% kanë përparësi mbi + dhe -.

Shembulli 1. Veprimet aritmetike mbi vlerat e plota

Për shembull, në këtë kod, variablat a dhe b do të ketë kuptime të ndryshme:

Klasa publike BasicIntMath (kryesor publik statik i zbrazët (args me vargje) (int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println ("a =" + a) ; System.out.println ("b = + b);))

Rezultati i ekzekutimit:

A = 3 b = 13

  • Operacioni unar i zbritjes ndryshon shenjën e operandit të tij të vetëm.
  • Një operacion i mbledhjes unare thjesht kthen vlerën e operandit të tij. Në parim, nuk është e nevojshme, por e mundur.

Shembulli 2. Veprimet unare të mbledhjes dhe zbritjes

klasa publike UnarySignOperation (kryesor publik statik i zbrazët (args varg) (double a = -6; dyfishtë b = +6; System.out.println (a); System.out.println (b);))
  • Kur një operacion ndarjeje kryhet në një lloj të dhënash me numër të plotë, rezultati nuk do të përmbajë një komponent të pjesshëm.

Shembulli 3. Ndarja e numrave të plotë

klasa publike IntDivision (kryesor publik statik i zbrazët (args varg) (int a = 16/5; System.out.println (a);))

Rezultati i ekzekutimit të këtij programi:

  • Operandët për veprimet aritmetike duhet të jenë të tipit numerik. Veprimet aritmetike nuk mund të kryhen në llojet e të dhënave boolean, por mund të kryhen në llojet e të dhënave karakter pasi në Java ky lloj është në thelb një variacion i llojit ndër.

Shembulli 4. Veprimet aritmetike mbi variablat e tipit karakter

klasa publike BasicCharMath1 (kryesor publik statik i zbrazët (args me varg) (char c = "n"; System.out.println (c); System.out.println (c + 1); System.out.println (c / 5) ;))

Rezultati i ekzekutimit:

N 111 22

Shembulli 5. Veprimet aritmetike mbi variablat e tipit karakter

klasa publike BasicCharMath2 (kryesor publik statik i zbrazët (args me varg) (char c1 = "1"; char c2 = "\ u0031"; char c3 = 49; System.out.println (c1 + c2 + c3);))

Rezultati i ekzekutimit:

    Operatori i modulit - shënohet me%. Ky operator kthen pjesën e mbetur të numrit të parë të pjesëtuar me të dytin. Kur ndahet një numër i plotë, rezultati është gjithashtu një numër i plotë.

Shembulli 6. Ndarja e modulit

klasa publike DivisionByModule (kryesor publik statik i zbrazët (args varg) (int a = 6% 5; double b = 6.2% 5.0; System.out.println (a); System.out.println (b);))

Rezultati i ekzekutimit:

1 1.2000000000000002

2. Veprime aritmetike të përbëra me detyrë

Java ka operacione speciale që kombinojnë aritmetikën me caktimin. Merrni parasysh shprehjen e mëposhtme:

A = a + 4;

Në Java, ky operacion mund të shkruhet si më poshtë:

A + = 4;

Operacionet e caktimit të përbërë jo vetëm që ju lejojnë të zvogëloni sasinë e kodit, por gjithashtu ju lejojnë të kryeni konvertim automatik, gjë që nuk bëhet nga operacionet konvencionale.

Shembulli 5. Veprimet e caktimit aritmetik të përbërë

Klasa publike CompoundOperations (klasa publike e zbrazëtisë statike kryesore (args me vargje) (int a = 1; int b = 2; int c = 3; a + = 3; b * = 2; c + = a * b; System.out.println (a); System.out.println (b); System.out.println (c);))

Artikujt kryesorë të lidhur