introduzione alla programmazione (Caravagna e Russo)

Programmazione in C

Nozioni Fondamentali

  • Programma: Un insieme di istruzioni che descrivono un algoritmo per calcolare un risultato (output) a partire da dati iniziali (input). Un programma può essere pensato come una funzione matematica.
  • Computazione: L’esecuzione di un programma, che comporta modifiche successive al suo stato interno.
  • Variabile: Un nome associato a un valore modificabile.
  • Stato: L’insieme delle variabili e i loro valori in un dato momento durante l’esecuzione di un programma.
  • Assegnamento: Istruzione che modifica il valore di una variabile. nome_variabile = espressione;
  • Espressione: Combinazione di variabili, costanti, operatori e funzioni che produce un valore.
  • Ambiente e Memoria: L’ambiente mappa le variabili agli indirizzi di memoria, mentre la memoria memorizza i valori a quegli indirizzi. Lo stato di un programma è definito dalla coppia ambiente-memoria.
  • Dichiarazione di Variabile: tipo nome_variabile; o tipo nome_variabile = espressione;
  • Tipi di Dato: int, float, double, char, etc.

Istruzioni Condizionali e Iterative

  • Istruzione if: Esegue un blocco di codice solo se una condizione è vera. if (condizione) { ... } else { ... }
  • Espressioni Logiche: Usano operatori di confronto (<, >, <=, >=, ==, !=) e operatori logici (&&, ||, !).
  • Istruzione while: Esegue un blocco di codice ripetutamente finché una condizione è vera. while (condizione) { ... }
  • Istruzione for: Esegue un blocco di codice un numero determinato di volte. for (inizializzazione; condizione; aggiornamento) { ... }
  • Blocchi di Codice e Pile di Frame: I blocchi di codice definiscono lo scope delle variabili. La pila di frame tiene traccia dello stato di esecuzione dei blocchi, implementando il meccanismo LIFO (Last In, First Out).

Funzioni

  • Definizione di Funzione: tipo_ritorno nome_funzione(tipo_argomento_1 nome_argomento_1, ...) { ... }
  • Passaggio di Parametri: In C, il passaggio di parametri avviene per valore. Si può simulare il passaggio per riferimento usando i puntatori.
  • Funzioni Ricorsive: Funzioni che chiamano sé stesse. Devono avere un caso base per terminare la ricorsione.

Puntatori

  • Definizione: Variabili che contengono indirizzi di memoria. tipo *nome_puntatore;
  • Operatore & (Address of): Restituisce l’indirizzo di una variabile.
  • Operatore * (Dereferenziazione): Accedi al valore memorizzato all’indirizzo puntato da un puntatore.
  • Passaggio per Indirizzo: Passare un puntatore a una funzione permette di modificare il valore della variabile originale.

Array (Vettori)

  • Dichiarazione: tipo nome_array[dimensione];
  • Indicizzazione: Inizia da 0. nome_array[indice]
  • Array e Puntatori: In C, il nome di un array è un puntatore al suo primo elemento.
  • Aritmetica dei Puntatori: Si possono usare operatori aritmetici su puntatori per accedere ad elementi di un array.

Stringhe

  • Rappresentazione: Array di caratteri terminati da \0.
  • Funzioni: scanf("%s", nome_stringa), printf("%s", nome_stringa)

Memoria Dinamica

  • malloc: Alloca memoria nello heap. void* malloc(size_t size);
  • free: Dealloca memoria allocata con malloc. void free(void *ptr);
  • Memory Leak: Memoria allocata che non viene deallocata, causando spreco di risorse.

Liste Linkate

  • Struttura: Nodi collegati tramite puntatori. Ogni nodo contiene un valore e un puntatore al nodo successivo.
  • Operazioni: Inserimento, cancellazione, ricerca, etc.
  • Vantaggi: Dimensione dinamica, facile inserimento e cancellazione.
  • Svantaggi: Accesso sequenziale (non diretto).

Programmazione ad Oggetti in Python

Classi e Oggetti

  • Classi: Template per creare oggetti.
  • Oggetti: Istanze di una classe.
  • Attributi: Variabili associate ad un oggetto.
  • Metodi: Funzioni associate ad un oggetto.
  • __init__ (Costruttore): Metodo speciale chiamato quando si crea un oggetto.
  • self: Riferimento all’istanza corrente dell’oggetto.
  • Magic Methods (Dunder Methods): Metodi speciali con nomi che iniziano e finiscono con doppio underscore (e.g., __str__, __repr__, __init__, __iter__, __next__).

Ereditarietà

  • Sottoclasse: Classe che eredita da un’altra classe (superclasse).
  • Superclasse: Classe da cui eredita una sottoclasse.
  • super(): Funzione per accedere ai metodi della superclasse.
  • Overriding: Ridefinire un metodo della superclasse nella sottoclasse.

Classi Astratte

  • Definizione: Classi che non possono essere istanziate direttamente. Servono come base per altre classi.
  • abstractmethod: Decoratore per definire metodi astratti (metodi senza implementazione).

List Comprehensions

  • Sintassi: [espressione for elemento in iterabile if condizione]
  • Utilizzo: Creare liste in modo conciso ed efficiente.

Iteratori

  • __iter__: Metodo speciale che restituisce un iteratore.
  • __next__: Metodo speciale che restituisce il prossimo elemento dell’iteratore.
  • StopIteration: Eccezione sollevata quando l’iteratore non ha più elementi.