Matrici Vettori di stringhe. Programmazione in C. Riferimenti al materiale



Documenti analoghi
Matrici Vettori di stringhe. Matrici Definizione di matrici in C Operazioni elementari sulle matrici Vettori di stringhe Esercizi proposti Sommario

Vettori di stringhe. Matrici Vettori di stringhe. Matrici di caratteri. Vettori di stringhe. char tris[3][3] ; Esercizio Verifica Sudoku.

Operazioni elementari sulle matrici. Matrici Vettori di stringhe. Definizioni (1/2) Operazioni elementari sulle matrici.

Matrici Vettori di stringhe

Matrici Vettori di stringhe

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

LINGUAGGI DI PROGRAMMAZIONE

Caratteri e stringhe Esercizi risolti

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

Vettori Algoritmi elementari di ordinamento

Introduzione al Foglio Elettronico

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

Le stringhe. Le stringhe

Esercizi di programmazione in C

Linguaggio C - Stringhe

INFORMATICA - I puntatori Roberta Gerboni

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Introduzione al MATLAB c Parte 2

Introduzione al linguaggio C Gli array

Corso di Fondamenti di Informatica

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Dati testuali. Caratteri e stringhe. Tipi di dato testuali. Dati testuali. Il sistema dei tipi C. Rappresentazione dei testi

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Introduzione alla programmazione in C

BARCODE. Gestione Codici a Barre. Release 4.90 Manuale Operativo

Richiesta pagina PHP (es: index.php)

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

RICERCA DI UN ELEMENTO

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

Editor vi. Editor vi

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

4. Operazioni elementari per righe e colonne

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

RISOLUTORE AUTOMATICO PER SUDOKU

Programmazione dinamica

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza

Matlab: Strutture di Controllo. Informatica B

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Funzioni in C. Violetta Lonati

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

Operazioni Aritmetiche e Codici in Binario Giuseppe Talarico 23/01/2013

Esame del 3 febbraio 2010

Variabili e tipi di dato

FIRESHOP.NET. Gestione del taglia e colore.

Cosa è un foglio elettronico

Lezione 8. La macchina universale

Utilizzo delle formule in Excel

Linguaggio C - Funzioni

Codifica: dal diagramma a blocchi al linguaggio C++

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

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL

EXCEL FUNZIONI PRINCIPALI

2.1 Definizione di applicazione lineare. Siano V e W due spazi vettoriali su R. Un applicazione

FORMULE: Operatori matematici

Modulo: Fogli elettronici

Linguaggio C. Fondamenti. Struttura di un programma.

TEST: Word & Excel Tutti i diritti riservati. Computer Facile -

Introduzione al Linguaggio C

Laboratorio di programmazione

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

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

EASYGEST: GESTIONE MOVIMENTI DI MAGAZZINO

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

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

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Test Excel conoscenze di Base

Sistema operativo: Gestione della memoria

Gestione dei File in C

Breve riepilogo della puntata precedente:

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

SISTEMI DI NUMERAZIONE E CODICI

Manuale di Aggiornamento BOLLETTINO. Rel DATALOG Soluzioni Integrate a 32 Bit

Gestione ed analisi di base dati nell epidemiologia. delle malattie infettive

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

4 3 4 = 4 x x x 10 0 aaa

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Plate Locator Riconoscimento Automatico di Targhe

1 ACCESSO AL 3 2 CARICAMENTO DELLE RICHIESTE/PRESTAZIONI MONITORAGGIO DELLE RICHIESTE DOWNLOAD ESITI...

Matlab: Gestione avanzata dei file

Gli algoritmi: definizioni e proprietà

10 - Programmare con gli Array

USO DI EXCEL CLASSE PRIMAI

Prof. Nicola Cappuccio

Potenzialità statistiche Excel

Inizializzazione, Assegnamento e Distruzione di Classi

PROGRAMMA SVOLTO NELLA SESSIONE N.

NUOVO SISTEMA AGGIORNAMENTO DA FYO

Record in C: il costruttore struct.

Le variabili. Olga Scotti

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};

