In questo articolo introduciamo i Fondamenti di programmazione richiamando alcuni concetti sui sistemi di elaborazione e dando alcune definizioni importanti (programma, algoritmo, problem solving ecc)

In questo articolo introduciamo i Fondamenti di programmazione richiamando alcuni concetti sui sistemi di elaborazione e dando alcune definizioni importanti (programma, algoritmo, problem solving ecc)

Introduzione ai Sistemi di Elaborazione


Cos’è l’Informatica

L’Informatica (Computer Science) è la disciplina che studia i principi, i metodi e le tecnologie per la rappresentazione, la trasmissione e la manipolazione automatica dell’informazione mediante dispositivi elettronici.
Essa non riguarda solo il funzionamento dei computer, ma anche le modalità di risoluzione automatica dei problemi attraverso algoritmi e strutture dati.


Il Concetto di Elaborazione

Un elaboratore elettronico riceve in input dei dati, li elabora secondo un insieme di istruzioni (programma) e produce dei risultati in output.

Problemi tipici dell’elaborazione:

  • Codificare i dati in un formato comprensibile dalla macchina.
  • Codificare gli ordini in sequenze di istruzioni eseguibili.
  • Decodificare i risultati in un formato comprensibile all’utente.

L’informazione digitale: tutto diventa bit

Nel mondo digitale, ogni tipo di informazione – testi, immagini, musica, voce, video – viene rappresentato attraverso una sequenza di bit (binary digit): 0 e 1.

Tipo di informazioneRappresentazione digitale (esempio)
Testo 01001000 01100101 01101100 01101100 01101111 (ASCII di “Hello”)
ImmagineSequenza di pixel codificati in binario
AudioCampionamenti numerici del suono
VideoSequenze di immagini (frame) + audio

Hardware e Software

Un calcolatore elettronico è composto da due componenti principali:

  • Hardware: l’insieme delle componenti fisiche ed elettroniche (es. CPU, RAM, dischi, monitor, tastiera, mouse…).
  • Software: la parte logica e immateriale, costituita da programmi (istruzioni) e dati (informazioni su cui operano i programmi).

Componenti dell’Hardware

L’hardware si articola in:

  • Unità centrale di elaborazione (CPU): esegue le istruzioni del programma.
  • Memorie:
    • Primaria (RAM): volatile, veloce, per dati temporanei.
    • Secondaria (Hard disk, SSD, CD/DVD): permanente, più lenta.
  • Dispositivi di Input/Output: consentono l’interazione con l’utente (mouse, tastiera, monitor, stampante…).

Il Software

Il software è composto da programmi scritti in linguaggi di programmazione e tradotti in linguaggio macchina. Può essere:

  • Applicativo: es. Microsoft Word, browser, videogiochi.
  • Di sistema: sistemi operativi, driver di periferiche.

La programmazione è l’attività di progettazione, sviluppo e verifica di questi programmi.

Programmi

Un programma è una sequenza finita di istruzioni che descrive con precisione un insieme di operazioni da eseguire su determinati dati per ottenere un risultato. Si può considerare come una procedura formale per la risoluzione di un problema, che deve essere definita in modo tale da poter essere eseguita da una macchina. Ogni istruzione di un programma rappresenta un’azione elementare, esprimibile in un linguaggio comprensibile al computer, e contribuisce alla trasformazione degli input in output. Un programma deve essere deterministico (ovvero produrre sempre lo stesso risultato a parità di input) e finito (deve concludersi in un tempo ragionevole).


Eseguire un programma

Perché un programma possa essere eseguito da un elaboratore, esso deve essere codificato in un linguaggio comprensibile alla macchina. Tale linguaggio, detto linguaggio macchina, è costituito da istruzioni binarie specifiche per ciascuna architettura hardware. I programmi scritti in linguaggi ad alto livello (come C, Java, Python) devono essere tradotti in linguaggio macchina mediante strumenti detti compilatori o interpreti. Una volta tradotto, il programma viene caricato in memoria ed eseguito dalla CPU, che legge e interpreta una a una le istruzioni, interagendo con i dispositivi di input/output e la memoria per portare a termine il compito richiesto.


Cucinare vs Programmare

