Corso di Fondamenti di Informatica Algoritmi su array / 2



Похожие документы
Algoritmi su array / 2

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Vettori Algoritmi elementari di ordinamento

Ricerca di un valore nell array

Fondamenti di Informatica 2

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Semplici Algoritmi di Ordinamento

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

dall argomento argomento della malloc()

10 - Programmare con gli Array

Laboratorio di Fondamenti di Informatica anno accademico Esercizi proposti il

Laboratorio di Algoritmi e Strutture Dati

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Algoritmi di ordinamento

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

GESTIONE INFORMATICA DEI DATI AZIENDALI

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Prova Scritta del 19/07/10

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Ricorsione. (da lucidi di Marco Benedetti)

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

Corso di Informatica

Monitor. Introduzione. Struttura di un TDA Monitor

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

3. La sintassi di Java

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

MODULO 5 ACCESS Basi di dati. Lezione 4

Ricerca sequenziale di un elemento in un vettore

Introduzione a ROOT. 1. Informazioni generali

Il tipo di dato astratto Pila

Le stringhe. Le stringhe

Laboratorio di Algoritmi e Strutture Dati

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Algoritmo di ordinamento per sostituzione. Esempio : dato l array :

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Realizzazione di una classe con un associazione

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Funzioni in C. Violetta Lonati

LISTE, INSIEMI, ALBERI E RICORSIONE

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Lab 11 Gestione file di testo"

Corso di Tecniche di Programmazione

Introduzione al MATLAB c Parte 2

I tipi di dato astratti

IL MARKETING E QUELLA FUNZIONE D IMPRESA CHE:

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Linguaggio C - Stringhe

Breve riepilogo della puntata precedente:

Laboratorio di programmazione

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Politecnico di Torino

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Sono casi particolari di MCF : SPT (cammini minimi) non vi sono vincoli di capacità superiore (solo x ij > 0) (i, j) A : c ij, costo di percorrenza

Scheda operativa Versione rif c00. Libro Inventari

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Maschere. Microsoft Access. Maschere. Maschere. Maschere. Aprire una maschere. In visualizzazione foglio dati: Maschere

Gestione dei processi

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Sottoprogrammi: astrazione procedurale

SIMPLY JOB. Progetto per il corso di Programmazione III e Laboratorio A.A Realizzato da: Massimo Buonocore

Programmazione 1 A.A. 2015/2016

Esempi di esercizi d esame

Programmazione I - Laboratorio

Corso di Fondamenti di Informatica

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012


La struttura dati ad albero binario

2. Simulazione discreta: approcci alla simulazione

Supermarket Progetto di Programmazione Febbraio 2010

Puntatori Passaggio di parametri per indirizzo

Inizializzazione, Assegnamento e Distruzione di Classi

Esercizi su. Funzioni

Introduzione agli Abstract Data Type (ADT)

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Mon Ami 3000 Conto Lavoro Gestione del C/Lavoro attivo e passivo

Транскрипт:

Corso di Fondamenti di Informatica Algoritmi su array / Anno Accademico 00/009 Francesco Tortorella

Algoritmi su array Operazioni tipiche sugli array: inizializzazione lettura stampa ricerca del minimo e del massimo ricerca di un valore inserimento di un valore eliminazione di un valore ordinamento del vettore 00/009

Inserimento ed eliminazione A volte è utile considerare gli array come insiemi dinamici di dati [la cui composizione, cioè, può variare dinamicamente]. A questo scopo è necessario realizzare operazioni quali: Inserimento di un valore nell array Eliminazione di un elemento dall array 00/009

Inserimento di un valore nell array Per poter inserire un nuovo valore nell array, è necessario che questo disponga di spazio sufficiente per accogliere il nuovo elemento L inserimento va realizzato diversamente per Array non ordinato Array ordinato 00/009

Inserimento in array non ordinato Se l array non è ordinato, non esiste una posizione precisa in cui il valore va inserito La scelta più conveniente è di inserire il nuovo valore in coda all array 00/009

Inserimento in array ordinato L inserimento di un valore in un array ordinato deve mantenere l ordine degli elementi. Per questo motivo, non è possibile il semplice accodamento del nuovo valore a quelli già presenti, ma è necessario modificare la disposizione degli elementi già presenti per fare in modo che il nuovo valore possa essere inserito nella giusta posizione. 00/009

Inserimento in array ordinato L inserimento si realizza in due passi: individuare la posizione che deve assumere il nuovo valore all interno dell array per mantenere l ordine dell insieme dei valori rendere disponibile quella posizione facendo scorrere tutti gli elementi da quella posizione in poi di un posto in basso e infine scrivere il nuovo valore nella posizione resa disponibile 00/009

00/009 Inserimento in array ordinato 7 7 7 7 7

Inserimento in array ordinato int cerca_pos(int v[], int n, int x){ // cerca la posizione // del primo elemento >= x nell'array v int i; i = 0; while(i<n && v[i] <= x) i++; Che succede se: x < min[v]? (inserimento in testa) x > max[v]? (inserimento in coda) return(i); void crea_spazio(int v[], int n, int pos) { // crea una posizione libera nell'array v // in corrispondenza dell'indice index // si assume ci sia spazio disponibile nell'array for(int i = n-; i >= pos; i--) v[i+] = v[i]; 00/009

#include <iostream> #include "InsExtr.h" void stampa_array(int vet[], int riemp); using namespace std; int main(int argc, char** argv) { int vet[0] = {,,,,,,, ; int n =, int x, index; cout << "array prima dell'inserimento:\n "; stampa_array(vet, n); cout << "\nx: "; cin >> x; index = cerca_pos(vet, n, x); crea_spazio(vet, n, index); // inserimento e aggiornamento riempimento vet[index] = x; n++; cout << "\narray dopo l'inserimento:\n "; stampa_array(vet, n); return (EXIT_SUCCESS); 00/009

00/009 Eliminazione di un valore Nel caso si debba eliminare un certo valore da un array, i passi da compiere sono: ricerca nell array per identificare la posizione del valore [se presente] cancellazione logica tramite scorrimento di una posizione verso l alto dei successivi elementi dell array

Eliminazione di un valore void elimina_pos(int v[], int n, int pos) { // elimina l'elemento in posizione pos for (int i = pos; i < n - ; i++) v[i] = v[i + ]; int main(int argc, char** argv) { int vet[] = {,, 7, 9,, 7, n = ; int x = 9, pos; pos = cerca_fun(vet,n,x); if(pos >= 0){ elimina_pos(vet,n,pos); n--; return (EXIT_SUCCESS); 00/009

Ordinamento di un array L operazione di ordinamento consiste in una permutazione degli elementi nell array in modo che, al termine dell ordinamento, la disposizione degli elementi nell array rispetti un ordine specifico [p.es. crescente]. Lo scopo dell ordinamento è di facilitare successive ricerche di elementi nell array che è stato ordinato. Sono stati proposti numerosi algoritmi di ordinamento, con caratteristiche diverse. Non esiste l algoritmo di ordinamento ottimo. 00/009

Ordinamento per selezione [select sort] Questo algoritmo si basa sul seguente principio: dato un array vet di N elementi, si determina l elemento minimo tra vet[0], vet[],, vet[n-] e lo si scambia con il primo elemento Le operazioni vengono poi ripetute su N- elementi a partire da vet[], poi su N- elementi a partire da vet[],, su elementi a partire da vet[n-]. for (int i=0; i < N-; i++){ determina l elemento minimo in vet[i],,vet[n-] e scrivi in k la sua posizione scambia vet[i] e vet[k] 00/009

int cercaposmin(int v[], int n, int start){ int min,pos; pos = start; min = v[start]; for(int i = start+; i < n; i++) if (v[i] < min){ min = v[i]; pos = i; return(pos); void selectsort(int v[], int n){ int k; for(int i = 0; i < n-; i++){ k = cercaposmin(v,n,i); if(k!= i) swap(v[i],v[k]); 00/009

Problema Scrivere una funzione che restituisca i primi tre elementi in ordine crescente di un array di interi. 00/009

Ordinamento per gorgogliamento [bubble sort] Questo algoritmo si basa sul seguente principio: dato un array vet di N elementi, si verifica se la coppia (vet[n-],vet[n-]) sia ordinata; se non lo è, si scambiano i due elementi si ripete lo stesso con le coppie (vet[n-], vet[n- ]), (vet[n-],vet[n-]),, (vet[],vet[0]) al termine, in prima posizione ci sarà l elemento minimo Le operazioni vengono poi ripetute altre N- volte per completare l ordinamento 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n){ for(int t = 0; t < n; t++) for(int i = n-; i > 0; i--) if(v[i] < v[i-]) swap(v[i], v[i-]); 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n){ for(int t = 0; t < n; t++) for(int i = n-; i > 0; i--) if(v[i] < v[i-]) swap(v[i], v[i-]); Possibile migliorare l algoritmo? Che cosa resta invariato durante il ciclo esterno? 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n){ for(int t = 0; t < n; t++) for(int i = n-; i > t; i--) if(v[i] < v[i-]) swap(v[i], v[i-]); 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n){ for(int t = 0; t < n; t++) for(int i = n-; i > t; i--) if(v[i] < v[i-]) swap(v[i], v[i-]); Si possono sfruttare i risultati delle verifiche di ordinamento delle coppie di elementi successivi? 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n) { int last=0,end; for (int t = 0; t < n; t++) { end = last; for (int i = n - ; i > end; i--) if (v[i] < v[i - ]) { swap(v[i], v[i - ]); last = i; 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n) { int last=0,end; for (int t = 0; t < n; t++) { end = last; for (int i = n - ; i > end; i--) if (v[i] < v[i - ]) { swap(v[i], v[i - ]); last = i; È possibile verificare se l array abbia completato l ordinamento prima del termine del for esterno? 00/009

Ordinamento per gorgogliamento [bubble sort] void bubblesort(int v[], int n) { int last=0,end; bool fattoswap; do{ fattoswap = false; end = last; for (int i = n - ; i > end; i--) if (v[i] < v[i - ]) { swap(v[i], v[i - ]); last = i; fattoswap = true; while(fattoswap); 00/009

Confronto tra select sort e bubble sort Quale dei due algoritmi è più conveniente? In termini di confronti? In termini di scambi? 00/009