La selezione binaria

Convertitori numerici in Excel

Transcript:

Matrici Vettori di stringhe Programmazione in C Matrici Definizione di matrici in C Operazioni elementari sulle matrici Vettori di stringhe Esercizi proposti Sommario Riferimenti al materiale Testi Kernighan & Ritchie: capitoli e Cabodi, Quer, Sonza Reorda: capitolo Dietel & Dietel: capitolo Dispense Scheda: Matrici e Vettori di stringhe in C

Matrici Matrici bidimensionali Matrici come vettori di vettori Matrici pluridimensionali Matrici Vettori di stringhe Il concetto di matrice Matrici La matrice (array) è un estensione logica del concetto di vettore Vettore = Sequenza uni-dimensionale di valori Tutti dello stesso tipo Identificati da un indice intero Dimensione fissa Matrice = Schiera bi- (o n-) dimensionale di valori Tutti dello stesso tipo Identificati da (o n) indici interi Dimensioni fisse Matrice bidimensionale Caratteristiche righe N colonne M Una matrice bi-dimensionale è caratterizzata da Nome : pitagora Numero di righe : N Numero di colonne : M Tipo degli elementi : int Le righe sono numerate da ad N- Le colonne sono numerate da ad M- In totale ci sono N M elementi In generale M N; per matrici quadrate, M=N pitagora

righe N Elemento (,): riga, colonna Identificazione degli elementi colonne M pitagora Elemento (,): riga, colonna Elemento (,): riga, colonna Lavorare con le matrici Ogni operazione su una matrice deve essere svolta lavorando singolarmente su ciascuno degli elementi Ciò solitamente significa dover ricorrere a due cicli annidati for(i=; i<n; i++) /* righe */ for(j=; j<m; j++) /* colonne */ somma = somma + matrice[i][j] ; Vettori di vettori Matrici Un altro modo di vedere le matrici è concepirle come vettori di vettori: Un vettore di N oggetti (righe) Ciascun oggetto (riga) è composto da M elementi (colonne) Questa prende il nome di rappresentazione per righe di una matrice Esempio Codifica N- pitagora M- Nella realtà, poiché la memoria di un calcolatore è uni-dimensionale, le matrici vengono effettivamente memorizzate per righe

Matrici con più dimensioni Il concetto di matrice può essere generalizzato anche a più di dimensioni Non vi sono, a priori, limiti sul numero di dimensioni Matrici N righe M colonne L livelli N M L elementi: elemento(i, j, k) i N- j M- k L- Caratteristiche Anche le matrici a più dimensioni condividono i vincoli di base dell intera famiglia degli array: Tipo di elementi uniforme Dimensioni fissate a priori Indici interi a partire da In pratica è molto raro utilizzare più di dimensioni

Definizione di matrici in C Sintassi della definizione Operazioni di accesso Matrici Vettori di stringhe Definizione di matrici in C int mat[][] ; Definizione di matrici in C Tipo di dato base Nome della matrice Numero di righe Numero di colonne Definizione di matrici in C int mat[][] ; Definizione di matrici in C int mat[][] ; Tipo di dato base Nome della matrice Numero di righe Numero di colonne Tipo di dato base Nome della matrice Numero di righe Numero di colonne int float char In In futuro vedremo: struct Stesse regole che valgono per i i nomi di di variabili e vettori I nomi delle matrici devono essere diversi dai nomi di di altre variabili o vettori

Definizione di matrici in C Esempi int mat[][] ; int pitagora[][] ; Tipo di dato base Nome della matrice Numero di righe Interi positivi Costanti note a tempo di di compilazione const oppure #define Uguali o diverse Numero di colonne Esempi Esempi int pitagora[][] ; char tris[][] ; X O X O X X int pitagora[][] ; char tris[][] ; float rot[][] ; - - cos β -sin β sin β cos β - Matrici a più dimensioni int mat[][] ; Errore frequente Dichiarare una matrice usando variabili anziché costanti per le dimensioni Più dimensioni Numero di elementi per ciascuna dimensione int mat[][] ; float dati[][][] ; int N = ; int mat[n][n] ; const int N = ; int mat[n][n] ;

