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

Documenti analoghi
Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili

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

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

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Array. Anno Accademico 2010/2011 Francesco Tortorella

Array multidimensionali e stringhe

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

Puntatori. Fondamenti di Programmazione

Array e puntatori in C

Multidimensionali. Array Multidimensionali. Tipi di array. Matrice: array bidimensionale. Array multidimensionale. Dichiarazione di una matrice

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

Array k-dimensionali

Problema. Vettori e matrici. Vettori. Vettori

Strutture dati e loro organizzazione. Gabriella Trucco

Introduzione ai puntatori in C Definizione

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

stringhe array monodimensionali char. libreria < string.h>

Elementi di Informatica A. A. 2016/2017

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Esercitazione 6. Array

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

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

4 GLI ARRAY E LE STRINGHE

Il linguaggio C. Puntatori e dintorni

Esercitazione 8. Array multidimensionali

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Esercizi C su array e matrici

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Allocazione dinamica della memoria

Programmazione I - Laboratorio

Strutture dati complesse. Vettori. Tipi di dato strutturati. Strutture dati complesse nome fulvio. Esigenze. Esigenze. dato

Fondamenti di Informatica

Il linguaggio C Puntatori

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Dati aggregati. Violetta Lonati

Introduzione al linguaggio C Gli array

Lezione 8 Struct e qsort

Struct, enum, Puntatori e Array dinamici

Strutture Dati Dinamiche

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Aritmetica dei puntatori

Verso i puntatori: Cosa è una variabile?

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Esercizi Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Gestione dinamica della memoria

Tutorato Programmazione 1 Modulo 2

Linguaggio C - sezione dichiarativa: costanti e variabili

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Laboratorio di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Fondamenti di Programmazione

Introduzione al linguaggio C Puntatori

I puntatori (richiamo)

! Array. n Mondimensionali n Multidimesionali (Matrici)! Preprocessore! Commenti

Primi passi col linguaggio C

L Allocazione Dinamica della Memoria

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

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

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

Strategie di programmazione

Uso avanzato dei puntatori Allocazione dinamica della memoria

Il C nel C++: Funzioni

Esercizi Array Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Linguaggio C: PUNTATORI

Struttura dei programmi C

Allocazione dinamica

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Algoritmi e basi del C Struttura di un programma

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Fondamenti di Informatica T. Linguaggio C: i puntatori

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Caratteri e stringhe

Il puntatore. Il puntatore

Aggregati di dati eterogenei: il tipo struct. Esercizi risolti

Allocazione Dinamica della Memoria

Mini-dispensa sui puntatori in C

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Esercizi Programmazione I

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Esercitazione 7. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Il linguaggio C. Puntatori e Array

Esercizi. Stringhe. Stringhe Ricerca binaria

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

Funzioni di libreria. Richiedono tutte. #include <math.h> fabs(x) sqrt(x) pow(x,a) exp(x) log(x)

Costanti e Variabili

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Transcript:

ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori) 1 ARRAY DI PUNTATORI stringhe sarà dunque una struttura dati rappresentabile nel modo seguente Ivaripuntatori sono memorizzati in celle contigue. Possono invece non essere contigue le celle che loro puntano stringhe 2

INIZIALIZZAZIONE Come usuale, anche gli array di puntatori a stringhe possono essere inizializzatii i char * mesi[] = { Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno,, Maggio,, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre ; I caratteri dell i-esima stringa vengono posti in una locazione qualsiasi e in mesi[i] viene memorizzato un puntatore a tale locazione Come sempre, poiché l ampiezza lampiezzadel vettore non è stata specificata, il compilatore conta i valori di inizializzazione e dimensiona il vettore di conseguenza 3 INIZIALIZZAZIONE mesi Gennaio Febbraio Marzo Dicembre 4

ARRAY MULTIDIMENSIONALI È possibile definire variabili di tipo array con più di una dimensione <tipo> <identificatore>[dim1][dim2] [dimn] Array con due dimensioni vengono solitamente detti matrici float M[20][30]; 0 1 29 Come sempre, allocazione statica: allocazione di 20x30 celle atte a mantenere float 0 1 19 5 MATRICI Per accedere all elemento l che si trova nella riga i e nella colonna j si utilizza la notazione M[i][j] Anche possibilità di vettori con più di 2 indici: int C[20][30][40]; int Q[20][30][40][40]; ] 6

