Linguaggio C Array e puntatori (Parte 5)

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Linguaggio C Array e puntatori (Parte 5)"

Transcript

1 Linguaggio C Array e puntatori (Parte 5) Prof. Aniello Castiglione castiglione@ieee.org 1

2 Sommario Gli array ed i puntatori Dichiarazione e memorizzazione di array L inizializzazione di array L aritmetica dei puntatori Il passaggio di puntatori come argomenti di funzione Gli algoritmi di ordinamento Le stringhe 2

3 Gli array ed i puntatori 3

4 Gli array Nel linguaggio C, un array è un insieme di variabili dello stesso tipo memorizzate consecutivamente Ogni variabile dell array, detta elemento, può essere acceduta mediante il nome dell array ed un indice (un espressione), con il primo elemento individuato dall indice di valore 0 Esempio: 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 Nota: Gli array contengono informazione correlata (le temperature di un anno, i voti di esame di uno studente, etc.) 4

5 La dichiarazione di array - 1 La sintassi della dichiarazione di array è: Specificatore di tipo Nome dell array [ Dimensione dell array ] = Valori iniziali } 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 5

6 Il riferimento 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 La dichiarazione di array - 2 /* La seguente è una dichiarazione; * il valore 365 specifica il numero * di elementi dell array */ int daily_temp[365]; /* I seguenti sono riferimenti a elementi * dell array; i valori 0,1,2, * specificano gli elementi cui accedere */ daily_temp[0] = 2; daily_temp[1] = 5; daily_temp[2] = 3; 6

7 La dichiarazione di array - 3 Esempio: Calcolo della temperatura media annua #include <stdio.h> #include <stdlib.h> #define DAYS_IN_YEAR 365 main() int j, sum=0; int daily_temp[days_in_year]; /* si assegnano i valori a daily_temp[] */ } for (j=0; j<days_in_year; j++) sum += daily_temp[j]; printf( La temperatura media dell anno è %d.\n, sum/days_in_year); exit(0); 7

8 La memorizzazione di array Esempio 4 byte int ar[5]; /* dichiarazione */ ar[0] = 15; ar[1] = 17; ar[3] = 3; 0FFC C non definito 3 non definito ar[0] ar[1] ar[2] ar[3] ar[4] ar[2] e ar[4] sono indefiniti: il contenuto delle posizioni di memoria è quello rimasto da esecuzioni precedenti (garbage) 8

9 L inizializzazione di array - 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 static (vettore a 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 9

10 L inizializzazione di array - 2 Esempio static int ar[5]; static int br[5]=1,2,3.5,4,5}; Nota: il valore floating-point 3.5 viene convertito nel valore intero 3 0FFC C byte non definito ar[0] ar[1] ar[2] ar[3] ar[4] br[0] br[1] br[2] br[3] C br[4]

11 L inizializzazione di array - 3 Specificare un numero maggiore di valori di inizializzazione, rispetto agli elementi dell array, costituisce un errore segnalato dal compilatore Se vengono specificati meno valori rispetto alla dimensione, gli elementi rimanenti vengono inizializzati a zero Esempio: La dichiarazione static int cr[5] = 1,2,3}; produce l inizializzazione cr[0] = 1 cr[1] = 2 cr[2] = 3 cr[3] = 0 cr[4] = 0 11

12 L inizializzazione di array - 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 Esempio: static char dr[] = a, b, c, d }; comporta la creazione di un array di quattro elementi, di tipo char, caratterizzati dai valori iniziali dr[0] = a dr[1] = b dr[2] = c dr[3] = d 12

13 Crittografia - 1 Poiché in formato elettronico viene memorizzato e trasmesso ogni tipo di informazione (anche personale, quindi coperta da privacy), viene posta attenzione alla sicurezza rispetto ad accessi indesiderati I file, nei sistemi multiutente, sono provvisti di vari livelli di protezione, il primo dei quali è costituito dall autenticazione al sistema tramite password Oltre 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 crittogramma, o testo cifrato Il 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 13

14 Crittografia - 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 14

15 Crittografia - 3 Se il sistema di cifra, o cifrario, è ben congegnato, l operazione di decifrazione 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 cifrario Occorre notare la distinzione tra decifrazione e decrittazione, l operazione illegittima in cui non ci si può avvalere della chiave 15

16 Crittografia - 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} 48= 0 ð 111= o Ciao 6D\5 /* Controlla la presenza di caratteri illeciti */ if (ch > 127) return ILLEGAL_VAL; else return encoder[ch]; /* Fornisce il carattere codificato */ } 16

17 Crittografia - 5 Il codice Shift Cypher con K=3 era utilizzato da Giulio Cesare 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 Esercizio: Con K=11, 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 midnight hphtwwxppelextoytrse 17

18 Esempio - 1 /* Dato un vettore, stabilisce se vi sono almeno due elementi uguali tra loro */ #define MAX_DIM 256 typedef int[max_dim] VECTOR; 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_DIM-1)) && (found == -1)); c++) for(k = (c+1); ((k < MAX_DIM) && (found == -1)); k++) if (v[c] == v[k]) found = 1; /* ricerca con successo */ } } } return found; 18

19 Esempio - 2 /* Inverte gli elementi di un vettore */ #include <stdio.h> int main() /*dichiarazioni*/ int a[10], b[10]; int i, dim=10; /*input elementi*/ return 0; for(i=0;i<dim;i++) } printf( inserire l elemento a[%d]:,i); scanf( %d, &a[i]); } /*inversione vettore*/ for(i=0;i<dim;i++) b[i]=a[dim-1-i]; /*stampa vettore invertito*/ printf( Il vettore invertito è:\n\n ); for(i=0;i<dim;i++) printf( b[%d] = %d\n, i, b[i]); /*stampa vettore*/ printf( \nil vettore è:\n\n ); for(i=0;i<dim;i++) printf( a[%d] = %d\n, i, a[i]); printf( \n ); 19

20 L aritmetica dei puntatori - 1 Il C permette l utilizzo degli operatori additivi in concomitanza con i puntatori Se p è un puntatore, l espressione p+3 è lecita ed individua il terzo oggetto che segue quello puntato da p Poiché p contiene un indirizzo, operazioni aritmetiche su p forniscono nuovi indirizzi Il compilatore non opera semplicemente una somma tra 3 e p, ma moltiplica 3 per la dimensione dell oggetto puntato da p: effettua cioè uno scaling Esempio: Se l indirizzo contenuto in p è 1000 e p è un puntatore a long int, allora p+3 identifica l indirizzo 1018 (8 byte per gli interi lunghi); se p è un puntatore a char, p+3 rappresenta l indirizzo

21 L aritmetica dei puntatori - 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 puntatori Se il primo puntatore è relativo a un indirizzo inferiore al secondo, il risultato è un intero negativo &a[3]-&a[0] = 3 &a[0]-&a[3] = -3 È lecito anche sottrarre un valore intero da un puntatore: il risultato è un puntatore 21

22 L aritmetica dei puntatori - 3 Esempio long *p1, *p2, k; int j; char *p3; p1=&k; p2=p1+ 4; /* OK */ j=p2-p1; /* OK a j viene assegnato 4 */ j=p1-p2; /* OK a j viene assegnato -4 */ p1=p2-2; /* OK tipi dei puntatori compatibili */ p3=p1-1; /* NO tipi diversi di puntatori */ j=p1-p3; /* NO tipi diversi di puntatori */ 22

23 L aritmetica dei puntatori - 4 Il linguaggio C prevede la definizione di puntatori nulli, ovvero di puntatori che non puntano ad alcun oggetto valido Un puntatore nullo è un qualsiasi puntatore a cui sia assegnato il valore zero char *p; p=0; /* rende p un puntatore nullo */ In questo caso il compilatore non effettua la conversione esplicita dell espressione intera nel tipo del puntatore La 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 23

24 Il passaggio di puntatori come argomenti di funzione - 1 Il compilatore segnala i tentativi di utilizzo congiunto di puntatori di tipi diversi Un eccezione alla regola è costituita dall uso di puntatori come argomenti di funzione: in mancanza di un prototipo, 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 disomogeneo Il prototipo 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 24

25 Il passaggio di puntatori come argomenti di funzione - 2 #include <stdio.h> #include <stdlib.h> void clr(p) int *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 p è un puntatore a int ð vengono azzerati 4 byte, quindi sia s[1] che s[2] s[0]=1 s[1]=0 s[2]=0 25

26 L accesso agli elementi di array mediante puntatori - 1 È 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 array, ed accedere all indirizzo puntato dall espressione, equivale 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 ar è equivalente a &ar[0] Se p=&ar[0] ð *(p+e) è equivalente a ar[e] 26

27 L accesso agli elementi di array mediante puntatori - 2 Combinando le due relazioni, si ottiene la regola generale ar[n] equivale a *(ar+n) 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 base In considerazione del meccanismo di scaling, lo spostamento determina il numero di elementi da oltrepassare Esempio: ar[2] *(ar+2) 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 27

28 L accesso agli elementi di array mediante puntatori - 3 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 float ar[7], *p; p=ar; /* OK equivale a p=&ar[0] */ ar=p; /* NO assegnamento su un indirizzo di array */ &p=ar; /* NO assegnamento su un indirizzo di puntatore */ ar++; /* NO: non è possibile incrementare un indirizzo di array */ ar[1]=*(p+5); /* OK ar[1] è una variabile */ p++; /* OK è possibile incrementare una variabile puntatore */ 28