Una metafora efficace per comprendere la programmazione è il paragone con la cucina. Una ricetta culinaria può essere vista come un programma: descrive in maniera dettagliata le operazioni da compiere, nell’ordine corretto, utilizzando determinati ingredienti per ottenere un piatto finale. Allo stesso modo, un programma specifica una sequenza ordinata di istruzioni, utilizzando determinati dati (gli “ingredienti”) per ottenere un risultato (l’”output”). In entrambi i casi, l’esecutore (cuoco o calcolatore) deve seguire le istruzioni in maniera esatta e senza ambiguità. Un errore nella ricetta o nel programma può compromettere l’intero risultato.

Introduzione agli Algoritmi e al Problem Solving

Cos’è un algoritmo

Un algoritmo è una sequenza ordinata e finita di istruzioni non ambigue, progettate per risolvere un problema specifico. È simile a una “ricetta”, che definisce passo dopo passo come raggiungere un obiettivo partendo da determinati dati iniziali.

Caratteristiche fondamentali di un algoritmo

Un algoritmo deve possedere le seguenti proprietà:

  • Non ambiguità: ogni istruzione deve essere chiara e comprensibile senza assunzioni implicite.
  • Eseguibilità: ogni passo deve poter essere eseguito praticamente.
  • Terminazione: deve terminare dopo un numero finito di passi.

Pensare come un programmatore

La programmazione richiede un approccio analitico e sistematico alla risoluzione dei problemi, noto come problem solving. Ciò comporta:

  • Analizzare il problema.
  • Scomporlo in sotto-problemi.
  • Progettare una soluzione sotto forma di algoritmo.
  • Formalizzare l’algoritmo tramite pseudo-codice o diagrammi di flusso.
  • Implementare il codice nel linguaggio di programmazione scelto.

Esempi di algoritmi quotidiani

Esempio 1 – Cucinare la pasta:

  1. Metti l’acqua nella pentola
  2. Accendi il fuoco
  3. Aspetta che bolla
  4. Se l’acqua non bolle, torna al passo 3
  5. Aggiungi la pasta
  6. Aspetta qualche minuto
  7. Assaggia
  8. Se è cruda, torna al passo 6
  9. Scola la pasta

Nota: manca il sale! Anche questa è parte del ragionamento algoritmico.

Esempio 2 – Succo d’arancia:

  1. Prendi un bicchiere dall’armadio
  2. Prendi la bottiglia di succo dal frigorifero
  3. Apri la bottiglia
  4. Versa il succo nel bicchiere
  5. Rimetti la bottiglia nel frigo
  6. Bevi

Problem Solving: esempi formali

Esempio 1 – Maggiore tra due numeri A e B:

1. Se A > B allora max = A
2. Altrimenti max = B

Esempio 2 – Calcolo del MCD tra A e B:

Soluzione informale: provare tutti i divisori comuni. Soluzione formale: utilizzare ad esempio l’algoritmo di Euclide.

Esempio 3 – Scelta tra due automobili:

Input:

  • Prezzo d’acquisto, efficienza (km/l) di entrambe
  • Prezzo al litro: $1.40
  • Km percorsi all’anno: 15.000
  • Durata di utilizzo: 10 anni

Output:

  • Auto più conveniente

Pseudo-codice:

Per ciascuna auto:
  consumo_annuo = km_annui / efficienza
  costo_annuo = consumo_annuo * prezzo_litro
  costo_operativo = costo_annuo * anni
  costo_totale = prezzo_acquisto + costo_operativo

Se costo_totale_auto1 < costo_totale_auto2
  scegli auto1
Altrimenti
  scegli auto2

Esempio: Interessi su conto corrente

Problema: quanti anni servono per raddoppiare un deposito di $10.000 con interesse del 5%?

Pseudo-codice:

anno = 0
saldo = 10000
Finché saldo < 20000:
  anno = anno + 1
  saldo = saldo * 1.05
Restituisci anno

Rappresentazione degli algoritmi

Pseudo-codice

  • Descrizione testuale vicina al linguaggio naturale.
  • Vantaggio: leggibilità.
  • Svantaggio: meno astratto.

Diagrammi di flusso (Flowchart)

  • Rappresentazione grafica con blocchi.
  • Vantaggio: più intuitivo.
  • Svantaggi: richiede simboli specifici; meno adatto a problemi complessi.

