DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
LINGUAGGIO DI PROGRAMMAZIONE C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Process synchronization
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Introduzione al linguaggio C
Stringhe di caratteri In linguaggio C.
PUNTATORI Introduzione
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Introduzione al linguaggio C
Programmazione Procedurale in Linguaggio C++
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Algebra di Boole ed elementi di logica
Process synchronization
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 15 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 18 Aprile 2012.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
eliana minicozzi linguaggi1a.a lezione2
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Strutture di controllo in C -- Flow Chart --
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Dichiarazioni e tipi predefiniti nel linguaggio C
I File.
Le funzioni.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
14 marzo 2002 Avvisi:.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Programmazione in linguaggio C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Ottobre 2014.
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.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2016.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Process synchronization
Process synchronization
Process synchronization
Transcript della presentazione:

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Array particolari: le stringhe Puntatori 2

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 3 Array di caratteri: spesso chiamati stringhe Quando rappresentano caratteri da leggersi in fila Dichiarazione+inizializzazione di una stringa: char stringa[] "word"; Il carattere nullo '\0' termina le stringhe Perciò larray stringa ha 5 elementi (non 4): Dichiarazione equivalente: char stringa[] {'w', 'o', 'r', 'd', '\0'}; drow \0 Le stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: inserisci nome 4

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 5 Stringhe e caratteri Qual è la differenza tra 'x' e "x"? 'x' è una costante di tipo char, rappresentata in memoria da un intero "x" è una stringa costante, rappresentata in memoria da un array che contiene i caratteri: 'x' e '\0' ATTENZIONE Le stringhe non sono propriamente un tipo di dato (non sono un tipo base!) Non hanno operatori nativi, ma una serie di funzioni nella libreria standard che permettono di manipolarle

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 6 char str1[32]; / str1 ha spazio per 32 char. / char str2[64]; / str2 ha spazio per 64 char. / / inizializza str1 con la stringa "alfa" / strcpy(str1, "alfa"); / str1 contiene "alfa" / / copia str1 in str2 / strcpy(str2, str1); / str2 contiene "alfa" / / lunghezza di str1 / x = strlen(str1); / x assume valore 4 / / scrivi str1 su standard output / printf("%s", str1); / scrive str1 su stdout / / leggi str1 da standard input / scanf("%s", str1); / str1 riceve da stdin / Operazioni su stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 7 char str1[32]; char str2[64]; scanf("%s", str1); > ciao / ora str1 contiene "ciao" / strcpy(str2, str1);/ str2 riceve "ciao" / val = strlen(str2); / val = 4 / printf("%s\n", str2); > ciao/ stampa "ciao" / Attenzione: strlen("") vale 0 ! Operazioni su stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: copia stringhe 8

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 9 Il nome dellarray rappresenta lindirizzo del suo primo elemento, perciò quando ci si vuole riferire allintero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere blank (lo spazio), o linvio Perciò se nel buffer si trova una stringa troppo lunga, essa è memorizzata oltre la fine dell array !!! Ed è un errore grave !!! Particolarità delle stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema: non esiste strcpy! 10

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 11 E se non ci fosse la funzione strcpy() ? Assegneremmo sempre un carattere alla volta! char s1[N], s2[M]; /* assegnamento di s2, omesso */ int i = 0; while( i <= strlen(s2) && i < N ) { s1[i] = s2[i]; ++i; } N.B. funziona correttamente se s2 è una stringa ben formata (cioè terminata da '\0') e se s1 è sufficientemente grande da contenere i caratteri di s2 (N >= strlen(s2)) strcpy(s1, s2)

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 12 Una funzione apposita: strcmp(s1,s2) restituisce un intero confronta le due stringhe fino al \0 char str1[32], str2[64]; int diverse; /*... acquisizione di valori per le stringhe... (codice omesso)*/ diverse = strcmp(str1, str2); if( diverse == 0 ) printf("UGUALI\n"); else if( diverse < 0 ) printf("%s PRECEDE %s\n", str1, str2); else printf("%s SEGUE %s\n", str1, str2); Confrontare due stringhe

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Pointer Fun with Binky 13 This is document 104 in the Stanford CS Education Library. Please see for this and other free educational materials. Copyright Nick Parlante 1999.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio dei parametri Il passaggio dei parametri consiste nellassociare, allatto delle chiamata di un sottoprogramma, ai parametri formali i parametri attuali Se il prototipo di una funzione è float circonferenza (float raggio); Invocare questa funzione significa eseguire listruzione c = circonferenza(5.0); In questo modo la variabile raggio (il parametro formale) assumerà per quella particolare invocazione il valore 5 (il parametro attuale). Lo scambio di informazioni con passaggio dei parametri tra chiamante e chiamato può avvenire in due modi: Passaggio per valore Passaggio per indirizzo 14

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio per VALORE Allatto della chiamata il valore del parametro attuale viene copiato nelle celle di memoria del corrispondente parametro formale. Il parametro formale e il parametro attuale si riferiscono a due diverse celle di memoria Il sottoprogramma in esecuzione lavora nel suo ambiente e quindi sui parametri formali I parametri attuali non vengono modificati 15

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio * 3.14; raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; } /* nel main */ float c,r=5; c=circonferenza(r); /*Attenzione! r vale sempre 5 */ 16 Ambiente della funzione circonferenza raggio circ Ambiente della funzione main r c Quando invoco la funzione in raggio viene copiato il valore di r Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio per INDIRIZZO Allatto della chiamata lindirizzo dei parametri attuali viene associato ai parametri formali il parametro attuale e il parametro formale si riferiscono alla stessa cella di memoria Il sottoprogramma in esecuzione lavora nel suo ambiente sui parametri formali (e di conseguenza anche sui parametri attuali) ogni modifica sul parametro formale è una modifica del corrispondente parametro attuale Gli effetti del sottoprogramma si manifestano nel chiamante con modifiche al suo ambiente locale di esecuzione 17

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio dei parametri in C In C non esiste un costrutto sintattico per distinguere tra passaggio dei parametri per valore e per indirizzo Il passaggio è sempre per valore /*passaggio per valore*/ float circonferenza(float raggio); Per ottenere il passaggio per indirizzo è necessario utilizzare parametri formali di tipo indirizzo (puntatori) /*passaggio per indirizzo*/ float circonferenza(float *raggio); 18

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori – premessa Dichiarare una variabile significa riservare una zona di memoria composta da diverse celle Il numero di celle dipende dal tipo di dato (short int 2 byte, float 4 byte, …) Ogni cella di memoria ha un indirizzo fisico e: il nome della variabile indica il contenuto della cella di memoria loperatore & permette di ottenere lindirizzo di memoria della cella associata alla variabile cui loperatore è applicato 19

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Variabili e indirizzi: remider Supponiamo che la dichiarazione riservi la zona di memoria allindirizzo 1 var indica il contenuto della cella di memoria &var indica lindirizzo della cella di memoria 20 int var; var &var

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEPuntatore È un tipo di dato che ammette tra i suoi valori un indirizzo di memoria La zona di memoria viene detta puntata dalla variabile puntatore La variabile puntatore viene detto che punta ad una cella di memoria Quando dichiaro un puntatore si deve anche specificare che tipo di dato viene ospitato nella cella puntata Sintassi: int *p; Una variabile puntatore occupa solitamente 2 byte o 4 byte a seconda delle architetture 21

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONESignificato p è una variabile come tutte le altre quindi p indica il contenuto della cella di memoria &p indica lindirizzo di memoria Quello che caratterizza una variabile di tipo puntatore è il fatto che il suo valore è esso stesso un indirizzo di memoria 22 int *p; p &p

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEDeferenziazione Ad una variabile di tipo puntatore posso applicare loperatore di deferenziazione * *p indica il contenuto della cella puntata da p Se p è un puntatore ad un intero allora *p è una semplice variabile intera int *p; *p=5; /* OK. *p è un intero */ p=5; /* errore. p è un puntatore */ Attenzione! Il simbolo * lo uso sia nella dichiarazione che nella deferenziazione 23

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEOperazioni A una variabile di tipo puntatore posso assegnare un indirizzo di memoria int x; int *p; x=5; p=&x; /* *p vale 5 */ p punterà alla zona di memoria in cui è memorizzato il valore di x Ad una variabile puntatore non viene mai assegnato una costante x &p &x p

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Passaggio parametri per indirizzo Si utilizza: il costruttore di tipo puntatore per la definizione dei parametri formali della funzione float circonferenza(float *raggio) loperatore di dereferenziazione allinterno della funzione circ = *raggio * 3.14; alla chiamata della funzione, si passa un indirizzo di variabile come parametro attuale c=circonferenza(&r); Attenzione! Gli array sono SEMPRE passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore 25

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: passaggio per indirizzo float circonferenza(float *raggio) { float circ; circ = *raggio * 3.14; *raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; } /* nel main */ float c,r=5; c=circonferenza(&r); /*attenzione! Dora in poi r vale 7 */ 26 Ambiente della funzione circonferenza raggio circ Ambiente della funzione main r c Quando invoco la funzione in raggio viene copiato lindirizzo di r. Quindi *raggio e r sono la stessa cosa Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 27 a b 3 7 p q temp 3 7

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 28 a b 3 7 p q temp 3 7 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 29 a b 3 7 p q temp 7 7 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 30 a b 3 7 p q temp 7 3 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) 31 a b 3 7 p q temp Al termine dellesecuzione di swap le variabili nel main restano inalterate!

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 32 a b 3 7 p q temp

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 33 a b 3 7 p q temp 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 34 a b 7 7 p q temp 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 35 a b 7 3 p q temp 3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio di 2 valori interi void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) 36 a b 7 3 p q temp 3 Al termine dellesecuzione di swap le variabili nel main vengono modificate

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 1/* Cubo di una variabile */ #include 6 7void cuboRiferimento( int * nPtr ); /* prototype */ 8 9void main() 10{ 11 int number = 5; printf( "The original value of number is %d", number ); 14 cuboRiferimento( &number ); 15 printf( "\nThe new value of number is %d\n", number ); } 19 20void cuboRiferimento( int *nPtr ) 21{ 22 *nPtr = *nPtr * *nPtr * *nPtr; 23} The original value of number is 5 The new value of number is 125 In cuboRiferimento, viene usato *nPtr ( *nPtr è lintero number ). cuboRiferimento si aspetta un indirizzo!! 37Cubo

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Intercambiabilità tra procedure e funzioni Funzione: int f(int par1) { … (calcola valore di variabile risultato)... return (risultato); } Chiamata: y=f(x); Procedura: void f(int par1,int *par2) { … (calcola valore di variabile risultato)... *par2=risultato; } Chiamata: f(x,&y); 38

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Parametri di tipo array Per usare in una funzione una variabile di tipo array occorre passare il suo indirizzo di base, perciò di fatto larray è passato per locazione (indirizzo) Una funzione C non restituirà un array (come contenuto), ma solo un puntatore a un array (cioè il suo nome come suo indirizzo)!! 39

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: prodotto degli elementi di un array di tipo double 40 double mul (double a[ ], int n) { /* n porzione occupata dell'array che viene passato */ int i; double ris; ris = 1.0; for ( i = 0; i < n; i = i + 1 ) ris = ris * a[i]; return ris; }

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Parametri di tipo array Due testate equivalenti: double mul(double *a, int n) double mul(double a[], int n) N.B.: non cè la dimensione, e n è la porzione occupata dell'array Supponiamo di avere un array V[50]. Possibili chiamate: mul(V,50) restituisce V[0]*V[1]*…V[49] mul(V,30) restituisce V[0]*V[1]*…V[29] mul(&V[5],7) restituisce V[5]*V[6]*…V[11] mul(V+5,7) restituisce V[5]*V[6]*…V[11] 41

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio Binky Pointer Fun Video: Credits Gianluca Palermo