29 Il passaggio di array come argomenti di funzione - 1 In C, un nome di array, utilizzato come argomento di funzione, viene interpretato come indirizzo del primo elemento dell array Esempio main() extern float func(); float x; static float farray[5]; x = func(farray) /* equivalente a: func(&farray[0]) */ Nella funzione chiamata è necessario dichiarare l argomento come un puntatore all elemento iniziale di un array func(ar) float *ar; } func(ar) float ar[]; } Non è specificata la dimensione perché non si alloca memoria 29

30 Il passaggio di array come argomenti di funzione - 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 float 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 30

31 Il passaggio di array come argomenti di funzione - 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> #include <stdlib.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 31

32 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.) Esempio: main() int ar[10], j; } Uscita dal limite superiore di un array for(j=0; 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 for contiene un errore off-by-one Probabilmente verrebbe azzerata la variabile j ð il ciclo diventa infinito 32

33 Gli algoritmi di ordinamento - 1 L ordinamento 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 ricerca 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 33

34 Gli algoritmi di ordinamento - 2 Esistono due categorie di algoritmi di ordinamento: la classificazione è fatta in base alla complessità di calcolo e alla semplicità algoritmica La complessità 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 34

35 Gli algoritmi di ordinamento - 3 Algoritmi semplici di ordinamento Algoritmi che presentano complessità O(n 2 ), 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 ordinamento Algoritmi che presentano complessità computazionale O(n log 2 n): sono più complessi, fanno spesso uso di ricorsione; la convenienza del loro utilizzo si rileva quando il numero n di informazioni da ordinare è molto elevato 35

36 Bubblesort - 1 La strategia Bubblesort (ordinamento 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 36

37 Bubblesort - 2 Il confronto fra tutte le coppie di elementi adiacenti viene detto passaggio Se, durante il primo passaggio, è stato effettuato almeno uno scambio, occorre procedere ad un ulteriore passaggio Ad ogni passaggio, almeno un elemento assume la sua posizione definitiva (l elemento più grande del sottoinsieme attualmente disordinato) Devono essere effettuati al più n-1 passaggi Al k-esimo passaggio vengono effettuati n-k confronti (con eventuali scambi): almeno k-1 elementi sono già ordinati Complessivamente, vengono effettuati n (n-1)/2 confronti ð La complessità computazionale del Bubblesort è O(n 2 ) 37

38 Bubblesort - 3 #define FALSE 0 #define TRUE 1 #include <stdio.h> void bubble_sort(list, list_size) int list[], list_size; int j, temp, sorted=false; while(!sorted) sorted = TRUE; /* assume che list sia ordinato */ for(j=0; j<list_size-1; j++) if(list[j]>list[j+1]) /* almeno un elemento non è in ordine */ sorted = FALSE; temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } /* fine del ciclo for */ } /* fine del ciclo while */ } Nota Nel caso migliore, quando il vettore è già ordinato, si effettua un solo passaggio, con n-1 confronti e nessuno scambio ð La complessità scende a O(n) 38

39 Le stringhe 39

40 Definizione Una stringa è un array di caratteri terminato dal carattere nullo, corrispondente alla sequenza di escape \0 (con valore numerico associato zero) Una stringa costante (o letterale) è una serie di caratteri racchiusi fra doppi apici: tale stringa è di tipo array di caratteri, con ogni carattere che occupa un byte Ad ogni stringa viene aggiunto automaticamente dal compilatore un carattere nullo, ad indicarne la fine 40

41 Dichiarazione e inizializzazione - 1 Per memorizzare una stringa occorre dichiarare un array di char, che può essere inizializzato con una stringa costante static char str[]= testo ; L array ha dimensione maggiore di uno rispetto alla lunghezza della stringa, per consentire la memorizzazione del carattere nullo di terminazione (str 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]= quattro ; /* SCORRETTO */ static char str1[3]= tre ; /* CORRETTO */ I compilatori ANSI, generalmente, consentono di specificare una dimensione di array che non includa il carattere terminatore 41

42 Dichiarazione e inizializzazione - 2 È possibile inizializzare un puntatore a char con una stringa costante: str 0FFF 1000 t a l 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 modificato Il puntatore è una variabile e può essere modificato: l indirizzo relativo alla prima inizializzazione viene perso ptr e s t o \ A 100B 100C 100D 100E 100F t r o t e s t o \0 42

43 Gli assegnamenti a stringhe Un puntatore a char può essere inizializzato con una stringa costante, perché una stringa è un array di char Una 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 */ *(ptr1+5) = B ; /* OK */ ptr1 = OK ; ptr1[5] = C ; /* opinabile a causa dell assegnamento precedente */ *ptr2 = not OK ;/* conflitto di tipi */ ptr2 = OK ; /* opinabile perché non c è inizializzazione */ exit(0); } 43

44 Stringhe e caratteri - 1 Occorre notare la differenza fra stringhe costanti e costanti di tipo carattere: 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 ; È possibile assegnare una costante carattere all indirizzo contenuto in un puntatore a char; è invece scorretto effettuare la stessa operazione relativamente ad una stringa char *p1; *p1 = a ; /* OK */ *p1 = a ; /* not OK */ char *p2; p2 = a ; /* not OK */ p2 = a ; /* OK */ Le stringhe sono interpretate come puntatori a carattere 44

45 Stringhe e caratteri - 2 Le inizializzazioni e gli assegnamenti non sono simmetrici; è infatti possibile scrivere Puntatore a carattere char *p = string ; ma non Carattere *p = string ; Nota: vale per inizializzazioni ed assegnamenti di tutti i tipi di dati float f; float *pf = &f; /*OK */ *pf = &f; /* SCORRETTO */ Float Puntatore a float 45

46 Lettura e scrittura di stringhe - 1 Le stringhe possono essere lette e scritte utilizzando le funzioni scanf() e printf(), con lo specificatore di formato %s L argomento della funzione 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(), dopo aver letto il dato in ingresso, aggiunge automaticamente il carattere \0 in fondo alla stringa L argomento della funzione printf() deve essere un puntatore ad un array di caratteri terminato dal carattere nullo (che non viene stampato) 46

47 Lettura e scrittura di stringhe - 2 Esempio: 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; È possibile utilizzare il nome dell array come argomento per le funzioni di I/O, in quanto puntatore all inizio dell array } printf( Introdurre una stringa: ); scanf( %s, str); for (i=0; i<10; i++) printf( %s\n, str); exit(0); 47