Errore frequente Dichiarare una matrice usando il nome degli indici Errore frequente Dichiarare una matrice usando il simbolo di virgola int i, j ; int mat[i][j] ; for(i=; i<; i++) for(j=; j<; j++) scanf("%d",&mat[i][j]) ; const int N = ; int const int N = ; const int M = ; int mat[n,m] ; int mat[n][m] ; int mat[n][n] ; Accesso ai valori di una matrice Definizione di matrici in C Ciascun elemento di una matrice è una variabile del tipo base Per accedere a tale elemento si usa l operatore di indicizzazione: [ ] Vi sono tanti indici quante sono le dimensioni della matrice Ogni indice è racchiuso da una coppia di parentesi quadre Sintassi Sintassi nomematrice[ valoreindice ][ valoreindice ] nomematrice[ valoreindice ][ valoreindice ] Valore intero compreso tra e numero di righe - Costante, variabile o espressione aritmetica con valore intero Costante, variabile o espressione aritmetica con valore intero Valore intero compreso tra e numero di colonne -

pitagora[][] pitagora[][] pitagora[][] Esempi Vincoli (/) In una matrice NxMxKx, il valore dell indice deve essere compreso tra e N-/M-/K-/ La responsabilità è del programmatore Se qualche indice non è un numero intero, viene automaticamente troncato pitagora[i][j] = (i+)*(j+) ; x = pitagora[][] ; int pitagora[][] ; Vincoli (/) Una variabile di tipo matrice può essere utilizzata solamente mediante l operatore di indicizzazione Occorre agire individualmente sui singoli elementi Non è possibile agire sull intera matrice in una sola istruzione pitagora[i][j] = (i+)*(j+) ; x = pitagora[][] ; Uso di una cella di un vettore L elemento di una matrice è utilizzabile come una qualsiasi variabile: Utilizzabile all interno di un espressione tot = tot + mat[i][j] ; Utilizzabile in istruzioni di assegnazione mat[][] = ; Utilizzabile per stampare il valore printf("%d\n", mat[z][k]) ; Utilizzabile per leggere un valore scanf("%d\n", &mat[k][z]) ;

Operazioni elementari sulle matrici Matrici Vettori di stringhe Definizioni Stampa di una matrice Lettura di una matrice Copia di una matrice Somme di riga o di colonna Ricerca di un elemento Ricerca del massimo o del minimo Definizioni (/) const int N = ; const int M = ; /* dimensioni massime */ matricic Operazioni elementari sulle matrici float mat[n][m] ; /* matrice x di reali */ float mat[n][m] ; /* uguali dimensioni */ float sr[n] ; /* somma per righe */ float sc[m] ; /* somma per colonne */ int i, j ; /* indici dei cicli */ Definizioni (/) int trovato ; /* flag */ int riga, col ; /* risultati ricerca */ matricic float dato ; /* elemento da ricercare */ float somma, sommar, sommac ; /* per calcolo di somme */ Operazioni elementari sulle matrici float maxr, maxc ; /* massimi */

Stampa di matrici Stampa per righe matrice di reali Occorre stampare un elemento per volta, all interno di cicli for Sono necessari due cicli annidati Il ciclo esterno per scandire le righe (da a N-) Il ciclo interno per scandire ciascuna colonna (da a M-) della riga data Si può stampare per righe (caso normale) o per colonne (trasposta) printf("matrice: %d x %d\n", N, M); for(i=; i<n; i++) for(j=; j<m; j++) printf("%f Stampa la riga ", i-esima mat[i][j]) ; printf("\n"); matricic Stampa per righe matrice di reali Esempio printf("matrice: %d x %d\n", N, M); for(i=; i<n; i++) for(j=; j<m; j++) printf("%f ", mat[i][j]) ; printf("\n"); /* Stampa la riga i-esima */ matricic Matrice: righe, colonne Stampa per colonne matrice di reali Esempio printf("matrice: %d x %d\n", N, M); for(j=; j<m; j++) for(i=; i<n; i++) printf("%f ", mat[i][j]) ; printf("\n"); matricic Matrice: righe, colonne

Lettura di matrici Occorre leggere un elemento per volta Si procede per righe (o per colonne) Si utilizzano solitamente due cicli annidati Operazioni elementari sulle matrici Lettura per righe matrice di reali Esempio printf("immetti matrice %d x %d\n", N, M) ; for(i=; i<n; i++) printf("riga %d:\n", i+) ; for(j=; j<m; j++) printf("elemento (%d,%d): ", i+, j+) ; scanf("%f", &mat[i][j]) ; matricic Immetti una matrice x Riga : Elemento (,): Elemento (,): Elemento (,): - Elemento (,): Elemento (,): Riga : Elemento (,): Elemento (,): Elemento (,): Elemento (,): Elemento (,): Copia di matrici (/) Operazioni elementari sulle matrici L operazione di copia di una matrice sorgente in una destinazione richiede che ciascun elemento venga copiato individualmente La matrice destinazione deve avere dimensioni uguali o superiori a quelle della sorgente L operazione di copia avviene ovviamente a livello del singolo elemento

Copia di matrici (/) matricic for(i=; i<n; i++) for(j=; j<m; j++) mat[i][j] = mat[i][j] ; Operazioni elementari sulle matrici Sommatorie in matrici Esempio Il calcolo di totali sui dati contenuti in una matrice può corrispondere a tre diverse operazioni: Somma degli elementi di ciascuna riga (totali di riga) Somma degli elementi di ciascuna colonna (totali di colonna) Somma di tutti gli elementi della matrice float mat[n][m] ; Esempio Somma per righe float mat[n][m] ; float sr[n] ; for(i= ; i<n ; i++) somma = ; for(j=; j<m; j++) somma = somma + mat[i][j] ; sr[i] = somma ; matricic for(i=; i<n; i++) printf("somma riga %d = %f\n", i+, sr[i]) ; float sc[m] ; float

Somma per colonne Somma complessiva for(j= ; j<m ; j++) somma = ; for(i=; i<n; i++) somma = somma + mat[i][j] ; sc[j] = somma ; matricic somma = ; for(i= ; i<n ; i++) for(j=; j<m; j++) somma = somma + mat[i][j] ; matricic for(j=; j<m; j++) printf("somma colonna %d = %f\n", j+, sc[j]) ; printf("somma complessiva = %f\n", somma) ; Ricerca di elementi Operazioni elementari sulle matrici Dato un valore dato, ricercare se esso esiste (almeno una volta) nella matrice In caso affermativo, specificare la riga e la colonna Si utilizzano i soliti due cicli annidati Ricerca elemento (/) Ricerca elemento (/) printf("dato da ricercare: "); scanf("%f", &dato) ; trovato = ; riga = - ; col = - ; for(i=; i<n && trovato==; i++) for(j=; j<m && trovato==; j++) if( mat[i][j]==dato ) trovato= ; riga = i ; col = j ; matricic if(trovato==) printf("dato %f presente: (%d,%d)\n", dato, riga, col) ; else printf("dato %f non presente\n", dato) ; matricic

Massimi e minimi Operazioni elementari sulle matrici Per quanto riguarda il calcolo di massimi e minimi si possono distinguere i scenari: Massimo/minimo degli elementi di ciascuna riga Massimo/minimo degli elementi di ciascuna colonna Massimo/minimo tra tutti gli elementi della matrice Massimo per righe Massimo per colonne for(i=; i<n; i++) col = ; maxr = mat[i][] ; for(j=; j<m; j++) if( mat[i][j] > maxr ) maxr = mat[i][j] ; col = j ; matricic for(j=; j<m; j++) riga = ; maxc = mat[][j] ; for(i=; i<n; i++) if( mat[i][j] > maxc ) maxc = mat[i][j] ; riga = i ; matricic printf("max di riga %d vale %f e si trova nella colonna %d\n", i+, maxr, col+) ; printf("max di colonna %d vale %f e si trova nella riga %d\n", j+, maxc, riga+) ; Osservazioni Le operazioni qui citate sono gli elementi fondamentali dell elaborazione di matrici Nei problemi concreti si osserveranno delle combinazioni di tali operazioni Occorre analizzare il problema, scomporlo nei suoi sottoproblemi e combinare opportunamente le varie tecniche Esercizio Max Sum Abs Data una matrice NxN, determinare la riga in cui la somma dei valori assoluti degli elementi sia massima r = max j i ( Mij )

Soluzione Soluzione Inizializza max Per ogni riga i: Calcola la somma sommar dei valori assoluti di tale riga Confronta sommar con il max corrente, ed eventualmente aggiorna il max Stampa max max = - ; for(i=; i<n; i++) sommar = ; for(j=; j<m; j++) sommar = sommar + fabs(mat[i][j]) ; if(sommar>max) max = sommar ; printf("r = %f\n", max) ; maxsumabsc Soluzione Soluzione (/) Calcola un vettore di appoggio, di N elementi, contenente le sommatorie per ogni riga Trova il max all interno di questo vettore di appoggio Soluzione più lunga dal punto di vista del codice, ma più semplice da concepire e realizzare for(i=; i<n; i++) sommar = ; for(j=; j<m; j++) sommar = sommar + fabs(mat[i][j]) ; sr[i] = sommar ; maxsumabsc Soluzione (/) maxsumabsc max = - ; for(i=; i<n; i++) if(sr[i]>max) max = sr[i] ; printf("r = %f\n", max) ;

Vettori di stringhe Matrici di caratteri Vettori di stringhe I/O di vettori di stringhe Matrici Vettori di stringhe Matrici di caratteri Vettori di stringhe Nel definire una matrice, è ovviamente possibile usare il tipo base char Permette di memorizzare una tabella NxM di caratteri ASCII Ogni posizione [i][j] deve contenere un carattere Non può essere vuota Non può contenere più di un carattere char tris[][] ; O X X Esercizio Verifica Sudoku Esempio Si realizzi un programma in C che verifichi la corretta soluzione della griglia di un Sudoku Il programma acquisisce da tastiera la griglia x, in cui ciascun elemento è un carattere tra e Il programma deve verificare se il Sudoku è stato correttamente risolto

Analisi Tutti i valori devono essere singoli caratteri tra e Su ciascuna delle righe, non devono esserci valori ripetuti Su ciascuna delle colonne, non devono esserci valori ripetuti In ciascuno dei blocchi x, non devono esserci valori ripetuti Soluzione (/) const int N = ; char sudoku[n][n] ; int i, j, k ; /* indici dei cicli */ int r, c, r, c ; char ch ; int err, good ; /* flag */ printf("verifica Sudoku\n") ; sudokuc Soluzione (/) Soluzione (/) for(i=; i<n; i++) printf("riga %d:\n", i+) ; for(j=; j<n; j++) Acquisisci un carattere ch tra e sudoku[i][j] = ch ; sudokuc for(i=; i<n; i++) do printf(" printf("riga Colonna %d:\n", ", i+) j+) ;; ch = for(j=; getchar() j<n; ; j++) if( ch<'' ch>'' ) printf("errata - ripeti\n") ; Acquisisci un carattere /* elimina fino ch fine tra linea e */ while( getchar()!='\n') sudoku[i][j] = ch ; /*nop*/ ; while( ch<'' ch>'') ; sudokuc Soluzione (/) /* Stampa il tabellone */ for(i=; i<; i++) for(j=; j<; j++) printf("%c ", sudoku[i][j]) ; if(j== j==) printf(" ") ; printf("\n"); if(i== i==) printf("\n") ; sudokuc good = ; /* flag generale */ /* Verifica le righe */ for(i=; i<n; i++) printf("riga %d: ", i+) ; err = ; Soluzione (/) sudokuc /* ricerca duplicati su col j,k */ for(j=; j<n; j++) for(k=j+; k<n; k++) if(sudoku[i][j]== sudoku[i][k]) err = ;

