Formulario - fondamenti di informatica
In questa pagina 11
Il calcolatore e i linguaggi
Note: Struttura di un elaboratoreModello di von Neumann: CPU, memoria centrale, bus e periferiche; ciclo fetch-decode-execute e gerarchia di memoria.Struttura di un elaboratore → · Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati → · Paradigmi di programmazione e linguaggiAlgoritmo e programma; paradigmi imperativo, procedurale, a oggetti, funzionale e dichiarativo; compilazione e interpretazione; confronto tra Python e C.Paradigmi di programmazione e linguaggi →
- Ciclo fetch-decode-execute: il PC contiene l'indirizzo della prossima istruzione, il fetch la copia nell'IR e incrementa il PC; un salto scrive un nuovo valore nel PC. Con bit si indirizzano celle da 1 byte.
| Livello | Tempo di accesso |
|---|---|
| Registri | ns |
| Cache L1/L2/L3 | 1-20 ns |
| RAM | circa 100 ns |
| SSD | circa 100 µs |
| HDD | circa 10 ms |
- Base : ; prefissi
0b,0o(Python) o0(C),0x; . Decimale binario con divisioni per 2 e resti letti dal basso; binario esadecimale a gruppi di 4 bit. Con bit: configurazioni. - Senza segno (overflow = troncamento modulo ). Complemento a 2: , intervallo (8 bit: ), opposto = inverti i bit e somma 1; overflow se due operandi dello stesso segno danno un risultato di segno opposto.
Grafico interattivo: Valore interpretato in complemento a 2 su 8 bit in funzione del codice (0…255): da 0 a 127 coincide con il valore senza segno, da 128 (10000000 = −128) a 255 (11111111 = −1) vale codice − 256; l'intervallo è asimmetrico, −128 … 127
| Formato IEEE 754 | Bit | Segno | Esponente | Mantissa | Cifre decimali |
|---|---|---|---|---|---|
singola (float C) |
32 | 1 | 8 (bias 127) | 23 | 7 |
doppia (float Python, double C) |
64 | 1 | 11 (bias 1023) | 52 | 15-16 |
- . Esatti solo i numeri ( è approssimato): mai
==tra float, usaremath.isclose. Valori specialiinf,-inf,nan(nan != nan). ASCII 7 bit ('A'=65,'a'=97,'0'=48); UTF-8 1-4 byte. - Python: interpretato (bytecode), tipi dinamici ma forti, memoria con garbage collection, blocchi per indentazione, interi a precisione arbitraria. C: compilato, tipi statici, memoria manuale (
malloc/free), blocchi tra graffe, interi di dimensione fissa. Paradigmi: imperativo, procedurale, a oggetti, funzionale, dichiarativo.
Python: variabili, tipi ed espressioni
Note: Eseguire un programma PythonInterprete interattivo e script .py, struttura di un file Python, indentazione, commenti, istruzioni ed espressioni, errori di sintassi.Eseguire un programma Python → · Variabili, oggetti e riferimentiIn Python una variabile è un nome legato a un oggetto; tipo, identità e valore; assegnamento, aliasing, oggetti mutabili e immutabili, None.Variabili, oggetti e riferimenti → · Tipi numerici ed espressioniint, float, complex e bool; operatori aritmetici con divisione intera e modulo; precedenza; conversioni di tipo; modulo math e arrotondamenti.Tipi numerici ed espressioni →
- Un nome si riferisce a un oggetto con tipo, identità (
id) e valore. Immutabili:int,float,bool,complex,str,tuple,frozenset,None; mutabili:list,dict,set.b = acon una lista crea un alias; copia superficialea[:],a.copy(),list(a); annidatacopy.deepcopy.a == bconfronta i valori,a is bl'identità (quasi solo conNone).
| Operatore | Significato | 7 op 2 |
-7 op 2 |
|---|---|---|---|
/ |
divisione reale, sempre float |
3.5 |
-3.5 |
// |
divisione intera (verso ) | 3 |
-4 |
% |
resto, segno del divisore | 1 |
1 |
** |
potenza | 49 |
- Sempre
a == (a // b) * b + a % b. Precedenza:**(associativo a destra),+x/-x,* / // %,+ -, confronti,not,and,or.n % 10ultima cifra,n // 10senza l'ultima,divmod(135, 60)(2, 15).int(3.99)3;round(2.5)2(arrotonda al pari);math.floor(-2.5),ceil,trunc.^è lo XOR, non la potenza. - Errori: sintassi (
SyntaxError, file non eseguito), a tempo di esecuzione (eccezione con traceback), logici.input()restituisce semprestr.
Decisioni e cicli
Note: Logica booleana e istruzione ifValori di verità, operatori di confronto e logici con valutazione a corto circuito, leggi di De Morgan, truthiness; if/elif/else, espressione condizionale e match.Logica booleana e istruzione if → · Ciclo whileCiclo while, cicli controllati da contatore, da sentinella e da condizione; break, continue, else; terminazione e invariante di ciclo.Ciclo while → · Ciclo for e rangefor scorre gli elementi di un iterabile; range per gli indici; enumerate, zip, reversed, sorted; cicli annidati; quando usare for e quando while.Ciclo for e range →
- De Morgan: , . Corto circuito:
A and Bnon valutaBseAè falso,A or Bnon valutaBseAè vero. Falsi:False,None,0,0.0,"",[],(),{},set(). Confronti concatenabili0 <= x < 10.
if cond1:
...
elif cond2:
...
else:
...
r = vero if cond else falso # espressione condizionale
while condizione: # condizione valutata prima di ogni iterazione
...
for elemento in iterabile: # range(start, stop, step): stop escluso
...breakesce dal ciclo più interno,continuesalta al controllo,elsedel ciclo se non c'è statobreak.range(5),range(2,6),range(5,0,-1);enumerate,zip,reversed,sorted. Euclide:while b != 0: a, b = b, a % b. Terminazione: una quantità intera non negativa che decresce; invariante di ciclo vera prima e dopo ogni iterazione.
Funzioni e moduli
Note: Funzioni in Pythondef e return, parametri posizionali, con nome e con valore predefinito, *args e **kwargs; passaggio per riferimento a oggetto; ambito delle variabili LEGB; docstring, type hint, lambda.Funzioni in Python → · Moduli e libreria standardOgni file .py è un modulo; forme di import; il blocco if name == "main"; moduli della libreria standard più usati (math, random, sys, os, time, collections).Moduli e libreria standard →
| Costrutto | Sintassi essenziale |
|---|---|
| Funzione | def f(a, b=0, *args, **kwargs): ... return x (senza return restituisce None) |
| Più valori | return q, r (tupla), q, r = f(...) |
| Default mutabile | def agg(x, l=None): if l is None: l = [] |
| Ambito LEGB | Locale, Enclosing, Globale, Built-in; global/nonlocal per assegnare |
| Lambda | lambda x: x * x |
| Import | import math, import math as m, from math import sqrt, pi |
| Script | if __name__ == "__main__": main() |
- Passaggio per riferimento a oggetto: riassegnare il parametro non tocca il chiamante, modificare un oggetto mutabile sì. Moduli utili:
math(isclose,gcd),random(randint(a, b)estremi inclusi,choice,shuffle),sys(argv,exit),time.perf_counter(),collections(deque,Counter,defaultdict),csv,copy,unittest.
Stringhe, liste e tuple
Note: Stringhe in Pythonstr come sequenza immutabile di caratteri Unicode; indici e slicing; operatori; metodi principali (split, join, strip, find, replace...); f-string e formattazione; confronto lessicografico.Stringhe in Python → · Liste in Pythonlist come sequenza mutabile (array dinamico); indici, slicing e assegnamento a fette; metodi e loro costo; aliasing, copia superficiale e profonda; list comprehension; liste annidate e matrici.Liste in Python → · Tuple e unpackingtuple come sequenze immutabili; quando usarle al posto delle liste; spacchettamento, scambio, asterisco; tuple come valori di ritorno multipli e come chiavi di dizionario.Tuple e unpacking →
- Stringhe immutabili:
s[i:j]ha lunghezzaj - ie non dà mai errore,s[::-1]rovesciata. Metodi:upper,lower,strip,split(sep),sep.join(seq),find(-1se manca) eindex(ValueError),count,replace,startswith,endswith,isdigit,isalpha. f-string:f"{x:.2f}",f"{42:05d}",f"{0.25:.1%}",f"{nome:<10}". Costruire con"".join(pezzi), non con+=in un ciclo. - Liste:
[x*x for x in range(10) if cond]; matrice corretta[[0] * c for _ in range(r)](con[[0] * c] * rle righe sono la stessa).l.sort()el.reverse()agiscono sul posto e restituisconoNone.
Operazione su list |
Costo |
|---|---|
l[i], l[i] = x, l.pop() |
|
l.append(x) |
ammortizzato |
l.pop(i), l.insert(i, x), l.remove(x) |
|
x in l, l.index(x), l.count(x), min, max, sum |
|
l.sort(), sorted(l) |
|
x in set, d[k] |
medio |
- Tuple:
(5,)per un elemento; unpackingx, y = p,a, b = b, a,primo, *resto = [1, 2, 3, 4],_per ignorare; chiavi di dizionario.
Input/Output ed eccezioni
Note: Input e output da consoleinput() restituisce sempre una stringa da convertire; lettura di più valori su una riga; print con sep, end e file; flussi standard stdin, stdout, stderr e reindirizzamento.Input e output da console → · File di testo in Pythonopen con modalità e codifica, il costrutto with, lettura riga per riga, read e readlines, scrittura con write e print, percorsi relativi, file CSV con il modulo csv.File di testo in Python → · Eccezioni in PythonEccezioni e traceback, eccezioni predefinite più comuni, try/except/else/finally, raise per segnalare errori, propagazione lungo le chiamate.Eccezioni in Python → · File di record e controllo degli errori riga per rigaSchema per leggere un file (o lo standard input) di record, uno per riga: formati con separatore, controllo di ogni riga, messaggi di errore con il numero di riga su standard error, righe da saltare, fine dell'input su riga vuota; versione in Python con split, int, float e eccezioni; versione in C con fgets, sscanf e strtol.File di record e controllo degli errori riga per riga →
n = int(input()),a, b = map(int, input().split()),for riga in sys.stdin:;print(*oggetti, sep=" ", end="\n", file=sys.stderr). Reindirizzamentopython prog.py < dati.txt > risultati.txt.- File:
with open(nome, "r", encoding="utf-8") as f:; modi"r","w"(crea o svuota),"a","x","b";f.read(),f.readline(),f.readlines(),for riga in f;f.write("testo\n")non aggiunge\n. CSV:csv.reader(f),csv.writer(f).writerow([...])connewline="".
| Eccezione | Causa tipica |
|---|---|
NameError |
nome non definito |
TypeError |
operazione su un tipo sbagliato |
ValueError |
valore inammissibile (int("abc")) |
IndexError, KeyError |
indice fuori dalla sequenza, chiave assente |
ZeroDivisionError |
divisione o modulo per zero |
FileNotFoundError |
file inesistente |
RecursionError |
ricorsione troppo profonda (circa 1000 chiamate) |
try:
f = open(nome, encoding="utf-8")
except FileNotFoundError as e:
print("Impossibile aprire:", e)
else:
dati = f.read() # solo se non c'è stata eccezione
finally:
print("fine") # sempre
raise ValueError("media di una lista vuota")- LBYL (controllo preventivo) contro EAFP (prova e gestisci). Riga per riga:
for n, riga in enumerate(f, start=1), riga vuotacontinue, errori susys.stderrcon il numero di riga. In C:fgetsrestituisceNULLa fine file,strtol(s, &fine, 10)segnalafine == so*fine != '\0',sscanfrestituisce i campi letti.
Pattern algoritmici e complessità
Note: Pattern algoritmici iterativiSchemi ricorrenti nei cicli: accumulatore, contatore, massimo e minimo, ricerca con uscita anticipata, verifica universale, filtro e trasformazione, finestra scorrevole, due indici, elaborazione di coppie.Pattern algoritmici iterativi → · RicorsioneFunzioni che chiamano se stesse: caso base e passo ricorsivo, stack delle chiamate, esempi su numeri, stringhe e liste, ricorsione multipla e suo costo, divide et impera, confronto con l'iterazione.Ricorsione → · Complessità computazionaleCosto di un algoritmo in funzione della dimensione dell'input; caso peggiore, migliore e medio; notazione O-grande e classi di crescita; come contare i passi di cicli e ricorsioni; costo delle operazioni Python.Complessità computazionale → · Ricerca lineare e binariaRicerca lineare su sequenze qualsiasi in O(n); ricerca binaria su sequenze ordinate in O(log n), versione iterativa e ricorsiva, invariante e errori di indice; modulo bisect.Ricerca lineare e binaria → · Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →
- Pattern: accumulatore (inizializzato all'elemento neutro), contatore, massimo e minimo (inizializzati al primo elemento, non a 0), ricerca
return Trueal primo riscontro, verifica universalereturn Falseal primo controesempio (any,all), finestra scorrevole, due indici, tutte le coppie con (). - Ricorsione: caso base e passo su input più piccolo, un record di attivazione per chiamata.
fattoriale:n * fattoriale(n - 1).fib(n)ricorsivo: chiamate esponenziali (, ); con memoizzazione (functools.cache) .
Grafico interattivo: Numero di chiamate di fib(n): ricorsione ingenua 2F(n + 1) − 1 ≈ 2φ^(n+1)/√5 − 1 (esponenziale, φ ≈ 1,618; 15 chiamate per n = 5) contro 2n − 1 con la memoizzazione (9 per n = 5, lineare)
- se per ; si tiene il termine dominante; passi in sequenza si sommano, cicli annidati si moltiplicano. Ricorrenze: ; ; ; esponenziale.
| Classe | Nome | Esempio |
|---|---|---|
| costante | v[i], append |
|
| logaritmica | ricerca binaria | |
| lineare | ricerca lineare, somma, massimo | |
| quasi lineare | merge sort, sorted |
|
| quadratica | selection sort, insertion sort | |
| esponenziale | fib ingenuo |
Grafico interattivo: Crescita di n, n·log₂n, n² e 2ⁿ per n da 1 a 10 (numero di operazioni, asse verticale fino a 100): a n = 10 valgono 10, 33, 100 e 1024; l'esponenziale supera il quadrato già da n = 5 e esce dal grafico a n ≈ 6,6
- Ricerca lineare: migliore , peggiore . Ricerca binaria (lista ordinata): , al più iterazioni, invariante "se
xc'è, sta inv[lo..hi]",m = (lo + hi) // 2, aggiornamentilo = m + 1ohi = m - 1;bisect.bisect_left(v, x),bisect.insort(v, x).
| Algoritmo | Peggiore | Migliore | Sul posto | Stabile |
|---|---|---|---|---|
| Selection sort | sì | no | ||
| Insertion sort | sì | sì | ||
| Bubble sort (con flag) | sì | sì | ||
| Merge sort | no | sì |
Grafico interattivo: Confronti al caso pessimo in funzione di n: selection sort e insertion sort fanno n(n−1)/2, il merge sort n·log₂n − n + 1 (esatto per n potenza di 2); a n = 64 sono 2016 contro 321, mentre l'insertion sort su un array già ordinato ne fa solo n − 1 = 63
- Selection sort: confronti sempre. Merge sort: , memoria . Timsort (
sort,sorted): , stabile, su dati già ordinati;sorted(v, key=..., reverse=True). Nessun ordinamento per confronti supera al caso peggiore. - Costi nascosti: slicing,
v.copy(),s + tproporzionali al risultato;x in lista;x in insieme,d[k]medio.
Il linguaggio C
Note: Dal Python al CStruttura di un programma C, compilazione con gcc (preprocessore, compilatore, linker), main e valore di ritorno, dichiarazioni con tipo statico, printf di base; corrispondenze con Python.Dal Python al C → · Tipi, operatori e controllo del flusso in CTipi interi e reali del C con dimensioni e limiti, conversioni implicite e cast, divisione intera, operatori di incremento, logici e bit a bit; if, switch, while, do-while, for, break e continue.Tipi, operatori e controllo del flusso in C → · Funzioni in CDefinizione e prototipo di una funzione C, tipo di ritorno e void, passaggio dei parametri sempre per valore, variabili locali, globali e static, file header e compilazione separata, funzioni ricorsive.Funzioni in C → · Array e stringhe in CArray di dimensione fissa in memoria contigua, inizializzazione, nessun controllo sugli indici, passaggio a funzioni con la lunghezza, matrici; stringhe come array di char terminati da '\0' e funzioni di string.h.Array e stringhe in C → · Input e output in Cprintf con larghezza e precisione, scanf con indirizzi e valore di ritorno, lettura di righe con fgets, file con FILE*, fopen, fclose, fprintf, fscanf, controllo degli errori e della fine del file.Input e output in C →
| Tipo | Dimensione | Intervallo / precisione |
|---|---|---|
char |
1 byte | (o ) |
short |
2 byte | |
int |
4 byte | |
long long |
8 byte | circa |
float |
4 byte | 7 cifre significative |
double |
8 byte | 15-16 cifre significative |
- Compilazione: preprocessore (
#include,#define), compilatore (.c.o), linker;gcc -Wall -Wextra -o prog main.c(-lmper<math.h>). Variabili locali non inizializzate: valore indeterminato. Overflow diint= comportamento indefinito, diunsigned= modulo . Booleani:0falso, altro vero (<stdbool.h>). - Tra interi
/tronca verso zero:7 / 2 == 3,-7 / 2 == -3,-7 % 2 == -1; reale con(double)a / b.i++restituisce il vecchio valore,++iil nuovo. Logici&&,||,!con corto circuito; bit a bit&,|,^,~,<<,>>; condizionalemax = (a > b) ? a : b;.switchsenzabreakprosegue (fall-through);do { ... } while (cond);. - Funzioni: argomenti sempre copiati; per modificare una variabile si passa
&x; prototipo prima dell'uso; header.hcon include guard#ifndef / #define / #endif; localestaticconserva il valore. Mai restituire l'indirizzo di una variabile locale.
| Elemento | Sintassi essenziale |
|---|---|
| Array | int w[5] = {3, 1, 4, 1, 5}; indici da 0 a , nessun controllo; non si assegna né si confronta con ==; la lunghezza va passata alle funzioni |
| Matrice | int m[3][4]; per righe; parametro int m[][4] |
| Stringa | char s[] = "ciao"; (5 byte con '\0'); 'a' è un carattere, "a" una stringa di 2 byte |
<string.h> |
strlen, strcpy, strcat, strcmp (<0, 0, >0), strchr, strstr |
printf |
%d, %ld, %u, %f, %c, %s, %p, %x, %%; %5d, %-5d, %.2f, %8.3f |
scanf |
scanf("%d", &n), %lf per double, scanf("%31s", nome) senza &; restituisce i valori letti o EOF |
| Riga | fgets(riga, sizeof riga, stdin), poi riga[strcspn(riga, "\n")] = '\0';; mai gets |
| File | FILE *f = fopen("dati.txt", "r"); (NULL se fallisce), fscanf, fprintf, fgetc (restituisce int), fclose |
- Lettura corretta:
while (fscanf(f, "%d", &x) == 1)ewhile ((c = fgetc(f)) != EOF), maiwhile (!feof(f)).
Puntatori e memoria in C
Note: Puntatori in CUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C → · Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C → · Strutture (struct) in Cstruct per raggruppare campi di tipo diverso, typedef, accesso con punto e freccia, struct come parametri e valori di ritorno, array di struct, struct allocate dinamicamente e struct autoreferenziali.Strutture (struct) in C → · Ordinare e cercare in C - qsort, bsearch e puntatori a funzionePuntatori a funzione e funzioni di confronto; qsort per ordinare array di interi, stringhe e struct; bsearch per la ricerca binaria; dizionario ordinato su array dinamico di struct con inserimento (memmove e realloc) e ricerca in O(log n).Ordinare e cercare in C - qsort, bsearch e puntatori a funzione →
- Puntatore:
int *p = &x;*p = 20;modificax; inint *p, q;solopè un puntatore. Aritmetica:p + ksposta di byte;v[i]*(v + i); il nome di un array decade a puntatore.const int *p(dato costante),int *const q(puntatore costante),int **ppper modificare un puntatore passato a funzione,p->campo(*p).campo.
| Segmento | Contenuto | Gestione |
|---|---|---|
| Codice | istruzioni | sistema operativo |
| Dati statici | globali, static, letterali |
all'avvio |
| Stack | parametri, locali, indirizzo di ritorno | automatica |
| Heap | memoria dinamica | manuale: malloc/free |
| Funzione | Effetto |
|---|---|
malloc(n * sizeof *v) |
alloca byte non inizializzati; NULL se fallisce |
calloc(n, dim) |
alloca elementi azzerati |
realloc(p, nuovi_byte) |
ridimensiona (può spostare); con un puntatore temporaneo, NULL se fallisce |
free(p) |
libera; free(NULL) non fa nulla; un free per ogni malloc |
- Errori classici: memory leak, dangling pointer, double free, buffer overflow, memoria non inizializzata. Strumenti:
valgrind --leak-check=full ./prog,-fsanitize=address. Array che cresce: an == capsi raddoppia conrealloc, costo totale delle copie . - Struct:
typedef struct { char nome[32]; int matricola; double media; } Studente;campo con., con puntatore->; si assegnano ma non si confrontano con==;sizeofinclude il padding. Autoreferenziale:typedef struct nodo { int valore; struct nodo *succ; } Nodo;. int (*f)(int, int)è un puntatore a funzione.qsort(base, n, sizeof base[0], cmp)concmp(const void *a, const void *b)che restituisce<0,0,>0(maix - y:(x > y) - (x < y)), non stabile, .bsearch(&chiave, base, n, sizeof base[0], cmp)su array ordinato con lo stessocmp.
Tipi di dato astratti
Note: Tipi di dato astrattiUn ADT è definito dalle operazioni e dal loro comportamento, non dalla rappresentazione; interfaccia e implementazione; realizzazione in Python con le classi e in C con header e tipo opaco; esempio di un ADT Frazione.Tipi di dato astratti → · Classi ed ereditarietà in PythonAttributi di istanza e di classe, metodi di istanza, di classe e statici; confronto e ordinamento con eq e lt; proprietà; ereditarietà, super(), override e polimorfismo; classi astratte come interfacce; eccezioni personalizzate; overloading e shadowing in Python.Classi ed ereditarietà in Python → · Pila e codaPila (LIFO) e coda (FIFO) come ADT: operazioni e costi; realizzazione in Python con list e collections.deque; realizzazione in C con array e indici, coda circolare; applicazioni (parentesi bilanciate, stack delle chiamate, visite).Pila e coda → · Liste concatenateLista concatenata semplice: nodi allocati dinamicamente collegati da puntatori; inserimento e rimozione in testa, scorrimento, ricerca, inserimento ordinato, deallocazione; confronto dei costi con l'array; versione in Python.Liste concatenate → · Dizionari e insiemi in PythonADT mappa e insieme; dict con chiavi hashable, accesso, get, iterazione, conteggi e raggruppamenti; set e operazioni insiemistiche; tabelle hash e costo O(1) medio; Counter e defaultdict.Dizionari e insiemi in Python → · Realizzare contenitori su array e listeCome si realizza un ADT contenitore partendo da un array: lunghezza logica e capacità con raddoppio (costo ammortizzato), dizionario su array ordinato con ricerca binaria, coda doppia su array circolare, coda con priorità a livelli, ADT costruiti sopra altri ADT (pila di code, pila reversibile); tabella dei costi.Realizzare contenitori su array e liste →
- ADT = interfaccia (cosa) e implementazione (come e a che costo); incapsulamento e invariante stabilito dal costruttore. Python: classi con
self,__init__,__eq__,__lt__,__str__,@property;super().__init__(...); ereditarietà per is-a; classi astratte conABCe@abstractmethod. C: header con tipo opacotypedef struct frazione *Frazione;e funzioni di creazione e distruzione. - Pila (LIFO):
push,pop,top, tutte ; in Pythonlistconappendepop(). Coda (FIFO):enqueue,dequeue,first, ; in Pythoncollections.deque(append,popleft(), perchélist.pop(0)è ); in C array circolare con indici% CAPe conteggio .
| Operazione | Array | Lista concatenata |
|---|---|---|
| accesso -esimo | ||
| inserimento o rimozione in testa | ||
| ricerca |
- Lista concatenata in C: inserimento in testa
n->succ = *pt; *pt = n;conNodo **pt; cerca finchép != NULL && p->valore != x; rimozione conprec->succ = cur->succefree(cur); deallocazione salvando il successivo prima difree. dict:d[k] = v,d.get(k, 0),k in d,d.pop(k),d.items(), chiavi hashable; frequenzefreq[p] = freq.get(p, 0) + 1,Counter,defaultdict(list).set:{}crea un dizionario,set()l'insieme vuoto; unionea | b, intersezionea & b, differenzaa - b, simmetricaa ^ b. Array che raddoppia: ammortizzato per inserimento, copie totali ; con incremento costante .
Grafico interattivo: Copie totali per m inserimenti in un array che cresce: raddoppiando la capacità restano sotto 2m (O(1) ammortizzato per inserimento), con incremento costante c = 10 crescono come m²/(2c), cioè O(m²)
- Dizionario su array ordinato:
bisect_left,cerca,inserisciecancella. Coda doppia su array circolare: elementoiina[(t + i) % cap]. Coda con priorità a pochi livelli fissi: inserisci , estrai ; con priorità arbitrarie, heap .
Debugging e testing
| Azione | VS Code | pdb (Python) |
gdb (C, -g) |
|---|---|---|---|
| avvio | F5 | python -m pdb prog.py |
gdb ./prog, poi run |
| breakpoint | clic a sinistra | b 12 |
break 12 |
| riga successiva | F10 | n |
next |
| entra in funzione | F11 | s |
step |
| continua | F5 | c |
continue |
| valore | Variabili | p x |
print x |
| call stack | Call Stack | w |
backtrace |
- Metodo: riprodurre con l'input minimo, leggere il messaggio (traceback dal fondo in Python, primo errore in C), formulare un'ipotesi, restringere, correggere la causa e aggiungere un test.
assert condizione, "messaggio"verifica ipotesi interne, non l'input utente (in C si disattiva con-DNDEBUG). Test: casi normali, limite, partizioni, input non validi;unittest(assertEqual,assertRaises),doctest, in C funzioni di test conassert.
Versione ripasso
- Complemento a 2: , intervallo ; opposto = inverti e somma 1 (Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →).
- IEEE 754: ; 32 bit (8+23, bias 127), 64 bit (11+52, bias 1023); mai
==tra float (Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →). - Divisione:
a == (a // b) * b + a % b;//verso ; in C/tronca verso zero (Tipi numerici ed espressioniint, float, complex e bool; operatori aritmetici con divisione intera e modulo; precedenza; conversioni di tipo; modulo math e arrotondamenti.Tipi numerici ed espressioni →). - De Morgan: ; corto circuito di
andeor(Logica booleana e istruzione ifValori di verità, operatori di confronto e logici con valutazione a corto circuito, leggi di De Morgan, truthiness; if/elif/else, espressione condizionale e match.Logica booleana e istruzione if →). - Euclide:
while b != 0: a, b = b, a % b(Ciclo whileCiclo while, cicli controllati da contatore, da sentinella e da condizione; break, continue, else; terminazione e invariante di ciclo.Ciclo while →). - Funzioni:
def f(a, b=0, *args, **kwargs); ambito LEGB; default mutabileNone(Funzioni in Pythondef e return, parametri posizionali, con nome e con valore predefinito, *args e **kwargs; passaggio per riferimento a oggetto; ambito delle variabili LEGB; docstring, type hint, lambda.Funzioni in Python →). - Liste:
appendammortizzato,insert(0),pop(0),in;sort(Liste in Pythonlist come sequenza mutabile (array dinamico); indici, slicing e assegnamento a fette; metodi e loro costo; aliasing, copia superficiale e profonda; list comprehension; liste annidate e matrici.Liste in Python →). - File ed eccezioni:
with open(...),"w"svuota;try/except/else/finally,raise(Eccezioni in PythonEccezioni e traceback, eccezioni predefinite più comuni, try/except/else/finally, raise per segnalare errori, propagazione lungo le chiamate.Eccezioni in Python →). - Complessità: ; ;
fibingenuo esponenziale (Complessità computazionaleCosto di un algoritmo in funzione della dimensione dell'input; caso peggiore, migliore e medio; notazione O-grande e classi di crescita; come contare i passi di cicli e ricorsioni; costo delle operazioni Python.Complessità computazionale →). - Ricerca binaria: invariante
xinv[lo..hi], al più iterazioni (Ricerca lineare e binariaRicerca lineare su sequenze qualsiasi in O(n); ricerca binaria su sequenze ordinate in O(log n), versione iterativa e ricorsiva, invariante e errori di indice; modulo bisect.Ricerca lineare e binaria →). - Ordinamento: selection ; insertion migliore ; merge stabile (Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →).
- printf e scanf:
%d %f %c %s;scanf("%d", &n)con&,%lfperdouble; controllare il ritorno (Input e output in Cprintf con larghezza e precisione, scanf con indirizzi e valore di ritorno, lettura di righe con fgets, file con FILE*, fopen, fclose, fprintf, fscanf, controllo degli errori e della fine del file.Input e output in C →). - Puntatori:
&x,*p,v[i]*(v + i),p->campo(*p).campo(Puntatori in CUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C →). - Memoria:
malloc(n * sizeof *v), unfreeper ognimalloc,realloccon puntatore temporaneo (Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C →). - Strutture dati: pila
list, codadeque; lista concatenata inserimento in testa , accesso (Liste concatenateLista concatenata semplice: nodi allocati dinamicamente collegati da puntatori; inserimento e rimozione in testa, scorrimento, ricerca, inserimento ordinato, deallocazione; confronto dei costi con l'array; versione in Python.Liste concatenate →).