MEMORIZZAZIONE Le matrici multidimensionali sono memorizzate per righe in celle contigue. Nel caso di M: M[0][0] M[0][1] M[0][29] M[1][0] M[1][1] M[1][29]. M[19][0] M[19][1] M[19][29] E analogamente nel caso di più di 2 dimensioni: viene fatto variare prima l indice più a destra, poi il penultimo a destra, e così via fino a quello più a sinistra Per calcolare l l offset della cella di memoria dell elemento l (i,j) in una matrice bidimensionale (rispetto all indirizzo di memorizzazione della prima cella indirizzo dell array): LungRiga * i + j Nel caso di M: M[i][j] elemento che si trova nella cella 30*i+j dall inizio della matrice Elemento: *(&M[0][0] + 30*i+j) 7 In generale, se MEMORIZZAZIONE <tipo> mat[dim 1 1][ ][dim 2 2] ] [dim n n] mat[i 1 ][i 2 ] [i n-1 ][i n ] è l elemento che si trova nella cella i 1 *dim 2 * *dim n + + i n-1 *dim n +i n a partire dall inizio del vettore 8

MATRICI Si possono anche dichiarare dei tipi vettore multidimensionale typedef <tipo> <ident>[dim1][dim2] [dimn] typedef float MatReali [20] [30]; MatReali Mat; è equivalente a typedef float VetReali[30]; typedef VetReali MatReali[20]; MatReali Mat; 9 INIZIALIZZAZIONE Come al solito, i vettori multidimensionali possono essere inizializzati con una lista di valori di inizializzazione racchiusi tra parentesi graffe int matrix[4][4]={{1,0,0,0,{0,1,0,0, 0 0 {0 1 0 0 {0,0,1,0, {0,0,0,1 0 1 2 3 0 1 0 0 0 1 0 1 0 0 2 0 0 1 0 3 0 0 0 1 10

Puntatori e Vettori MULTIDIMENSIONALI Anche un vettore multidimensionale è implementato in C come un puntatore all area di memoria da cui partono le celle contigue contenenti il vettore int a[10][4]; ]; a vettore di 10 elementi, ciascuno dei quali è un vettore a 4 interi tipo = puntatore a vettore di 4 interi non puntatore a intero int ** b; int * c; b=a; c=a; compila con warning 11 PUNTATORI E VETTORI MULTIDIMENSIONALI Date le due definizioni int a[10][4]; int *d[10]; la prima alloca 40 celle di ampiezza pari alla dim di un int mentre la seconda alloca 10 celle per contenere 10 puntatori a int Uno dei vantaggi offerti dall uso di vettori di puntatori consiste nel fatto che si possono realizzare righe di lunghezza variabile 12

PUNTATORI E VETTORI MULTIDIMENSIONALI char * mesi[] = { Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre ; vengono create righe di lunghezza variabile 13 Esempio: PRODOTTO MATRICI QUADRATE Programma per il prodotto (righe x colonne) di matrici quadrate NxN a valori interi: C[i,j] = Σ (k=1..n) A[i][k]*B[k][j] #include <stdio.h> #define N 2 typedef int Matrici[N][N]; int main(){ int Somma,i,j,k; Matrici A,B,C; /* inizializzazione di A e B */ for (i=0; i<n; i++) for (j=0; j<n; j++) scanf("%d",&a[i][j]); for (i=0; i<n; i++) for (j=0; j<n; j++) scanf("%d",&b[i][j]); 14

Esempio: PRODOTTO MATRICI QUADRATE /* prodotto matriciale */ for (i=0; i<n; i++) for (j=0; j<n; j++){ Somma=0; for (k=0; k<n; k++) Somma=Somma+A[i][k]*B[k][j]; ] [ ][j]; C[i][j]=Somma; /* stampa */ for (i=0; i<n; i++) { for (j=0; j<n; j++) printf("%d\t",c[i][j]); printf( \n ); 15 PASSAGGIO DI PARAMETRI Nel caso di passaggio come parametro di un vettore bidimensionale a una funzione, nel prototipo della funzione va dichiarato necessariamente il numero delle colonne (ovvero la dimensione della riga) Ciò è essenziale perché il compilatore sappia come accedere al vettore in memoria 16

PASSAGGIO DI PARAMETRI Esempio: se si vuole passare alla funzione f() la matrice par occorre scrivere all atto della definizione della funzione: f(float par[20][30], ) f(float par[][30], ) ], oppure perché il numero di righe è irrilevante ai fini dell aritmetica dei puntatori su par In generale, come già detto, soltanto la prima dimensione di un vettore multidimensionale può non essere specificata 17 Esempio: PRODOTTO MATRICI QUADRATE #include <stdio.h> #define N 2 typedef int Matrici[N][N]; void prodottomatrici(int X[][N], int Y[][N], int Z[][N]) { int Somma,i,j,k; for (i=0; i<n; i++) for (j=0; j<n; j++){ Somma=0; for (k=0; k<n; k++) Somma=Somma+X[i][k]*Y[k][j]; Z[i][j]=Somma; 18

Esempio: PRODOTTO MATRICI QUADRATE int main(void){ int Somma,i,j,k; Matrici A,B,C; for (i=0; i<n; i++) /* inizializ. di A e B */ for (j=0; j<n; j++) scanf("%d",&a[i][j]); for (i=0; i<n; i++) for (j=0; j<n; j++) scanf("%d",&b[i][j]); prodottomatrici(a,b,c); //in C verrà caricato il risultato del prodotto for (i=0; i<n; i++) { /* stampa */ for (j=0; j<n; j++) printf("%d\t",c[i][j]); printf("\n"); 19 Matrici Un po di esercizi sulle matrici Semplici Lettura e scrittura Calcolo della trasposta 20

Matrici.h Definizione dei tipi #define MAXROWS 10 #define MAXCOLS 10 #define ELEMENT int #define ELEMENTFORMAT "%d" Tipo degli elementi della matrice #define MATRICE Formato di stampa degli elementi della matrice typedef ELEMENT Matrice[MAXROWS][MAXCOLS]; 21 Lettura di una matrice Leggere da console una matrice di r righe e c colonne... Parametri: La matrice da leggere (obbligatorio riferimento va bene così) La dimensione (righe, colonne) Pseudocodice: Leggere la matrice riga per riga elemento per elemento stampare un opportuno messaggio prima di richiedere i dati Un ciclo per le righe Un ciclo innestato nel precedente per le colonne Per ogni riga della matrice Indicare quale riga si sta leggendo Leggere la riga con tante scanf() quante sono le colonne Controllare che i valori siano stati tutti convertiti correttamente, altrimenti uscire dalla funzione con un codice d errore opportuno 22

Lettura di una matrice CODICEUSCITA readmatrice(matrice m, int righe, int colonne) { int riga, colonna; for (riga = 0; riga < righe; riga++) { printf("inserire la riga %d: ", riga); for (colonna = 0; colonna < colonne; colonna++) { if (scanf(elementformat, &m[riga][colonna])!= 1) return VALORINONVALIDI; while (getchar()!= (char)10); CODICEUSCITA è il simbolo utilizzato anche nelle slide relative al calcolo delle radici return OK; VALORINONVALIDI è un simbolo aggiuntivo... 23 Stampa di una matrice Stampare a console una matrice di r righe e c colonne... Parametri: La matrice da stampare La dimensione (righe, colonne) Pseudocodice: Predisporre la stringa di formato Per ogni riga r Per ogni colonna c Stampare l elemento di posizione r, cusando la stringa di formato 24

Stampa di una matrice void printmatrice(matrice m, int righe, int colonne) { int riga, colonna; char formato[10] = ""; strcat(formato, ELEMENTFORMAT); strcat(formato, "\t"); for (riga = 0; riga < righe; riga++) { for (colonna = 0; colonna < colonne; colonna++) printf(formato, m[riga][colonna]); printf("\n"); n"); printf("\n"); n"); 25 Trasposta di una matrice quadrata La definizione di trasposta è... Parametri: Una matrice in ingresso Una matrice in uscita La dimensione della matrice Pseudo codice: Per ogni riga r, colonna c Porre l elemento di posizione r,c cnella matrice in ingresso nella posizione c,r nella matrice in uscita 26

Trasposta di una matrice quadrata void trasposta(matrice m, Matrice tm, int dim) { int riga, colonna; for (riga = 0; riga < dim; riga++) for (colonna = 0; colonna < dim; colonna++) tm[colonna][riga] = m[riga][colonna]; 27