Soluzione (/) Soluzione (/) if(err==) printf("ok\n"); else printf("errore!\n"); good = ; sudokuc for(i=; i<n; i++) /* Colonne */ printf("colonna %d: ", i+) ; err = ; /* ricerca dupl su righe j,k */ for(j=; j<n; j++) for(k=j+; k<n; k++) if(sudoku[j][i]==sudoku[k][i]) err = ; if(err==) printf("ok\n"); else printf("errore!\n"); good = ; sudokuc Ricerca per blocchi Ricerca per blocchi j j+ i i+ Ricerca per blocchi Soluzione (/) j j+ i i+ r,c r,c for(i=; i<n; i=i+) for(j=; j<n; j=j+) printf("blocco (%d,%d)-(%d,%d): ", i+, j+, i+, j+) ; /* ricerca duplicati nel blocco */ /* Confronta [r][c] con [r][c] */ err = ; sudokuc

Soluzione (/) Soluzione (/) for(r=i; r<i+; r++) for(c=j; c<j+; c++) /* elemento [r][c] */ for(r=i; r<i+; r++) for(c=j; c<j+; c++) /* rispetto a [r][c] */ if( ((r!=r) (c!=c)) && sudoku[r][c]== sudoku[r][c] ) err = ; /*r,c*/ /*r,c*/ sudokuc if(err==) printf("ok\n"); else printf("errore!\n"); good = ; /*j*/ /*i*/ sudokuc Soluzione (/) sudokuc if(good==) printf("sudoku valido!\n"); else printf("sudoku errato\n"); Vettori di stringhe Vettori di stringhe Esempio Una matrice di caratteri può anche essere vista come: Un vettore di vettori di caratteri, cioè Un vettore di stringhe Si tratta di un metodo diverso di interpretare la stessa struttura dati char tris[][] ; char nomi[][] ; O X X F u l v i o \ x! w A n t o n i o \ Z C r i s t i n a \ u E l e n a \ g r d D a v i d e \ $ e

Caratteristiche Sintassi stringhe di lunghezza variabile char nomi[][] ; Lunghezza max caratteri F u l v i o \ x! w A n t o n i o \ Z C r i s t i n a \ u E l e n a \ g r d D a v i d e \ $ e Terminatore nullo in ogni stringa (riga) Definizione Nome del vettore di stringhe char vett[max][lun] ; Numero di stringhe Lunghezzza massima di ciascuna stringa (compreso terminatore nullo) Sintassi Sintassi Definizione char vett[max][lun] ; Accesso al singolo carattere vett[i][j] Definizione char vett[max][lun] ; Accesso al Stringa singolo carattere (i+)-esima, da usarsi con le vett[i][j] funzioni di libreria Carattere (j+)-esimo della stringa (i+)-esima, da usarsi per l elaborazione carattere-per-carattere Accesso all intera stringa vett[i] Esempio Dato un vettore di stringhe, determinare quante volte è presente la lettera A (maiuscola o minuscola) Dato un vettore di stringhe, determinare se esistono due stringhe identiche Esempio cont = ; for(i=; i<max; i++) for(j=; vett[i][j]!=; j++) if(toupper(vett[i][j])=='a') cont++ ; uguali = ; for(i=; i<max; i++) for(k=i+; k<max; k++) if(strcmp(vett[i], vett[k])==) uguali= ;

Occupazione variabile In un vettore di stringhe, ogni riga (ogni stringa) è intrinsecamente un vettore di caratteri ad occupazione variabile Terminatore nullo per indicare la lunghezza effettiva Il numero di stringhe effettivamente memorizzato potrebbe non riempire l intero vettore Variabile intera che indica l effettiva occupazione del vettore const int MAX = ; const int LUN = ; char nomi[max][lun+] ; int N ; F u l v i o \ x! w A n t o n i o \ Z C r i s t i n a \ u N= e ) a \ g r d % < d d e g $ e Esempio Errore frequente Confondere una stringa (vettore di caratteri) con un vettore di stringhe (matrice di caratteri) char s[lun+] ; char v[max][lun+] ; Vettori di stringhe s[i] è un singolo carattere s è l intera stringa v[i][j] è il singolo carattere v[i] è un intera stringa v è l intera matrice Stampa (/) Stampa (/) La stampa del contenuto di un vettore di stringhe si ottiene semplicemente stampando ciascuno degli elementi Si può utilizzare puts oppure printf for(i=; i<n; i++) puts(vett[i]) ; vettstrc

Lettura Dimensione nota a priori (/) Acquisire da tastiera un vettore di stringhe Un ciclo per ciascuna delle stringhe da leggere Lunghezza nota a priori Lunghezza determinata dalla lettura di un certo dato (es: FINE ) Acquisizione, nel ciclo, di ciascuna delle stringhe Utilizzo della funzione gets Eventualmente, lettura in una stringa d appoggio per la verifica di correttezza, prima di ricopiare nel vettore destinazione char vett[max][lun+] ; char s[] ; do printf("quante stringhe? ") ; gets(s) ; N = atoi(s) ; if(n< N>MAX) printf("valore errato: deve essere tra e %d\n", MAX) ; while(n< N>MAX) ; vettstrc Dimensione nota a priori (/) Lettura terminata da FINE for(i=; i<n; i++) printf("stringa %d: ", i+) ; gets(s) ; if (strlen(s)==) printf("vuota - ripeti\n"); i-- ; else if(strlen(s)>lun) printf("troppo lunga max %d chr\n", LUN) ; i-- ; else strcpy(vett[i], s) ; vettstrc N = ; end = ; do printf("stringa %d: ", N+) ; gets(s) ; if (strlen(s)==) printf("vuota - ripeti\n"); else if(strlen(s)>lun) printf("troppo lunga\n") ; else if(strcmp(s, "FINE")==) end = ; else strcpy(vett[n], s) ; N++ ; while(end==) ; vettstrc

Esercizi proposti Esercizio Statistiche testo Esercizio Magazzino Matrici Vettori di stringhe Esercizio Statistiche testo Esercizi proposti Un utente inserisce una serie di frasi da tastiera, su più righe L inserimento termina quando l utente inserisce la parola FINE su una riga da sola Il programma deve determinare: ) Quante righe sono state inserite dall utente ) Quanti caratteri sono stati inseriti ) Quanti caratteri alfanumerici sono stati inseriti ) Quante parole sono state inserite Analisi Soluzione (/) Testo: Nel mezzo del cammin di nostra vita Testo: mi ritrovai per una selva oscura Testo: che la diritta via era smarrita Testo: FINE L'utente ha inserito righe L'utente ha inserito caratteri L'utente ha inserito caratteri alfanumerici L'utente ha inserito parole const int MAXRIGHE = ; const int LUN = ; char testo[maxrighe][lun] ; int Nrighe ; /* righe inserite */ char riga[lun*] ; int i, j ; int caratteri, caralfa, parole ; statistichetestoc

Soluzione (/) Soluzione (/) Nrighe = ; do printf("testo: "); gets(riga) ; if( strcmp(riga, "FINE")!= ) /*copia riga in testo[nrighe] ;*/ strcpy( testo[nrighe], riga ) ; Nrighe++ ; while( strcmp(riga, "FINE")!= ) ; statistichetestoc printf("l'utente ha inserito" " %d righe\n", Nrighe); caratteri = ; for(i=; i<nrighe; i++) caratteri = caratteri + strlen(testo[i]) ; printf("l'utente ha inserito" " %d caratteri\n", caratteri) ; statistichetestoc Soluzione (/) caralfa = ; for(i=; i<nrighe; i++) for(j=; testo[i][j]!=; j++) if( isalnum(testo[i][j] ) ) caralfa++ ; printf("l'utente ha inserito " "%d caratteri alfanumerici\n", caralfa) ; statistichetestoc Soluzione (/) parole = ; for(j=; j<nrighe; j++) for(i=; testo[j][i]!=; i++) if( isalpha(testo[j][i]) && (i==!isalpha(testo[j][i-]))) parole ++ ; printf("l'utente ha inserito " "%d parole\n", parole) ; statistichetestoc Esercizio Magazzino (/) Esercizi proposti Un azienda deve tenere traccia dei beni presenti in un magazzino L utente inserisce da tastiera dei comandi nel seguente formato: bene EU quantità dove: bene è il nome di un bene EU è la lettera 'E' per entrata, 'U' per uscita quantità è la quantità di bene entrata o uscita

