Problém z programom – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém z programom – Java – Fórum – Programujte.comProblém z programom – Java – Fórum – Programujte.com

 

Tobinnek0
Duch
9. 12. 2013   #1
-
0
-

Zdravím,  učím se programovat z knihy Java 7 výukový kurz a nastal problém , s ktorím si neviem rady.

Týka sa to jedného programu v knihe (str.80/81).

 

Zadanie : V tomto projektu vytvoříte program, který zobrazí pravdivostní tabulku pro logické
operátory jazyka Java. Sloupce v tabulce musíte zarovnat. Tento projekt využívá
několik rysů probíraných v této kapitole, včetně řídicích sekvencí a logických operátorů
Javy. Kromě toho ilustruje rozdíly v prioritě mezi aritmetickým operátorem +
a logickými operátory.

Kód:
class TabulkaLogickeOp {
   public static void main(String args[]) {
      boolean p, q;


      System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");


      p = true; q = true;
      System.out.print(p + "\t" + q +"\t");
      System.out.print((p&q) + "\t" + (plq) + "\t");
      System.out.println((pAq) + "\t" + (!p));


      p = true; q = false;
      System.out.print(p + "\t" + q +"\t");
      System.out.print((p&q) + "\t" + (piq) + "\t");
      System.out.println((pAq) + "\t" + (!p));


      p = false; q = true;
      System.out.print(p + "\t" + q +"\t");
      System.out.print((p&q) + "\t" + (plq) + "\t");
      System.out.println((pAq) + "\t" + (!p));


      p = false; q = false;
      System.out.print(p + "\t" + q +"\t");
      System.out.print((p&q) + "\t" + (plq) + "\t");
      System.out.println((pAq) + "\t" + (!p));

   }   

}

Zkompilovaný  program:

p         Q         AND       OR        XOR        NOT

true     true     true        true       false        false

true     false    false      true       true          false

false    true     false      true       true          true

false    false    false      false     false         true
 

Tento program mi fungoval bez problémov, ale jednou z daľších úloh bolo :

Zkuste program upravit tak, aby místo "true" a "false" zobrazoval jedničky
a nuly. To ovšem vyžaduje více úsilí, než se na první pohled může zdát!


Takto som upravil program:
 

public class priklad {
    public static void main(String args[]) {
        int p, q, a, b, c, d ;
        
        System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");
        
        
        p = 1; q = 1;
        a = (int) (p&q);
        b = (int) (p^q);
        c = (int) (p|q);
        d = (int) (!p);
        
        
        
        System.out.print(p + "\t" + q + "\t");
        System.out.print(a + "\t" + c + "\t");
        System.out.println(b + "\t" + d + "\t");
        
        
        p = 0; q = 1;
        a = (int) (p&q);
        b = (int) (p^q);
        c = (int) (p|q);
        d = (int) (!p);
       
        
        System.out.print(p + "\t" + q + "\t");
        System.out.print(a + "\t" + c + "\t");
        System.out.println(b + "\t" + d + "\t");
     
        
        p = 1; q = 0;
        a = (int) (p&q);
        b = (int) (p^q);
        c = (int) (p|q);
        d = (int) (!p);
       
        
        System.out.print(p + "\t" + q + "\t");
        System.out.print(a + "\t" + c + "\t");
        System.out.println(b + "\t" + d + "\t");
       
       
        
        p = 0; q = 0;
        a = (int) (p&q);
        b = (int) (p^q);
        c = (int) (p|q);
        d = (int) (!p);
        
        System.out.print(p + "\t" + q +"\t");
        System.out.print(a + "\t" + c + "\t");
        System.out.println(b + "\t" + d + "\t");
      
       
        
    }

}

A tu sa konečne dostávam k  problému celý kód mi funguje až na : "d = (int) (!p);"  to mi ukazuje chybu  a netuším ako to mam vyriešiť.

Takto vyzerá zkompilovaný program bez "d = (int) (!p);"

P    Q    AND    OR    XOR    NOT
1     1    1         1       0    
0     1    0         1       1    
1     0    0         1       1    
0     0    0         0       0   

Nahlásit jako SPAM
IP: 80.78.151.–
sleepy
~ Anonymní uživatel
422 příspěvků
9. 12. 2013   #2
-
0
-

No v jave take nieco ako negacie integeru nieje. Vtipom je ze si vlastne vobec neriesil zadanie knihy, ale nieco troska ine a preto ti to nefunguje. Ty totizto pouzivas bitewise operatory, ktore funguju na cislach dokonca pre 1 a 0 budes dostavat hodnoty ako pre true a flase. Bohuzial negacie nieje definovana, ako bitewise operator, ani by to nemalo zmysel. Cize riesenie tvojho problemu, nebude preist na int (cele cisla), ale zostat pri booleane a pri vypisovani, ak bude hodnota true napises 1 a ak false napises 0. Tu je ukazka toho ako sa to da opravit:  

boolean d = !p;
... // tu je tvoj kod
System.out.println((b?"1":"0") + "\t" + (d?"1":"0")); // alebo ak uz vies ako funguju polia

System.out.println("P\tQ\tAND\tOR\tXOR\tNOT");
boolean[] res = new boolean[6];
for(int i=0; i<4; i++) {
	res[0] = i%2==1?true:false; // toto pouzivam iba na generovanie cisel p a q
	res[1] = i/2==1?true:false; // skrateny zapis if(?) else(:)
	res[2] = res[0] && res[1];
	res[3] = res[0] || res[1];
	res[4] = res[0] ^ res[1];
	res[5] = ! res[0];
	for(int k=0; k<5; k++) {
		System.out.print(res[k]?"1":"0"+"\t");
	}
	System.out.println(res[5]?"1":"0");
}

// Este existuje jedna moznost s pouzitim celych cisel a to namiesto ! pouzit (p+1)%2 dava to ten isty vysledok

	
Nahlásit jako SPAM
IP: 147.175.177.–
Flowy0
Věrný člen
9. 12. 2013   #3
-
0
-

negacia 0 a 1 je XOR ku 1 ... negacia 0bxxxx je XOR 0b1111 atd ... a ma to zmysel ... minimalne jedno pouzitie je pri doplnkovom kode ale inak je to velmi pekna vlastnost binarnych cisel ktorou sa da dosiahnut zaujimave vysledky

Nahlásit jako SPAM
IP: 91.127.137.–
https://github.com/Flowy
sleepy
~ Anonymní uživatel
422 příspěvků
9. 12. 2013   #4
-
0
-

Ospravdlnujem sa, mozno som zaviedol svoju mylnu predstavu o doplnku. Je to tak ako pise Flowy. Ja som to ponimal skorej z tej matematickej stranky, teda ako doplnok (co by boli vsetky cisla okrem tebou zadaneho). A spravne pripomina takyto doplnkovy kod sa pouziva pri pocitany so znamienkom.

Nahlásit jako SPAM
IP: 147.175.177.–
Tobinnek0
Duch
9. 12. 2013   #5
-
0
-

#2 sleepy
Ďakujem za odpoveď. Ja som úplný začiatočník a z tvojho kódu toho chápem  len veľmi málo. Asi preto že som sa stím ešte nestretol v knihe a neviem ako odo mňa chceli aby som to prepísal, keďže z toho čo som doteraz prebral v knihe nerozumiem ani druhému riadku tvojho kódu . Aspoňže z textu chápem  prečo mi to nefunguje takže ešte raz ďakujem.

Nahlásit jako SPAM
IP: 80.78.151.–
Flowy0
Věrný člen
10. 12. 2013   #6
-
0
-

myslim ze cielom bolo to co napisal v kode na tretom riadku ... len to trochu zabalil

pouzil tam prvok volany ternarny operator ... je to taky zjednoduseny if (podmienka) {true_kod} else {false_kod} ... syntax je podmienka ? true_kod : false_kod cize v tomto pripade je podmienkou samotny boolean ktory ked je true tak vrati cislo 1 a ak false tak vrati 0