Dal problema al programma

Una volta formalizzato l’algoritmo, la traduzione in codice è relativamente diretta. I linguaggi di programmazione offrono costrutti che corrispondono agli elementi base:

  • Sequenze
  • Condizioni (if)
  • Cicli (while, for)
  • Variabili

Quali linguaggi?

▪ Diversi livelli di astrazione

  • Linguaggi ad alto livello
    • Elementi del linguaggio hanno complessità equivalente ai blocchi dei diagrammi di flusso strutturati (condizionali, cicli,…)
    • Esempi: C, C++, Java, JavaScript, Python, ecc.
    • Indipendenti dall’hardware
  • Linguaggi ‘assembler’
    • Elementi del linguaggio sono istruzioni microarchitetturali
    • Fortemente dipendenti dall’hardware
    • Esempio: Linguaggio Assembler del microprocessore Intel Core

Le istruzioni nei linguaggi di programmazione

I linguaggi di programmazione offrono un insieme di istruzioni che permettono di descrivere le operazioni da eseguire in un algoritmo. Queste istruzioni vengono successivamente tradotte in codice macchina, ovvero in una forma comprensibile per l’elaboratore.

Possiamo distinguere le istruzioni in diverse categorie:

▸ Pseudo-istruzioni

Le pseudo-istruzioni sono direttive rivolte al compilatore o all’interprete, piuttosto che istruzioni eseguibili direttamente dal processore. Non producono codice macchina, ma influenzano il comportamento della traduzione del programma.
Esempio: direttive per l’inclusione di librerie o la definizione di macro.

▸ Istruzioni elementari (o primitive)

Le istruzioni elementari corrispondono direttamente a operazioni supportate dall’hardware del computer. Queste includono:

  • Accesso ai dati in memoria
  • Modifica di valori
  • Interazioni con dispositivi di input/output

Sono le unità fondamentali dell’esecuzione e costituiscono la base delle operazioni più complesse.

▸Istruzioni di controllo del flusso

Le istruzioni di controllo permettono di modificare l’ordine di esecuzione delle istruzioni elementari, consentendo la realizzazione di logiche complesse. Queste includono:

  • Condizioni (if, else)
  • Cicli (for, while)
  • Salti (goto, switch, break, continue)

Queste istruzioni sono essenziali per la gestione del flusso logico di un programma e permettono di strutturare l’algoritmo in modo efficiente. Qui un esempio di programma:

Problem Solving: Diagrammi di Flusso (Flow Chart)

Introduzione ai Diagrammi di Flusso

Il diagramma di flusso, o flow chart, è uno strumento grafico utilizzato per rappresentare visivamente la sequenza logica di operazioni necessarie alla risoluzione di un problema. È particolarmente utile nella fase di progettazione di un algoritmo, in quanto consente di visualizzare il flusso delle operazioni e le decisioni da prendere.

Elementi fondamentali

Un diagramma di flusso è costituito da blocchi e frecce:

  • Ogni blocco rappresenta un’azione (input/output, elaborazione, decisione).
  • Le frecce collegano i blocchi e indicano la direzione del flusso dell’elaborazione.

Nota importante: le frecce devono sempre collegare blocchi e mai puntare verso altre frecce. Inoltre, è fondamentale non indirizzare una freccia verso un ramo interno: la struttura deve essere chiara e ordinata.

Struttura di un Flow Chart

Quando si costruisce un flow chart, occorre:

  • Collegare i blocchi di attività, input e output, nella sequenza in cui devono essere eseguiti.
  • Utilizzare un rombo per rappresentare una decisione condizionale, che presenta sempre due uscite (es. sì/no, vero/falso).
  • In caso di condizioni con più di due alternative, si utilizzeranno più blocchi decisionali collegati in cascata.

Flow Chart Condizionali

Caso studio: Spese di spedizione

Supponiamo di dover rappresentare graficamente il calcolo delle spese di spedizione in base alla destinazione geografica:

  • $5 per spedizioni negli Stati Uniti continentali (48 States).
  • $10 per spedizioni verso Hawaii e Alaska.
  • $10 per spedizioni internazionali (extra-USA).

