venerdì 1 settembre 2017

I Diagrammi di Flusso [slide]

Permettono di rappresentare in modo efficace un algoritmo tramite dei modelli grafici che associano alle istruzioni del programma dei simboli grafici

Attenzione! I programmatori inesperti tendono a introdurre numerosi salti privi di regole (“spaghetti programming”)

Blocchi di base



Regole

- uno ed un solo blocco START
- uno ed un solo blocco STOP
- tutti gli archi devono avere origine e fine in un blocco

Diagrammi di flusso strutturati

- Un diagramma di flusso è detto strutturato se contiene solo un insieme predefinito di strutture:
  • sequenze
  • decisioni
    • IF-THEN-ELSE
    • IF-THEN
  • cicli
    • WHILE
    • DO-WHILE
L’analisi analisi strutturata strutturata favorisce, la descrizione di algoritmi facilmente documentabili
e comprensibili

Teorema di Böhm – Jacopini

Qualunque diagramma di flusso è sempre trasformabile in un diagramma di flusso strutturato equivalente a quello dato.

Sequenza

- Una sequenza è composta da una o più bocchi azione


// inizio blocco sequenza
Istruzione1;
Istruzione2;
// fine blocco

IF-THEN

- È presente solo la condizione vera
- I due rami vero e falso si devono ricongiungere


// inizio blocco IF-THEN
if(condizione)
{
  Struttura1;
}
// fine blocco

IF-THEN-ELSE

- È presente sia la condizione vera che la condizione falsa
- Condizione vera e falsa si devono ricongiungere


// inizio blocco IF-THEN
if(condizione)
{
  Struttura1;
}
else
{
  Struttura2;
}
// fine blocco

IF-THEN-ELSE nidificati

- Si ottengono nidificando dei blocchi IF-THEN-ELSE



// inizio blocco IF-THEN-ELSE nidificati
if(condizione1)
{
  Struttura1;
}
else
{
  if(condizione2)
  {
    Struttura2;
  }
  else
  {
    if(condizione3)
    {
      Struttura3;
    }
    else
    {
      Struttura4;
    }
  }
}
// fine blocco

IF-ELIF--ELSE / SWITCH-CASE

- Non sono strutture fondamentali - Si possono ottenere con dei blocchi IF-THEN-ELSE nidificati


# esempio in bash
#inizio blocco if-elif-else-fi
if [ condizione1 ]
then Struttura-1;
elif [ condizione2 ]
then Struttura-2; elif [ condizione3 ]
then Struttura-3; else Struttura-4; fi #fine blocco

// inizio blocco SWITCH-CASE
// inizio blocco IF-ELIF-ELSE
if(condizione1) 
{
  Struttura-1;
} 
else if(condizione2) 
{
   Struttura-2;
} 
else if(condizione3) 
{
   Struttura-3;
} 
else
{
   Struttura-4;
}
// fine blocco

// inizio blocco SWITCH-CASE
switch(numero) 
{
  case 0:
    Struttura-1;
    break;
  case 1:
    Struttura-2;
    break;
  case 2:
    Struttura-3;
    break;
  default:
    Struttura-4;
    break;
}
// fine blocco

IF-ELSE

- Non è consentito, perchè non è necessario
- Basta invertire la condizione e quindi usare un blocco IF-THEN
// Blocco IF-ELSE
if(condizione)
{
  ;  // Nessuna istruzione
} 
else
{
  Struttura1;
} 
// invertendo la condizione diventa
if(!condizione)
{
  Struttura1;
} 

WHILE-DO

- la parte ciclica viene eseguita quando la condizione è vera
- un ciclo WHILE-DO può essere eseguito zero o più volte 
- viene eseguito zero volte quando la condizione è subito falsa



Nei linguaggi C, Javascript, ...
// Blocco WHILE
while(condizione)
{
  Struttura;
} 

In Bash
#!/bin/bash
i=0
while [ $i -lt 10 ]; do
  echo $i
  i=$(( $i + 1))
done
echo “Done counting”


DO-WHILE

- un ciclo DO_WHILE viene sempre eseguito almeno una volta
- la parte ciclica viene eseguita quando la condizione è vera




// Blocco DO-WHILE
do
{
  Struttura;
} while(condizione);

FOR

- Non è una struttura fondamentale
- La struttura iterativa FOR si ottiene utilizzando un ciclo WHILE-DO



// inizio blocco for
for(int i=1; i<10; i++)
{
  Struttura;
}
//Ciclo for usando il while
int i=1;
while(i<10) {
  Struttura;
  i++;
}

Verifica che il grafo sia strutturato

1. etichettare ogni blocco 2. sostituire ad ogni insieme strutturato un blocco avente come etichetta l’unione delle etichette dei blocchi che lo costituiscono 3. se al passo 2 si è fatta almeno una sostituzione, ripetere il passo 2 4. se alla fine si ottiene un diagramma lineare (una sequenza), allora il diagramma originale è strutturato




Esempio di diagramma non strutturato




Riferimenti

- http://it.wikipedia.org/wiki/Programmazione_strutturata
- http://security.polito.it/~lioy/12bhd/programmare.pdf

1 commento: