ARRAY MULTIDIMENDIONALI

Slides:



Advertisements
Presentazioni simili
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Advertisements

Array multidimensionali
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
Vettori e matrici algebrici
Si definisce matrice di ordine mn una tabella della forma:
Algebra delle Matrici.
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata al.
RICHIAMI ELEMENTARI DI ALGEBRA MATRICIALE
Array bidimensionali Paragrafo5.
APPUNTI SUL LINGUAGGIO C
Introduzione all’algebra lineare
void binario(int n); …………………
Ricerca sequenziale in un array di interi
I VETTORI E LE MATRICI IN PHP Motta Ilaria I.T.E. Agostino Bassi.
CORSO DI PROGRAMMAZIONE II
Quadrati magici tabelle numeriche con particolari curiose proprietà.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata.
Prof. Cerulli – Dott. Carrabs
I circuiti elettrici.
PIANO DI RIORDINO PRESIDI DI FOLIGNO E SPOLETO
Rappresentazione dei campi di gravità
MICROCIRCOLAZIONE Moduli microvascolari: arteriole di resistenza, capillare preferenziale, capillari veri, cellule mioepitaliali, venule, anastomosi artero-venose.
Rapporto finale di valutazione
Nascita Comitato dei CiNQUE 1859
Italia al CERN 4 aprile 2017 Cryogenics Antonio Perin (TE-CRG)
REACH 2018 Conoscere il portafoglio della propria azienda e avviare subito i preparativi.
Corso di Fisica per CTF AA2015/16
• MODELLO DI COMPORTAMENTO RAZIONALE (def
Corso di Fisica Subnucleare
Campi di gravità e topografia: analisi isostatiche con QGIS
Viganò Samuele, Marone Davide, Mongelli Alessandro
Il procedimento legislativo nello Statuto Albertino
CARATTERIZZAZIONE DI MACROMOLECOLE IN SOLUZIONE DILUITA
I marcatori uniparentali (Y e mtDNA)
Tassi demografici ed economici
Associazione Studenti e Professori di Medicina Uniti Per In collaborazione con Ufficio Tutor Medicina CORREZIONE DELL’ESERCITAZIONE DI MATEMATICA.
Premessa Negli ultimi anni, il settore nonprofit è stato narrato come un CASO DI GRANDE SUCCESSO, uno dei pochi in una fase di profonda crisi. La narrazione.
Salari dei manager Y = Salario annuale (in dollari)
Criteri di selezione dell’offerta
Tecnologie e tecniche della ripresa e della registrazione audio
1.Legislazione Angela e colleghi si ribellano
Presentazione Corporate del Gruppo
Nelle precedenti puntate…
Gastoldi Paolo, Lorenzi Denise, Dia Oureye
CORSO DI STORIA CONTEMPORANEA Docente Prof. Ventrone
Qualità del software (p )
Laboratorio di Pittura
Epidemiological and clinical features of imported malaria at the three main hospitals of the Friuli-Venezia Giulia Region, Italy  Paola Stano, Alessandra.
Regressione lineare multipla
Discorso sulle scienze e sulle arti
Che cos'è la Devianza? La devianza è l'infrazione di una norma che prevede una sanzione e deve essere sempre considerata in relazione al gruppo di riferimento.
IS THE INCREMENTAL DIAGNOSTIC VALUE OF AMYLOID-PET AFFECTED BY INFORMATION ON OTHER CORE BIOMARKERS?  Cristina Festari, Daniele Altomare, Martina Bocchetta,
L’intervento scuola: strategie didattiche funzionali
Mondo complesso perché:
(Liquidità immediata) (Liquidità immediata) (Liquidità differita)
PROTEZIONE TRASMISSIONE E GESTIONE DEI PATRIMONI FAMILIARI
Analysing Causation Analizzare la causalità
Elettrochimica L’elettrochimica è una branca della chimica che studia le trasformazioni chimiche che avvengono in un sistema in concomitanza con il passaggio.
PROGRAMMA LEZIONE 6 ETF E GESTIONE PASSIVA
Lez. 3 – TEORIA DELLA CRESCITA: Introduzione rif. BW-c.3
Amaranto Teatro.
Come si fanno i jeans Leonardo M., 1F.
La Diffusione della Luce
Ese 1 (del 3 Aprile 2003).
Dal al servizio della Salute
Rilevamento di onde d’urto e scomposizione
Parte 10 Test di parentela e di paternità
SUPERFICI LIS/SLIP PER LA RIDUZIONE DI ATTRITO
Transcript della presentazione:

ARRAY MULTIDIMENDIONALI  Un array (sia esso associativo o meno) può avere più di una dimensione. Nel caso un array abbia più dimensioni (specialmente nel caso bidimensionale), esso viene spesso definito "matrice", in riferimento alla nozione matematica di matrice da cui prende ispirazione. La differenza è che una matrice ha due (o più) indici (ogni indice è una dimensione) e ogni elemento è identificato dalla combinazione di valori di tutti gli indici del vettore.  MATRICE una matrice è una tabella ordinata di elementi; ad esempio, la seguente è una matrice intera: Righe, colonne, elementi  Le righe orizzontali di una matrice sono chiamate righe, mentre quelle verticali colonne.In generale, una matrice  mxn è una matrice con  m  righe  n colonne, dove m e n sono interi positivi fissati.  aij l'elemento posizionato alla riga i-esima e alla colonna j-esima

void leggi(int m[][])//lettura matrice quadrata { cout<<"Definisci le dimensioni della matrice quadratica : "; cout<<"numero max (<11) righe e colonne = "; cin>>n; cout<<"Riempimento matrice "; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cout<<"inserisci il valore della cella M [ "<<i<<","<<j<<" ] : "; cin>>m[i][j]; }

void trasposta(int m[][]) { int temp; for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) temp=m[i][j]; m[i][j]=m[j][i]; m[j][i]=temp; } -1 34 3 11 11 45 0 A= 13 11 -1 3 45 34 11 0 AT=