ak si este nemal ternary operator tak to mozes zapisat aj ako

int vysledok;
if (b)
	vysledok = 1;
else
	vysledok = 0;
System.out.println(vysledok);

ale je to dost zakerny autor ak pouzil pre porovnavanie booleanov binarne operatory a nie bezne logicke

&& - and

|| - or

... v tomto pripade je XOR trochu zlozitejsie ale je to len zlozenie and or a negacie - 

(X a nie Y) alebo (nie X a Y) - (X && !Y) || (!X && Y)

Nahlásit jako SPAM
IP: 91.127.137.–
https://github.com/Flowy
sleepy
~ Anonymní uživatel
422 příspěvků
10. 12. 2013   #7
-
0
-

Presne, logicke operatory je velmi dobre pouzivat s boolean-om. Tu to zatial mozno este nevidis, ale o nedlho sa dostanes po take kody kde referencia objektu moze ukazovat na null a ty to mas spracovat. Jednoducho logicke operatori neporovnavaju ked uz nemusia napr. ak p = false a q = ? a mas urobit p && q, tak q jednoducho uz nieje potrebne zistovat lebo nemeni vysledok. Ukazem konkretnejsie:

MyObject obj = ...
if(obj != null && obj.satsfiesCondition()) {
	process(obj);
}


Toto je priklad toho, kde to ma neskutocne vyuzitie, lebo ak obj = null tak neexistuje metoda stisfiessCondtion() a volanim by to hodilo NullPointerException a cela aplikacia by ti na tom mohla padnut. Lenze pouzitim toho logickeho operatora sa druha cast podmienky overovat uz nebude (netreba, nemeni to vysledok). Takze nemusis kod pisat takto: 

if(obj!=null) {
	if(obj.satisfiesCondition()) {
		process(obj)
	}
}


To iste plati aj pre or ak je prva cast rovna true druha sa nevykonava. Znova by sa dal uvist podobny priklad. Inak uz rozumies tomu, ako si to mal vyriesit? A uz vidis rozdiel medzi logickym a binarnym operatorom? Jednoducho vsetko je zapisane ako seria 1 a 0 napr. int je ich 32. Binarne opertaori su take, ze porovnanie sa deje na kazdom bite. Cize ak mas (cislo, znak, ...) zapisany v takomto tvare: 0xba_na_n-1 ...a_1a_0 a druhy operand podobne 0xb_nb_n-1...b_1,b_0 tak pre lubovolne c_k plati c_k = a_k (operator na danom bite) b_k, kde k = {0,1, ..., n}.

Nahlásit jako SPAM
IP: 147.175.177.–
Tobinnek0
Duch
10. 12. 2013   #8
-
0
-

#7 sleepy
No ja chápem aký je rozdiel medzi logickým a binárnym operátorom v kóde, ale to ako to funguje (možno teraz budem vyzerať ako idot ) v bitovom kóde je už mimo mňa.

Nahlásit jako SPAM
IP: 80.78.151.–
sleepy
~ Anonymní uživatel
422 příspěvků
10. 12. 2013   #9
-
0
-

Tak skusim priklad int 3 = 11 a int 9 = 1001 a pri binarnom operatore je to tak ze ides po bitoch. Cize 3 & 9 = 0011 & 1001 = 0001; 3^9 = 0011 ^ 1001 = 1010; 3|9 = 0011 | 1001 = 1011. Jednoducho pouzivas operator medzi k-timi bitmi. Pre boolean ktory reprezentuje len 0 a 1 (false a true) je len 1 bit (aj ked v jave sa uklada ako 8bit-ov, ale to teraz nieje dolezite). Logisky operator sa neda pouzit na cisla ale iba na booleane, dalo by sa povedat ze pracuje len s 1bitom a teda true a false.

Nahlásit jako SPAM
IP: 147.175.177.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Problém s programom — založil Kent

Problem s programom (C) — založil Cary

Problém s programom — založil Kent

Problém s programom — založil letsthrowq

Problem s programom — založil Daniel

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý