Programmazione Procedurale in Linguaggio C++

Documenti analoghi
Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Programmazione Orientata agli Oggetti in Linguaggio Java

Informatica Applicata

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica Ing. Biomedica

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Algoritmi e Strutture di Dati

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Procedurale in Linguaggio C++

Tecnologie di Sviluppo per il Web

Introduzione ai Calcolatori Elettronici

Ambienti di Programmazione per il Software di Base

Il problema dello zaino

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Programmazione Procedurale in Linguaggio C++

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Lezione 8: Stringhe ed array multidimensionali

Programmazione Procedurale in Linguaggio C++

Introduzione all'algoritmica per i Licei (C++). 2 Massimo e minimo.

Programmazione Procedurale in Linguaggio C++

Esercizi su array di array

Programmazione Procedurale in Linguaggio C++

Matrici. Unità 7. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

csp & backtracking informatica e laboratorio di programmazione Alberto Ferrari Informatica e Laboratorio di Programmazione

Programmazione Orientata agli Oggetti in Linguaggio Java

Transcript:

Programmazione Procedurale in Linguaggio C++ Strutture di Dati La Matrice versione. Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca Università della Basilicata mecca@unibas.it Strutture di Dati: La Matrice >> Sommario Sommario Introduzione Definizione di Matrice Operazioni su una Matrice Matrici di Dimensione Costante Rappresentazione con Record e Array Il Problema delle Matrici Sparse

Strutture di Dati: La Matrice >> Introduzione Introduzione Strutture di dati organizzazioni frequenti dei dati di un problema nelle lezioni precedenti: la lista (struttura lineare e monodimensionale) ma la lista non è l unica struttura di dati notevole In questa lezione la matrice matematica Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Matrice Matematica collezione di elementi tutti dello stesso tipo (tipicamente numeri) bidimensionale: organizzata in righe e colonne ogni elemento è caratterizzato dall indice di riga e l indice di colonna alcuni elementi possono essere nulli (tipicamente uguali a ) Per semplicità supporremo che righe e colonne siano numerate con base e non

Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Matrici speciali matrice nulla (tutti gli elementi sono nulle) matrici quadrate (n. righe = n. colonne) matrici quadrate diagonali (solo gli elementi della diagonale sono non nulli) matrici quadrate triangolari superiori/inferiori (tutti gli elementi sotto/sopra la diagonale sono nulli) 5 Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Esempio di matrice di numeri interi [ ] [ - ] [ 8 ] In questa matrice righe (-), colonne (-) (matr. rettangolare) l elemento (, ) vale l elemento (, ) vale l elemento (, 5) non esiste ci sono due elementi nulli 6

Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Operazioni essenziali su una matrice accedi all elemento i, j: preleva il valore dell elemento in posizione i, j (se esiste) assegna valore all elemento i, j: assegna un valore all elemento in posizione i, j (se esiste) numero di righe: restituisce il numero di righe numero di colonne: restituisce il numero di colonne 7 Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Tutte le altre operazioni sono riconducibili a queste essenziali Esempi valori della i-esima riga valori della j-esima colonna valori della diagonale numero di elementi nulli 8

