Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Introduzione agli Algoritmi: Operatori Logici e Condizionali - Prof. Caputo, Appunti di Fondamenti di informatica

Il documento contiene: Gli Algoritmi; Diagramma di flusso degli algoritmi; Istruzioni condizionali e Istruzioni iterative (cicli); Operatori relazionali e Operatori logici.

Tipologia: Appunti

2021/2022

Caricato il 27/03/2023

me_
me_ 🇮🇹

4.4

(11)

64 documenti

1 / 9

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
GLI ALGORITMI
Un altro esempio
oProdotto tra due numeri x e y per somme ripetute
5. Leggere il numero nella variabile x
6. Leggere il numero nella variabile y
7. Assegnare il valore 0 a una variabile z
8. Valutare se x > 0
4a. Se si, andare al passo 5
4b.Se no, andare al passo 6
9. Assegnare alla variabile z il valore di z+y, assegnare alla variabile x il valore di
x-1, andare al passo 4
10.Rispondere che il risultato di x*y è z
11. Terminare la procedura
L’informazione, codificata l’informazione, come trasformare tutto in codifica binaria e lo
scopo di aver visto tutta quella parte lì era intanto sapere che le cose funziona così nella
realtà e anche convincerci che è un modo ragionevole di portare l’informazione all’interno
di un dispositivo per poi farci qualcosa e abbiamo visto quali sono i limiti dell’operazione.
Però l’idea di avere con la prima informazione messa in quel formato lì e idea era di non
metterci noi a modificare gli 0 e gli 1 o applicare tutti i conti a mano ma l’idea era di
rendere i processi totalmente o parzialmente automatici. Per fare questo quindi abbiamo
fatto un processo opposto, ovvero invece di partire da come mettere l’informazione
all’interno del dispositivo stiamo ragionando da come dalla nostra testa vorremmo
migliorare il dispositivo per lo strumento informatico a fare quello che mi serve, e abbiamo
visto che il modo per farlo sono gli algoritmi. Ci sono degli algoritmi che ci aiutano a capire
come scrivere o come dare in maniera corretta le istruzioni a un sistema informatico.
Abbiamo visto come proprietà degli algoritmi che i passi hanno le proprietà di essere
sequenziali nel senso che non solo avvengono in maniera temporalmente sequenziale ma
anche sequenziale perché ogni passo contribuisce al successo dell’ algoritmo solo se il
passo precedente ha fatto quello che deve fare e ha portato il nostro problema da
risolvere in uno stato in cui il passo corrente a sua volta facendo quello che deve fare
aumenta il progresso verso il completamento dell’algoritmo, quindi verso la soluzione del
problema. Oltre a dare una lista di istruzioni abbiamo visto che le cose possono essere
anche leggermente più raffinate quindi c’è un certo potere decisionale nel senso che si
possono fare cose diverse a fronte di situazioni diverse e questo è uno strumento molto
potente senza il quale sarebbe impossibile risolvere certi problemi.
Vogliamo che il nostro dispositivo informatico faccia una moltiplicazione tra due numeri. E
vogliamo che questo avvenga tramite somme ripetuta. Questo vuol dire che se abbiamo da
fare 3 × 2 somma 2 a se stesso per 3 × 2 + 2 + 2 = 3 volte e vogliamo che questo sia il
metodo di moltiplicazione, senza discutere che ci siano metodi migliori per eseguire questa
operazione. Preso lo scopo di esempio.
Qua troviamo sette passi e non c’è sempre un algoritmo giusto che lo risolve il problema
possono esistere diversi algoritmi.
1 e 2. Si parte leggendo passo 1 e passo 2, si leggono due numeri e quindi si vanno a
recuperare i valori numerici che sono in due variabili X e Y. Le variabili sono
pf3
pf4
pf5
pf8
pf9

Anteprima parziale del testo

Scarica Introduzione agli Algoritmi: Operatori Logici e Condizionali - Prof. Caputo e più Appunti in PDF di Fondamenti di informatica solo su Docsity!