Per creare numeri casuali in C++ si usano principalmente due funzioni: srand(), rand() All'inizio del codice dobbiamo includere la libreria <time.h> Poi, inizializziamo la funzione rand() così: srand(time(NULL)); Una volta fatto questo non ci rimane che utilizzare rand() per generare numeri casuali in questo modo: rand() % x; Dove x è il numero massimo . Esempio: #include<time.h> using namespace std; int main() {      int A;      srand(time(NULL));      A = rand() % 5; return 0;  } In questo caso la variabile A sarà un numero compreso tra 0 e 4. Quindi per avere un numero tra 1 e 5 bisogna semplicemente aggiungere 1 così:      A = rand() % 5 + 1;

Algoritmo di ordinamento per scambio (a bolle o bubble sort) …. const int maxDim=100; int dim, pmin; int dimensione_vett(); void carica_vettore(int v[], int dimVet); void visualizza_vett(int v[], int dimVet); void scambia(int &x, int &y); void ordinamento_vettore(int v[], int dim); int main() { char quit=‘\0’; int array[maxDim]; while (quit!=‘q’) dimensione_vett(); carica_vettore(array, int dim); visualizza_vett(array, dim); ordinamento_vettore(array, dim); cout<<«premere q per uscire»<<endl; cin>>quit: } return 0

int dimensione_vett() { do cout<<«inserisci la dimensione del vettore»<<endl; cin>>dim; }while((dim<1)||(dim>maxDim)); return dim; }-------------------------------------------------------------------------------------------- void carica_vettore(int v[], int dimVet) srand(time(NULL)); for(int i=0;i<dimvett;i++) {v[i]=rand();} } -------------------------------------------------------------------------------------------------------- void visualizza_vett(int v[], int dimVet) cout<<«visualizzazione vettore»<<endl; for(int i=0;i<dimVett;i++) cout<<elemento di posto<<i<< <<v[i]<<endl; }--------------------------------------------------------------------------------------------------------------

void scambia(int &x, int &y) { int temp; temp=x; x=y; y=temp; }-------------------------------------------------------------------------------------------------------- void ordinamento_vettore(int v[], int dim) { bool scambio; int i, j; j=1; do { scambio=false; i=0; { if(v[i]>v[i+1]) { scambia(v[i],v[i+1]); scambia=true; } i++; while(i<dim-j); j++; } while(scambio==true && j<=dim-1); }------------------------------------------------------------------------- ATTENZIONE!!!! NON DEVE ESSERE AGGIUNTA LA CONDIZIONE SCAMBIO==FALSE ALTRIMENTI IL PROGRAMMA GIRA ALL’INFINITO

void leggi(int m[][],int &val,int r,int c) { int i,j; Scrivere un programma per la ricerca di un elemento in una matrice assegnata e visualizzare a video la sua frequenza. ….void leggi(matrice m,int &val,int r,int c); void confronto(matrice m,int &val,int r,int c); void istogramma(matrice m,matrix p,int r,int c); int main() { int r,c,val,rip; int m[10][10]; //dichiarazione della matrice int p[100][2]; //dichiarazione matrice di appoggio cout<<"\n Definisci le dimensioni della matrice : "; cin>>r; cin>>c; leggi(m,val,r,c); confronto(m,val,r,c); return 0 } void leggi(int m[][],int &val,int r,int c) { int i,j; for(i=0;i<r;i++) { for(j=0;j<c;j++) { cout<<"\n Inserisci il valore della cella [ "<<i<<","<<j<<" ] : "; cin>>m[i][j]; } cout<<"\n Inserisci il valore da confrontare : "; cin>>val;

void confronto(int m[][],int val,int r,int c) { int i,j,s,a; s=0; cout<<"\n Matrice : "; for(i=0;i<r;i++) { cout<<endl; for(j=0;j<c;j++) cout<<" "<<m[i][j]; } { for(j=0;j<c;j++) if(m[i][j]==val) s=s+1; cout<<"\n Il valore "<<val<<" e' presente "<<s<<" volte" <<endl;

Ricerca dicotomica La ricerca di un elemento in un vettore può essere molto laboriosa in termini di tempo di esecuzione. Se la base dati è molto grande è opportuno minimizzare questo tempo riducendo il numero di confronti tramite un semplice algoritmo detto di ricerca dicotomica. Il vettore deve essere dapprima riordinato, poi si confronta l’elemento posto a metà vettore (indice = n/2) con l’elemento cercato. Si hanno 3 possibilità: a) é quello cercato; b) l’elemento cercato è più grande; c) l’elemento cercato è più piccolo. Se l’elemento cercato è più grande si considera un nuovo vettore formato dalla sola seconda metà dell’intero vettore e si ricomincia la ricerca col confronto tra elemento cercato e elemento posto a metà del nuovo vettore; e così via.

Ricerca dicotomica 1/5 #include <stdio.h> #include <conio.h> #define MAX_DATI 100 #define FALSE 0 #define VERO 1 /* prototipo delle funzioni di ricerca e di riordinamento */ void trovato (int vett[ ], int elemento, int &p_posiz, int n_dati, bool& presente); void bubble (int vett[ ], int n); int main() { int num_dati, dato, indice, p_posiz, cercato; int vett [MAX_DATI]; bool trova_elemento=false;

Ricerca dicotomica 2/5 indice = 1; cout<<«Introduci il vettore terminando con -1»<<endl; cout<<«inserisci il primo elemento»<<endl; cin>>dato vett[0]=dato; while ((dato!=-1) && (indice < MAX_DATI)) { cout<<«inserisci l’ elemento»<<indice<<endl; vett [indice] = dato; indice++; } num_dati = indice; /* in num_dati numero di dati letti */ bubble (vett, num_dati); /* riordina il vettore di interi */ cout<<«Vettore riordinato:”<<endl; /* visualizza il vettore riordinato */ for (indice = 0; indice < num_dati; indice++) cout<<«Elemento di indice «<< indice<<«con valore»<< vett [indice]);

Ricerca dicotomica 3/5 /* richiede il dato da cercare */ cout<<«Quale dato vuoi cercare? «<<endl; cin>>cercato; /* cerca il dato con la funzione trovato che restituisce col suo nome un valore logico (vero o falso) a seconda che il dato sia presente o meno nel vettore e, se presente, l’indice del dato nella variabile p_posiz */ trovato (vett, cercato, p_posiz, num_dati, trova_elemento) ; if (trova_elemento==true) cout<<«Dato presente in posizione «<<p_posiz<<endl; else cout<<« Dato non presente«<<endl; }

