Corso di Fondamenti di Programmazione canale E-O. Cos è. un vettore (1) un vettore (2) un vettore (3)

Documenti analoghi
Cos è un vettore (1) Vettori. Cos è un vettore (2) Cos è un vettore (3) DD Cap. 6 pp

Fondamenti di Programmazione

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Esercitazione 6. Array

Esercizi C su array e matrici

Fondamenti di Programmazione

Introduzione al linguaggio C Puntatori

Ricorsione. DD cap. 5 pp KP cap. 5 pp

Esercitazione di Reti degli elaboratori

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

C: panoramica. Violetta Lonati

Fondamenti di Informatica 12. Linguaggio C -4

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Laboratorio di Informatica I

Lezione 6: Array e puntatori

Programmazione I - Laboratorio

Programmazione in Java (I modulo)

I puntatori. DD Cap.7 pp KP Cap.6 pp

Puntatori e array. Violetta Lonati

Fondamenti di Programmazione

Introduzione al C. Unità 7 Array. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Linguaggio C - Array. Array: tipo nome_array[num_elementi]

Array. Aggragati di variabili omogenee...

Informatica (A-K) 14. Linguaggio C -4

Cicli annidati e matrici di variabili

Laboratorio di Informatica I

Array multidimensionali e stringhe

Esercizi. Filtraggio

Esercizi. La funzione swapint() primo tentativo

Array e puntatori in C

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

char *s; s = (char *) malloc(5*sizeof(char)); scanf( %s, s); Stringhe

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

Corso di Fondamenti di Programmazione canale E-O. Strutture. Strutture. Definizione di strutture (2) Definizione di strutture (1)

Gli array. slides credit M. Poneti

Programmazione I - Laboratorio

Linguaggio C: Array Valeria Cardellini