GLI ALGORITMI

 Un altro esempio o Prodotto tra due numeri x e y per somme ripetute

  1. Leggere il numero nella variabile x
  2. Leggere il numero nella variabile y
  3. Assegnare il valore 0 a una variabile z
  4. Valutare se x > 0 4a. Se si, andare al passo 5 4b. Se no, andare al passo 6
  5. Assegnare alla variabile z il valore di z+y, assegnare alla variabile x il valore di x-1, andare al passo 4
  6. Rispondere che il risultato di x*y è z
  7. Terminare la procedura L’informazione, codificata l’informazione, come trasformare tutto in codifica binaria e lo scopo di aver visto tutta quella parte lì era intanto sapere che le cose funziona così nella realtà e anche convincerci che è un modo ragionevole di portare l’informazione all’interno di un dispositivo per poi farci qualcosa e abbiamo visto quali sono i limiti dell’operazione. Però l’idea di avere con la prima informazione messa in quel formato lì e idea era di non metterci noi a modificare gli 0 e gli 1 o applicare tutti i conti a mano ma l’idea era di rendere i processi totalmente o parzialmente automatici. Per fare questo quindi abbiamo fatto un processo opposto, ovvero invece di partire da come mettere l’informazione all’interno del dispositivo stiamo ragionando da come dalla nostra testa vorremmo migliorare il dispositivo per lo strumento informatico a fare quello che mi serve, e abbiamo visto che il modo per farlo sono gli algoritmi. Ci sono degli algoritmi che ci aiutano a capire come scrivere o come dare in maniera corretta le istruzioni a un sistema informatico. Abbiamo visto come proprietà degli algoritmi che i passi hanno le proprietà di essere sequenziali nel senso che non solo avvengono in maniera temporalmente sequenziale ma anche sequenziale perché ogni passo contribuisce al successo dell’ algoritmo solo se il passo precedente ha fatto quello che deve fare e ha portato il nostro problema da risolvere in uno stato in cui il passo corrente a sua volta facendo quello che deve fare aumenta il progresso verso il completamento dell’algoritmo, quindi verso la soluzione del problema. Oltre a dare una lista di istruzioni abbiamo visto che le cose possono essere anche leggermente più raffinate quindi c’è un certo potere decisionale nel senso che si possono fare cose diverse a fronte di situazioni diverse e questo è uno strumento molto potente senza il quale sarebbe impossibile risolvere certi problemi. Vogliamo che il nostro dispositivo informatico faccia una moltiplicazione tra due numeri. E vogliamo che questo avvenga tramite somme ripetuta. Questo vuol dire che se abbiamo da fare 3 × 2 somma 2 a se stesso per 3 × 2 + 2 + 2 = 3 volte e vogliamo che questo sia il metodo di moltiplicazione, senza discutere che ci siano metodi migliori per eseguire questa operazione. Preso lo scopo di esempio. Qua troviamo sette passi e non c’è sempre un algoritmo giusto che lo risolve il problema possono esistere diversi algoritmi. 1 e 2. Si parte leggendo passo 1 e passo 2, si leggono due numeri e quindi si vanno a recuperare i valori numerici che sono in due variabili X e Y. Le variabili sono

semplicemente delle zone della memoria del nostro dispositivo in cui è conservato o scritto il valore di un certo numero. Quindi X e Y sono delle etichette che fanno riferimento a dei numeri che sono da qualche parte la nostra memoria. In questo senso leggiamo seguendo le etichette andiamo a recuperare i valori

  1. Prendiamo la nuova etichetta la assegniamo ad una zona della nostra memoria ci scriviamo zero.
  2. Dopodiché facciamo la valutazione per vedere se X è maggiore di 0. Anche qui ci sono due possibili esiti in questa valutazione o è maggiore di zero oppure non lo è, ecco non lo è significa che inevitabilmente è minore o uguale a zero. 4a. Se X è maggiore di zero andiamo al passo cinque
  3. Vado a rassegnare la variabile Z del passo tre, va ad assegnare il valore di zeta più Y quindi valore di zero più Y Es. 3 × 2. L’asse y Avrebbe valore 2 quindi al passo cinque assegnare la variabile Z e il valore di zeta più Y ci porterebbe ad avere il valore di 0 + 2 messo descritto nella variabile Z. Dunque prendiamo la variabile Z e sappiamo che all’inizio abbiamo scritto zero poi prendiamo Y e facciamo Z + Y quindi 0 + 2 e otteniamo 2 e lo rimettiamo Z. Dopo facciamo un giochino con le variabili X cioè prendiamo il valore di X nel nostro esempio 3 × 2 verrebbe 3 e calcoliamo 3-1 ovvero X-1 che fa 2 e lo rimettiamo in X. Quindi prendiamo X e lo tagliamo a 1 e rimettiamo il valore nuovo al posto di X. Quello che vogliamo fare è ok abbiamo due numeri voglia moltiplicarlo per somme ripetuto allora cosa facciamo? Il primo dei due numeri lo usiamo come un contatore, nel caso 3 × 2 quindi il tre è il nostro contatore e dopo iniziamo a sommare 2 partendo da 0 e ogni volta che lo facciamo togliamo/ci mangiamo un numero -1 del numero che usiamo come contatore quindi del 3. Quindi sommiamo 2 a 0 e abbiamo 2 e 3 diventa 2, sommiamo di nuovo 2 a quello che adesso è 2 quindi diventa 4 e la nostra X diventa 1. Sommiamo un altro 2 e diventa 6 quindi 2 + 2 + 2 facendo questo giro tre volte e sempre mangiandoci un - 1 dalla nostra variabile X. Ad un certo punto continuato a mangiare la nostra variabile contatore X, X non sarà più maggiore di 0. L’idea che noi valutiamo se X è maggiore di zero nel Passo 4 e finché è maggiore di zero aggiungiamo un’altra somma dell’altro numero dal numero Y e togliamo 1 da X così ci assicuriamo che stiamo contando il numero giusto di volte con il quale sommiamo Y con se stessa, e questo fatto di togliere e fare quest’operazione di togliere -1 da X assicura che a un certo punto usciamo da questo giro che va da 4 a 5 e 5 a 4, perché a un certo punto X non sarà maggiore di zero ma evidentemente è uguale a zero e quindi finalmente possiamo andare nel ramo di esecuzione 4b 4b. Se non è maggiore di zero allora andiamo al passo sei
  4. Rispondere che il risultato di X per Y e Z e poi torniamo le procedure

