Programmazione Procedurale in Linguaggio C++
|
|
|
- Agostino Albanese
- 9 anni fa
- Просмотров:
Транскрипт
1 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 [email protected] 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
2 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
3 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
4 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
5 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
6 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
7 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;
8 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
9 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
10 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
11 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;
12 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
13 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 per le celle sui bordi possono essere meno es: elemento (, ) es: elemento (, ) x 5 x 6
14 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
15 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
16 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)
17 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
18 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
19 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
20 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
21 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 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 oppure inviare una lettera all indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 95, USA.
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Parte 7 Dettagli e Approfondimenti versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Sintassi e Semantica Riferimenti versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 6 Il FORTRAN versione 2.0 Questolavoroè concessoin uso secondoi termini di unalicenzacreative Commons (vedi ultima pagina) G. Mecca Università
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Parte 1 Introduzione G. Mecca M. Samela Università della Basilicata Tipi Strutturati: Introduzione >> Sommario Sommario Panoramica Alcuni Esempi
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Sottoprogrammi Concetti Avanzati Tecniche di Test e Correzione versione 2.4 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa Array di array A. Miola Febbraio 8 http://www.dia.uniroma.it/~java/fondinf/ Array di array Contenuti Array bidimensionali creazione
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Ruoli e Responsabilità: C# versione 1.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G.
Il problema dello zaino
Il problema dello zaino (knapsack problem) Damiano Macedonio [email protected] Copyright 2010 2012 Moreno Marzolla, Università di Bologna (http://www.moreno.marzolla.name/teaching/asd2011b/) This work is licensed
Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN
Breve Manuale di Riferimento sulla Sintassi Linguaggi e versione aggiornata al 05/02/2004 Sommario Elementi di Base... 2 Dati, Tipi e Dichiarazioni... 2 Tipi di Dato di Base... 2 Tipi di Dato Strutturati...
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Design Pattern: Storia Parte b versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Ruoli e Responsabilità: Introduzione versione 2.3 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima
Lezione 8: Stringhe ed array multidimensionali
Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Parte 3 Record G. Mecca M. Samela Università della Basilicata Tipi Strutturati: Record >> Sommario Sommario Introduzione Dichiarazione di Record
