# Operatori Logici (superiori)
## Gli operatori Logici

Quando si devono scrivere delle condizioni logiche possiamo usare gli operatori di confronto <,<=,>,>=,==,!= per poter però costruire delle condizioni logiche più complesse dobbiamo usare gli operatori logici AND,OR,NOT.
Pensiamo alla situazione di dover trovare un fidanzato, Maria dice io voglio un fidanzato bello, Elena interviene e dice io voglio un fidanzato bello ma anche intelligente, Mattia dice invece io la fidanzata la voglio carina o simpatica ( mi va bene anche se è carina e simpatica contemporaneamente, e i compagni ridono), Luca dice io la fidanzata non la voglio bassa perché io sono alto un metro e 90, Francesco che interviene per ultimo dice io la voglio bella ricca e famosa e Stefano ribatte dicendo guarda che Belen è già impegnata con me.
Ora se analizziamo le singole condizioni troviamo che
* per Maria deve essere aspetto == bello
* per Elena deve essere aspetto == bello e contemporaneamente cervello == intelligente
* per Luca non deve essere bassa cioè non statura==bassa
* per Mattia deve essere aspetto == carina oppure carattere=simpatica, in questo caso l'oppure è da intendersi come carina e/o simpatica
* per Francesco deve essere aspetto == carina e contemporaneamente statosociale == ricca e contemporaneamente popolarità== famosa
Ora queste condizioni risultano più complesse perché date dall'unione di più condizioni logiche o dalla negazione di una condizione logica. L'operatore AND serve per congiungere più condizioni logiche fra loro, imponendo che tutte siano verificate perché la condizione complessiva sia verificata.
L'operatore OR serve per disgiungere più condizioni logiche fra loro, imponendo che basta che una delle condizioni sia verificata perché la condizione complessiva sia verificata.
L'operatore NOT serve per negare una condizione, la condizione negata ribalta la condizione di partenza (se è true diventa false e viceversa)
Proviamo quindi a scrivere le condizioni per trovare la fidanzata usando questi nuovi operatori , L'AND nel C ha come simbolo il && l'OR ha come simbolo || e il NOT ha come simbolo il ! .
* per Maria visto che c'è una sola condizione basta scrivere (aspetto=="bello")
* per Elena visto che ci sono 2 condizioni che devono essere verificate contemporaneamente uso l'operatore di congiunzione , e ho (aspetto=="bello") && (cervello=="intelligente")
* per Luca la condizione è singola e negata allora ho !(statura=="bassa")
* per Mattai le condizioni sono 2 ma basta che una sola delle 2 sia verificata perché la condizione complessiva sia accettata (vera) allora ho (aspetto=="carina") || (carattere=="simpatica")
* per Francesco le condizioni sono 3 e si vuole che tutte siano vere , allora scrivo (aspetto="carina") && (statosociale=="ricca") && (popolarità=="famosa")
Mentre per un informatico un valore booleano è un valore true/false cioè vero o falso per un elettronico un valore booleano è 0/1 zero rappresenta assenza di tensione/corrente e uno rappresenta presenza di tensione/corrente nel circuito, e per esprimere il comportamento degli operatori AND OR e NOT si utilizzano delle tabelle dette tabelle di verità, vediamole
il simbolo A rappresenta la prima condizione e il simbolo B la seconda condizione
Vediamo la tabella di verità del AND il cui simbolo nel C è &&
l'operatore && è binario cioè lavora su due operandi (le espressioni logiche A e B)
| A | B | A&&B |
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
nelle prime 2 colonne si sono scritte tutte le possibili condizioni che possono capitare, si nota che perché sia verificata la condizione complessiva A&&B bisogna che entrambe le condizioni A e B siano verificate, o detto in modo diverso basta che una delle due sia falsa perché la condizione complessiva sia false.Quando c'è da valutare 2 o più condizioni unite fra loro dall'operatore && (AND) il C si ferma alla prima delle condizioni che trova falsa , senza valutare le successive. Qualche volta si congiungono anche più di 2 condizioni con l'operatore &&, si parla allora di AND multiplo e visto che basta che una condizione sia falsa perché la condizione complessiva sia falsa, se devo calcolare A && B && C && D il linguaggio C procede in questo modo : guarda prima A se questa risulta falsa non valuta le condizioni successive perché sa già che il risultato complessivo sarà falso, se invece A è vero non può ancora stabilire il risultato complessivo e deve andare a valutare anche la condizione B e se questa è vera anche la condizione successiva C e così via.Nel caso quindi di and multiplo il C si ferma alla prima condizione falsa che trova non valutando quelle successive . Questo risulta utile se dobbiamo verificare se n/m sia maggiore di 5, la divisione n/m è calcolabile infatti solo se m è diverso da zero e allora io scrivo (m!=0)&&(n/m>5) perché per poter dividere per m devo prima assicurami che sia diverso da zero, se lo fosse non voglio calcolare n/m perché l'operazione non è possibile e se eseguita produce un errore Division By zero che comporta l'immediata interruzione del programma.
Vediamo la tabella di verità del OR il cui simbolo nel C è ||
l'operatore || è binario cioè lavora su due operandi (le espressioni logiche A e B)
| A | B | A||B |
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
nelle prime 2 colonne si sono scritte tutte le possibili condizioni che possono capitare, si nota che perché sia verificata la condizione complessiva A||B basta che almeno una delle conzioni sia verificata perché sia la condizione complessiva true, e viceversa bisogna che tutte le condizioni siano false perché la condizione complessiva sia falsa.
Vediamo la tabella di verità del NOT il cui simbolo nel C è !
l'operatore ! è unario cioè lavora su un solo operando (le espressione logica A)
| A | !A |
| true | false |
| false | true |
L'operatore ! (NOT) inverte la condizione logica cioè la nega, si può scrivere la stessa condizione in modi diversi ad esempio la condizione la fidanzata deve essere alta la posso anche scrivere come la fidanzata non deve essere bassa , state attenti generalmente che è preferibile la prima espressione perché più chiara. Tutti i circuiti elettronici al loro interno contengono migliaia di componenti detti porte logiche che individualmente realizzano la funzione AND, OR, NOT. Gli elettronici studiano una particolare matematica detta algebra di Bool (L'inventore della notazione e delle sue proprietà) che permette data una funzione (con variabili di tipo binario) di trovarne l'equivalente circuitale mediante port AND, porte OR e porte NOT Gli elettronici che per rappresentare il valore true usano il numero binario 1 e per rappresentare false usano lo 0, pensano all'and come a un prodotto e pensano all'or come a una addizione (binaria). Le tabelle AND OR NOT le potete trovare anche nei libri di elettronica scritte nella seguente forma:
| Porta AND | Porta OR | Testo del titolo |
| Porta AND | Porta OR | Porta NOT |
| A B A AND B 1 1 1 1 0 0 0 1 0 0 0 0 | A B A OR B 1 1 1 1 0 1 0 1 1 0 0 0 | A NOT A 0 1 1 0 |
* Pensiamo ora alla matematica spesso si vuole verificare se un numero appartiene o meno a un certo intervallo,
* Punto interno a un intervallo , punto esterno a un intervallo
* ad esempio scrivendo $x\in [a,b[$ si intende che il punto x appartiene all'intervallo $[a,b[$ dove il punto a appartiene all'intervallo e b invece ne è escluso , scritto in altra forma $a\leqslant x<b$
* Se la condizione fosse $2\leqslant x<7$ allora la condizione è composta da due condizioni che devono valere contemporaneamente, si deve allora usare l'operatore di congiunzione (2<=x)&&(x<7)
* Se mi interessa sapere se il punto non è nell'intervallo $[2,7[$ allora la condizione è quella opposta a quella precedentemente scritta cioè devo negare la condizione opposta cioè !((2<=x)&&(x<7))
* Un punto che non è nell'intervallo $[2,7[$ è un punto esterno allo stesso cioè o è nell'intervallo $]-\infty ,2[$ oppure nell'intervallo $[7,+\infty [$, ma basta che una delle due sia verificata e la condizione diventa allora $(x<2)||(x>=7)$