Flow chart: diagrammi di flusso

Un diagramma di flusso rappresenta graficamente un algoritmo con simboli standard e
frecce orientate. È efficace perché visualizza struttura e costrutti (sequenza, selezione, iterazione).

Regole base

  • Usa solo i 4 blocchi standard + frecce orientate.
  • Un solo Start e un solo Stop.
  • I rami alternativi si ricongiungono prima di Stop.

I quattro blocchi fondamentali

Blocco Forma Immagine Uso tipico Esempio
Inizio/Fine Ovale Punto di ingresso/uscita del diagramma Start / Stop
I/O Parallelogramma Lettura da tastiera, stampa a video “Leggi N” • “Stampa Somma”
Elaborazione Rettangolo Assegnazioni e calcoli S = A + B
Decisione Rombo Test con rami vero/falso N % 2 == 0 ?

Esempio di flow chart (sequenza)

Leggi A e B → calcola S = A + B → stampa S → Stop.

Esercizi – Flow chart

Esercizio 1 — Riconosci i blocchi

Indica, nell’immagine precedente, quali blocchi sono I/O, quali di elaborazione e dove sono Start/Stop.

Soluzione
  • I/O: “Leggi A”, “Leggi B”, “Stampa S”.
  • Elaborazione: “S = A + B”.
  • Start/Stop: ovali iniziale e finale.
Esercizio 2 — Pari/Dispari

Disegna un flow chart che legge N e stampa “pari” se N%2==0, altrimenti “dispari”.

Soluzione (schema)

Start → Leggi N → Decisione N%2==0? → V: Stampa “pari” → Stop; F: Stampa “dispari” → Stop.

Esercizio 3 — Ricongiungi i rami

Nel flow chart di cui sopra, fai convergere entrambi i rami su un unico Stop.

Soluzione

Entrambi i rami (V e F) puntano a un unico blocco Stop.

Costrutto if (senza else)

Esegue il blocco solo quando la condizione è true; altrimenti prosegue oltre.

Flow chart dell’if senza else.

Esempi

// C
if (x > 100) {
    printf("Maggiore di 100\n");
}

// C++
if (x % 2 == 0) {
    std::cout << "Numero pari\n";
}

Esercizi – if senza else

Esercizio 1 — “OK” se a>b

Stampa “OK” solo se a > b (C e C++).

Soluzione
// C
if (a > b) { printf("OK\n"); }

// C++
if (a > b) { std::cout << "OK\n"; }
Esercizio 2 — Bonus se importo≥100

Se importo >= 100, aumenta bonus di 10.

Soluzione
// C
if (importo >= 100) { bonus += 10; }

// C++
if (importo >= 100) { bonus += 10; }
Esercizio 3 — Evita divisione per zero

Stampa a/b solo se b != 0.

Soluzione
// C
if (b != 0) { printf("%d\n", a/b); }

// C++
if (b != 0) { std::cout << (a/b) << '\n'; }

Attività

  • Leggi una temperatura T. Se T <= 0 stampa “Gelo”.
  • Leggi una password. Se vuota, stampa “Password mancante”.

Costrutto if … else

Sceglie un ramo se la condizione è vera, l’altro se è falsa; i rami si ricongiungono.

Flow chart dell’if … else.

Esempi

// C
if (n % 3 == 0) {
    printf("Divisibile per 3\n");
} else {
    printf("Non divisibile per 3\n");
}

// C++
if (x >= 18) {
    std::cout << "Maggiorenne\n";
} else {
    std::cout << "Minorenne\n";
}

Esercizi – if … else

Esercizio 1 — Positivo/Negativo

Se x >= 0 stampa “positivo”, altrimenti “negativo”.

Soluzione
// C
if (x >= 0) printf("positivo\n"); else printf("negativo\n");

// C++
if (x >= 0) std::cout << "positivo\n"; else std::cout << "negativo\n";
Esercizio 2 — Sufficiente/Insufficiente

Se voto >= 6 stampa “sufficiente”, altrimenti “insufficiente”.

Soluzione
// C
if (voto >= 6) printf("sufficiente\n"); else printf("insufficiente\n");

// C++
if (voto >= 6) std::cout << "sufficiente\n"; else std::cout << "insufficiente\n";
Esercizio 3 — Pari/Dispari

Se n % 2 == 0 stampa “pari”, altrimenti “dispari”.

Soluzione
// C
if (n % 2 == 0) printf("pari\n"); else printf("dispari\n");

// C++
if (n % 2 == 0) std::cout << "pari\n"; else std::cout << "dispari\n";

Attività

  • Scrivi un programma che legga un anno e dica se è bisestile con regola base: divisibile per 4 → sì, altrimenti no (versione semplice con if/else).
  • Leggi due interi e stampa il maggiore (senza ternario, usa if/else).

Costrutto if … else if … else

Valuta le condizioni dall’alto verso il basso; esegue il primo ramo vero, altrimenti l’else finale (se presente).

Flow chart della catena if … else if … else.

Esempi

// C
if (voto >= 28) {
    printf("Eccellente\n");
} else if (voto >= 24) {
    printf("Buono\n");
} else if (voto >= 18) {
    printf("Sufficiente\n");
} else {
    printf("Insufficiente\n");
}

// C++
if (temp > 30) {
    std::cout << "Caldo\n";
} else if (temp >= 10) {
    std::cout << "Mite\n";
} else {
    std::cout << "Freddo\n";
}

