fondamenti di informatica i a.a. 2007-08 1 il linguaggio c gli array e i puntatori dichiarazione e...

55
damenti di Informatica I damenti di Informatica I a.a. 2007-08 a.a. 2007-08 1 Il linguaggio C Il linguaggio C Gli array e i puntatori Gli array e i puntatori Dichiarazione e memorizzazione di array Dichiarazione e memorizzazione di array L’inizializzazione di array L’inizializzazione di array L’aritmetica dei puntatori L’aritmetica dei puntatori Il passaggio di puntatori come Il passaggio di puntatori come argomenti di funzione argomenti di funzione Gli algoritmi di ordinamento Gli algoritmi di ordinamento Le stringhe Le stringhe C C Language Language Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-09 2008-09

Upload: annunziata-nicolosi

Post on 01-May-2015

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 1

Il linguaggio CIl linguaggio C

Gli array e i puntatoriGli array e i puntatoriDichiarazione e memorizzazione di arrayDichiarazione e memorizzazione di array

L’inizializzazione di arrayL’inizializzazione di array

L’aritmetica dei puntatoriL’aritmetica dei puntatori

Il passaggio di puntatori come argomenti di Il passaggio di puntatori come argomenti di funzionefunzione

Gli algoritmi di ordinamentoGli algoritmi di ordinamento

Le stringheLe stringhe

C Language

C Language

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 2: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 2

Gli array e i puntatoriGli array e i puntatori

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 3: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 3

Gli array Gli array

Nel linguaggio C, un arrayarray è un insieme di variabili dello stesso tipo memorizzate consecutivamenteOgni variabile dell’array, detta elementoelemento, può essere acceduta mediante il nome dell’array ed un indiceindice (un espressione), con il primo elemento individuato dall’indice di valore 0EsempioEsempio: Memorizzare la temperatura media registrata per ogni giorno dell’anno

Si dichiara un array di 365 elementi (piuttosto che 365 variabili!), identificati con un solo nome, e che occupano posizioni di memoria consecutive

NotaNota: Gli array contengono informazione correlata (le temperature di un anno, i voti di esame di uno studente, etc.)

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 4: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 4

La sintassi della dichiarazione di un arraydichiarazione di un array è:

La dichiarazione viene effettuata inserendo una coppia di parentesi quadre dopo il nome dell’array

La dimensione dell’array viene specificata inserendo il numero di elementi all’interno delle parentesi quadre

La dichiarazione di array La dichiarazione di array 1 1

Valori inizialiValori iniziali

SpecificatorSpecificatore di tipoe di tipo

}}

[[Nome Nome

dell’arraydell’arrayDimensione Dimensione dell’arraydell’array

==

]]