o Vediamo il diagramma di flusso di questo algoritmo

valutazioni e fare alcune azioni in base allo stato in cui si trova il nostro problema. Però abbiamo visto che questo blocco decisionale ha avuto due funzioni diverse nei due esempi cioè in uno semplicemente vai a sinistra e vai a destra e poi succedeva delle cose da una parte o dall’altra e infine si andava comunque avanti diretti verso il termine della procedura. Invece in questo esempio abbiamo visto qualcosa che lo stesso blocco decisionale faceva qualcosa diverso cioè da una parte ci mandava verso il termine della procedura mentre se avevamo un si faceva una serie di cose e di operazioni e poi ci diceva ok adesso ritornate al passo precedente. Questi due modi di sfruttare questo strumento di valutare lo stato di qualcosa come ad esempio il valore di una variabile ed interrogarla può avere due usi:

  1. La creazione di istruzioni condizionali , cioè in base alla condizione che stabilisce chi scrive l’algoritmo fa una cosa piuttosto che un’altra
  2. E un altro tipo di istruzione che si chiama iterativo , è un concetto più simile al continuare a fare qualcosa finché non si raggiunge un certo stato. Le due cose non sono completamente separate ma una delle due è un problema alla base.

r Le istruzioni condizionali

s Permettono di controllare il flusso di un algoritmo s Si basano sulla valutazione di una ‘condizione’ t La valutazione della condizione deve risultare in un valore di tipo ‘logic’ (vero o falso) t Per avere una condizione di questo tipo si formulano delle ‘espressioni logiche’. t Per formulare tali espressioni vediamo due tipi di operatori (i più comuni): u Operatori relazionali u Operatori logici Le istruzioni condizionali permettono di controllare il flusso di un algoritmo tramite il diagramma di flusso, uno strumento di controllo perché fa da controllore che dice dove andare a destra o a sinistra esamina la situazione. La situazione è una condizione che deve verificarsi cioè ad esempio nel primo esempio X - Y > di 0. A fronte di questa condizione distruzione che è una valutazione vede qualcosa è diverso in base al fatto che la condizione sia vera o falsa. Il tipo di valutazione che si fa, ed è per questo che quando avevamo visto la versione corretta dell’algoritmo non abbiamo fatto un blocco decisionale a tre vie perché ogni volta che si fa una valutazione la risposta deve essere ovvero o falsa, se noi vogliamo fare una cosa a tre vie e dire una è la via che porta a fare quella cosa e l’altra via porta a fare ulteriori valutazioni e quindi si creano tre vie o di più a seconda di quanto vogliamo considerarne nell’algoritmo però singolarmente un’istruzione condizionale deve fare una valutazione sulla condizione che o è vera o è falsa. Per avere una condizione di questo tipo si crea l’espressione logica ovvero una formula di cui non ci si preoccupa di che cosa ci si butta dentro dei numeri, dei valori vero o falso ma quello che ci interessa è che l’espressione logica è valutabile sempre in termini di vero o falso quindi o è vera o è falsa. Questa è la descrizione di cos’è un’espressione logica. È un’espressione di che abbiamo la certezza che per come è costruita sarà sempre valutabile in termini di vero o falso e che quindi usata all’interno di un’istruzione condizionale, nel momento in cui l’algoritmo usa un’espressione logica per decidere se andare a destra o a

