Resúmenes
Apuntes universitarios en formato Markdown desde Obsidian.
Strutture dati, ricorsione e stringhe
download Descargar MDArray (Vettori)
Un array è una struttura dati complessa, statica e omogenea. È una sequenza di elementi dello stesso tipo immagazzinata in locazioni di memoria consecutive. Il primo elemento ha indice 0, l'ultimo ha indice N-1 (dove N è la dimensione) .
Dichiarazione:
- Senza inizializzare:
<tipo> <nome>[<dimensione>];(es.int V[5];) . - Con inizializzazione:
<tipo> <nome>[] = {el1, el2, ...};(es.int V[] = {2, 4, 6, 8, 10};) .
Accesso:
- Si usa l'operatore parentesi quadre:
<nome>[indice](es.V[3] = 12;) .Matrici
Una matrice è un array bidimensionale (array di array).
Dichiarazione:
int M[4][3];(4 righe, 3 colonne) .- Inizializzazione:
int M[2][3] = {{1, 2, 3}, {4, 5, 6}};.
Accesso e Scorrimento:
Per scorrere una matrice si usano due cicli annidati (solitamente for):
- Il ciclo esterno scorre le righe (indice
i). - Il ciclo interno scorre le colonne (indice
j). - Accesso:
M[i][j].
Esempi di Algoritmi su Matrici:
- Diagonale Principale: Somma elementi dove
i == j(M[k][k]) . - Diagonale Secondaria: Somma elementi dove la somma degli indici è pari alla dimensione - 1 (
M[k][N-(k+1)]) .Ricorsione
Tecnica di programmazione in cui un problema viene suddiviso in sotto-problemi simili all'originale ma più semplici, fino ad arrivare ai Casi Base (risolvibili immediatamente) .
Funzione Ricorsiva: Una funzione che richiama se stessa (direttamente o indirettamente) .
Esempi Classici:
- Fattoriale ($N!$):
- Definizione: $N! = N \times (N-1)!$
- Caso base: $0! = 1$
- Codice:
int fatt(int n) { if (n <= 1) return 1; // Caso Base else return n * fatt(n-1); // Chiamata Ricorsiva }
- Fibonacci:
- Ogni numero è la somma dei due precedenti: $0, 1, 1, 2, 3, 5, 8...$
- $Fib(n) = Fib(n-1) + Fib(n-2)$
- Casi base: $Fib(0)=0, Fib(1)=1$ .
Iterazione vs Ricorsione:
- Iterazione: Ciclo esplicito, termina quando la condizione fallisce. Più performante.
- Ricorsione: Chiamate ripetute, termina col caso base. Codice più pulito/elegante ma rischio Stack Overflow se troppe chiamate .
Stringhe (C-Style)
In C++, le stringhe "vecchio stile" (ereditate dal C) sono array di caratteri terminati dal carattere speciale nullo
\0.
Dichiarazione:
char str[7] = "ABCDEF";(Serve dimensione N+1 per il terminatore\0) .char str[] = "testo";(Dimensione calcolata automaticamente) .
Input/Output:
cout << str;stampa tutta la stringa .cin >> str;legge fino al primo spazio bianco (non legge intere frasi!) .cin.getline(array, dim, delimitatore);: Legge intere righe inclusi gli spazi.- Es.
cin.getline(frase, 80, '\n');.Libreria
<cstring>Contiene funzioni utili per manipolare stringhe C-style :
- Es.
strlen(s): Restituisce la lunghezza (escluso\0) .strcpy(dest, source): Copiasourceindest.strcat(dest, source): Concatena (appende)sourcealla fine didest.strcmp(s1, s2): Confronta due stringhe.- Restituisce
0se uguali. < 0se s1 precede s2 alfabeticamente.> 0se s1 segue s2 .
- Restituisce
- Tokenizzazione (
strtok): Spezza una stringa in "token" in base a dei delimitatori. La prima chiamata prende la stringa, le successive passanoNULLper continuare sulla stessa stringa.