Strutture di Dati: La Matrice >> Definizione di Matrice Definizione di Matrice Due tipologie principali di matrici matrici di dimensioni costanti: il numero di righe e il numero di colonne è fissato matrici di dimensioni variabili: il numero di righe e di colonne può variare (tra un esecuzione ed un altra del programma) Per ciascuna una tecnica di rappresentazione appropriata 9 Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Sono le più frequenti il numero di righe ed il numero di colonne sono fissate e non possono cambiare es: matrice di un sistema x es: scacchiera per giocare a scacchi In questo caso basta un array bidimensionale con componenti del tipo appropriato

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Un esempio: matrice quadrata di interi un programma che consente di effettuare elaborazioni su una matrice quadrata NxN lettura da tastiera generazione di matrici particolari (diagonali, triangolari) stampa elaborazioni (somme di righe, colonne, diagonale) >> elaboramatricequadrata.cpp Strutture di Dati: La Matrice >> Matrici di Dimensione Costante La rappresentazione della matrice const int N = ; int matrice[n][n]; La struttura del programma un menu con comandi numerici che consente di effettuare le varie operazioni sulla matrice

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante void leggimatrice(int matrice[n][n]) { cout << "Immetti gli elementi \n"; cout << "---------------------\n"; for (int i = ; i < N; i++) { cout << "Riga n. " << i << endl; for (int j = ; j < N; j++) { cout << "Elemento (" << i << "," << j << ")"; cin >> matrice[i][j]; return; Strutture di Dati: La Matrice >> Matrici di Dimensione Costante void stampamatrice(int matrice[n][n]) { cout << "Valori della matrice \n"; cout << "---------------------\n"; for (int i = ; i < N; i++) { cout << "\t"; for (int j = ; j < N; j++) { cout << matrice[i][j] << "\t"; cout << endl; return;

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Generazione della matrice diagonale solo gli elementi sulla diagonale sono non nulli elemento sulla diagonale: i == j 5 Strutture di Dati: La Matrice >> Matrici di Dimensione Costante void generamatdiagonale(int matrice[n][n], int valore) { for (int i = ; i < N; i++) { for (int j = ; j < N; j++) { if (i == j) { matrice[i][j] = valore; else { matrice[i][j] = ; return; 6

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Generazione della matrice triangolare inf. solo gli elementi sulla diagonale e quelli sotto sono non nulli elemento sulla o sotto la diagonale: i >= j 7 Strutture di Dati: La Matrice >> Matrici di Dimensione Costante void generamattriangolare(int matrice[n][n], int valore) { for (int i = ; i < N; i++) { for (int j = ; j < N; j++) { if (i >= j) { matrice[i][j] = valore; else { matrice[i][j] = ; return; 8

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Una annotazione importante la matrice nel suo complesso è una struttura bidimensionale per le elaborazioni servono due cicli Ma le righe, le colonne e la diagonale sono strutture monodimensionali per le elaborazioni basta un unico ciclo 9 Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Infatti per gli el. di una riga l indice di riga è fissato per gli el. di una colonna l indice di colonna è fissato

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante int sommariga(int matrice[n][n], int riga) { int somma = ; for (int j = ; j < N; j++) { somma += matrice[riga][j]; return somma; int sommacolonna(int matrice[n][n], int colonna) { int somma = ; for (int i = ; i < N; i++) { somma += matrice[i][colonna]; return somma; Strutture di Dati: La Matrice >> Matrici di Dimensione Costante La diagonale un elemento per ciascuna riga l indice di colonna è uguale all indice di riga int sommadiagonale(int matrice[n][n]) { int somma = ; for (int i = ; i < N; i++) { somma += matrice[i][i]; return somma;

Strutture di Dati: La Matrice >> Matrici di Dimensione Costante Attenzione in questo esempio: somma ma allo stesso modo si programmano le altre tecniche algoritmiche notevoli es: conteggio es: massimo (della matrice, di una riga, di una colonna, della diagonale) es: verifica di condizioni (sulla matrice, su una riga, su una colonna, sulla diagonale Strutture di Dati: La Matrice >> In alcuni casi la matrice può avere un numero di righe e di colonne variabile es: scacchiera per giocare a battaglia navale In questo caso si può usare una rappresentazione basata su array e record simile a quella per la lista con due indicatori di riempimento: uno per le righe e uno per le colonne

Strutture di Dati: La Matrice >> Un esempio: il gioco della vita un gioco di simulazione si gioca su una scacchiera (max. NxN elementi) ogni elemento della scacchiera può contenere una cellula viva oppure meno da una scacchiera iniziale vengono prodotte varie configurazioni successive nelle configurazioni successive la vita in un elemento si evolve secondo precise regole che dipendono dal numero di cellule negli elementi vicini 5 Strutture di Dati: La Matrice >> Elementi vicini ad una cella elementi del contorno normalmente sono 8 es: elemento (, ) 6 x 7 5 8 per le celle sui bordi possono essere meno es: elemento (, ) es: elemento (, ) x 5 x 6

Strutture di Dati: La Matrice >> Le regole del gioco della vita se nell elemento i,j c è una cellula viva se tra i vicini ci sono meno di due cellule vive, nella conf. succ. la cellula muore di solitudine se tra i vicini ci sono più di tre cellule vive, nella conf. succ. la cellula muore per sovraffollamento altrimenti la cellula sopravvive se nell elemento i,j non c è una cellula viva se tra i vicini ci sono esattamente tre cellule vive, nella conf. successiva nasce una cellula viva 7 Strutture di Dati: La Matrice >> Il gioco viene acquisita da un file la configurazione iniziale della scacchiera (matrice di e, dove vuol dire cellula viva) viene chiesto all utente quante configurazioni generare vengono generate e stampate le configurazioni successive del gioco >> giocodellavita.cpp 8

Strutture di Dati: La Matrice >> La rappresentazione dei dati const int MAXDIM = ; indicatore di riempimento struct matrice { per le righe int righe; indicatore di riempimento int colonne; per le colonne int elementi[maxdim][maxdim]; ; void main() { matrice scacchiera;... array bidimensionale di dimensione MAXDIMxMAXDIM 9 Strutture di Dati: La Matrice >> Esempio MAXDIM = ; scacchiera.righe = ; scacchiera.colonne = 6; scacchiera.elementi elementi significativi 5 6 7 8 9 5 6 7 8 9

Strutture di Dati: La Matrice >> Nota in teoria, come per le liste, questa rappresentazione consente di aggiungere righe e colonne ad una matrice esistente ma questo è necessario di rado tipicamente: i due indicatori di riempimento vengono inizializzati all avvio del programma e non vengono più cambiati Strutture di Dati: La Matrice >> Il Diagramma delle Chiamate main matrice scacchiera const int N =... ; struct matrice { int righe; int colonne; int elementi[n][n]; ; schermonomefile (string &nomefile) carica (matrice &scacchiera, string nomefile, bool &esito) stampascacchiera (matrice scacchiera) schermoripetizioni (int &ripetizioni) simula (matrice &scacchiera, int ripetizioni) for (int i=; i < ripetizioni; i++) generanuovociclo (matrice &scacchiera) for (int i=; i < scacchiera.righe; i++) { for (int j=; j < scacchiera.colonne; j++) int nuovovalore (matrice &scacchiera, int x, int y) copiascacchiera (matrice scacchiera, matrice &copia) int contavicini (matrice &scacchiera, int x, int y)

Strutture di Dati: La Matrice >> Alcune operazioni interessanti il caricamento della matrice dal file il calcolo delle cellule vive negli elementi vicini Caricamento dal file al solito, il file contenente la matrice deve avere un formato preciso Strutture di Dati: La Matrice >> Il formato del file prima riga: numero di righe seconda riga: numero di colonne righe successive: elementi per righe e colonne ( oppure ) Righe: 5 Colonne: 5 >> vita5x5.txt >> vita7x9.txt

Strutture di Dati: La Matrice >> void carica (matrice &scacchiera, string nomefile, bool &esito) { string tmp; int righe, colonne; ifstream file (nomefile.c_str()); file >> tmp; file >> righe; file >> tmp; file >> colonne; if (righe <= MAXDIM && colonne <= MAXDIM) { scacchiera.righe = righe; scacchiera.colonne = colonne; for (int i = ; i < scacchiera.righe; i++) { for (int j = ; j < scacchiera.colonne; j++) { file >> scacchiera.elementi[i][j]; esito = true; else { esito = false; return; 5 Strutture di Dati: La Matrice >> L analisi dei vicini data una cella x, y, bisogna contare gli nel contorno righe coinvolte: da x- a x+ col. coinvolte: da y- a y+ es: x=, y= attenzione agli sconfinamenti es: x=, y= 6

Strutture di Dati: La Matrice >> int contavicini (matrice scacchiera, int x, int y) { int conta = ; for (int i = x - ; i <= x + ; i++) { for (int j = y - ; j <= y + ; j++) { if (i >= && i < scacchiera.righe && j >= && j < scacchiera.colonne) { conta += scacchiera.elementi[i][j]; return conta - scacchiera.elementi[x][y]; 7 Strutture di Dati: La Matrice >> Il Problema delle Matrici Sparse Il Problema delle Matrici Sparse Matrice sparsa matrice in cui più del 9% degli elementi ha valore nullo (es: ) In questi casi le due rappresentazioni viste hanno un notevole difetto spreco di memoria: più del 9% dello spazio di memoria è sprecato spreco di tempo: lunghe scansioni inutili 8

Strutture di Dati: La Matrice >> Il Problema delle Matrici Sparse Il Problema delle Matrici Sparse Una rappresentazione più adeguata una rappresentazione che si limiti a riservare memoria per le componenti non nulle Intuizione una collezione ordinata delle componenti non nulle per ciascuna: le coordinate (indice di riga e indice di colonna) e il valore 9 Strutture di Dati: La Matrice >> Il Problema delle Matrici Sparse Il Problema delle Matrici Sparse In teoria sarebbe possibile utilizzare una lista, mantenendola ordinata Ma nella lista sarebbero frequentemente necessarie inserimenti e cancellazioni la rappresentazione che abbiamo (array e record) non è particolarmente adatta vedremo in seguito una soluzione più adatta

Strutture di Dati: La Matrice >> Sommario Riassumendo Introduzione Definizione di Matrice Operazioni su una Matrice Matrici di Dimensione Costante Rappresentazione con Record e Array Il Problema delle Matrici Sparse Termini della Licenza Termini della Licenza This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/./ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 95, USA. Questo lavoro viene concesso in uso secondo i termini della licenza Attribution-ShareAlike di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/./ oppure inviare una lettera all indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 95, USA.