sinistra nei gradi di esecuzione può farlo perché l’espressione logica può essere valutata solo come vero o falso e quindi c’è un parallelismo tra il numero di via il nostro algoritmo può seguire in quel blocco decisionale e il numero di risposte che la valutazione dell’espressione logica ci può dare. X - Y > di 0 cioè il fatto di aver usato il > al posto di una condizione sul valore di X e Y cioè X

  • Y > di 0 o è vero o è falso che o si verifica o X - Y è > di 0 o non si verifica X - Y non è maggiore di 0. Quindi quella era esattamente un’espressione logica. Altri operatori oltre maggiore: operatori relazionali e operatori logici

v Operatori relazionali

w Sono operatori binari (utilizzano due operandi) w I due operandi devono essere di tipo comparabile (e.g. due numeri) Gli operatori relazionali sono operatori binari cioè che utilizzano due operandi, ovvero cioè l’operatore qualcosa sinistra e qualcosa a destra e le due cose a sinistra e a destra degli operatori sono gli operandi cioè degli elementi sui quali ci si interrogherà in base al quale l’operatore. Nel caso il primo esempio avevamo X - Y che è un operando, 0 era l’altro operando cosa ci si chiedeva se il primo era maggiore del secondo. Ce ne sono altri. La simbologia utilizzata è una convenzione ma non è la convenzione assoluta nel senso che è una convenzione molto usata in tanti linguaggi di programmazione si usa questa scrittura ma non è l’unica. Questa è la convenzione largamente utilizzata. Operatori relazionali

  1. == verifica l’uguaglianza degli operandi ovvero noi possiamo utilizzare se vogliamo fare la domanda se l’operato di sinistra è uguale all’operato di destra, ad esempio due numeri. Abbiamo due numeri e vogliamo che la condizione da valutare sia se due numeri sono uguali. E quindi scriviamo per esempio X == Y e la condizione è vera che i due numeri sono uguali quindi dal nostro ipotetico immaginario algoritmo che usa questa istruzione condizionale andremo in un certo branching, se i duoi numeri non sono uguali la condizione non si verifica quindi è falsa e quindi andiamo nell’altro branch
  2. != varia nei diversi linguaggi di programmazione. Comunque verifica la diversità ovvero la condizione invece di essere vera quando ad esempio due numeri sono uguale la condizione è vero quando due numeri sono diversi.
  3. < e > ci chiediamo se un numero è maggiore di un altro se l’operando di sinistra è maggiore o minore a seconda del simbolo che usiamo per esplicitare la condizione

entrambe gli operandi sono a loro volta espressioni logiche che vengono valutate come vere

  1. OR: è un operatore binario ed è un po’ più rilassato valutare l’espressione logica che consiste di un OR e due operandi, che sono due soluzioni logiche, a differenza dell’AND basta che solo una delle due sia valutata come vera e tutte le espressione contenente l’OR sia valutata come vera.

| Vediamo degli esempi ‘traducendo’ delle condizioni:

 Valutare se un numero x è maggiore di un numero y e minore di un numero z ú (x > y) AND (x < z)  Valutare se due numeri x e y sono uguali o se il numero x è diverso da un numero z ú (x == y) OR (x != z)  Valutare se non si verifica che l’espressione P e l’espressione Q sono vere ú NOT(P AND Q) Vediamo degli esempi e cerchiamo di tradurre delle condizioni. Diciamo a parole con linguaggio comune quello che vorremmo verificare/far fare al nostro algoritmo e poi lo riscriviamo sottoforma di espressione logica che è quello che capisce la macchina. ù Ipotizziamo di aver bisogno di valutare se un numero X, che vuol dire un numero associato all’etichetta, X > Y e allo stesso tempo verificare se questo numero X < Z. Qui la cosa fondamentale è l’idea di volerlo fare nello stesso tempo, perché durante l’esecuzione di un algoritmo i valori a fronte di operazioni eseguite nei passi dell’algoritmo, i valori e le variabili possono mutare ed evolvere ma noi vogliamo in un certo punto nel nostro algoritmo verificare che tutte e due le condizioni si verificano. Dunque ci viene in aiuto l’operatore AND. Perché and AND da l’idea traducendo dall’inglese di questa cosa e anche quest’altra cosa, dove questa cosa è la condizione X

