Gyakorlati alapok
Igazságtáblák
Ha már kezdünk belemelegedni nemcsak a számolásba, hanem a logikai döntésekbe is, akkor gyorsan implementáljuk a híres igazságtáblákat!
De előtte kis elmélet...
A számítógép nemcsak számolni, hanem dönteni is képes. Az utóbbi műveleteket úgynevezett logikai kapuk segítségével hajtja végre: ezek a processzorban fixen behuzalozott áramkörök, amelyek alapjában véve egyszerű felépítésűek, de mivel a logikai számításokhoz összekapcsolhatók, jóval bonyolultabb (logikai) eredményeket is szolgáltathatnak. Így összesen hétféle logikai kapu létezik, amelyek igazságtáblája is különböző, ezek:
(NOT) AND OR NAND NOR XOR XNOR
Az igazságtábla tehát a logikai kapuk összes lehetséges bemenetének összes lehetséges eredményét tartalmazza, egyfajta egyesített logikai eredménylista.
Az alábbiakban az igazságtáblákat fogjuk implementálni Java-nyelven. Ellenőrzésképpen mindig összevethetjük az igazságtábla aktuális értékeit a Java-végeredményekkel. Például logikai ÉS művelet (AND gate) esetén az igazságtábla értékei...
-
0 - 0 -> 0
-
1 - 0 -> 0
-
0 - 1 -> 0
-
1 - 1 -> 1
...ahol 0 = false, 1 = true logikai állapotot szimbolizálja. A Java-kód végeredménye:
FALSE AND FALSE -> false
TRUE AND FALSE -> false
FALSE AND TRUE -> false
TRUE AND TRUE -> true
Az értékek ugyanazok, az implementáció tehát helyes. A kódolás során kihasználjuk a System.out.println() metódus egyik rendkívül előnyös tulajdonságát, hiszen paraméterlistájában teljes logikai műveletek is végrehajthatók.
Ugyanakkor szakértők kifogásolhatják, hogy System.out.println() metódus mindig többször van meghívva ahelyett, hogy paraméterlistájának rendkívül rugalmas terhelhetőségét használnánk ki. A probléma részletes kifejtésre került a Formai különbségek kezdő és haladó kód között című fejezetben.
A luciferi tagadás logikai művelete. A fenti igazságtábla még nem tartalmazza valószínűleg azért, mert csak egyváltozós (egyoperandusú) művelet, míg a többi már kétváltozós-kétoperandusú. Java-szintaktikai eleme: !A.
-
0 -> 1
-
1 -> 0
public class Main {
public static void main(String[] args) {
System.out.println("NOT TRUE -> " + !true);
System.out.println("NOT FALSE -> " + !false);
}
}
Végeredmény:
NOT TRUE -> false
NOT FALSE -> true
Konkrét példa a valós életből: bármilyen állítás tagadása.
Logikai ÉS művelet. Java-szintaktikai eleme: A && B.
-
0 AND 0 -> 0
-
1 AND 0 -> 0
-
0 AND 1 -> 0
-
1 AND 1 -> 1
public class Main {
public static void main(String[] args) {
System.out.print("FALSE AND FALSE -> ");
System.out.print(false && false);
System.out.println();
System.out.print("TRUE AND FALSE -> ");
System.out.print(true && false);
System.out.println();
System.out.print("FALSE AND TRUE -> ");
System.out.print(false && true);
System.out.println();
System.out.print("TRUE AND TRUE -> ");
System.out.print(true && true);
}
}
Végeredmény:
FALSE AND FALSE -> false
TRUE AND FALSE -> false
FALSE AND TRUE -> false
TRUE AND TRUE -> true
Konkrét példa a valós életből: cipőt akarunk vásárolni, de 2 feltétellel:
csakis 43-as ÉS Adidas márkájú lehet.
Logikai VAGY művelet. Java-szintaktikai eleme: A || B.
-
0 OR 0 -> 0
-
1 OR 0 -> 1
-
0 OR 1 -> 1
-
1 OR 1 -> 1
public class Main {
public static void main(String[] args) {
System.out.print("FALSE OR FALSE -> ");
System.out.print(false || false);
System.out.println();
System.out.print("TRUE OR FALSE -> ");
System.out.print(true || false);
System.out.println();
System.out.print("FALSE OR TRUE -> ");
System.out.print(false || true);
System.out.println();
System.out.print("TRUE OR TRUE -> ");
System.out.print(true || true);
}
}
Végeredmény:
FALSE OR FALSE -> false
TRUE OR FALSE -> true
FALSE OR TRUE -> true
TRUE OR TRUE -> true
Konkrét példa a valós életből: lemegyünk a boltba, mert iszonyúan szeretjük a
csokit. Lehet Milka VAGY Kinder, mégis megvesszük.
Logikai NEM ÉS művelet. Java-szintaktikai eleme: !(A && B).
-
0 NAND 0 -> 1
-
1 NAND 0 -> 1
-
0 NAND 1 -> 1
-
1 NAND 1 -> 0
public class Main {
public static void main(String[] args) {
System.out.print("FALSE NAND FALSE -> ");
System.out.print(!(false && false));
System.out.println();
System.out.print("TRUE NAND FALSE -> ");
System.out.print(!(true && false));
System.out.println();
System.out.print("FALSE NAND TRUE -> ");
System.out.print(!(false && true));
System.out.println();
System.out.print("TRUE NAND TRUE -> ");
System.out.print(!(true && true));
}
}
Végeredmény:
FALSE NAND FALSE -> true
TRUE NAND FALSE -> true
FALSE NAND TRUE -> true
TRUE NAND TRUE -> false
Logikai NEM VAGY művelet. Java-szintaktikai eleme: !(A || B).
-
0 NOR 0 -> 1
-
1 NOR 0 -> 0
-
0 NOR 1 -> 0
-
1 NOR 1 -> 0
public class Main {
public static void main(String[] args) {
System.out.print("FALSE NOR FALSE -> ");
System.out.print(!(false || false));
System.out.println();
System.out.print("TRUE NOR FALSE -> ");
System.out.print(!(true || false));
System.out.println();
System.out.print("FALSE NOR TRUE -> ");
System.out.print(!(false || true));
System.out.println();
System.out.print("TRUE NOR TRUE -> ");
System.out.print(!(true || true));
}
}
Végeredmény:
FALSE NOR FALSE -> true
TRUE NOR FALSE -> false
FALSE NOR TRUE -> false
TRUE NOR TRUE -> false
Logikai KIZÁRÓ VAGY művelet. Java-szintaktikai eleme: A ^ B. Mivel matematikailag nézve ekkor a következő műveletet hajtjuk végre...
...ezért a (A || B) && !(A && B) művelettel helyettesíthető. Ezt külön kódban mutatjuk meg.
-
0 XOR 0 -> 0
-
1 XOR 0 -> 1
-
0 XOR 1 -> 1
-
1 XOR 1 -> 0
public class Main {
public static void main(String[] args) {
System.out.print("FALSE XOR FALSE -> ");
System.out.print(false ^ false);
System.out.println();
System.out.print("TRUE XOR FALSE -> ");
System.out.print(true ^ false);
System.out.println();
System.out.print("FALSE XOR TRUE -> ");
System.out.print(false ^ true);
System.out.println();
System.out.print("TRUE XOR TRUE -> ");
System.out.print(true ^ true);
}
}
public class Main {
public static void main(String[] args) {
System.out.print("FALSE XOR FALSE -> ");
System.out.print((false || false) && !(false && false));
System.out.println();
System.out.print("TRUE XOR FALSE -> ");
System.out.print((true || false) && !(true && false));
System.out.println();
System.out.print("FALSE XOR TRUE -> ");
System.out.print((false || true) && !(false && true));
System.out.println();
System.out.print("TRUE XOR TRUE -> ");
System.out.print((true || true) && !(true && true));
}
}
Végeredmény:
FALSE XOR FALSE -> false
TRUE XOR FALSE -> true
FALSE XOR TRUE -> true
TRUE XOR TRUE -> false
Konkrét példa a valós életből: a tea nem jó édesítés nélkül (FALSE XOR FALSE -> false),
ezért édesíthetjük cukorral is (TRUE XOR FALSE -> true),
mézzel is (TRUE XOR FALSE -> true). Ha viszont
mindkét dologgal édesítjük, az szintén rossz (TRUE XOR TRUE -> false).
Logikai KIZÁRÓ NEM VAGY művelet. Java-szintaktikai eleme: !(A ^ B). Mivel matematikailag nézve a fenti művelet negáltja, ezért a !(XOR), azaz a...
!((A || B) && !(A && B)))
...művelettel helyettesíthető. Ezt külön kódban mutatjuk meg.
-
0 XNOR 0 -> 1
-
1 XNOR 0 -> 0
-
0 XNOR 1 -> 0
-
1 XNOR 1 -> 1
public class Main {
public static void main(String[] args) {
System.out.print("FALSE XNOR FALSE -> ");
System.out.print(!(false ^ false));
System.out.println();
System.out.print("TRUE XNOR FALSE -> ");
System.out.print(!(true ^ false));
System.out.println();
System.out.print("FALSE XNOR TRUE -> ");
System.out.print(!(false ^ true));
System.out.println();
System.out.print("TRUE XNOR TRUE -> ");
System.out.print(!(true ^ true));
}
}
public class Main {
public static void main(String[] args) {
System.out.print("FALSE XNOR FALSE -> ");
System.out.print(!((false || false) && !(false && false)));
System.out.println();
System.out.print("TRUE XNOR FALSE -> ");
System.out.print(!((true || false) && !(true && false)));
System.out.println();
System.out.print("FALSE XNOR TRUE -> ");
System.out.print(!((false || true) && !(false && true)));
System.out.println();
System.out.print("TRUE XNOR TRUE -> ");
System.out.print(!((true || true) && !(true && true)));
}
}
Végeredmény:
FALSE XNOR FALSE -> true
TRUE XNOR FALSE -> false
FALSE XNOR TRUE -> false
TRUE XNOR TRUE -> true