From 274d8dda4fd2fdbc4f5463c5360fa7b1a3cec5e9 Mon Sep 17 00:00:00 2001 From: mc-cat-tty <44820563+mc-cat-tty@users.noreply.github.com> Date: Thu, 2 Dec 2021 12:07:50 +0100 Subject: [PATCH] fine lezione 19 --- 19_matrici.md | 78 ++++++++++++ esercitazioni/calcola_somma_riga.cpp | 36 ++++++ esercitazioni/contenitore_struct.cpp | 155 ++++++++++++++++++++++++ esercitazioni/matrice.cpp | 29 +++++ esercitazioni/matrice_conta_pos_neg.cpp | 42 +++++++ 5 files changed, 340 insertions(+) create mode 100644 19_matrici.md create mode 100644 esercitazioni/calcola_somma_riga.cpp create mode 100644 esercitazioni/contenitore_struct.cpp create mode 100644 esercitazioni/matrice.cpp create mode 100644 esercitazioni/matrice_conta_pos_neg.cpp diff --git a/19_matrici.md b/19_matrici.md new file mode 100644 index 0000000..ca86550 --- /dev/null +++ b/19_matrici.md @@ -0,0 +1,78 @@ +# Matrici +=> tabella n-dimensionale ordinata di elementi + +Utilizzeremo principalmente matrici bdimensionali + +## Dimensione +Una dimensione NxM è da intendersi come una matrice di N righe ed M colonne + +## Sintassi - matrice bdimensionale +``` +[const] [][]; +``` + +## Riempimento matrice +Metodo 1: riempire riga per riga. All'interno di ogni riga riempio colonna per colonna. Utilizzo 2 cicli for innestati. +Meotodo 2: un solo ciclo for che fa uso dell'operatore modulo per determinare su quale riga/colonna si trova (oppure accedo come se fosse un array, con le righe allocate in memoria in modo contiguo) + +## Matrice k-dimensionale +``` +[const] [] [] {[dimk]}; +``` + +## Inizializzazione matrici +È possibile inizializzare le matrici come se fossero un array di più array. + +Nella dichiarazione + inizializzazione di una matrice non è necessario specificare il numero di righe, perchè tale valore viene dedotto dal compilatore + +``` +int mat[][2] = +{ + {1, 2}, + {3, 4} +} +``` + +## Diagonanale +Matrici quadrate + +### DIAGONALE PRINCIPALE +Indici: i, i => mi trovo sulla diagonale principale se i == i + +### DIAGONALE SECONDARIA +Indici: i, N-i-1 => mi trovo sulla diagonale secondaria se i == N-i-1 + +Ho bisogno di un solo ciclo per accedere alla diagonale + +## Raw major e column major +Il C è un linguaggio raw major, perchè memorizza in memoria le matrici come array contigui, ognuno dei quali rappresenta una riga +Linguaggi come il Fortran memorizza le colonne in modo sequenziale + +## Memoria +In memoria le matrici sono rappresentate come righe contigue + +## Passaggio a funzione +Equivalente al passaggio di array +=> sempre passate per riferimento + +Sintassi: +``` +[cont] [] [] +``` + +Infatti: quando passo un array ad una funzione non esplicito il numero di elementi presenti nell'array + +Per efettuare l'acccesso in memoria basta conoscere l'indirizzo della cella di memoria dell'elemento richiesto + +Indice per l'elemento \[indice_riga][indice_colonna] è calcolato come segue: +indirizzo_matrice + byte_tipo_dato_elementi \* (indice_riga\*num_colonne + indice_colonna) + +Vettorizzazione o linearizzazione di una matrice + +## Array di strighe +Posso memorizzare un array di stringhe. Su ogni riga si trova una array di caratteri terminati di '\0', tutto lo spazio dopo il terminatore è purtroppo sprecato. + +// TODO: traccia_disegno.cpp +// TODO: battaglia navale +// TODO: implementa il gioco della vita +// TODO: traccia_lista_esami.txt diff --git a/esercitazioni/calcola_somma_riga.cpp b/esercitazioni/calcola_somma_riga.cpp new file mode 100644 index 0000000..5278cd3 --- /dev/null +++ b/esercitazioni/calcola_somma_riga.cpp @@ -0,0 +1,36 @@ +#include + +using namespace std; + +int calcola_somma(int riga[], int dim_riga) { + int count = 0; + + for (int i=0; i> M[i][j]; + } + } + + + for (int i=0; i + +using namespace std; + +const char MIN_CHAR = 'a'; +const char MAX_CHAR = 'z'; + + +const int DIM = int(MAX_CHAR)-int(MIN_CHAR)+1; + +// struttura dati +// cout << int(MAX_CHAR) - int(MIN_CHAR) + 1; +struct contenitore_t { + int dim; + int capienza; // numero totale di elementi + int dimensione_attuale; + int array[DIM]; +}; + +enum errore {OK = 0, ELE_NOT_VALID, NOT_ENOUGH_SPACE, TOO_SMALL_CAP, NUM_ERR}; +const char error_msgs[NUM_ERR][50] = {"", "Elemento non valido", "Spazio finito", "Capienza troppo piccola"}; + +/* +* stampa l'error message ed esce con errore +* @param msg: string, esce con errore +*/ +void gestisci_errore(errore e) { + cerr << error_msgs[e] << endl; + // exit(1); +} + +/* +* inizializza tutti i contatori a 0 e ritorna +* @param cont: alias al contenitore che si vuole inizializzare +* @return: void +*/ +void inizializza(contenitore_t &cont) { + for (int i=0; iMAX_CHAR) + return ELE_NOT_VALID; + // cout << "valid" << endl; + + if (cont.dimensione_attuale >= cont.capienza) + return NOT_ENOUGH_SPACE; + // cout << "space" << endl; + + // cout << v[ele-MIN_CHAR] << endl; + cont.array[ele-MIN_CHAR]++; + cont.dimensione_attuale++; + return OK; +} // se esce senza errori ritorna 0 => OK + +errore estrai(char ele, contenitore_t &cont) { + if (eleMAX_CHAR) + return ELE_NOT_VALID; + + cont.dimensione_attuale -= cont.array[ele-MIN_CHAR]; + cont.array[ele-MIN_CHAR] = 0; + return OK; +} // se esce senza errori ritorna 0 => OK + +errore modifica_capienza(int nuova_capienza, contenitore_t &cont) { + if (nuova_capienza < cont.dimensione_attuale) + return TOO_SMALL_CAP; + + cont.capienza = nuova_capienza; + return OK; +} + +void stampa(contenitore_t &cont) { + cout << "<"; + for (int i=0; i" << endl; +} + +int main() { + const char menu[] = + "i - inserisci elemento\n" + "e - estrai elementi\n" + "m - modifica capienza\n" + "c - stampa capienza\n" + "q - stampa numero elementi\n" + "s - stampa vettore\n" + "t - termina programma\n"; + + errore err; + contenitore_t contenitore = {DIM, 0, 0, {}}; + + // inizializzazione + cout << "Capienza: "; cin >> contenitore.capienza; + inizializza(contenitore); + + char ch; // scelta utente + char ele; int aux; + while (true) { + cout << menu << endl; + cout << ">> "; cin >> ch; + switch (ch) { + case 'i': + cout << "Nome elemento: "; cin >> ele; + err = inserisci(ele, contenitore); + if (err != OK) { + // cout << err << endl; + gestisci_errore(err); + } + break; + case 'e': + cout << "Nome elemento: "; cin >> ele; + err = estrai(ele, contenitore); + if (err != OK) + gestisci_errore(err); + break; + case 'm': + cout << "Nuova capienza: "; cin >> aux; + err = modifica_capienza(aux, contenitore); + if (err != OK) + gestisci_errore(err); + break; + case 'c': + cout << "Capienza: " << contenitore.capienza << endl; + break; + case 'q': + cout << "Quanti elementi sono nel vettore? " << contenitore.dimensione_attuale << endl; + break; + case 's': + stampa(contenitore); + break; + case 't': + return 0; + break; + default: + cout << "Scelta errata" << endl; + } + } +} diff --git a/esercitazioni/matrice.cpp b/esercitazioni/matrice.cpp new file mode 100644 index 0000000..b82df4a --- /dev/null +++ b/esercitazioni/matrice.cpp @@ -0,0 +1,29 @@ +/* +Scrivere un programma che definisca una mat bdimensionale di interi +(dim stabilite a tempo di scrittura) ed assegni ad ogni elemento un +valore letto da stdin +*/ + +#include + +using namespace std; + +int main() { + const int dimX = 3, dimY = 2; + int M[dimY][dimX]; + for (int i=0; i> M[i][j]; + } + } + + for (int i=0; i +#include + +using namespace std; + +int main() { + const int dim_r= 100, dim_c = 100; + int M[dim_r][dim_c]; + + srand(time(0)); + + // Inizializzazione + for (int i=0; i 0) + pos++; + else if (M[i][j] < 0) + neg++; + } + } + + cout + << "Pos: " << pos << endl + << "Neg: " << neg << endl + << "Nulli: " << dim_r*dim_c-(pos+neg) << endl; + + return 0; +}