Y (operando 1) e X < Z (operando 2). L’espressione logica è tutto appunto questo suggerisce in un certo modo che un’espressione logica può essere composta da altre espressioni logiche e a loro volta possono essere composte da altre espressioni logiche di fatto non c’è un limite imposto, o meglio l’unico limite dovesse esserci è perché magari lo impone a un certo linguaggio di programmazione che non ammette di andare troppo o di avere espressione troppo complicate per qualche motivo, però dal punto di vista logico non c’è un limite. Noi possiamo prendere le espressioni logiche e usare un operatore logico per connetterle e creare una nuova espressione logica. Questa nuova espressione logica possiamo prendere di nuovo un altro operatore logico o lo stesso e aggiungere un altro operando quindi un’altra espressione logica ed avere un’espressione logica che completa. Questo è uno strumento molto potente perché permette di descrivere delle condizioni molto raffinate. Se ne vogliamo eseguire un certo passo dell’algoritmo a fronte di una condizione molto particolare lo possiamo fare utilizzando un mix necessario di questi operatori. ù Valutare se numeri X e Y sono uguali o se il numero X è diverso da un numero Z. Quindi o X e Y sono uguali oppure X è diverso da Z. È

proprio questo o, oppure dovrebbe suggerirci l’utilizzo dell’operatore logico OR. Da una parte abbiamo la prima espressione logica che c’è da verificare che sia vera in alternativa dopo verificheremo l’altra tramite l’OR. E la cosa che vorremmo verificare è che X e Y siano uguali perché questo è l’esempio valutare se due numeri X e Y sono uguali. Oppure ci va altrettanto bene se l’altra espressione, il secondo operando dell’OR è vero. Seguendo il nostro esempio questo si traduce da X è diverso da un numero Z in X operatore relazionale di negazione Z. Quindi X diverso da Z con l’OR in mezzo significa che se è vero quello che c’è a sinistra l’espressione logica operando uno oppure vera quella che c’è nell’operatore due questo include il caso in cui queste espressioni siano entrambe vere entrambe le espressioni logica diano risultato, cioè si risolvono, in un valore logico vero entrambe allora tutta l’espressione logica contenuta nell’OR è vera. Se invece entrambe le espressioni e logica/entrambi gli operandi dell’OR si risolvono in valori falso allora tutta l’espressione OR si risolve in un valore falso. ù Valutare se non si verifica che l’espressione P (è un etichetta in questo esempio per dire che è un’espressione logica di qualsiasi tipo che potrebbe essere X > Y ma potrebbe essere tutte l’espressione precedente quindi X == Y OR X!= Z, o tutte e due le precedenti messe in AND) e l’espressione Q sono vere. E quello che c’è gli interessa sapere è che ti è valutabile e una volta valutato diventa o vero o falso. Quello che ci interessa è valutare se non si verifica che l’espressione P e Q sono vere. Ovvero che l’espressione P e Q si risolvono in un risultato vero quindi costruiamo questa espressione logica andando all’inverso cioè valutare se non si verifica. Intanto scriviamo la condizione come se si verificasse ed è questa cioè noi vogliamo verificare una cosa che non si verifica. Quindi noi vogliamo vedere se non qualcosa quindi prima scriviamo qualcosa e poi ci attacchiamo il NOT operatore logico unaria che ci attacchiamo davanti e abbiamo la nostra espressione logica. Quindi la cosa che vogliamo che non si verifichi è che l’espressione P e Q siano vere. Allora P e Q le mettiamo in AND questo è esattamente quello che vogliamo che non si verifichi allora ci mettiamo il NOT d’avanti. Il NOT si esplicita o scrivendolo a parole oppure mettendo il “!” che è diverso da disuguaglianza perché non ce l’ho uguale a seguito. Il significato dall’espressione logica non cambia. Qui l’operatore NOT in questo caso è spesso con il “!” è un operatore unario perché usa un solo operando cioè applicato solo una sola espressione logica in questo caso P AND Q. Le parentesi contano perché se si tolgono sì posso mettere delle convenzioni perché magari funzionano permettono di scrivere espressioni logiche, almeno in