{{

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 5: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 5

La dichiarazione di array La dichiarazione di array 2 2

Il riferimento ad un elemento dell’arrayriferimento ad un elemento dell’array è invece l’operazione di accesso al dato elemento ed avviene utilizzando il nome dell’array seguito dall’indice dell’elemento (racchiuso fra parentesi quadre)Le istruzioni di dichiarazione di un array e di riferimento ad un elemento dell’array sono molto simili nella forma, ma molto diverse nel significato

/* I seguenti sono riferimenti a elementi

* dell’array; i valori 0,1,2,… specificano

* gli elementi a cui accedere

*/

daily_temp[0] 2;

daily_temp[1] 5;

daily_temp[2] 3;

… … …

/* La seguente è una dichiarazione;

* il valore 365 specifica il numero

* di elementi dell’array

*/

int daily_temp[365];

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 6: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 6

La dichiarazione di array La dichiarazione di array 3 3

EsempioEsempio: Calcolo della temperatura media annua

include <stdio.h>include <stdlib.h>define DAYS_IN_YEAR 365

main(){ int j, sum0; int daily_temp[DAYS_IN_YEAR];

/* si assegnano i valori a daily_temp[] */

for (j0; j<DAYS_IN_YEAR; j) sum daily_temp[j]; printf(“La temperatura media dell’anno è %d.\n”, sum/DAYS_IN_YEAR); exit(0);}

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 7: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 7

La modalità di memorizzazione La modalità di memorizzazione degli arraydegli array

EsempioEsempio

ar[2] e ar[4] sono indefiniti: il contenuto delle posizioni di memoria è quello rimasto da esecuzioni precedenti (garbagegarbage)

int ar[5]; /* dichiarazione */

ar[0] 15;

ar[1] 17;

ar[3] 3;ar[4]

ar[0]ar[1]ar[2]ar[3]

1018

0FFC100010041008100C10101014

3

1517

non definito

non definito

4 byte

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 8: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 8

L’inizializzazione di array L’inizializzazione di array 1 1

La presenza di valori indefiniti in alcuni elementi dell’array può provocare errori difficili da rilevare Occorre inizializzare l’intero vettore

Dichiarare l’array staticstatic (vettore a durata fissaa durata fissa): gli elementi del vettore, non inizializzati esplicitamente, vengono posti a zero

Valori diversi possono essere specificati, facendoli seguire alla dichiarazione dell’array, racchiusi fra parentesi graffe: tali valori devono essere espressioni costanti che possano essere convertite automaticamente nel tipo dell’array

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 9: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 9

L’inizializzazione di array L’inizializzazione di array 2 2

EsempioEsempio

NotaNota: il valore floatingpoint 3.5 è convertito nel valore intero 3

1028

0FFC100010041008100C10101014

5

1517

non definito

4 byte

1018101C10201024 br[4]

br[0]br[1]br[2]br[3]

ar[4]

ar[0]ar[1]ar[2]ar[3]

0

00

0 0 1 2 3 4

static int ar[5];

static int br[5] {1,2,3.5,4,5};

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 10: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 10

L’inizializzazione di array L’inizializzazione di array 3 3

Specificare un numero maggiore di valori di inizializzazione, rispetto agli elementi dell’array, costituisce un errore segnalato dal compilatoreSe vengono specificati meno valori rispetto alla dimensione, gli elementi rimanenti vengono inizializzati a zeroEsempioEsempio: La dichiarazione

static int cr[5] {1,2,3};produce l’inizializzazione

cr[0] 1cr[1] 2cr[2] 3cr[3] 0cr[4] 0

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 11: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 11

L’inizializzazione di array L’inizializzazione di array 4 4

Se vengono specificati i valori iniziali, può essere omessa la dimensione dell’array: il compilatore calcola automaticamente il numero degli elementi sulla base del numero dei valori iniziali specificati

EsempioEsempio:static char dr[] {‘a’, ‘b’, ‘c’, ‘d’};

comporta la creazione di un array di quattro elementi, di tipo charchar, caratterizzati dai valori iniziali

dr[0] ‘a’dr[1] ‘b’dr[2] ‘c’dr[3] ‘d’

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 12: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

12

Crittografia Crittografia 1 1

Poiché in formato elettronico viene memorizzato e trasmesso ogni tipo di informazione (anche personale, quindi coperta dalla privacy), viene posta attenzione alla sicurezza rispetto ad accessi indesideratiI file, nei sistemi multiutente, sono provvisti di vari livelli di protezione, il primo dei quali è costituito dall’autenticazione al sistema tramite passwordOltre ai tipi di protezione standard, il contenuto di un file riservato può essere codificato, utilizzando tecniche crittografiche che producono, a partire dal testo in chiaro, il cosiddetto crittogrammacrittogramma, o testo cifratoIl legittimo proprietario del file (e chi da lui autorizzato) è l’unico depositario della chiave di decodifica ed è l’unico in grado di operare l’inversione da testo cifrato a testo in chiaro

Page 13: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 13

Crittografia Crittografia 2 2

Inoltre, negli attuali sistemi informativi distribuiti, e più in generale nel settore delle telecomunicazioni, la crittografia ha assunto rilievo ed interesse crescenti nelle infrastrutture di sicurezza

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 14: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 14

Crittografia Crittografia 3 3

Se il sistema di cifra, o cifrariocifrario, è ben congegnato, l’operazione di decifrazionedecifrazione o decifratura deve risultare semplice al legittimo proprietario (o al destinatario del messaggio), ma di complessità proibitiva alla “spia”

possibile in quanto gli utenti “legittimi” possiedono un’informazione che deve rimanere inaccessibile alla spia, la chiave del cifrariochiave del cifrario

Occorre notare la distinzione tra decifrazione e decrittazionedecrittazione, l’operazione illegittima in cui non ci si può avvalere della chiave

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 15: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

15

Crittografia Crittografia 4 4

/* Dato un carattere, ne fornisce un valore codificato */define ILLEGAL_VAL 1

char encode(ch)char ch;{ static unsigned char encoder[128] {127, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, 94, 91, 88, 85, 82, 79, 76, 73, 70, 67, 64, 61, 58, 55, 52, 49, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 126, 123, 120, 117, 114, 111, 108, 105, 102, 99, 96, 93, 90, 87, 84, 81, 78, 75, 72, 69, 66, 63, 60, 57, 54, 51, 48, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 125, 122, 119, 116, 113, 110, 107, 104, 101, 98, 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 65, 62, 59, 56, 53, 50, 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2}

/* Controlla la presenza di caratteri illeciti */ if (ch > 127) return ILLEGAL_VAL; else return encoder[ch]; /* Fornisce il carattere codificato */}

48=‘0’ 48=‘0’ 111=‘o’111=‘o’

CiaoCiao

6G\26G\2

Page 16: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 16

Crittografia Crittografia 5 5

Il codice Shift CypherShift Cypher con K3 era utilizzato da Giulio Cesare

EsercizioEsercizio: Con K11, si somma 11 al valore corrispondente alla lettera e, nel caso che la somma superi 25, si divide il numero per 26 e si considera il resto della divisione intera

we will meet at midnightwe will meet at midnight 22 4 22 8 11 11 12 4 4 19 0 19 12 8 3 13 8 6 7 19

7 15 7 19 22 22 23 15 15 4 11 4 23 19 14 24 19 17 18 4

hphtwwxppelextoytrsehphtwwxppelextoytrse

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 17: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

17

Esempio Esempio 1 1/* Dato un vettore, stabilisce se vi sono almeno due elementi uguali tra loro

*/

#define MAX_DIM 256typedef VECTOR int[MAX_DIM];

int TwinSearch (v) /* ricerca degli elementi gemelli */VECTOR v;{ int c 0; int k 0; int found 1; /* ricerca senza successo ritorna 1 */

for(c 0; ((c < (MAX_DIM1)) && (found 1)); c) { for(k (c1); ((k < MAX_DIM) && (found 1)); k) { if (v[c] v[k]) found 1; /* ricerca con successo */ } }

return found;}

Page 18: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

18

Esempio Esempio 2 2

/*inversione vettore*/ for(i0;i<dim;i) b[i]a[dim1i];

/*stampa vettore invertito*/ printf(“Il vettore invertito e’:\n\n”); for(i0;i<dim;i) printf(“b[%d] %d\n”, i, b[i]);

return 0; }

/* Inverte gli elementi di un vettore */

#include <stdio.h>

int main() { /*dichiarazioni*/ int a[10], b[10]; int i, dim10;

/*input coefficienti*/ for(i0;i<dim;i) { printf(“inserire il coefficiente a[%d]: ”, i); scanf(“%d”, &a[i]); }

/*stampa vettore*/ printf(“\nIl vettore e’:\n\n”); for(i0;i<dim;i) printf(“a[%d] %d\n”, i, a[i]); printf(“\n”);

Page 19: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 19

L’aritmetica dei puntatori L’aritmetica dei puntatori 1 1

Il C permette l’utilizzo degli operatori additivi in concomitanza con i puntatoriSe p è un puntatore, l’espressione “p3” è lecita ed individua il terzo oggetto che segue quello puntato da pPoiché p contiene un indirizzo, operazioni aritmetiche su p forniscono nuovi indirizziIl compilatore non opera semplicemente una somma tra 3 e p, ma moltiplica 3 per la dimensione dell’oggetto puntato da p: effettua cioè uno scalingscalingEsempioEsempio: Se l’indirizzo contenuto in p è 1000 e p è un puntatore a long intlong int, allora p3 identifica l’indirizzo 100C (4 byte per gli interi lunghi); se p è un puntatore a charchar, p3 rappresenta l’indirizzo 1003

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 20: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 20

L’aritmetica dei puntatori L’aritmetica dei puntatori 2 2

Nell’ipotesi di puntatori che si riferiscono allo stesso tipo di dato, è lecito sottrarre il valore di un puntatore da un altro: l’operazione fornisce un valore intero che rappresenta il numero di oggetti compresi fra i due puntatoriSe il primo puntatore è relativo a un indirizzo inferiore al secondo, il risultato è un intero negativo

È lecito anche sottrarre un valore intero da un puntatore: il risultato è un puntatore

&a[0] &a[3] 3&a[3] &a[0] 3

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 21: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 21

EsempioEsempio

L’aritmetica dei puntatori L’aritmetica dei puntatori 3 3

long *p1, *p2, k;int j;char *p3;

p1 &k;p2 p1 4; /* OK */j p2p1; /* OK a j viene assegnato 4 */j p1p2; /* OK a j viene assegnato 4 */p1 p22; /* OK i tipi dei puntatori sono compatibili */p3 p11; /* NO i tipi dei puntatori sono diversi */j p1p3; /* NO i tipi dei puntatori sono diversi */

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 22: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 22

Il linguaggio C prevede la definizione di puntatori nulli, ovvero di puntatori che non puntano ad alcun oggetto validoUn puntatore nullo è un qualsiasi puntatore a cui sia assegnato il valore zero

char *p; p0; /* rende p un puntatore nullo

*/ In questo caso il compilatore non effettua la conversione

esplicita dell’espressione intera nel tipo del puntatoreLa definizione del puntatore nullo è utile all’interno di istruzioni di controllo: il puntatore nullo è l’unico puntatore cui è associato il valore FALSE; tutti i puntatori validi valgono TRUE

L’aritmetica dei puntatori L’aritmetica dei puntatori 4 4

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 23: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 23

Il compilatore segnala i tentativi di utilizzo congiunto di puntatori di tipi diversiUn’eccezione alla regola è costituita dall’uso di puntatori come argomenti di funzione: in mancanza di un prototipoprototipo, il compilatore non effettua controlli per verificare la corrispondenza di tipo fra parametro attuale e parametro formale si possono produrre risultati inconsistenti nel caso di parametri di tipo disomogeneoIl prototipoprototipo di una funzione è una dichiarazione di funzione antecedente alla sua definizione: permette al compilatore di compiere il controllo sui tipi degli argomenti che vengono passati alla funzione

Il passaggio di puntatori come Il passaggio di puntatori come argomenti di funzione argomenti di funzione 1 1

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 24: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 24

Il passaggio di puntatori come Il passaggio di puntatori come argomenti di funzione argomenti di funzione 2 2

include <stdio.h>include <stdlib.h>

void clr(p)long *p;{ *p 0 /* Memorizza 0 alla locazione p */}main(){ static short s[3] {1,2,3};

clr(&s[1]); /* Azzera l’elemento 1 di s[] */ printf(“s[0]%d\ns[1]%d\ns[2]%d\n”, s[0],s[1],s[2]); exit(0);}

s[0]1

s[1]2

s[2]3

s[0]1

s[1]0

s[2]0

p è un puntatore a long long intint vengono azzerati 4 byte, quindi sia s[1] che s[2]

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 25: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 25

È possibile accedere agli elementi di un array attraverso…

…l’uso del nome dell’array con il relativo indice…l’uso dei puntatori

Infatti vale la regola che…

Aggiungere un intero ad un puntatore all’inizio di un Aggiungere un intero ad un puntatore all’inizio di un array, ed accedere all’indirizzo puntato dall’espressione, array, ed accedere all’indirizzo puntato dall’espressione, equivale ad utilizzare l’intero come indice dell’arrayequivale ad utilizzare l’intero come indice dell’array

Inoltre, un nome di array non seguito da un indice viene interpretato come un puntatore all’elemento iniziale dell’array

L’accesso agli elementi di array L’accesso agli elementi di array mediante puntatori mediante puntatori 1 1

ar è equivalente a &ar[0]

Se p &ar[0] *(pe) è equivalente a ar[e]

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 26: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 26

Combinando le due relazioni, si ottiene la regola generale

Un nome di array viene trasformato dal compilatore C in un puntatore all’elemento iniziale dell’array e quindi gli indici vengono interpretati come spostamenti dalla posizione di indirizzo baseindirizzo base In considerazione del meccanismo di scaling, lo spostamento determina il numero di elementi da oltrepassareEsempioEsempio:

L’accesso agli elementi di array L’accesso agli elementi di array mediante puntatori mediante puntatori 2 2

ar[n] equivale a *(arn)

ar[2] *(ar2)

Sono equivalenti: in entrambi i casi, ar è un puntatore all’elemento iniziale dell’array e 2 è un fattore di spostamento che richiede al compilatore di aggiungere due al valore del puntatore

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 27: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 27

Tuttavia……i valori delle variabili puntatore possono essere modificati…i nomi di array non sono variabili, ma riferimenti a indirizzi delle variabili array e, come tali, non possono essere modificati

Un nome di array non associato ad un indice o ad un operatore “accesso all’indirizzo di” (**) non può apparire alla sinistra di un operatore di assegnamento

L’accesso agli elementi di array L’accesso agli elementi di array mediante puntatori mediante puntatori 3 3

float ar[7], *p;

par; /* OK equivale a p&ar[0] */arp; /* NO: non è possibile operare assegnamenti su un indirizzo di array */&par; /* NO: non è possibile operare assegnamenti su un indirizzo di puntatore */ar; /* NO: non è possibile incrementare un indirizzo di array */ar[1]*(p5); /* OK ar[1] è una variabile */p; /* OK è possibile incrementare una variabile puntatore */

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 28: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

28

Il passaggio di array come Il passaggio di array come argomenti di funzione argomenti di funzione 1 1

In C, un nome di array, utilizzato come argomento di funzione, viene interpretato come indirizzo del primo elemento dell’array

EsempioEsempio:

Nella funzione chiamata è necessario dichiarare l’argomento come un puntatore all’elemento iniziale di un array

main(){

extern float func();float x;static float farray[5]; x func(farray) /* equivalente a: func(&farray[0]) */… … …

func(ar)float ar[];{ … … …}

func(ar)float *ar;{ … … …}

Non è specificata la dimensione perché non si alloca memoria

Page 29: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 29

Il passaggio di array come Il passaggio di array come argomenti di funzione argomenti di funzione 2 2

Anche nel secondo caso, ciò che viene passato è un puntatore al primo elemento dell’array ed il compilatore è in grado di convertire automaticamente ar in un puntatore a floatfloat

In termini di leggibilità, la seconda versione è preferibile, poiché evidenzia che l’oggetto passato è l’indirizzo di base di un array e non un generico puntatore a una variabile float (scalare o composta?)

La dichiarazione della dimensione dell’array nella definizione dell’argomento è comunque corretta: il compilatore può usare l’informazione sulla dimensione per effettuare controlli sui valori limite

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 30: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

30

Il passaggio di array come Il passaggio di array come argomenti di funzione argomenti di funzione 3 3

Non è possibile ottenere la dimensione di un array all’interno di una funzione cui viene passato come argomento, ma solo laddove l’array è effettivamente dichiarato

include <stdio.h>

void print_size(arg)float arg[];{ printf(“La dimensione di arg è: %d\n”, sizeof(arg));}

main(){ void print_size(); static float f_array[10];

printf(“La dimensione di f_array è: %d\n”, sizeof(f_array)); print_size(f_array); exit(0);}

Sulla macchina di riferimento, l’esecuzione del programma fornisce:

La dimensione di f_array è: 40

La dimensione di arg è: 4

Page 31: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 31

Uscita dal limite superiore di un Uscita dal limite superiore di un arrayarray

Il compilatore, di solito, non controlla che l’accesso agli elementi di un array venga effettuato rispettandone i limiti dimensionali È possibile accedere per errore ad elementi per i quali non è stata allocata memoria (aree di memoria riservate ad altre variabili, riservate ad altri processi, etc.)EsempioEsempio:main(){ int ar[10], j;

for (j0; j<10; j) ar[j] 0;}

Essendo ar un array di 10 elementi, quelli cui è possibile accedere in modo corretto hanno indice da 0 a 9: il ciclo forfor contiene un errore offbyone

Probabilmente verrebbe azzerata la variabile j il ciclo diventa infinitoFondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-

0909

Page 32: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 32

L’ordinamentoordinamento di una sequenza di informazioni consiste nel disporre le stesse informazioni in modo da rispettare una qualche relazione d’ordine; ad esempio, una relazione d’ordine “minore o uguale” dispone le informazioni in modo “non decrescente”

L’ordinamento è un’operazione molto importante perché permette di ridurre notevolmente i tempi di ricercaricerca di un’informazione, nell’ambito di una sequenza di informazioni

Nel caso in cui tale sequenza risulta ordinata, secondo una qualche relazione d’ordine, è infatti possibile sfruttare la stessa relazione d’ordine per effettuare la ricerca

Gli algoritmi di ordinamento Gli algoritmi di ordinamento 1 1

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 33: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 33

Gli algoritmi di ordinamento Gli algoritmi di ordinamento 2 2

Esistono due categorie di algoritmi di ordinamento: la classificazione è fatta in base alla complessità di calcolocomplessità di calcolo e alla semplicità semplicità algoritmicaalgoritmica

La complessità di calcolocomplessità di calcolo si riferisce al numero di operazioni necessarie all’ordinamento; tali operazioni sono essenzialmente confronti e scambi tra gli elementi dell’insieme da ordinare

La semplicità algoritmica si riferisce alla lunghezza e alla comprensibilità del codice

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 34: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 34

Gli algoritmi di ordinamento Gli algoritmi di ordinamento 3 3

Algoritmi semplici di ordinamentoAlgoritmi semplici di ordinamentoAlgoritmi che presentano complessità O(n2), dove n è il numero di informazioni da ordinare: sono caratterizzati da poche e semplici istruzioni, dunque si realizzano con poche linee di codice

Algoritmi evoluti di ordinamentoAlgoritmi evoluti di ordinamentoAlgoritmi che presentano complessità computazionale O(nlog2n): sono più complessi, fanno spesso uso di ricorsionericorsione; la convenienza del loro utilizzo si rileva quando il numero n di informazioni da ordinare è molto elevato

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 35: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 35

Bubblesort Bubblesort 1 1

La strategia BubblesortBubblesort (ordinamento a bollaordinamento a bolla) prevede il confronto dei primi due elementi di un array, e lo scambio, se il primo è maggiore del secondo

Dopo il primo confronto, si effettua un confronto fra il secondo ed il terzo elemento (con eventuale scambio), fra il terzo ed il quarto, etc.

Gli elementi “pesanti” (grandi) tendono a scendere verso il fondo del vettore, mentre quelli “leggeri” (più piccoli) salgono (come bolle) in superficie

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 36: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 36

Bubblesort Bubblesort 2 2

Il confronto fra tutte le coppie di elementi adiacenti viene detto passaggiopassaggio

Se, durante il primo passaggio, è stato effettuato almeno uno scambio, occorre procedere ad un ulteriore passaggioAd ogni passaggio, almeno un elemento assume la sua posizione definitiva (l’elemento più grande del sottoinsieme attualmente disordinato)

Devono essere effettuati al più n1 passaggiAl kesimo passaggio vengono effettuati nk confronti (con eventuali scambi): almeno k1 elementi sono già ordinatiComplessivamente, vengono effettuati n(n1)/2 confronti La complessità computazionale del Bubblesort è La complessità computazionale del Bubblesort è OO(n(n22))

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 37: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

37

Bubblesort Bubblesort 3 3

define FALSE 0define TRUE 1include <stdio.h>

void bubble_sort(list, list_size)int list[], list_size;{ int j, temp, sortedFALSE; while (!sorted) { sorted TRUE; /* assume che list sia ordinato */ for (j0; j<list_size1; j) { if (list[j]>list[j1]) { /* almeno un elemento non è in ordine */ sorted FALSE; temp list[j]; list[j] list[j1]; list[j1] temp; } } /* fine del ciclo for */ } /* fine del ciclo while */}

NotaNota

Nel caso migliore, quando il vettore è già ordinato, si effettua un solo passaggio, con n1 confronti e nessuno scambio

La complessità scende a O(n)

Page 38: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 38

Le stringheLe stringhe

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 39: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 39

DefinizioneDefinizione

Una stringastringa è un array di caratteri terminato dal carattere nullo, corrispondente alla sequenza di escape \0\0 (con valore numerico associato zero)

Una stringa costantestringa costante (o letteraleletterale) è una serie di caratteri racchiusi fra doppi apici: tale stringa è di tipo array di caratteriarray di caratteri, con ogni carattere che occupa un byte

Ad ogni stringa viene aggiunto automaticamente dal compilatore un carattere nullo, ad indicarne la fine

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 40: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 40

Dichiarazione e inizializzazione Dichiarazione e inizializzazione 11

Per memorizzare una stringa occorre dichiarare un array di charchar, che può essere inizializzato con una stringa costante

static char str[]static char str[]“testo”;“testo”;L’array ha dimensione maggiore di uno rispetto alla lunghezza della stringa, per consentire la memorizzazione del carattere nullo di terminazione (strstr ha lunghezza 6 byte)Il compilatore segnala un errore se si dichiara la lunghezza della stringa n, e si inizializza con una stringa costante di lunghezza >n

static char str[3]static char str[3]“quattro”; /* SCORRETTO */“quattro”; /* SCORRETTO */

static char str1[3]static char str1[3]“tre”; /* CORRETTO */“tre”; /* CORRETTO */

I compilatori ANSI, generalmente, consentono di specificare una dimensione di array che non includa il carattere terminatore

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 41: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 41

Dichiarazione e inizializzazione Dichiarazione e inizializzazione 22

È possibile inizializzare un puntatore a charchar con una stringa costante:

char *ptr = “altro testo”;char *ptr = “altro testo”;si crea un array di caratteri, inizializzato ad “altro testo”, riservando però memoria anche per il puntatore

Nel caso dell’array, tutti i successivi accessi utilizzano il nome dell’array come riferimento per l’indirizzo dell’elemento iniziale dell’array: tale indirizzo non può essere modificatoIl puntatore è una variabile e può essere modificato: l’indirizzo relativo alla prima inizializzazione viene perso

2000 1006

‘\0’

‘\0’

‘o’

‘t’

‘e’

‘s’

‘t’

‘o’

‘a’ ‘l’

‘t’

‘r’

‘o’

‘t’

‘e’

‘s’

‘t’

1009

1008

1007

1006

100B

1005

100E

100D

100C

1011

100F

1002

1001

1000

0FFF

1004

1003

strstr

100A

‘ ’

ptrptr1010

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 42: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

42

Gli assegnamenti a stringheGli assegnamenti a stringhe

Un puntatore a charchar può essere inizializzato con una stringa costante, perché una stringa è un array di charcharUna stringa costante viene interpretata come un puntatore al primo carattere della stringa

include <stdlib.h>main(){ char array[10]; char *ptr1 “10 spazi”; char *ptr2;

array “not OK”; /* non è possibile assegnare un indirizzo */ array[5] ‘A’; /* OK */ *(ptr15) ‘B’; /* OK */ ptr1 “OK”; ptr1[5] ‘C’; /* opinabile a causa dell’assegnamento precedente */ *ptr2 “not OK”;/* conflitto di tipi */ ptr2 “OK”; exit(0);}

Page 43: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 43

Stringhe e caratteri Stringhe e caratteri 1 1

Occorre notare la differenza fra stringhe costanti e costanti di tipo carattere:

È possibile assegnare una costante carattere all’indirizzo contenuto in un puntatore a charchar; è invece scorretto effettuare la stessa operazione relativamente ad una stringa

char ch ‘a’; /* Per ‘a’ è riservato un byte */

/* Vengono riservati due byte per “a”, oltre allo

* spazio necessario alla memorizzazione di ps

*/

char *ps “a”;

char *p2;

p2 ‘a’; /* not OK */

p2 “a”;/* OK */

char *p1;

*p1 ‘a’; /* OK */

*p1 “a”; /* not OK */

Le stringhe sono interpretate come puntatori a carattere

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 44: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 44

Stringhe e caratteri Stringhe e caratteri 2 2

Le inizializzazioni e gli assegnamenti non sono simmetrici; è infatti possibile scrivere

char *p char *p “string”; “string”; ma non… *p *p “string”; “string”;

NotaNota: vale per inizializzazioni ed assegnamenti di tutti i tipi di dati

float f;float f; float *pf float *pf &f; /*OK */ &f; /*OK */ *pf *pf &f; /* SCORRETTO */ &f; /* SCORRETTO */

Carattere

Float

Puntatore a carattere

Puntatore a float

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 45: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 45

Lettura e scrittura di stringhe Lettura e scrittura di stringhe 1 1

Le stringhe possono essere lette e scritte utilizzando le funzioni scanf()scanf() e printf()printf(), con lo specificatore di formato %s%s

L’argomento della funzione scanf()scanf() deve essere un puntatore ad un array di caratteri di dimensioni sufficienti a contenere la stringa in ingresso, che si intende terminata da un qualsiasi carattere di spaziatura

La funzione scanf()scanf(), dopo aver letto il dato in ingresso, aggiunge automaticamente il carattere \0\0 in fondo alla stringa

L’argomento della funzione printf()printf() deve essere un puntatore ad un array di caratteri terminato dal carattere nullo (che non viene stampato)

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 46: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 46

Lettura e scrittura di stringhe Lettura e scrittura di stringhe 2 2

EsempioEsempio: Scrivere un programma che legge una stringa dalla periferica d’ingresso di default e la stampa dieci volte

include <stdio.h>include <stdlib.h>define MAX_CHAR 80

main(){ char str[MAX_CHAR]; int i;

printf(“Introdurre una stringa:”); scanf(“%s”, str); for (i0; i<10; i) printf(“%s\n”, str); exit(0);}

È possibile utilizzare il nome dell’array come argomento per le funzioni di I/O, in quanto puntatore all’inizio dell’array

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 47: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 47

Le funzioni di libreria per le Le funzioni di libreria per le stringhe: stringhe: strlenstrlen ()()

Poiché nell’espressione *str*str i due operatori hanno la stessa precedenza ed associatività destra, l’espressione viene analizzata dal compilatore nel modo seguente:

Valutazione dell’operatore di incremento postfisso; il compilatore passa strstr all’operatore successivo e lo incrementa solo al termine della valutazione dell’espressione

int strlen(str)char *str;{ int i;

for (i0; *str; i) ; /* istruzione vuota */ return i;}

Valutazione dell’operatore *, applicato a strstrCompletamento dell’espressione, con l’incremento di strstr

La funzione strlen()strlen(), restituisce il numero di caratteri che compongono una stringa (escluso il carattere nullo)

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 48: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 48

Le funzioni di libreria per le Le funzioni di libreria per le stringhe: stringhe: strcpystrcpy ()()

L’operatore di incremento postfisso è obbligatorio: un incremento prefisso non produrrebbe un risultato corretto, dato che il primo elemento non verrebbe copiato

void strcpy(s1, s2)char *s1, *s2;{ while (*s2 *s1) ; /*istruzione vuota */ }

Il risultato dell’assegnamento costituisce la condizione di test per il ciclo whilewhile

Se *s2 vale zero (per il carattere di terminazione), si ha l’uscita dal ciclo

La funzione strcpy()strcpy() copia una stringa in un’altra

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 49: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 49

Le funzioni di libreria per le Le funzioni di libreria per le stringhe: stringhe: strstrstrstr ()() 1 1

La funzione strstr()strstr() effettua la ricerca di una sottostringa all’interno di una stringa, operazione detta comunemente pattern matchingpattern matchingLa funzione prevede come argomenti due puntatori a stringhe di caratteri ed effettua la ricerca di un’occorrenza della seconda stringa nella prima:

se esiste un’occorrenza, viene restituita la posizione d’inizio nell’arrayaltrimenti, viene restituito 1

NotaNota: la maggior parte delle funzioni della libreria di runtime restituisce 0 o 1, come valore di errore (per strstr()strstr(), 0 corrisponde all’occorrenza della seconda stringa all’inizio della prima)

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 50: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

50

Le funzioni di libreria per le Le funzioni di libreria per le stringhe: stringhe: strstrstrstr ()() 2 2

/* Restituisce la posizione di str2 in str1; restituisce 1 se non esiste occorrenza */int strstr(str1, str2)char *str1, *str2; { char *p, *q, *substr;

/* Itera su ogni carattere di str1 */ for (substrstr1; *substr; substr) { p substr; q str2; /* Controlla se l’occorrenza di str2 corrisponde alla posizione corrente */ while (*q) if (*q !*p) goto no_match; /* serve per uscire dal while, ma restare nel for */ /* Si giunge qui solo se si è trovata un’occorrenza di str2 */ return substrstr1; /* Si giunge qui se non è stata riscontrata un’occorrenza di str2 (nel ciclo while) */ no_match: ; } /* Si giunge qui se non vi sono occorrenze di str2 in str1 */ return 1;}

Page 51: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 51

Le funzioni di libreria in string.hLe funzioni di libreria in string.h strcpy() Copia una stringa in un array

strncpy() Copia una parte di una stringa in un array

strcat() Concatena due stringhe

strncat() Concatena parte di una stringa ad un’altra

strcmp() Confronta due stringhe

strncmp() Confronta due stringhe per una lunghezza data

strchr() Cerca la prima occorrenza di un carattere specificato in una stringa

strcoll() Confronta due stringhe sulla base di una sequenza di confronto definita

strcspn() Calcola la lunghezza di una stringa che non contiene i caratteri specificati

strerror() Fa corrispondere ad un numero di errore un messaggio di errore testuale

strlen() Calcola la lunghezza di una stringa

strpbrk() Cerca la prima occorrenza di uno tra i caratteri specificati all’interno di una stringa

strrchr() Cerca l’ultima occorrenza di un carattere in una stringa

strspn() Calcola la lunghezza di una stringa che contenga caratteri specificati

strstr() Cerca la prima occorrenza di una stringa in un’altra

strtok() Divide una stringa in una sequenza di simboli

strxfrm() Trasforma una stringa in modo che sia utilizzabile come argomento per strcmp()Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-

0909

Page 52: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

52

Esempio: Calcolo dell’etàEsempio: Calcolo dell’età

/* Esempio di conversione da stringa ad intero */

include <stdio.h>include <stdlib.h>

main(){ char anno_nascita[5], anno_corrente[5]; int anni;

printf(“Inserire l’anno di nascita: ”); scanf(“%s”, anno_nascita); printf(“Inserire l’anno corrente: ”); scanf(“%s”, anno_corrente);

/* atoi() converte una stringa in un intero */ anni atoi(anno_corrente) atoi(anno_nascita); printf(“Età: %d\n”, anni); exit(0);}

Page 53: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

53

Esempio: Parole nella stringaEsempio: Parole nella stringa/* Conta il numero di parole in una stringa */

include <ctype.h>

int word_count(s)char *s;{ int count0;

while (*s !`\0´) { while (isspace(*s)) /* salta la spaziatura */ s; if (*s !`\0´) /* trovata una parola */ { count; while (!isspace(*s) && *s !`\0´) s; /* salta la parola */ } } return count;}

Page 54: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08 54

Esempio: Parole palindromeEsempio: Parole palindrome

/* Letta in input una stringa, verifica se è palindroma */include <stdio.h>#include <string.h>

main(){ char parola[32], i0, n;

printf(“Inserisci una parola (lunga al max 31 caratteri): ”); scanf(“%s”, parola); n strlen(parola); while ((i n/2) && (parola[i] parola[n1i]))

i; if (i n/2) printf(“La parola %s è palindroma.\n”, parola); else

printf(“La parola %s non è palindroma.\n”, parola); exit(0);}

Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

Page 55: Fondamenti di Informatica I a.a. 2007-08 1 Il linguaggio C Gli array e i puntatori Dichiarazione e memorizzazione di array Linizializzazione di array Laritmetica

Fondamenti di Informatica I Fondamenti di Informatica I a.a. 2007-08 a.a. 2007-08Fondamenti di Informatica Fondamenti di Informatica a.a. a.a. 2008-2008-0909

55

Esempio: Da minuscole a Esempio: Da minuscole a maiuscolemaiuscole/* Letta in input una stringa alfabetica, la riscrive utilizzando solo lettere maiuscole*/include <stdlib.h>include <stdio.h>#include <string.h>

main(){ char s[100], t[100]; int i;

printf(“Inserisci una stringa: ”); scanf(“%s”, s); for (i0; istrlen(s); i) { if (s[i] 97 && s[i] 122) t[i] s[i] 32; else t[i] s[i]; } printf(“Stringa maiuscola: %s\n”, t);

exit(0);}