Ricerca dicotomica 4/5 void trovato (int vett[ ], int dato, int &p_posiz, int n_dati, bool &presente) { int meta, limite_inf, limite_sup; limite_inf = 0; /* indice inferiore della porzione di vettore */ limite_sup = n_dati - 1; /* indice superiore della porzione di vettore */ presente = FALSE; while ((!presente) && (limite_inf <= limite_sup)) meta = (limite_sup + limite_inf) / 2; /* confronto il dato cercato con l’elemento di metà del vettore */ if (vett[meta] == dato) presente = TRUE; /* è lui, finito! */

Ricerca dicotomica 5/5 else { /* non è lui, procedo usando il metodo di bisezione */ if (vett[meta] > dato) limite_sup = meta - 1; limite_inf = meta + 1; } p_posiz = meta;

Siano assegnati da tastiera due vettori di interi vett1 e vett2 (max 50 elementi). Si progetti una funzione ALTERNA che riceva in ingresso i due vettori e restituisca un vettore vett3 costituito alternando gli elementi di vett1 e vett2 (vedi esempi). La funzione ALTERNA deve anche restituire come valore di ritorno la somma di tutti gli elementi del vettore vett3. Esempi INPUT: vett1 = 2 3 5 1 vett2 = 4 3 8 7 OUTPUT: vett3 = 2 4 3 3 5 8 1 7 Somma: 33 Si calcola il minimo tra i riempimenti di vett1 (n) e vett2 (m), diciamolo min. Si effettuano poi min iterazioni iniziali che inseriscono i primi min elementi di vett1 alternati ai primi min elementi di vett2 nel vettore vett3. A questo punto uno dei due vettori è esaurito e non resta che scaricare l'altro sul vettore vett3. In questo caso, la sequenza dei passi da compiere è: min = minimo tra n e m; for (i che va da 0 a min escluso) { inserisci elemento corrente di vett1 in vett3 inserisci elemento corrente di vett2 in vett3 } inserisci i restanti elementi di vett1 su vett3 (se ci sono); inserisci i restanti elementi di vett2 su vett3 (se ci sono);

int Alterna(int vett1[], int n1, int vett2[], int n2, int vett3[], int& n3) { int minlen ; if (n1 < n2) minlen = n1 else minlen = n2; n3 = 0; //preleva alternativamente gli elementi fino alla fine del vettore più corto (di lunghezza minlen) for (int i = 0; i < minlen; i++) { vett3[n3] = vett1[i]; n3++; vett3[n3] = vett2[i]; } //scarica, eventualmente, il primo vettore for (int i = minlen; i < n1; i++) {vett3[n3] = vett1[i]; n3++; } //scarica, eventualmente, il secondo vettore for (int i = minlen; i < n2; i++) { vett3[n3] = vett2[i]; n3++; } return SommaElems(vett3, n3); }