Esercizi – if … else if … else

Esercizio 1 — Classificazione voto

“Eccellente” (≥28), “Buono” (24–27), “Sufficiente” (18–23), “Insufficiente” (<18).

Soluzione
// C
if (voto >= 28) printf("Eccellente\n");
else if (voto >= 24) printf("Buono\n");
else if (voto >= 18) printf("Sufficiente\n");
else printf("Insufficiente\n");

// C++
if (voto >= 28) std::cout << "Eccellente\n";
else if (voto >= 24) std::cout << "Buono\n";
else if (voto >= 18) std::cout << "Sufficiente\n";
else std::cout << "Insufficiente\n";
Esercizio 2 — Fasce d’età

“Bambino” (< 12), “Ragazzo” (12–17), “Adulto” (18–64), “Senior” (≥65).

Soluzione
// C (con puts) o C++
if (eta < 12) puts("Bambino");
else if (eta < 18) puts("Ragazzo");
else if (eta < 65) puts("Adulto");
else puts("Senior");
Esercizio 3 — Voto 0–30 (messaggi)

0–15: “Respinto”, 16–20: “Orale”, 21–30: “Promosso”. Fuori range: “Valore non corretto”.

Soluzione
// C
if (voto < 0 || voto > 30) printf("Valore non corretto\n");
else if (voto >= 21) printf("Promosso\n");
else if (voto >= 16) printf("Orale\n");
else printf("Respinto\n");

Attività

  • Scrivi “calcolatrice tasse” a scaglioni (tre soglie con else if), stampa aliquota applicata.
  • Leggi tre numeri e stampa “tutti uguali”, “due uguali”, “tutti diversi”.

Espressioni condizionali (operatore ternario)

Sintassi: (condizione) ? ramoIf : ramoElse; — produce un valore utile in assegnazioni.

// Max tra due valori
max = (a > b) ? a : b;

// C++: evitare divisione per zero in stampa
if (b) std::cout << a/b;
else   std::cout << "impossibile";
// Nota: if(b) ≡ if(b != 0);  if(!b) ≡ if(b == 0)

Esercizi – Ternario

Esercizio 1 — Minimo di due
Soluzione
min = (a < b) ? a : b;
Esercizio 2 — Assoluto
Soluzione
absx = (x >= 0) ? x : -x;
Esercizio 3 — Etichetta pari/dispari
Soluzione
// C++
std::string et = (n % 2 == 0) ? "pari" : "dispari";

Attività di laboratorio

Attività A — Indovina numero (0–9)

Completa i “buchi” (C e C++). Stampa anche il numero generato.

Soluzione
// C
#include <stdio.h>
#include <stdlib.h>
int main(){
  int magico, x;
  magico = rand() % 10;
  printf("Indovina il numero: ");
  scanf("%d", &x);
  if (x == magico) printf("ESATTO\n"); else printf("ERRATO\n");
  printf("Numero generato=%d\n", magico);
  return 0;
}

// C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
  int magico = rand() % 10, x;
  cout << "Indovina il numero: ";
  cin >> x;
  if (x == magico) cout << "ESATTO\n"; else cout << "ERRATO\n";
  cout << "Numero generato=" << magico << endl;
  return 0;
}
Attività B — Voto 0–30 (versione robusta)

Leggi un intero 0–30 e stampa messaggi: “Valore non corretto” fuori range; 21–30 “Promosso”; 16–20 “Orale”; ≤15 “Respinto”.

Soluzione C
#include <stdio.h>
int main(){
  int voto;
  printf("Inserire il voto: ");
  scanf("%d", &voto);
  if (voto < 0 || voto > 30) printf("Valore non corretto!\n");
  else if (voto > 20)        printf("Hai passato l'esame e puoi registrarlo!\n");
  else if (voto >= 16)       printf("Dovrai sostenere l'orale se vuoi passare!\n");
  else                        printf("Mi dispiace... respinto!\n");
  return 0;
}
Attività C — Correggi il codice (C)

Rendi corretto e ben indentato il programma.

Soluzione
#include <stdio.h>
int main(){
  int x;
  printf("Inserisci un numero: ");
  scanf("%d", &x);
  if (x == 3){
    printf("Numero uguale a tre\n");
  } else {
    printf("Numero diverso da tre\n");
  }
  return 0;
}

Esercizi di verifica

Vero/Falso

  1. In un flow chart ci possono essere più blocchi di Stop. …… ☐ V ☐ F
  2. Il blocco rombo serve per l’I/O. …… ☐ V ☐ F
  3. Nel costrutto if … else viene eseguito sempre e solo uno dei due rami. …… ☐ V ☐ F
Soluzioni V/F
  1. F (si usa un solo Stop; i rami si ricongiungono)
  2. F (l’I/O è il parallelogramma; il rombo è la decisione)
  3. V

Risposta multipla

  1. Qual è il blocco usato per i test logici?
    A) Ovale B) Parallelogramma C) Rettangolo D) Rombo
  2. Nel ternario, quale parte si valuta se la condizione è falsa?
    A) condizione B) ramoIf C) ramoElse D) nessuna
  3. In una catena else if
    A) si eseguono tutti i rami veri
    B) si esegue solo il primo vero
    C) si esegue sempre l’else
    D) non è previsto l’else
Soluzioni (multiple)
  1. D
  2. C
  3. B