Corso di Fondamenti di Programmazione canale E-O ... Un esempio per iniziare. printf) Altri cenni su printf() Esercizi 8. (printf(

Programmazione Appello d esame del 18 giugno 2010 Compito B

del Linguaggio C Istruzioni di iterazione

Problema. Vettori e matrici. Vettori. Vettori

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Fondamenti di Informatica 2

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

STRUCT - ESERCIZIO 1

Matrici (array bidimensionali)

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Istruzioni iterative (o cicliche)

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Lezione 8: Stringhe ed array multidimensionali

Il linguaggio C. Puntatori e dintorni

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Università degli Studi di Brescia. Vettori di variabili. ! Sono variabili aggregate in grado di memorizzare una collezione (organizzata) di oggetti

C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.

Esercizio 1: parole nel testo

PASCAL: I VETTORI TRATTO DA CAMAGNI-NIKOLASSY, CORSO DI INFORMATICA, VOL. 1, HOEPLI. Informatica

Parametri passati per indirizzo. Puntatori Vogliamo modificare la parte del codice di bubble che realizza lo scambio dei valori:

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Esercitazione 11. Liste semplici

Variabili e input/ Alessandra Giordani Lunedì 18 marzo

Strutture Dati Dinamiche

Concetti chiave. Gli Array o Vettori. Array Elementi dell array Indici e lunghezza dell array Inizializzazione di vettori Array multidimensionali

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Algoritmi di ordinamento: Array e ricorsione

Esercitazioni di Fondamenti di Informatica - Lez. 4 23/10/2018

Programmazione di base

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Sunto della scorsa lezione Il linguaggio C. Un Programma con Errori. Il preprocessore. Linguaggi di Programmazione I.

Cicli annidati ed Array multidimensionali

Lezione 12: Allocazione Dinamica della Memoria

Fondamenti di Informatica 2

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

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Programmazione C Massimo Callisto De Donato

Informatica 2 modulo C Massimo Callisto De Donato

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Puntatori. Fondamenti di Programmazione

20/10/2014 M. Nappi/FIL 1

Introduzione al C Lez. 4

Programmazione C: Esercizi su vettori e funzioni. Titolo presentazione. sottotitolo. Milano, XX mese 20XX

Fondamenti di Informatica 2

Esercitazioni di Fondamenti di Informatica - Lez. 5 30/10/2018

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

LE FUNZIONI PARTE II. Manuale linguaggio C

Corso di Informatica A.A

Capitolo 11. Puntatori

Informatica A (per gestionali) A.A. 2004/2005. Esercizi di programmazione C Funzioni: passaggio di parametri per indirizzo, passaggio di array.

Tipi di dato strutturati: Array

Manualistica 3 Le strutture di controllo

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Fondamenti di Informatica 2

Un esempio di calcolo di complessità: insertion sort

Variabili intere, funzioni e input/ Alessandra Giordani Lunedì 19 marzo

Transcript:

Corso di Fondamenti di Programmazione canale E-O Tiziana Calamoneri Vettori DD Cap. 6, pp. 85-244 Cos è un vettore () Osserva: Una variabile può contenere un solo valore alla volta. Il costruttore di vettore [ ] permette di raccogliere sotto un unico nome più variabili dello stesso tipo. più avanti vedremo come sia possibile anche raccogliere sotto uno stesso nome variabili non omogenee (struct). Cos è un vettore (2) Vettore Gruppo di locazioni di memoria consecutive correlate dal fatto che hanno lo stesso nome e lo stesso tipo di dato Per riferirsi ad un elemento: nome del vettore numero della posizione Formato: nome_vettore[numero di posizioni] il primo elemento è in posizione gli n elementi del vettore sono: c[ ], c[ ]...c[ n ] Nome del vettore (N.B. Tutti gli elementi di questo vattore hanno lo stesso nome, c) c[] c[] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9] c[] c[] -45 numero di posizione dell elemento in c 6 72 543-89 62-3 6453 78 Cos è un vettore (3) I nomi dei vettori seguono le regole dei nomi delle altre variabili: formati da lettere, cifre, _ non possono iniziare con una cifra Il numero di posizione di un elemento è detto indice può essere un intero o un espressione intera Esempio: c[4], c[a+b], c[a++] Il valore degli elementi del vettore (non del vettore!) si determina guardando le singole celle, che sono variabili come tutte le altre Esempio: c[ ] = 3; printf( "%d", c[ ] );

Un esempio Definizione di un vettore c[] c[] c[2] c[3] -45 6 72 Problema: assegna ad una variabile intera x il valore del settimo elemento di c aumentato di 2. Quando si definisce un vettore, bisogna specificarne: il nome il tipo dei suoi elementi il numero dei suoi elementi Formato: tipo nome_vettore[numerodielementi]; c[4] c[5] c[6] c[7] c[8] c[9] 543-89 62-3 Qual è il settimo elemento di c? x=c[6]+2; c[6] Esempio: int c[]; float mio_vettore[3284]; c[] c[] 6453 78 Attenzione: non è possibile copiare il contenuto di un vettore su un altro con una singola assegnazione. E necessario copiare un elemento per volta!!! Inizializzazione di un vettore int n[5] =, 2, 3, 4, 5; int n[] =, 2, 3, 4, 5; Se i valori per inizializzare non sono sufficienti, i restanti elementi sono inizializzati a int n[2] =, 2, 3, 4, 5; Se i valori per inizializzare sono troppi, viene segnalato un errore di sintassi int n[5] = ; Tutti gli elementi sono inizializzati a int n[ ] =, 2, 3, 4, 5; Se la dimensione viene omessa, essa viene determinata dagli elementi che inizializzano (nell esempio: 5 inizializzatori, perciò 5 elementi) #include<stdio.h> #define N int A[N]=; Esempio definizione della dim. di A inizializzazione di A a int main() int i; for(i=; i<n; i++) printf( dammi l elem. %d\n, i); scanf( %d, &A[i]); valori immessi dall utente for(i=; i<n; i++) printf( %d, A[i]); stampa degli elementi di A return ; OUTPUT: 3 2 5 6 4 2 9 2

#include<stdio.h> #define N int A[N]=; Un altro esempio int main() int i; for(i=; i<n; i++) printf( dammi l elem. %d\n, i); scanf( %d, &A[i]); for(i=; i<n; i++) printf( A[%d]%6d\n, i, A[i]); return ; se voglio l output così? A[] 3 A[] 2 A[2] 5 A[3] 6 ecc nella printf: %nd, dove n è un intero, sposta la stampa di n spazi. Allora Un esempio Problema: dato un vettore di caratteri (stringa), contare il numero di caratteri di cui il vettore è composto. #include <stdio.h> char str[]= Nel mezzo del cammin di ; int lung_str(void) int lung_str(void); int i; for (i=; str[i]!= \ ; i++); int main() return i; int l=lung_str(); printf( lunghezza=%d caratteri, l); i str n e l me z z o d e l c a mm i n d i \ Memoria allocata () int n[9]; alloca in memora 9 spazi contigui per 9 interi. Se un intero occupa 2 bytes, allora lo spazio allocato è 2x9=8 bytes, se un intero occupa 4 bytes, allora lo spazio allocato è 4x9=36 bytes. Questi bytes sono tutti consecutivi in memoria: n[] n[] n[2] n[3] n[4] n[5] n[6] n[7] n[8] 78 79 8 8 82 83 84 85 86 87 88 89 9 9 92 93 94 95 Per sapere quanti bytes occupa un tipo, basta chiamare la funzione sizof(tipo), che restituisce il numero di bytes occupati dal tipo. Esempio: n=sizof(char); n contiene Memoria allocata (2) Attenzione: il C non fa controlli sulle dimensioni del vettore!! while (n[i]!=) n[i]=; corretto: i++; (n[i]!=)&&(i<n) n[] n[] n[2] n[3] n[4] n[5] n[6] n[7] n[8] 7-8 83 34-8 2 6-54398 78 79 8 8 82 83 84 85 86 87 88 89 9 9 92 93 94 95 Se si scorre un vettore senza usare una condizione sulla sua dimensione si rischia di sforare ottenendo un errore di esecuzione (non di compilazione!) Per questo, quando si passa un vettore ad una funzione, bisogna passare anche la sua dimensione!!

Un esempio Problema: definire un vettore di 2 interi e memorizzarvi i primi 2 multipli di 3. #include<stdio.h> #define N 2 int main() int vett[n]=; int i; for(i=; i<=n; i++) vett[i-]=3*i; printf( %d, vett[i-]); return ; Un altro esempio () Problema: rappresentare graficamente i valori degli elementi di un vettore con gli istogrammi Vett: 2 5 9 2 7 ************ ***** ********* ********** ** ******* Un altro esempio (2) Esercizi 5. (vettori) #include<stdio.h> #define N 6 int main() int vett[n]=2,5,9,,2,7; int i; int j; for(i=; i<n; i++) for(j=; j<=vett[i]; j++) printf( * ); printf( \n ); return ; N.B. due cicli nidificati Osservazione: Quante operazioni vengono eseguite da questo programma? Dopo aver costruito il diagramma di flusso per ciascun problema, scrivere dei programmi C che NON facciano uso di funzioni che eseguano le seguenti operazioni: Calcolare il massimo di un vettore di interi. Calcolare il massimo ed il minimo di un vettore di interi contemporaneamente (cioè con un solo ciclo). Calcolare la somma di tutti gli elementi di un vettore di reali. Calcolare la media degli elementi di un vettore di interi. Sostituire tutti gli elementi di un vettore di interi con la somma di tutti gli elementi che lo precedono, compreso se stesso (somme prefisse) Dati due vettori di reali della stessa lunghezza, costruire un terzo vettore di reali con le somme elemento per elemento dei primi due.

Usare vettori nelle funzioni: un esempio () Problema: prendere in input un intero e stamparne la sua rappresentazione binaria in decimale, dividiamo per e 285!28!2!! a 2 3 4 5 8 2!285 in binario, dividiamo per 2 e 3!6!3!! a 2 3 4! Usare vettori nelle funzioni: un esempio (2) #include <stdio.h> #define DIM 6 void stampa_bin(int x); int main() int num; printf( inserisci num. ); scanf( %d,&num); printf( rappr. bin.= ); stampa_bin(num); return ; void stampa_bin(int x) int i, j; int a [DIM]; if (x==) printf( %d, x); else for (i=; x!=; i++) a[i]=x%2; x/=2; for (j=i-; j>=; j--) printf( %d, a[j]) Passare vettori alle funzioni: un esempio Problema: scrivere una funzione C che prende come parametro un vettore di n interi, e restituisce o a seconda che ci sia o no almeno un elemento ripetuto due volte dato vettore A di dim. n: i=; finché i<n e non hai ancora trovato un doppione: cerca A[i] nel sottovettore [i+, n-]: se trovi un doppione restituisci altrimenti i++ restituisci. N.B. cicli nidificati int doppioni(int A[],int n) int i=; while (i<n) int j=i+; while (j<n) if (A[i]==A[j]) return ; j++; i++; return ; Numero di operazioni? Passare vettori alle funzioni () Per passare un vettore come paramentro ad una funzione, bisogna specificarne solo il nome int miovettore[ 24 ]; miafunzione(miovettore, 24 ); N.B. passare anche la dimensione (per quanto già osservato) I vettori vengono passati in C per riferimento: la funzione potrà modificare il vettore. Questo perché che il nome di un vettore è, in realtà, l indirizzo del suo primo elemento (cioè vett e &vett[] sono la stessa cosa!) La ragione è che copiare l intero vettore ad ogni chiamata di funzione può essere una cosa molto dispendiosa sia in termini di spazio che di tempo

Passare vettori alle funzioni (2) Per passare un elemento di un vettore come parametro ad una funzione, bisogna specificare il nome e l indice: int miovettore[ 24 ]; miafunzione(miovettore[3]); In questo caso il passaggio è per valore, come per tutte le altre variabili Nei prototipi di funzione si mettono le parentesi quadre per chiarire che si tratta di un vettore: void miafunzione(int miovettore[], int dim); I nomi dei parametri sono, come sempre, opzionali: void miafunzione(int [], int); La dimensione nelle [ ] non è obbligatoria: se c è, il compilatore controlla che sia > e poi la ignora. Specificare una dimensione negativa dà un errore di compilazione Un esempio Problema: scrivere una funzione C che prende come parametro un vettore di n interi, e restituisce la somma di tutti i suoi elementi dato vettore A di dim. n: i=; somma=; per ogni i da a n- somma=somma+a[i] ritorna somma. int sum(int A[],int n) int i, somma=; for (i=; i<n; i++) somma+=a[i]; return somma; Un altro esempio () p r o b l e m a : scrivere una funzione C che calcoli il minimo di un vettore. int min(int vett[], int dim) int min; int i; min=vett[]; for(i=; i<dim; i++) if (vett[i]<min) min=vett[i]; N.B. qui vett non viene modificato return min; Un altro esempio (2) void minin(vett[], int dim) problema: scrivere una int min; int ind; int i; funzione C che trovi il minimo di min=vett[]; un vettore e lo metta in prima ind=; posizione for(i=; i<dim; i++) if (vett[i]<min) min=vett[i]; ind=i; scambia(&vett[], &vett[ind]); return; qui vett viene modificato!

Esercizi 6. (vettori e funzioni) Dopo aver costruito il diagramma di flusso per ciascun problema, scrivere dei programmi C che facciano uso di funzioni e che eseguano le seguenti operazioni: Dato un vettore di reali, modificarlo in modo che contenga in ciascun elemento la metà di ciò che conteneva originariamente. Dato un vettore di interi ed un intero, scrivere una funzione che restituisce se l intero è nel vettore e altrimenti. Dato un vettore, utilizzare ripetutamente la funzione minin, opportunamente modificata, per ottenere il vettore ordinato. Ordinamento nei vettori Il problema dell ordinamento è interessante e di vasta applicabilità, quindi: molta ricerca in proposito per rendere la soluzione sempre più efficiente. Qui vedremo algoritmi semplici e non molto efficienti. Nel corso degli studi si avrà modo di studiare algoritmi più complessi ma più efficienti. Selection sort () 6 7 8 9-2 3 7 9-5 67 2 5 8 richiamo minin 6 7 8 9-5 - 2 3 7 9 67 2 5 8 richiamo minin 6 7 8 9-5 - 2 3 7 9 67 2 5 8 richiamo minin2 6 7 8 9-5 - 3 7 9 67 2 5 2 8 richiamo minin3 6 7 8 9-5 - 2 7 9 67 3 5 2 8 richiamo minin4 6 7 8 9-5 - 2 3 9 67 7 5 2 8 e così via Selection sort (2) PSEUDOCODICE Selection(Vett, dim) per ogni i da a n-2: trova il minimo nel sottovettore [i, n-] scambia il minimo trovato con Vett[i] stampa Vett Efficienza: se Vett è ordinato? Dobbiamo comunque fare tutti i confronti, senza scambiare nulla min=vett[i]; indmin=i; per ogni j da i+ a n- se Vett[j] < min min=vett[j] indmin=j

Bubble sort () Bubble sort (2) - 2 3 7 9-2 3 7 9-2 3 7 9-3 2 7 9-3 7 2 9-3 7 9 2 elem ok - 3 7 9 2-3 7 9 2-3 7 9 2-3 7 9 2-3 7 9 2 2 elem ok e così via PSEUDOCODICE Bubble(Vett, dim) per ogni i da n- a : scorri il sottovettore [,i] con j per ogni coppia (j, j+) se Vett[j] e Vett[j+] sono invertiti scambia(j,j+) stampa Vett per ogni j da a i- if Vett[j]>Vett[j+] Scambia(j, j+) Bubble sort (3) Efficienza? 7 2 23 27 49 se il vettore è già ordinato? 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 elemento ok 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 7 2 23 27 49 2 elem. ok 7 2 23 27 49 e così via Bubble sort (4) L efficienza non cambia se il vettore è già ordinato. Possiamo modificare lo pseudocodice per trarre vantaggio dall ordine dell input. Il vettore è ordinato se dopo il primo ciclo non ho fatto neanche uno scambio. Usiamo una flag per verificare se si fanno scambi Bubble2(Vett, dim) flag= per ogni i da n- a e finchè flag rimane : flag= scorri il sottovettore [,i] con j per ogni coppia (j, j+) se Vett[j] e Vett[j+] sono invertiti scambia(j,j+); flag= stampa Vett

Insertion sort () Utilizza la stessa idea dell ordinamento di un mazzo di carte: Il mazzo disordinato è sul tavolo Prendo una carta e la metto in mano: essa è ordinata rispetto a se stessa Finché ci sono carte sul tavolo: Prendo un altra carta e la inserisco in mano nella sua posizione relativa corretta: le carte in mano sono ordinate Tutte le carte (in mano) sono ordinate 2 7 3 9 4 7 2 3 9 4 7 2 3 9 4 3 7 2 9 4 3 7 2 9 4 3 4 7 2 9 Insertion sort (2) N.B. Ogni inserimento prevede uno shift verso destra degli elementi ordinati: 6 4 3 7 23 27 38 2 6 7 4 2 3 7 23 27 38 Insertion(Vett, dim) per ogni i da a n-: inserisci Vett[i] nel sottovettore ordinato [,i-]: se Vett[i] deve andare in posizione j salva Vett[i] in tmp sposta il sottovettore [j, i-] in [j+,i] memorizza tmp in Vett[j] 6 3 24 23 7 3 7 3 Insertion sort (3) Efficienza: se il vettore è il più possibile disordinato (ordinamento inverso) ogni volta devo effettuare lo spostamento massimo: 6 24 3 23 7 3 7 3 6 confronto+3 assegnazioni 23 24 3 7 3 7 3 confronto+4 assegnazioni 6 7 23 24 3 3 7 3 confronto+5 assegnazioni 6 3 7 23 24 3 7 3 confronto+6 assegnazioni 6 7 3 7 23 24 3 3 6 confronto+(n+) assegnazioni 3 7 3 7 23 24 3 In totale: n confronti + cn 2 assegnazioni 6 3 4 3 7 8 27 33 6 3 4 3 7 8 27 33 6 3 4 3 7 8 27 33 6 3 4 3 7 8 27 33 6 Insertion sort (4) Efficienza: se il vettore è il più possibile ordinato non si effettua alcuno spostamento: confronto+ assegnazioni 2 confronti+ assegnazioni 3 confronti+ assegnazioni 3 4 3 7 8 27 33 4 confronti+ assegnazioni 6 3 4 3 7 8 27 33 6 3 4 3 7 8 27 33 n confronti+ assegnazioni In totale: cn 2 confronti + assegnazioni

Ordinamento di un vettore Nei corsi di algoritmi si studieranno degli algoritmi più sofisticati di quelli visti ora e il loro numero di operazioni (complessità) risulterà inferiore a cn 2 Heap sort, merge sort, quick sort Ricerca in un vettore () p. 26 Problema: dato un vettore di numeri reali ed un valore x, dire se x sia nel vettore o no (cioè, cercare x nel vettore) x=3.3 A[] A[] A[2] A[3] A[4] A[5] A[6] A2. -3 4. 8 3.3-7 " " " " " " =x? =x? =x? =x? =x? =x? no no no no no ok ma per cercare una parola sul dizionario, lo leggiamo tutto dalla prima parola in poi? no Ricerca in un vettore (2) ma il dizionario è ordinato! x=3.3 A[] A[] A[2] A[3] A[4] A[5] A[6] A-2 -. 2.3.3 5 7. " x? " x? ok " x? Esercizi 7. (Ricerca) Scrivere tre programmi C per la ricerca in un vettore disordinato, usando ogni volta un diverso ciclo (while, for e do while) con delle opportune condizioni di uscita Scrivere un programma C che implementi la ricerca binaria (senza guardare sul libro!). Utilizzare opportunamente le funzioni.

Vettori multidimensionali () p. 222 Vettori multidimensionali (2) Se, invece di un vettore unidimensionale, vogliamo rappresentare una matrice (due dimensioni)? Vettore con due indici (il primo è di riga, il secondo di colonna) int b[2][3]=,2,3,4,5,6; Se non vengono forniti valori sufficienti, i restanti valori di ogni riga devono intendersi pari a : int b[2][3]=,2,3,4; 2 7-3 - 6 4 2 8.3 3 2 5 3.5 9 3 6 4 Per scorrere una matrice n x n: for (i=; i<n; i++) for (j=; j<m; j++) printf( %d, b[i][j]); printf( \n ); Domanda: E uguale scorrere la matrice riga per riga o colonna per colonna? b[][] b[][] b[][2] siano n=2 ed m=3 i= j= 2 b[][] b[][] b[][] b[][] b[][2] b[][2] Hint: la matrice viene memorizzata consecutivamente b[][] b[][] b[][2] #include <stdio.h> int main(void) int a[24][24]; int i,s,j,h; s=; for (h=; h<; h++) for (i=; i<24; i++) for (j=; j<24; j++) s+=a[j][i]; return ; Un esempio Le due versioni sembrano identiche, in realtà se si scorre per righe il tempo impiegato è circa 29 sec, mentre se si scorre per colonne il tempo impiegato è circa 3 min. N.B. i tempi possono essere molto diversi cambiando la macchina Lo usiamo per rendere più evidente il fenomeno s+=a[i][j] N.B. la matrice deve essere abbastanza grande per notare la differenza, per via della dimensione della memoria cache Un altro esempio Problema: un punto di sella di una matrice è quell elemento che gode della proprietà di essere minimo di riga e massimo di colonna. Scrivere un programma C che prenda come paramentro una matrice di interi, restituisca se la matrice contiene un punto di sella, altrimenti. i 7 4 j 3 6 2 4 9 5 6 8 per ogni riga i: trova il minimo (sia j il suo indice) se i è il massimo della colonna j allora ritorna altrimenti vai alla riga successiva ritorna. Esercizio per casa: tradurre in C Problema: quante operazioni?

Esercizi 8. (vettori multidimensionali) Pseudocodice e C per ciascuno dei seguenti problemi (usando opportunamente le funzioni): prendere in input una matrice 4 x 6 e stampare il quinto elemento della terza riga prendere in input una matrice (con dim. prese in input, non superiori a 3 x 3) e stampare la somma di tutti i suoi elementi prendere in input una matrice (con dim. prese in input, non superiori a 3 x 3), salvare in un vettore le somme riga per riga (nella pos. i del vettore la somma della riga i) e stampare il vettore prendere in input una matrice quadrata (con dim. presa in input, non superiori a 3 x 3) e stampare su due righe diverse gli elementi della diagonale principale e dell altra diagonale Vettori e puntatori Esiste uno stretto legame tra puntatori e vettori: int a[5], *p; p=&a[]; ora p punta al primo elemento del vettore! Esempio: *p=5; è equivalente ad a[]=5; *(p+7)=3; è equivalente ad a[7]=3; ma un vettore non è esattamente un puntatore, e viceversa quando studieremo i puntatori ne vedremo le differenze Il nome di un vettore è, in realtà, un puntatore. Perciò: a[5]=3; è equivalente a *(a+5)=3; N.B. Utilizzare la notazione *(a+5) al posto di a[5], anche se meno chiara, genera un codice più veloce.