Diagrammi di flusso e Codice Matlab: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
(Acquisizione e stampa degli elementi di un vettore)
Riga 208: Riga 208:
  
 
<syntaxhighlight lang="matlab" line>
 
<syntaxhighlight lang="matlab" line>
%% Codice per il calcolo dell'approssimazione per eccesso del logaritmo in base 2 di un numero
 
  
% Acquisisco da tastiera il numero di cui calcolare il logaritmo in base 2
 
% controllando che sia un numero maggiore di 0
 
flag = true;
 
while flag
 
    OP = input('');
 
    flag = OP <= 0;
 
end
 
 
% Una volta acquisito l'operando, inizializzo le variabili utili al programma
 
% e passo al calcolo del logaritmo
 
i = 0;
 
RIS = 1;
 
flag = true;
 
while flag == true
 
  RIS = RIS * 2;
 
  i = i+1;
 
  flag = RIS < OP;
 
end
 
 
% Mostro a video il risultato
 
disp(i)
 
  
 
%% Riferimenti utili
 
%% Riferimenti utili

Versione delle 18:19, 17 nov 2016

Vitoantonio Bevilacqua Strutture di controllo e Diagrammi di flusso vitoantonio.bevilacqua@poliba.it

Sommario. Il presente paragrafo si riferisce alle lezioni del I Modulo di Informatica : Fondamenti di Informatica per il nuovo corso di laurea triennale in Ingegneria dei Sistemi Medicali del Dipartimento di Ingegneria Elettrica e dell'Informazione del Politecnico di Bari.

Parole chiave: Algoritmo, Diagramma di flusso, Ricerca dicotomica.

ATTENZIONE !!! - PAGINA IN ALLESTIMENTO

Introduzione

Un algoritmo è una sequenza ordinata di passi elementari che consente di passare da dati in ingresso a dati in uscita; alcune delle proprietà fondamentali di un algoritmo sono:

  • eseguibilità: ogni parte, ogni diramazione dell’algoritmo deve essere percorribile;
  • non ambiguità: la scelta di un percorso rispetto ad un altro è legata ad una condizione (cioè da ogni punto del programma non devo poter andare dove voglio);
  • finitezza: l’algoritmo deve finire altrimenti si va in "loop".


Un diagramma di flusso è una rappresentazione simbolica di un algoritmo e ha lo scopo di esprimere il meccanismo di interazione con l’utenza e le operazioni da fare a partire dai dati inseriti. Le operazioni esplicitate in un algoritmo necessitano di essere eseguite sotto il controllo di un esecutore che le interpreta ed esegue nell’ordine logico di esecuzione. Poiché gli algoritmi che incontreremo dovranno essere eseguiti in maniera automatica, l’esecutore è l’elaboratore e quindi l’algoritmo dovrà essere tradotto in una sequenza di istruzioni scritte in un linguaggio che l’elaboratore è in grado di interpretare ed eseguire. Un linguaggio che ci consente di fare ciò è appunto il linguaggio MATLAB.

Struttura di un diagramma di flusso

Un qualsiasi diagramma di flusso è gestito da quattro schemi fondamentali che, opportunamente combinati attraverso delle frecce, rappresentano la sequenza logica e temporale dell’evoluzione dell’algoritmo. I quattro schemi hanno un ordine e un valore logico completamente diverso, e sono:

  1. una "ellisse" che contiene al suo interno un label (etichetta) che può indicare l'"inizio" o la "fine" dell’algoritmo;
  2. il "blocco delle assegnazioni", che contiene appunto un’assegnazione (p.e. i = 0); in particolare si assegna la parte destra del segno di = alla variabile a sinistra del segno; un’assegnazione del tipo i = 0 è un’assegnazione "di inizializzazione".
  3. il "blocco di input/output": se di input, serve ad assegnare alla variabile contenuta nel blocco (ad es. N) un valore immesso dall’esterno; se di output, serve a stampare su video il valore della variabile contenuta nel blocco, precedentemente modificato dall'algoritmo.
  4. il "blocco condizionale", che controlla se la condizione contenuta sia vera o no e restituisce l’esito vero o falso come output; quindi in un diagramma di flusso si trova sempre dopo altre operazioni di assegnazione o di input; si può presentare sotto due forme principali: ciclo con controllo in coda oppure decisione binaria V-F.

Ciclo con controllo in coda

Controlla se la condizione espressa nel blocco sia vera o no. Nel primo caso viene rieseguito il blocco di operazioni comprese tra la punta della freccia di ritorno e il blocco condizionale; se la condizione risultasse falsa, allora si uscirebbe dal ciclo.

Rappresentazione di un ciclo con controllo in coda