48 Le funzioni di libreria per le stringhe strlen() La funzione strlen(), restituisce il numero di caratteri che compongono una stringa (escluso il carattere nullo) Poiché nell espressione *str++ i due operatori hanno la stessa int strlen(str) precedenza ed associatività destra, l espressione viene analiz- char *str; zata dal compilatore nel modo int i; seguente: Valutazione dell operatore di incremento postfisso; il compilatore passa str all operatore successivo e lo incrementa solo al termine della valutazione dell espressione Valutazione dell operatore *, applicato a str Completamento dell espressione, con l incremento di str } for (i=0; *str++; i++) ; /* istruzione vuota */ return i; 48

49 Le funzioni di libreria per le stringhe strcpy() La funzione strcpy() copia una stringa in un altra Il risultato dell assegnamento costituisce la condizione di test per il ciclo while Se *s2 vale zero (per il carattere di terminazione), si ha l uscita dal ciclo void strcpy(s1, s2) char *s1, *s2; while(*s2++ = *s1++) ; /*istruzione vuota */ } L operatore di incremento postfisso è obbligatorio: un incremento prefisso non produrrebbe un risultato corretto, dato che il primo elemento non verrebbe copiato 49

50 Le funzioni di libreria per le stringhe strstr()- 1 La funzione strstr() effettua la ricerca di una sottostringa all interno di una stringa, operazione detta comunemente pattern matching La 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 array altrimenti, viene restituito -1 Nota: la maggior parte delle funzioni della libreria di run-time restituisce 0 o -1, come valore di errore (per strstr(), 0 corrisponde all occorrenza della seconda stringa all inizio della prima) 50

51 Le funzioni di libreria per le stringhe strstr()- 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(substr=str1; *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 substr-str1; /* 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; } 51

52 Le 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() 52

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

54 Esempio: Parole nella stringa /* Conta il numero di parole in una stringa */ #include <ctype.h> int word_count(s) char *s; int count=0; 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; } 54

55 Esempio: Parole palindrome /* Letta in input una stringa, verifica se è palindroma */ #include <stdio.h> #include <stdlib.h> #include <string.h> main() char parola[32], i=0, n; printf( Inserisci una parola (lunga al max 31 caratteri): ); scanf( %s, parola); n = strlen(parola); while((i <= n/2) && (parola[i] = = parola[n-1-i])) i++; if(i > n/2) printf( La parola %s è palindroma.\n, parola); else printf( La parola %s non è palindroma.\n, parola); exit(0); } 55

56 Esempio: Da minuscole a maiuscole /* Letta una stringa alfabetica, la riscrive con solo lettere maiuscole*/ #include <stdlib.h> #include <stdio.h> #include <string.h> main() exit(0); } char s[100], t[100]; int i; printf( Inserisci una stringa: ); scanf( %s, s); for (i=0; i<strlen(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); 56

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

! Array. n Mondimensionali n Multidimesionali (Matrici)! Preprocessore! Commenti Linguaggio C ! Array n Mondimensionali n Multidimesionali (Matrici)! Preprocessore! Commenti 2 ! Nel linguaggio C, un array è un insieme di variabili dello stesso tipo memorizzate consecutivamente! Ogni

Dettagli

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012 Funzioni e passaggio parametri Alessandra Giordani agiordani@disi.unitn.it Mercoledì 16 maggio 2012 http://disi.unitn.it/~agiordani/ Cosa vedremo oggi Le funzioni Il passaggio dei parametri Le dichiarazioni

Dettagli

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

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016

Dettagli

Dispensa 13 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratorio

Dispensa 13 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratorio CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA CORSO DI PROGRAMMAZIONE A.A. 2014-15 Dispensa 13 Laboratorio Dott. Mirko Ravaioli e-mail: mirko.ravaioli@unibo.it http://www.programmazione.info

Dettagli

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010 Tipi di dati scalari (casting e puntatori) Alessandra Giordani agiordani@disi.unitn.it Lunedì 10 maggio 2010 http://disi.unitn.it/~agiordani/ I tipi di dati scalari I tipi aritmetici, i tipi enumerativi

Dettagli

Esercizi. Stringhe. Stringhe Ricerca binaria

Esercizi. Stringhe. Stringhe Ricerca binaria Politecnico di Milano Esercizi Stringhe Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaa[10], stringab[10]; strcpy(stringaa, stringab); Copia if (strcmp(stringaa, stringab)

Dettagli

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012 Stringhe in C Alessandra Giordani agiordani@disi.unitn.it Lunedì 23 aprile 2012 http://disi.unitn.it/~agiordani/ Stringhe Sono particolari array: Ogni elemento del vettore è di tipo char La stringa è terminata

Dettagli

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

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p

Dettagli

Verso i puntatori: Cosa è una variabile?

Verso i puntatori: Cosa è una variabile? Verso i puntatori: Cosa è una variabile? Quando si dichiara una variabile, ad es. int a; si rende noto il nome e il tipo della variabile. Il compilatore alloca l opportuno numero di byte di memoria per

Dettagli

Dati aggregati. Violetta Lonati

Dati aggregati. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica - in breve: Definizione di tipi Array Stringhe Strutture

Dettagli

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

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C - sezione dichiarativa: costanti e variabili Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente

Dettagli

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercizio 1: funzione con valore di ritorno di tipo puntatore Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio

Dettagli

Caratteri e stringhe

Caratteri e stringhe Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un

Dettagli

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili Linguaggio C Argomenti Avanzati! I puntatori! Stack! Visibilità delle Variabili 2 ! Il C consente di associare ai tipi di dati nomi definiti dal programmatore, mediante la parola chiave typedef! Dal punto

Dettagli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli ELEMENTI DI INFORMATICA L-B Ing. Claudia Chiusoli Materiale Lucidi delle lezioni Date degli appelli Testi di esami precedenti Informazioni e contatti http://www.lia.deis.unibo.it/courses/ Programma del

Dettagli

Uso avanzato dei puntatori Allocazione dinamica della memoria

Uso avanzato dei puntatori Allocazione dinamica della memoria Uso avanzato dei puntatori Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica

Dettagli

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

Linguaggio C - Array. Array: tipo nome_array[num_elementi] Linguaggio C - Array Array: Gli array o vettori sono delle strutture dati in grado di contenere un insieme di valori tutti dello stesso tipo. Un array lo possiamo immaginare come un contenitore suddiviso

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 4 - Puntatori, vettori e stringhe Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti

Dettagli

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

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per

Dettagli

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

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di 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

Dettagli

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

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Raffaele Nicolussi FUB - Fondazione Ugo Bordoni Via del Policlinico, 147 00161 Roma I puntatori Variabili e parametri Parametri formali

Dettagli

Puntatori. Fondamenti di Programmazione

Puntatori. Fondamenti di Programmazione Puntatori Fondamenti di Programmazione Funzioni utili stdio.h c = getchar(); restituisce un carattere letto da tastiera. Equivale a: scanf( %c, &c); putchar(c); scrive un carattere sullo schermo. Equivale

Dettagli

4 GLI ARRAY E LE STRINGHE

4 GLI ARRAY E LE STRINGHE 13 4 GLI ARRAY E LE STRINGHE 4.1 Gli array monodimensionali Un array è un insieme di variabili dello stesso tipo, cui si fa riferimento mediante uno stesso nome. L accesso ad un determinato elemento si

Dettagli

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0 STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1

Dettagli

Il linguaggio C. Notate che...

Il linguaggio C. Notate che... Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione

Dettagli

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a Puntatori in C Puntatori Variabili tradizionali indirizzo int a = 5; A00E... Proprietà della variabile a: nome: a A010 A012 5 tipo: int A014 valore: 5 indirizzo: A010 Finora abbiamo usato solo le prime

Dettagli

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII. Tipi di dati fondamentali Tipi di dati fondamentali Linguaggi di Programmazione I Ferdinando Cicalese caratteri: char signed char unsigned char interi short int long interi unsigned short unsigned unsigned

Dettagli

Strutture Dati Dinamiche

Strutture Dati Dinamiche Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti

Dettagli

Lezione 8 Struct e qsort

Lezione 8 Struct e qsort Lezione 8 Struct e qsort Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Esercizio 3 QuickSort strambo Modificare il Quicksort

Dettagli

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm

Dettagli

Stringhe e allocazione dinamica della memoria

Stringhe e allocazione dinamica della memoria Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per

Dettagli

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica Array in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2006/2007 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 1 / 25 Cosa vedremo

Dettagli

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

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono

Dettagli

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

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella Corso di Informatica Tipi strutturati: Stringhe Anno Accademico 2010/2011 Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri quali

Dettagli

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

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi gianluca.rossi@uniroma2.it Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)

Dettagli

Esercizi Programmazione I

Esercizi Programmazione I Esercizi Programmazione I 9 Novembre 201 Esercizio 1 Valutare e dare il tipo delle seguenti espressioni condizionali. 1 char a= a, b= b ; // a ha v a l o r e decimale 97 2 i n t i= 1, j= 2 ; 3 double x=

Dettagli

Stringhe di caratteri

Stringhe di caratteri Linguaggio C Stringhe di caratteri 1 Variabili e costanti stringa! Una stringa letterale è una sequenza di caratteri racchiusa tra doppi apici! Può essere scritta su più righe utilizzando il backslash

Dettagli

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

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C Tipi di dati strutturati e Linguaggio C Record o strutture Il costruttore struct in C Dati strutturati Record Un record o struttura è una struttura dati ottenuta aggregando elementi di tipo diverso che

Dettagli

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

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi). Operatori di incremento e decremento: ++ e -- ++ e -- sono operatori unari con la stessa priorità del meno unario e associatività da destra a sinistra. Si possono applicare solo a variabili (di tipi interi,

Dettagli

Costanti e Variabili

Costanti e Variabili Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli

Dettagli

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari Input/Output Lettura e scrittura Caratteri e Stringhe: Terminale e file Input/output console file caratteri stringhe formattato ascii binari Linguaggio ANSI C Input/Output - 1 La libreria standard del

Dettagli

Puntatori in C Lucidi della Pof.ssa Pazienza

Puntatori in C Lucidi della Pof.ssa Pazienza Puntatori in C Lucidi della Pof.ssa Pazienza http://www.uniroma2.it/didattica/foi2/ Puntatori L operatore di indirizzo & Indirizzi, puntatori Aritmetica dei puntatori L operatore di dereferenziazione *

Dettagli

Introduzione ai puntatori in C Definizione

Introduzione ai puntatori in C Definizione Introduzione ai puntatori in C Definizione Un puntatore è una variabile che contiene l indirizzo di un altra variabile Tramite i puntatori si può quindi accedere a un oggetto indirettamente (si usa il

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Fondamenti di Informatica Prima prova intermedia - 11 Novembre 2009 Si risolvano i seguenti esercizi. Il compitino prevede un punteggio massimo di 15/14-esimi, cui andranno sommati i punti ottenuti nel

Dettagli

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h> Ricerca di un elemento in vettore Scrivere un programma in linguaggio C che riceve in ingresso una sequenza di N numeri interi. I numeri sono memorizzati in un vettore. Il valore N è inserito dall utente,

Dettagli

Introduzione al C. Unità 8 Stringhe

Introduzione al C. Unità 8 Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 8 Stringhe D. Bloisi, A. Pennisi, S. Peluso, S. Salza Sommario Unità 8 Array di

Dettagli

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout

Dettagli

Laboratorio di Informatica Ingegneria Clinica Lezione 12/12/2011. Prof. Raffaele Nicolussi

Laboratorio di Informatica Ingegneria Clinica Lezione 12/12/2011. Prof. Raffaele Nicolussi Laboratorio di Informatica Ingegneria Clinica Lezione 12/12/2011 Prof. Raffaele Nicolussi FUB - Fondazione Ugo Bordoni Via del Policlinico, 147-00161 Roma Docente Raffaele Nicolussi rnicolussi@fub.it Lezioni

Dettagli

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria. Puntatori I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria. NOTA: quando un programma viene mandato in esecuzione, ad esso viene assegnata un area di memoria di lavoro

Dettagli

Introduzione al linguaggio C

Introduzione al linguaggio C Introduzione al linguaggio C Abbiamo già visto come un programma non sia altro che un algoritmo codificato in un linguaggio di programmazione. Problema: quale linguaggio scegliere per la codifica di un

Dettagli

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

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. Linguaggio C Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. 1 Funzioni Generalizzazione del concetto di funzione algebrica: legge che associa a valori delle variabili

Dettagli

Struttura dei programmi C

Struttura dei programmi C Programmi C Struttura dei Programmi C Dichiarazione delle variabili Operazioni di Ingresso/Uscita Fondamenti di Informatica 1 Struttura dei programmi C Un programma C deve contenere, nell'ordine: una parte

Dettagli

Programmazione in Java (I modulo)

Programmazione in Java (I modulo) Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto

Dettagli

Stringhe. Concetti chiave

Stringhe. Concetti chiave Concetti chiave Stringhe Variabili strutturate: array di caratteri Carattere di fine stringa Copiare, concatenare, confrontare e convertire stringhe Funzioni standard strcpy, strcat, strcat, strcmp, atoi,

Dettagli

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE Input/output da file Il linguaggio C non contiene istruzioni di I/O, in quanto tali operazioni vengono eseguite tramite funzioni di libreria standard. Questo approccio rende estremamente flessibile e potente

Dettagli

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati Introduzione al C Ancora puntatori, allocazione dinamica, e tipi derivati 1 Array di caratteri Non esiste in C un tipo di dato predefinito per le stringhe Le stringhe sono rappresentate come array di caratteri.

Dettagli

Strategie di programmazione

Strategie di programmazione Funzioni Funzioni in C Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Funzioni in C Strategie

Dettagli

STRINGHE: ARRAY DI CARATTERI! a p e \0

STRINGHE: ARRAY DI CARATTERI! a p e \0 STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più

Dettagli

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009 Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria per l Ambiente ed il Territorio Corso di Laurea Specialistica in Ingegneria Civile - Strutture FONDAMENTI DI INFORMATICA 2

Dettagli

C: panoramica - I parte

C: panoramica - I parte C: panoramica - I parte Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010

Dettagli

Input/Output di numeri

Input/Output di numeri Input/Output di numeri I/O di numeri Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all inizio del sorgente la direttiva #include

Dettagli

Linguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Linguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin Linguaggio C Tipi predefiniti e operatori Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 RICHIAMI char 8 bit Valori interi

Dettagli

Laboratorio di informatica Ingegneria meccanica

Laboratorio di informatica Ingegneria meccanica Interi in complemento a 2 () Laboratorio di informatica Ingegneria meccanica Lezione 5 29 ottobre 2007 Con N bit sono rappresentabili tutti gli interi nell'intervallo [-2^(N-), 2^(N-)-] Esempio: 6 bit,

Dettagli

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

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione Corso di Fondamenti di Programmazione canale E-O Tiziana Calamoneri Ricorsione DD Cap. 5, pp. 160-184 KP Cap. 5, pp. 199-208 Un esempio Problema: prendere in input un intero e calcolarne il fattoriale

Dettagli

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

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria. POINTERS Una variabile pointer è una variabile che ha come valore un indirizzo di memoria. Es. Sia y una variabile intera di valore e sia yptr una variabile pointer avente come valore l indirizzo di y.

Dettagli

Gli Operatori. Linguaggio C. Gli Operatori. Esempi sull uso dell Operatore di Assegnamento. L Operatore di Assegnamento

Gli Operatori. Linguaggio C. Gli Operatori. Esempi sull uso dell Operatore di Assegnamento. L Operatore di Assegnamento Linguaggio C Gli Operatori Gli Operatori Gli operatori sono simboli (sia singoli caratteri che loro combinazioni) specificano come devono essere manipolati gli operandi dell espressione Operatori aritmetici

Dettagli

I puntatori (richiamo)

I puntatori (richiamo) I puntatori (richiamo) Puntatori Un puntatore è una variabile che assume come valore un indirizzo in memoria L uso dei puntatori permette di: mantenere riferimenti ad altre variabili (è un punto di accesso

Dettagli

Elementi di Informatica A. A. 2016/2017

Elementi di Informatica A. A. 2016/2017 Elementi di Informatica A. A. 2016/2017 Ing. Nicola Amatucci Università degli studi di Napoli Federico II Scuola Politecnica e Delle Scienze di Base nicola.amatucci@unina.it Programmazione C++ Parte 2

Dettagli

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C Sommario Introduzione... xv Organizzazione del volume... xv Argomenti...xvi Domande...xvi Verifiche...xvi Domande e risposte...xvi Esercizi...xvi Non è richiesta alcuna precedente esperienza di programmazione...

Dettagli

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

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata Puntatori int i = 10; int * pi = &i; pi i = 10 116 int * pi = pi contiene un informazione che mi permette di accedere ( puntare ) ad una variabile intera Un puntatore contiene un numero che indica la locazione

Dettagli

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

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Dettagli

Stringhe e tipi di dati strutturati

Stringhe e tipi di dati strutturati Stringhe e tipi di dati strutturati Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 21 Marzo 2013 Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore!

Dettagli

$QDOLVLGHOSURJUDPPDTXDGUDWR

$QDOLVLGHOSURJUDPPDTXDGUDWR $QDOLVLGHOSURJUDPPDTXDGUDWR /* */ calcolare l area del quadrato #include main(){ int lato, area; printf("lato "); scanf("%d", &lato); if(lato < 0) printf("errore nei dati \n"); else { area =

Dettagli

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

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il

Dettagli

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica Corso di Fondamenti di Informatica Puntatori e Allocazione Dinamica I puntatori (Richiamo) Il C++ prevede puntatori a dati di qualsiasi natura, semplici o strutturati e puntatori a funzione. In particolare

Dettagli

Aritmetica dei puntatori

Aritmetica dei puntatori Aritmetica dei puntatori Sui puntatori si possono anche effettuare operazioni aritmetiche, con opportune limitazioni somma o sottrazione di un intero sottrazione di un puntatore da un altro Somma e sottrazione

Dettagli

Linguaggio C: PUNTATORI

Linguaggio C: PUNTATORI Linguaggio C: PUNTATORI I puntatori sono una delle più importanti caratteristiche del linguaggio C. Permettono di lavorare a basso livello, mantenendo flessibilità e praticità. Il C utilizza molto i puntatori

Dettagli

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r

s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; 1 Libreria sulle stringhe La libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra

Dettagli

Linguaggio C: Espressioni

Linguaggio C: Espressioni Linguaggio C: Espressioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ 2 Ringraziamenti prof. Mirko Viroli, Università

Dettagli

Array k-dimensionali

Array k-dimensionali Informatica B a.a 2005/06 (Meccanici 4 squadra) Scaglione: da PO a ZZZZ PhD. Ing. Michele Folgheraiter Array k-dimensionali In C è possibile definire array con più dimensioni (ANSI C massimo k=12), per

Dettagli

Esercitazione 12. Esercizi di Ricapitolazione

Esercitazione 12. Esercizi di Ricapitolazione Esercitazione 12 Esercizi di Ricapitolazione Esercizio Scrivere un programma che, dato un numero intero positivo, stampa la sua rappresentazione binaria. ALGORITMO Scriviamo una procedura stampa_bin che,

Dettagli

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1 char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; 1 Libreria sulle stringhe La libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra

Dettagli

Esercitazione 6. Array

Esercitazione 6. Array Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione

Dettagli

Esercizi di programmazione in linguaggio C English Dictionary

Esercizi di programmazione in linguaggio C English Dictionary Esercizi di programmazione in linguaggio C English Dictionary Il file di testo wordnet.txt contiene un certo numero di parole (word) e il corrispondente significato (meaning) secondo il seguente formato:

Dettagli

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica.

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica. FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine Le trappole del linguaggio C 2001 Pier Luca Montessoro - Davide Pierattoni

Dettagli

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio: Variabili locali Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. void leggivettore(int v[], int dim) int i; /* i E UNA VARIABILE LOCALE */ for (i

Dettagli

Lezione 8. Sottoprogrammi

Lezione 8. Sottoprogrammi Lezione 8 Il linguaggio C: Sottoprogrammi e Funzioni I puntatori Input/Output su file Sottoprogrammi Per risolvere un problema si può scomporlo in problemi più semplici e comporre le loro soluzioni in

Dettagli

Esercizi C su array e matrici

Esercizi C su array e matrici Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4]

Dettagli

Librerie Stringhe. Librerie e stringhe. Lezione 9. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A. 2015/2016

Librerie Stringhe. Librerie e stringhe. Lezione 9. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A. 2015/2016 e stringhe Lezione 9 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2015/2016 Calendario delle lezioni Lezione 1 (7 e 9/10/2015) - Introduzione all ambiente Linux Lez. 2 (14 e 16/10/2015)

Dettagli

Linguaggio C: introduzione

Linguaggio C: introduzione Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: introduzione La presente dispensa e da utilizzarsi

Dettagli

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche Fondamenti di Informatica T-1 modulo 2 Laboratorio 04: stringhe 1 Stringhe In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche terminatore

Dettagli

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };

string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ }; char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; Libreria sulle stringhe libreria i string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra (strcpy

Dettagli

Gli array, le stringhe e le strutture

Gli array, le stringhe e le strutture INFORMATICA B Ingegneria Elettrica Gli array, le stringhe e le strutture Limiti dei tipi di dato semplici Utilizzare solo i tipi di dato semplici può essere limitante e rendere il programma poco flessibile

Dettagli

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

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali MASTER Information Technology Excellence Road (I.T.E.R.) Array Maurizio Palesi Salvatore Serrano Master ITER Informatica di Base Maurizio Palesi, Salvatore Serrano 1 Tipi di dato stutturati In C si possono

Dettagli

Linguaggio C. Tipi predefiniti. Università degli Studi di Brescia. Prof. Massimiliano Giacomin. Prof. M. Giacomin

Linguaggio C. Tipi predefiniti. Università degli Studi di Brescia. Prof. Massimiliano Giacomin. Prof. M. Giacomin Linguaggio C Tipi predefiniti Università degli Studi di Brescia Prof. Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Il concetto di tipo (reprise) Nome che indica

Dettagli

Informatica 1. Prova di recupero 21 Settembre 2001

Informatica 1. Prova di recupero 21 Settembre 2001 Informatica 1 Prova di recupero 21 Settembre 2001 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo

Dettagli