Esercizio Magazzino (/) Analisi L utente termina il caricamento inserendo un comando pari a "FINE" In tal caso il programma deve stampare le quantità di beni presenti a magazzino Comando: viti E Comando: dadi E Comando: viti U Comando: viti E Comando: FINE viti dadi Problemi Estrazione dei parametri dal comando immesso dall utente Nome prodotto: stringa viti E Direzione: carattere Quantità: intero Memorizzazione di nomi di prodotti e quantità relative Vettori paralleli Aggiornamento delle giacenze comando viti E prod viti dir E qta Da inizio stringa fino al primo spazio Spazio Singolo carattere Stringa di comando Spazio Ultimi caratteri della stringa, da convertire in int Analisi del comando (/) Analisi del comando (/) i = ; while(comando[i]!=' ') prod[i] = comando[i] ; i++ ; prod[i] = ; /* salta lo spazio */ i++ ; dir = comando[i] ; /* 'E' o 'U' */ magazzinoc /* salta lo spazio */ i++ ; /* da qui a fine: la quantità */ j = ; while(comando[i]!=) temp[j] = comando[i] ; i++ ; j++ ; temp[j] = ; qta = atoi(temp) ; magazzinoc

Osservazione L analisi di una stringa di comando composta da più campi è sempre un operazione complessa Nel caso in cui si dovessero gestire delle condizioni anomale (es più spazi consecutivi) o di errore (es manca la quantità), il codice diverrebbe estremamente articolato Vedremo più avanti la funzione sscanf che può aiutare in questi casi Rappresentazione del magazzino Occorre memorizzare, per ciascun prodotto Il nome La quantità corrente Si possono usare due vettori paralleli char prodotti[max][lun+] ; int quantita[max] ; int N ; /* occupazione effettiva vettori prodotti e quantita */ Inserimento di un prodotto Determinare se il prodotto è già in magazzino Ricerca del nome del prodotto nel vettore prodotto Se c è già, incrementa la quantità Se non c è ancora, aggiungi una riga ai vettori Inserimento di un prodotto /* trova la posizione del prodotto */ trovato = - ; for(i=; i<n; i++) if(strcmp(prodotti[i], prod)==) trovato = i ; if( trovato!= - ) /* esiste già */ quantita[trovato] = quantita[trovato] + qta ; magazzinoc else /* prodotto nuovo */ strcpy(prodotti[n], prod) ; quantita[n] = qta ; N++ ; Eliminazione di un prodotto Eliminazione di un prodotto Determinare se il prodotto è già in magazzino Ricerca del nome del prodotto nel vettore prodotto Se c è già, decrementa la quantità Se non c è ancora, errore /* trova la posizione del prodotto */ trovato = - ; for(i=; i<n; i++) if(strcmp(prodotti[i], prod)==) trovato = i ; if( trovato == - ) printf("prodotto %s non " "trovato in magazzino\n", prod); else quantita[trovato] = quantita[trovato] - qta ; magazzinoc

Argomenti trattati Matrici Vettori di stringhe Matrici bi-dimensionali e pluri-dimensionali Matrici di numeri interi e reali Definizione Operazioni frequenti Matrici di caratteri Vettori di stringhe Caso particolare di matrici di caratteri Operazioni frequenti Tecniche di programmazione Usare matrici per memorizzare schiere di dati numerici Usare vettori di stringhe per memorizzare stringhe di testo di lunghezza variabile Compiere operazioni di ricerca nei vettori di stringhe Materiale aggiuntivo Sul CD-ROM Testi e soluzioni degli esercizi trattati nei lucidi Scheda sintetica Esercizi risolti Esercizi proposti Esercizi proposti da altri libri di testo