Il seguente segmento di codice è la rappresentazione in codice matlab del ciclo con controllo in coda (è l'equivalente del ciclo do-while del linguaggio C). Come si può notare, è necessario utilizzare una variabile booleana affinché il costrutto presente in Matlab si comporti come un ciclo con controllo in coda.

  1. %% Snippet di codice per il ciclo con controllo in coda
  2.  
  3. % Eseguo una serie di operazioni
  4.  
  5. % Utilizzo una variabile booleana
  6. flag = true;
  7. while flag == true
  8.  
  9.     % Eseguo diverse operazioni
  10.  
  11.     flag = condition
  12.  
  13. end

Decisione Binaria Vero-Falso

A seconda della veridicità o meno dell’espressione inserita si esegue il ramo del vero o del falso rispettivamente.

Rappresentazione di un blocco condizionale Vero - Falso

Il seguente segmento di codice è la rappresentazione in codice matlab del blocco di decisione binaria.

  1. %% Snippet di codice per il blocco di decisione binaria if - else
  2. % Eseguo una serie di operazioni
  3.  
  4. if condizione == true
  5.  
  6.     % Eseguo un determinato blocco di istruzioni
  7. else
  8.  
  9.     % Eseguo un altro blocco di istruzioni
  10. end

Esempi Applicativi

Media di una serie di numeri

Data una dimensione N, si vuole calcolare la media aritmetica di N numeri e mostrare il risultato a video.

Diagramma di flusso per il calcolo della media
  1. %% Codice per il calcolo di N numeri
  2.  
  3. % Acquisisco da tastiera la dimensione dell'insieme di numeri
  4. % controllando che sia un numero maggiore di 0
  5. flag = true;
  6. while flag == true
  7.    N = input('');
  8.    flag = N <= 0;
  9. end
  10.  
  11. % Una volta acquisita la dimensione dell'insieme dei numeri, inizializzo le
  12. % variabili utili al programma e passo ad acquisire i numeri
  13. SOMMA = 0;
  14. i = 0;
  15. flag = true;
  16. while flag == true
  17.    ADDENDO = input('');
  18.    SOMMA = SOMMA + ADDENDO;
  19.    i = i+1;
  20.    flag = i < N;
  21. end
  22.  
  23. % Calcolo il valore di MEDIA
  24. MEDIA = SOMMA / N;
  25.  
  26. % Stampo a video il valore di MEDIA
  27. disp(MEDIA);
  28.  
  29. %% Riferimenti utili
  30. %
  31. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/input.html
  32. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/while.html
  33. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/disp.html
  34. %

Somma dei numeri pari e prodotto dei numeri dispari

Dati N numeri, con N compreso tra 5 e 10, si vuole calcolare la somma dei numeri pari e il prodotto dei numeri dispari e mostrare tali valori a video

Diagramma di flusso per il calcolo della somma dei numeri pari e il prodotto dei numeri dispari
  1. %% Codice per il calcolo della somma degli elementi pari e il prodotto di quelli dispari
  2.  
  3. % Acquisisco da tastiera la dimensione dell'insieme di numeri
  4. % controllando che sia un numero compreso tra 5 e 10 (estremi inclusi)
  5. flag = true;
  6. while flag == true
  7.     N = input('');
  8.     flag = N < 5 || N > 10;
  9. end
  10.  
  11. % Una volta acquisita la dimensione dell'insieme dei numeri, inizializzo le
  12. % variabili utili al programma e passo ad acquisire i numeri
  13. i = 0;
  14. SOMMA = 0;
  15. PROD = 1;
  16.  
  17. flag = true;
  18. while flag == true
  19.     operando = input('');
  20.     % Controllo se l'operando è pari o dispari
  21.     if mod(operando, 2) == 0
  22.         % Caso relativo all'operando pari
  23.        SOMMA = SOMMA + operando;
  24.     else
  25.          % Caso relativo all'operando dispari
  26.         PROD = PROD * operando;
  27.     end
  28.  
  29.     i = i+1;
  30.     flag = i < N;
  31. end
  32.  
  33. % Mostro a video i valori di somma e prodotto
  34. disp (SOMMA);
  35. disp (PROD);
  36.  
  37. %% Riferimenti utili
  38. %
  39. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/while.html
  40. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/input.html
  41. % # https://it.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.htm
  42. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/mod.html
  43. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/disp.html
  44. %

Logaritmo in base 2

Dato un numero maggiore di 0, si vuole calcolare il logaritmo in base 2 approssimato per eccesso di tale numero.

Diagramma di flusso per il calcolo del logaritmo in base 2 approssimato per eccesso
  1. %% Codice per il calcolo dell'approssimazione per eccesso del logaritmo in base 2 di un numero
  2.  
  3. % Acquisisco da tastiera il numero di cui calcolare il logaritmo in base 2
  4. % controllando che sia un numero maggiore di 0
  5. flag = true;
  6. while flag
  7.     OP = input('');
  8.     flag = OP <= 0;
  9. end
  10.  
  11. % Una volta acquisito l'operando, inizializzo le variabili utili al programma 
  12. % e passo al calcolo del logaritmo
  13. i = 0;
  14. RIS = 1;
  15. flag = true;
  16. while flag == true
  17.    RIS = RIS * 2;
  18.    i = i+1;
  19.    flag = RIS < OP;
  20. end
  21.  
  22. % Mostro a video il risultato
  23. disp(i)
  24.  
  25. %% Riferimenti utili
  26. %
  27. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/while.html
  28. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/input.html
  29. % # https://it.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.htm
  30. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/disp.html
  31. %

Esempi applicativi utilizzando i vettori

Acquisizione e stampa degli elementi di un vettore

Si vuole creare un vettore di N elementi, acquisirli da tastiera e mostrare a video tali elementi

Diagramma di flusso per creazione e stampa di un vettore con N elementi
  1. %% Riferimenti utili
  2. %
  3. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/while.html
  4. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/input.html
  5. % # https://it.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.htm
  6. % # https://www.mathworks.com/help/releases/R2016b/matlab/ref/disp.html
  7. %