In questo caso, il flow chart sarà composto da tre rami alternativi:

  • Ramo “48 States”
  • Ramo Hawaii/Alaska
  • Ramo Internazionale

Errore da evitare: mai incrociare i rami!

Un errore comune nella costruzione di diagrammi di flusso è quello di far incrociare visivamente le frecce che rappresentano i diversi rami decisionali. Questo compromette la leggibilità del diagramma e può causare confusione nell’interpretazione.

✅Soluzione corretta: flow chart chiaro e ben strutturato, con rami distinti che non si incrociano, ognuno ben identificato in base alla condizione.


Scelte e Decisioni Complesse

I diagrammi di flusso diventano particolarmente importanti quando il problema da risolvere prevede molteplici scelte o decisioni articolate.

Caso reale: Aeroporto di Denver (1993)

Un esempio emblematico riguarda il sistema automatizzato di gestione bagagli del nuovo aeroporto di Denver:

  • Il sistema doveva leggere le etichette dei bagagli, ordinarli, instradarli verso i nastri trasportatori e caricarli automaticamente.
  • L’intero processo era stato progettato per sostituire gli operatori umani con carrelli robotizzati.

Risultato:

  • Il sistema fallì clamorosamente.
  • L’aeroporto non poté aprire finché il sistema non fu sostituito.
  • Il ritardo durò oltre un anno.
  • Il costo finale superò 1 miliardo di dollari.
  • L’azienda responsabile del progetto dichiarò bancarotta.

Questo caso sottolinea come una mancata gestione efficace della complessità logica possa portare a conseguenze gravissime, anche in progetti ad alta tecnologia.


Esercizio Applicativo

Scenario: Fred vende mazzi di fiori in un centro commerciale. Il suo capo, Joe, vuole sapere in qualsiasi momento:

  • Quanti mazzi sono stati venduti.
  • Il valore del mazzo più costoso venduto.
  • Il valore del mazzo meno costoso.
  • Il valore medio dei mazzi venduti.

📌 Obiettivo: progettare un diagramma di flusso che permetta di raccogliere, elaborare e restituire queste informazioni.

Come Disegnare ed Eseguire un Diagramma di Flusso

Una volta compresa la logica e la struttura di un flow chart, è importante imparare come disegnarlo correttamente e, ove possibile, eseguirlo per verificarne il funzionamento.

📝 Strumenti per la progettazione

I diagrammi di flusso possono essere realizzati con diversi strumenti, a seconda del contesto e della complessità del problema:

✅ Metodo tradizionale

  • Carta e penna: ideale per diagrammi semplici, bozze rapide o per esercitazioni individuali.
  • Visualizzazione mentale: utile in fase di progettazione, soprattutto per algoritmi brevi e lineari.

🧩 Software di disegno generico

Per una rappresentazione più precisa e ordinata, si possono utilizzare strumenti digitali:

  • Lucidchart: piattaforma online versatile per diagrammi di flusso e altri tipi di rappresentazione visuale.
  • Diagrams.net / Draw.io: gratuito, intuitivo e integrabile con Google Drive e GitHub.
  • SmartDraw: potente strumento per diagrammi professionali, utile anche in ambito aziendale.
  • Microsoft Visio: uno dei software più noti in ambito aziendale per la creazione di flow chart, parte della suite Microsoft 365.

🎓 Software didattici specifici

Esistono anche strumenti sviluppati appositamente per l’insegnamento e l’apprendimento degli algoritmi, che integrano funzionalità aggiuntive:

  • Controllo automatico della struttura: avvisi in caso di errori logici o strutturali.
  • Esecuzione simulata dell’algoritmo: permette di “vedere” passo dopo passo come si sviluppa il flusso delle istruzioni, utile per la didattica.

Uno dei più noti è:

🔧 Flowgorithm

Flowgorithm è un’applicazione gratuita, progettata specificamente per gli studenti. Le sue caratteristiche principali includono:

  • Interfaccia visuale semplice e intuitiva.
  • Supporto per l’esecuzione simulata del diagramma.
  • Conversione automatica in codice (es. Python, C++, Java, ecc.).
  • Ottimo per esercitarsi e comprendere il comportamento di un algoritmo passo dopo passo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *