Skip to content

Latest commit

 

History

History
515 lines (307 loc) · 17.1 KB

102_corso_fondamenti.md

File metadata and controls

515 lines (307 loc) · 17.1 KB

logo

"Fondamenti di Programmazione: Introduzione al Pensiero Logico e alla Scrittura di Codice"

Mauro Bogliaccino


Le variabili

Le variabili sono contenitori di dati utilizzati per memorizzare informazioni all'interno di un programma. Ogni variabile ha un nome univoco, un tipo di dato e un valore associato. In sostanza, le variabili permettono di conservare e manipolare dati durante l'esecuzione di un programma.


Caratteristiche delle variabili


  1. Nome Univoco: Ogni variabile deve avere un nome univoco all'interno del contesto del programma.

  1. Tipo di Dato: Le variabili hanno un tipo di dato associato che specifica il tipo di valore che possono memorizzare (es. numeri interi, numeri in virgola mobile, stringhe di testo, booleani, etc.).

  1. Assegnazione e Memorizzazione: Le variabili vengono create assegnandogli un nome e un valore iniziale, che viene memorizzato fino a quando non viene modificato.

Esempio di dichiarazione e utilizzo di variabili

In molti linguaggi di programmazione, la dichiarazione di una variabile coinvolge la specifica del suo tipo e del suo nome. Ecco un esempio in linguaggio Python:

# Dichiarazione e assegnazione di variabili
numero_intero = 10  # Esempio di variabile intera
numero_virgola = 3.14  # Esempio di variabile in virgola mobile
testo = "Ciao Mondo!"  # Esempio di variabile stringa

# Utilizzo delle variabili
print(numero_intero)  # Output: 10
print(numero_virgola)  # Output: 3.14
print(testo)  # Output: Ciao Mondo!

Nell'esempio, vengono dichiarate tre variabili: numero_intero, numero_virgola, e testo, ciascuna con un valore associato. Successivamente, vengono utilizzate stampandone i valori.


Tipi comuni di variabili

  • Intero (Integer): Memorizza numeri interi senza parte decimale.
  • In virgola mobile (Float): Memorizza numeri con la parte decimale.
  • Stringa (String): Memorizza sequenze di caratteri.
  • Booleano (Boolean): Memorizza valori logici (vero/falso, true/false).

Le variabili sono essenziali nella programmazione poiché consentono di immagazzinare e manipolare dati, rendendo possibile la gestione dinamica delle informazioni durante l'esecuzione del programma.


Le costanti

Le costanti sono simili alle variabili, ma differiscono per il fatto che il loro valore non può essere modificato una volta assegnato. Sono utilizzate per rappresentare valori immutabili o fissi all'interno di un programma. Nei diversi linguaggi di programmazione, le costanti possono essere definite in modi leggermente diversi, ma in generale, il loro valore non cambia durante l'esecuzione del programma.


Caratteristiche delle costanti


  1. Valore Immutabile: Una volta assegnato un valore, una costante non può essere modificata durante l'esecuzione del programma.

  1. Dichiarazione e Utilizzo: Le costanti vengono dichiarate e utilizzate in modo simile alle variabili, ma con la differenza che il loro valore non può essere modificato.

  1. Nomi Esplicativi: Si consiglia di assegnare nomi significativi alle costanti per una migliore comprensione del codice.

Esempio di costante in diversi linguaggi


In Python

# Definizione di una costante
PI_GRECO = 3.14159

# Utilizzo della costante
raggio = 5
area_cerchio = PI_GRECO * (raggio ** 2)
print(area_cerchio)  # Output: 78.53975

In C

#include <stdio.h>

// Dichiarazione di una costante
#define PI_GRECO 3.14159

int main() {
    // Utilizzo della costante
    int raggio = 5;
    float area_cerchio = PI_GRECO * (raggio * raggio);
    printf("%f", area_cerchio);  // Output: 78.53975
    return 0;
}

Nell'esempio di Python, la costante PI_GRECO rappresenta il valore di π e viene utilizzata per calcolare l'area di un cerchio. In C, le costanti possono essere definite utilizzando #define prima del corpo principale del codice.

Le costanti sono utili quando si desidera utilizzare valori che non dovrebbero essere modificati durante l'esecuzione del programma. Questo può migliorare la chiarezza del codice e aiutare a evitare errori dovuti a modifiche non intenzionali dei valori.


Le espressioni

Le espressioni sono combinazioni di valori, variabili, operatori e chiamate a funzioni che possono essere valutate e risolte in un unico valore. Sono la base della programmazione e costituiscono i blocchi di costruzione di qualsiasi linguaggio di programmazione.


Caratteristiche delle espressioni


  1. Valori e Variabili: Possono includere costanti, numeri, stringhe, variabili o valori derivati da altre espressioni.

  1. Operatori: Utilizzano operatori come +, -, *, /, %, =, etc., per eseguire operazioni su valori o variabili.

  1. Chiamate a Funzioni: Le espressioni possono includere chiamate a funzioni che restituiscono un valore.

Esempi di espressioni


In JavaScript

let a = 5;
let b = 3;

let somma = a + b;  // Espressione che utilizza l'operatore di addizione
let espressioneComplessa = (a * b) / (a - b) + Math.sqrt(a);  // Espressione più complessa

In Python

a = 5
b = 3

somma = a + b  # Espressione che utilizza l'operatore di addizione
espressione_complessa = (a * b) / (a - b) + pow(a, 0.5)  # Espressione più complessa con la funzione pow

Le espressioni possono essere semplici, coinvolgendo solo operazioni aritmetiche di base, o possono essere più complesse coinvolgendo operatori e funzioni più avanzate.

Le espressioni sono fondamentali nella programmazione in quanto consentono di eseguire calcoli, confronti e operazioni su dati. Sono ampiamente utilizzate nelle istruzioni di assegnazione, nelle condizioni delle istruzioni di controllo del flusso e in molti altri contesti all'interno dei programmi.


Lo scope delle variabili

Lo "scope" o "ambito di visibilità" in programmazione si riferisce alla porzione del codice in cui una variabile o una funzione sono accessibili e utilizzabili. Ogni linguaggio di programmazione definisce le regole per lo scope, determinando dove e quando le variabili possono essere accedute o modificate.


Caratteristiche dello scope


  1. Scope Locale: Una variabile dichiarata all'interno di una funzione è di solito visibile solo all'interno di quella funzione. Viene chiamata variabile locale.

  1. Scope Globale: Una variabile dichiarata al di fuori di tutte le funzioni è spesso accessibile da qualsiasi parte del programma. Viene chiamata variabile globale.

  1. Scope di Blocchi: In alcuni linguaggi, come C, C++, Java o JavaScript, lo scope è determinato da blocchi di codice racchiusi tra parentesi graffe {}. Le variabili definite all'interno di un blocco sono visibili solo all'interno di quel blocco.

  1. Innesto degli Scope: All'interno di una funzione, una variabile locale può nascondere una variabile globale con lo stesso nome. In tal caso, la variabile locale avrà la precedenza all'interno della funzione.

Esempio di scope in diversi linguaggi


In JavaScript

let a = 10; // Variabile globale

function miaFunzione() {
    let b = 5; // Variabile locale
    console.log(a); // Accesso alla variabile globale a
    console.log(b); // Accesso alla variabile locale b
}

miaFunzione();
console.log(a); // Accesso alla variabile globale a al di fuori della funzione
console.log(b); // Errore: variabile b non definita in questo scope

In C++

#include <iostream>
using namespace std;

int a = 10; // Variabile globale

void miaFunzione() {
    int b = 5; // Variabile locale
    cout << a << endl; // Accesso alla variabile globale a
    cout << b << endl; // Accesso alla variabile locale b
}

int main() {
    miaFunzione();
    cout << a << endl; // Accesso alla variabile globale a dal main
    cout << b << endl; // Errore: variabile b non definita in questo scope
    return 0;
}

La comprensione dello scope è fondamentale per scrivere codice corretto e evitare errori, specialmente quando si tratta di variabili e funzioni. Assicurarsi di comprendere chiaramente dove e quando una variabile è visibile e utilizzabile all'interno del codice è essenziale per il buon funzionamento di un programma.


I tipi di dato

I tipi di dati rappresentano le varie categorie di informazioni che possono essere utilizzate in un programma. Ogni linguaggio di programmazione fornisce una serie di tipi di dati predefiniti che determinano il tipo di valore che può essere memorizzato in una variabile o costante. La gestione dei tipi di dati può variare da un linguaggio all'altro, e ci sono differenze significative nella rappresentazione e nella gestione dei dati.


Tipi comuni di dati


  1. Numeri Intero (Integer): Memorizza numeri interi senza parte decimale.

  1. Numeri in Virgola Mobile (Float/Double): Memorizza numeri con la parte decimale.

  1. Stringhe (String): Memorizza sequenze di caratteri.

  1. Booleani (Boolean): Memorizza valori logici (vero/falso, true/false).

  1. Caratteri (Char): Memorizza singoli caratteri, come lettere o simboli.

Differenze nella gestione dei tipi di dati tra i linguaggi


  1. Tipizzazione Statica e Dinamica:
    • Alcuni linguaggi (come Java, C, C++) richiedono la dichiarazione esplicita del tipo di dato per ogni variabile. Questo è noto come tipizzazione statica.
    • Altri linguaggi (come JavaScript, Python) consentono ai tipi di essere determinati dinamicamente durante l'esecuzione del programma. Questo è noto come tipizzazione dinamica.

  1. Fortemente o Debolmente Tipizzato:
    • I linguaggi fortemente tipizzati (come Java, C#) richiedono che i tipi siano rigorosamente rispettati durante le operazioni.
    • I linguaggi debolmente tipizzati (come JavaScript) sono più flessibili e possono eseguire conversioni automatiche tra i tipi.

  1. Dimensione dei Tipi di Dati:
    • I linguaggi differiscono nella dimensione dei tipi di dati. Ad esempio, in alcuni linguaggi un intero può essere di 4 byte, mentre in altri può essere di 2 byte.

  1. Trattamento dei Dati complessi:
    • Alcuni linguaggi forniscono tipi di dati complessi incorporati come liste, mappe, tuple, insiemi, ecc., mentre altri possono richiedere l'uso di librerie esterne per questo scopo.

  1. Gestione della Memoria:
    • Alcuni linguaggi gestiscono direttamente la memoria e richiedono un'allocazione e un rilascio espliciti, mentre altri gestiscono la memoria automaticamente (ad es. garbage collection).

regole per la gestione dei tipi

Ogni linguaggio ha le proprie regole per la gestione dei tipi di dati, e queste differenze possono influenzare il modo in cui i programmatori scrivono e gestiscono il codice. Comprendere queste differenze è fondamentale per scrivere codice efficiente e comprensibile in diversi contesti di sviluppo.


Il WorkFlow

Il termine "workflow" si riferisce alla sequenza di passaggi, azioni, attività o processi che vengono eseguiti in un'organizzazione, in un sistema o in un ambiente di lavoro per raggiungere un obiettivo specifico. Questi flussi di lavoro possono essere manuali, automatizzati o una combinazione di entrambi e sono progettati per gestire, coordinare e ottimizzare le attività all'interno di un'organizzazione.


Caratteristiche dei workflow


  1. Sequenza di Attività: I workflow definiscono un insieme di attività che devono essere eseguite in un ordine specifico per raggiungere uno scopo o un obiettivo.

  1. Assegnazione delle Responsabilità: Ogni attività all'interno di un workflow può essere assegnata a individui specifici o a ruoli all'interno dell'organizzazione.

  1. Controllo del Flusso: Il workflow può includere regole o logiche che determinano come le attività vengono attivate, eseguite e completate.

  1. Automazione e Monitoraggio: In alcuni casi, i workflow possono essere automatizzati tramite software o strumenti specifici. Inoltre, è possibile monitorare il progresso delle attività all'interno del workflow.

Esempi di workflow

  • Processo di Approvazione di un Documento: Include la creazione di un documento, l'invio per revisione, l'approvazione da parte di vari utenti e la pubblicazione finale.

  • Gestione delle Richieste Clienti: Dal momento in cui una richiesta viene ricevuta, passa attraverso varie fasi come l'assegnazione a dipendenti, l'elaborazione, il controllo di qualità e la risposta al cliente.

  • Flusso di Lavoro Editoriale: Dal momento in cui un autore invia un articolo, passa attraverso la revisione, la modifica, la formattazione, la pubblicazione e la distribuzione.


Importanza dei workflow

I workflow sono cruciali per l'efficienza operativa, l'ottimizzazione dei processi e la gestione delle attività all'interno di un'organizzazione. Quando ben progettati e implementati, possono contribuire a:

  • Ridurre gli errori e le duplicazioni.
  • Migliorare i tempi di risposta e di esecuzione delle attività.
  • Assegnare responsabilità e monitorare lo stato delle attività.
  • Automatizzare processi ripetitivi.
  • Migliorare la collaborazione e la comunicazione tra i membri del team.

La progettazione e l'ottimizzazione dei workflow sono fondamentali per mantenere un'organizzazione efficiente, produttiva e in grado di gestire efficacemente le attività quotidiane.


Il controllo del flusso

Le logiche di controllo del flusso sono utilizzate nella programmazione per gestire il flusso di esecuzione delle istruzioni in base a condizioni specifiche. Queste logiche controllano l'ordine in cui le istruzioni vengono eseguite all'interno di un programma. Le principali logiche di controllo del flusso includono:


1. Istruzioni Condizionali

  • IF-ELSE: Esegue un blocco di istruzioni se una condizione è vera e un altro blocco se è falsa.
  • SWITCH-CASE: Valuta un'espressione e esegue istruzioni in base al valore della variabile.

Esempio in JavaScript (IF-ELSE)

let numero = 10;

if (numero > 0) {
    console.log("Il numero è positivo");
} else if (numero === 0) {
    console.log("Il numero è zero");
} else {
    console.log("Il numero è negativo");
}

2. Cicli o Loop

  • FOR: Esegue un blocco di istruzioni per un numero specificato di volte.
  • WHILE: Esegue un blocco di istruzioni fintanto che una condizione è vera.
  • DO-WHILE: Simile al while, ma esegue il blocco di istruzioni almeno una volta, indipendentemente dalla condizione.

Esempio in C (FOR Loop)

#include <stdio.h>

int main() {
    for (int i = 0; i < 5; i++) {
        printf("%d ", i);
    }
    return 0;
}

3. Istruzioni di Salto

  • BREAK: Esce da un ciclo o uno switch.
  • CONTINUE: Salta il resto del ciclo attuale e passa alla successiva iterazione.
  • RETURN: Restituisce il controllo alla chiamata della funzione e termina la funzione.

Esempio in Python (BREAK e CONTINUE)

for i in range(10):
    if i == 3:
        continue  # Salta l'iterazione corrente quando i = 3
    if i == 7:
        break  # Esce dal ciclo quando i = 7
    print(i, end=" ")  # Output: 0 1 2 4 5 6

Queste logiche di controllo del flusso sono fondamentali per dirigere il flusso di esecuzione delle istruzioni all'interno di un programma. Consentono al programmatore di gestire condizioni, cicli e decisioni, rendendo il codice più flessibile, efficiente e adattabile alle diverse situazioni.


Le funzioni

Le funzioni o procedure rappresentano blocchi di istruzioni riutilizzabili e auto-contenuti all'interno di un programma. Sono utilizzate per eseguire compiti specifici quando vengono chiamate da altre parti del codice. Le funzioni consentono di organizzare il codice in unità più gestibili e modulari, migliorando la leggibilità, la manutenibilità e la riutilizzabilità del codice.


Caratteristiche delle funzioni:


  1. Nome e Parametri: Ogni funzione ha un nome che la identifica e può accettare zero o più parametri (input) necessari per eseguire il suo compito.

  1. Corpo della Funzione: Il corpo della funzione contiene un blocco di istruzioni che viene eseguito quando la funzione è chiamata.

  1. Valore di Ritorno: Molte funzioni restituiscono un valore come risultato dell'elaborazione. Questo valore può essere di qualsiasi tipo, come un numero, una stringa, un oggetto, o anche nulla.

Esempio di funzione in diversi linguaggi:


In JavaScript:

// Definizione di una funzione
function saluta(nome) {
    return "Ciao, " + nome + "!";
}

// Chiamata alla funzione
let messaggio = saluta("Marco");
console.log(messaggio);  // Output: Ciao, Marco!

In Python:

# Definizione di una funzione
def saluta(nome):
    return "Ciao, " + nome + "!"

# Chiamata alla funzione
messaggio = saluta("Alice")
print(messaggio)  # Output: Ciao, Alice!

Le funzioni sono utili per dividere un programma in sezioni più piccole e gestibili, permettendo ai programmatori di scrivere una logica specifica una sola volta e utilizzarla in molteplici contesti. Questo concetto di riutilizzo del codice è fondamentale per la scrittura di programmi efficienti e manutenibili.