I puntatori e l allocazione dinamica di memoria

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "I puntatori e l allocazione dinamica di memoria"

Transcript

1 I puntatori e l allocazione dinamica di memoria

2 Allocazione dinamica di memoria L allocazione delle variabili Allocazione e rilascio espliciti di memoria Le funzioni malloc e free 2

3 Allocazione dinamica di memoria

4 Allocare = collocare in memoria Allocare una variabile significa associare alla variabile una porzione di memoria (in cui collocare i dati) L allocazione avviene in modo Permanente, per le variabili globali (definite, nel file C, al di fuori da funzioni) Temporaneo, per le variabili locali e I parametri formali (definiti all interno delle funzioni). Una variabile locale viene Allocata alla chiamata della funzione De-allocata all uscita dalla funzione 4

5 Programma in esecuzione e memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; RAM (1 GB) 5

6 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; RAM (1 GB) 6

7 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) RAM (1 GB) 7

8 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) RAM (1 GB) 8

9 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) Variabili globali RAM (1 GB) 9

10 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) Variabili globali RAM (1 GB) 10

11 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 11

12 Programma in memoria #define MAX 100 struct studente ; In memoria (virtualmente) struct durante studente tutta l esecuzione dati[maxn]; int main(void) del programma char nomefile[maxriga]; FILE *fp; void ordinastudenti( struct studente el[], int n) int i, j, max; ; Codice (istruzioni) Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 12

13 Programma in memoria #define MAX 100 struct studente ; struct studente dati[maxn]; int main(void) char nomefile[maxriga]; FILE *fp; In memoria (virtualmente) durante l esecuzione della void ordinastudenti( struct studente el[], int n) int i, j, max; ; relativa funzione: allocate e de-allocate automaticamente Codice (istruzioni) Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 13

14 Programma in memoria #define MAX 100 struct studente ; struct La quantità studente di memoria dati[maxn]; int allocare main(void) è determinata dal programmatore: char nomefile[maxriga]; - Istruzioni FILE *fp; void - Dimensione ordinastudenti( dei vettori struct studente el[], int n) int i, j, max; ; - Tipo e numero delle variabili Codice (istruzioni) Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 14

15 Allocazione dinamica di memoria

16 Cosa manca? Osservazione: manca un modo per poter decidere, durante l esecuzione di un programma Creazione un dato Dimensionamento di un vettore Soluzione: istruzioni per allocare e de-allocare dati (memoria) in modo esplicito In funzione di dati forniti da chi esegue il programma Allocazioni e de-allocazioni sono (ovviamente) previste dall autore del programma 16

17 Come allocare in modo esplicito? Il C fornisce un meccanismo di allocazione e deallocazione esplicito, basato su puntatori Allocare = chiedere memoria (al Sistema Operativo) e ottenerla (se c è abbastanza memoria disponibile) De-allocare = rilasciare (restituire) la memoria precedentemente ottenuta (in modo che il S.O. possa riutilizzarla) Alla memoria allocata si accede tramite puntatore, cioè indirizzo+tipo L allocazione esplicita viene detta dinamica, per il modo (non statico) di gestione 17

18 Programma in memoria int main(void) int *p = malloc(); /* p usato come vettore */ free(p); p Codice (istruzioni) Variabili globali Variabili locali e parametri (formali) Memoria dinamica RAM (1 GB) 18

19 Programma in memoria int main(void) int *p = malloc(); /* p usato come vettore */ free(p); p Codice (istruzioni) Allocazione Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 19

20 Programma in memoria int main(void) int *p = malloc(); /* p usato come vettore */ free(p); p Codice (istruzioni) Rilascio (de-allocazione) Variabili globali Variabili locali e parametri (formali) RAM (1 GB) 20

21 Allocazione dinamica di memoria

22 Allocazione mediante malloc (1/3) La memoria in C viene allocata dinamicamente tramite la funzione malloc (e altre, quali calloc, realloc, ) La funzione di libreria malloc ha un prototipo simile al seguente void* malloc (int dimensione); Dimensione è il numero (intero) di byte da allocare Il valore di ritorno è un puntatore Indirizzo iniziale della memoria allocata (NULL se non c è memoria disponibile) tipo void *, tale da poter essere assegnato a qualunque tipo di puntatore 22

23 Allocazione mediante malloc (2/3) Per usarla occorre includere <stdlib.h> Per utilizzare correttamente malloc occorre richiedere una quantità di memoria compatibile col puntatore cui sarà assegnato il risultato (cioè la variabile generata dinamicamente) 23

24 Allocazione mediante malloc (3/3) Solitamente si ricorre all operatore sizeof per determinare la dimensione (in byte) di un dato. Per generare una variabile dinamica di tipo <tipo>, da assegnare a p (<tipo> *p), sono possibili 2 schemi Per ottenere una variabile scalare o struct p = malloc (sizeof (<tipo>)); Per ottenere un vettore di n elementi p = malloc (n*sizeof (<tipo>)); 24

25 Esempio: variabile dinamica singola struct studente char cognome[max], nome[max]; int matricola; struct studente *link; ; struct studente *creastud ( char *cognome, char *nome, int matricola ) struct studente *s; s = malloc (sizeof (struct studente)); if (s==null) return NULL; strcpy(s->cognome,cognome); strcpy(s->nome,nome); s->matricola = matricola; s->link = NULL; return s; ; 25

26 Esempio: variabile dinamica singola struct studente char cognome[max], nome[max]; int matricola; struct studente *link; ; struct studente *creastud ( char *cognome, char *nome, int matricola ) struct studente *s; s = malloc (sizeof (struct studente)); if (s==null) return NULL; strcpy(s->cognome,cognome); strcpy(s->nome,nome); Si potrebbe scrivere anche: s->matricola = matricola; s->link = NULL; return s = s; malloc (sizeof *s); ; 26

27 Esempio: vettore dinamico int *punt; int n; scanf ( %d, &n); punt = malloc(n*sizeof(int)); if (punt == NULL) printf ( Errore di allocazione\n ); else 27

28 Esempio: vettore dinamico int *punt; int n; scanf ( %d, &n); punt = malloc(n*sizeof(int)); if (punt == NULL) printf ( Errore di allocazione\n ); punt è un vettore dinamico di n interi else 28

29 De-allocazione mediante free (1/2) La memoria allocata dinamicamente viene restituita tramite la funzione free La funzione di libreria free ha un prototipo simile al seguente void free (void* p); p punta alla memoria (precedentemente allocata) da liberare La funzione non ritorna risultato 29

30 De-allocazione mediante free (2/2) Per usarla occorre includere <stdlib.h> La funzione free viene di solito chiamata quando è terminato il lavoro sulla variabile dinamica, affinchè la memoria possa essere riutilizzata 30

31 Esempio: vettore dinamico int *punt; int i, n; scanf ( %d, &n); punt = malloc(n*sizeof(int)); for (i=0; i<n; i++) punt[i] = ; free(punt); 31

32 I puntatori e l allocazione dinamica di memoria

33 Strutture dati dinamiche Vettori dinamici Matrici dinamiche Liste 2

34 Strutture dati dinamiche

35 Vettore dinamico Si dice vettore dinamico un vettore la cui dimensione è nota solo in fase di esecuzione del programma Soluzione Puntatore, sfruttando la dualità puntatore-vettore Allocazione mediante malloc Rilascio mediante free Per il resto, non cambia nulla rispetto al vettore sovradimensionato in modo statico 4

36 Esempio Acquisire da tastiera una serie di numeri reali, e memorizzarli in un vettore Stamparli successivamente in ordine inverso a quello di acquisizione La quantità di numeri non è nota al programmatore, né sovradimensionabile, ma è acquisita come primo dato da tastiera 5

37 Esempio Acquisire da tastiera una serie di numeri reali, e memorizzarli in un vettore Stamparli successivamente in ordine inverso a quello di acquisizione La quantità di numeri non è nota al programmatore, né sovradimensionabile, ma è acquisita come primo dato da tastiera Attenzione! Per creare un vettore dinamico occorre conoscerne la dimensione prima di iniziare ad utilizzarlo. Se il numero di dati (ignoto) fosse segnalato da un terminatore (es. input del valore 0), non si potrebbe usare un vettore dinamico 6

38 Soluzione (1/2) float *v; int N, i; InvertiOrdine.c printf( Quanti elementi vuoi inserire? "); scanf( %d,&n); /* alloca vettore */ v = malloc (N*(sizeof (float))); if (v==null) exit; 7

39 Soluzione (2/2) /* input */ printf("inserisci %d elementi\n, N); InvertiOrdine.c for (i=0; i<n; i++) printf("elemento %d: ", i+1) ; scanf("%f", &v[i]) ; /* output */ printf( Dati in ordine inverso\n ); for (i=n-1; i>=0; i--) printf("elemento %d: %f\n", i+1, v[i]); /* libera memoria dinamica */ free(v); 8

40 Strutture dati dinamiche

41 Matrice dinamica (1/2) Si dice matrice dinamica una matrice la cui dimensione è nota solo in fase di esecuzione del programma Soluzione 1 (meno flessibile): vettore dinamico e organizzazione manuale di righe e colonne su vettore 10

42 Matrice dinamica (2/2) Soluzione 2: vettore dinamico di puntatori a righe (o dualmente vettore di puntatori a colonne) Puntatore, sfruttando la dualità puntatore-vettore Allocazione dinamica del vettore di puntatori Iterazione di allocazione delle righe Per il resto, non cambia nulla rispetto alla matrice sovradimensionata in modo statico 11

43 Esempio Acquisire da tastiera una matrice di numeri reali, e memorizzarli in un vettore Stampare successivamente la matrice trasposta (righe e colonne scambiate di ruolo) Le dimensioni della matrice (righe e colonne) non sono note al programmatore, né sovradimensionabili, ma sono acquisite come primo dato da tastiera 12

44 Soluzione con vettore dinamico (1/2) float *v; int nr,nc,i,j; printf( Dimensioni (NR NC): "); scanf( %d%d, &nr, &nc); v = malloc (nr*nc*(sizeof (float))); if (v==null) exit; /* input */ for (i=0; i<nr; i++) printf("inserisci riga %d\n, i); for (j=0; j<nc; j++) scanf("%f", &v[nc*i+j]); matricetraspostavettdyn.c 13

45 Soluzione con vettore dinamico (2/2) /* output */ printf( Matrice trasposta\n ); for (j=0; j<nc; j++) for (i=0; i<nr; i++) printf("%6.2f, v[nc*i+j]); printf( \n ); /* libera memoria dinamica */ free(v); matricetraspostavettdyn.c 14

46 Soluzione con matrice dinamica (1/3) float **v; int nr,nc,i,j; matricetraspostamatdyn.c printf( Dimensioni (NR NC): "); scanf( %d%d, &nr, &nc); /* allocazione vettore di puntatori */ v = malloc (nr*sizeof (float *)); if (v==null) exit; 15

47 Soluzione con matrice dinamica (2/3) /* allocazione righe e input */ for (i=0; i<nr; i++) printf("inserisci riga %d\n, i); v[i] = malloc (nc*sizeof (float)); if (v[i]==null) exit; for (j=0; j<nc; j++) scanf("%f", &(v[i][j])); matricetraspostamatdyn.c 16

48 Soluzione con matrice dinamica (3/3) /* output */ printf( Matrice trasposta\n ); for (j=0; j<nc; j++) for (i=0; i<nr; i++) printf("%6.2f, v[i][j]); printf( \n ); /* libera memoria dinamica */ free(v); matricetraspostamatdyn.c 17

49 Strutture dati dinamiche

50 Lista concatenata (1/2) Una lista è una struttura dati dinamica concatenata in cui Ogni elemento conosce il successivo Esiste un elemento iniziale (testa) e uno finale (coda) della lista Si possono fare inserimenti, ricerche, estrazioni ed altre operazioni 19

51 Lista concatenata (2/2) Le liste non sono fornite dal linguaggio C come tipo predefinito, ma possono essere realizzate mediante strutture ricorsive La trattazione delle liste è al di la degli obiettivi di questo corso. Vediamo un esempio semplice 20

52 Esercizio: problema di Giuseppe Flavio N oggetti sono disposti in cerchio. Per semplicità gli oggetti sono numerati da 1 a N (N viene acquisito da tastiera) Si elimina un oggetto ogni M (in senso antiorario) e si richiude il cerchio Quale oggetto rimane per ultimo? Con quale ordine si eliminano gli oggetti? 21

53 Giuseppe Flavio dinamico: soluzione (1/2) struct oggetto int numero; GiuseppeFlavioDyn.c struct oggetto *succ; ; int main(void) int i, N, M; struct oggetto *p, *x; /* genera primo oggetto */ p=malloc(sizeof *p); p->numero=1; p->succ=p; x=p; /* x punta al primo oggetto */ printf( N = ); scanf( %d, &N); printf( M = ); scanf( %d, &M); 22

54 Giuseppe Flavio dinamico: soluzione (2/2) for (i=2; i<=n; i++) x = (x->succ = malloc(sizeof *x)); x->numero = i; x->succ = p; p=x; /* p punta all ultimo */ while (p!= p->succ) for (i=1; i<m; i++) p = p->succ; printf( Eliminato n.%d\n, p->succ->numero); x = p->succ; p->succ = p->succ->succ; free(x); printf( Ultimo n.%d\n, p->numero); GiuseppeFlavioDyn.c 23

55 I puntatori e l allocazione dinamica di memoria

56 Esercizi proposti Esercizio Mini-Editor 2

57 Esercizi proposti

58 Esercizio Mini-Editor Sia dato un file testo, contenente un certo numero (non noto) di righe, aventi ognuna non più di 80 caratteri (a-capo incluso) Si realizzi in C un programma che, acquisito da tastiera il nome del file, lo legga, immagazzinandone il contenuto in una opportuna struttura dati in memoria, quindi effettui mediante presentazione a menu (con comandi ricevuto da tastiera) una tra le operazioni seguenti 4

59 Esercizio Mini-Editor : menu Ricerca di una stringa nel testo (contando quante volte compare) Ricerca (stringa x) e sostituzione (con stringa y): ogni occorrenza di x nel testo viene sostituita da y Visualizza (da i a j): visualizza le righe dalla i- esima alla j-esima (incluse) Salva: salva il testo su un file (il cui nome va acquisito da tastiera Esci: fine del programma 5

60 Struttura dati (1/2) Vettore dinamico di stringhe (o matrice dinamica di caratteri) È necessario in quanto occorre immagazzinare tutti i dati, sui cui fare più elaborazioni. Sarebbe possibile operare sulle singole righe, secondo lo schema (input manipolazione output), solo riscrivendo, per ogni comando, il risultato su un file (temporaneo) intermedio La dimensione del vettore non è nota, ma può essere calcolata mediante una lettura preliminare del file 6

61 Struttura dati (2/2) Per ogni riga del file si alloca dinamicamente una stringa La riga viene acquisita in un vettore (sovradimensionato) di lunghezza fissa Successivamente si alloca il vettore dinamico e vi si copia la riga di caratteri La ricerca/sostituzione può richiedere una nuova stringa (di lunghezza diversa) 7

62 Algoritmo Input dei dati (tutti) da file a vettore Iterazione di esecuzione di comandi menu = selezione dei possibili comandi, riconosciuti dal primo carattere (selezione a switch) formato r <stringa>: ricerca <stringa> s <x> <y>: sostituisci <x> con <y> f <i> <j>: salva su file <f> da riga <i> a riga <j> (se <f> è stdout visualizza su video) u: uscita dal programma (fine) Per semplicità si omettono controlli di errore su apertura file e fallita allocazione di memoria 8

63 Mini-Editor (1/7) const int MAXRIGA=80; char **testo; int nrighe; int leggipagina(char *nomefile); int menu(void); void cerca (char *s); void sostituisci (char *s0, char *s1); void stampa (char *nomefile, int i, int j); int main(void) char nomefile[maxriga]; printf( nome file in ingresso: ); scanf( %s, nomefile); leggipagina(nomefile); while (menu()!=0); minieditor.c 9

64 Mini-Editor (1/7) const int MAXRIGA=80; char **testo; int nrighe; int leggipagina(char *nomefile); int menu(void); void cerca (char *s); Variabili globali, visibili a tutte le funzioni void sostituisci (char *s0, char *s1); void stampa (char *nomefile, int i, int j); int main(void) char nomefile[maxriga]; printf( nome file in ingresso: ); scanf( %s, nomefile); leggipagina(nomefile); while (menu()!=0); minieditor.c 10

65 Mini-Editor (2/7) int leggipagina(char *nomefile) FILE *fp; minieditor.c char s[maxriga+1]; /* +1 per \0 */ int i; fp = fopen(nomefile, r ); /* iterazione di conteggio righe */ for (i=0; fgets(s,maxriga,fp)!=null;i++); nrighe = i; /* chiude e riapre file */ fclose(fp); fp = fopen(nomefile, r ); /* alloca vettore dinamico */ testo = malloc(nrighe*sizeof(char *)); 11

66 Mini-Editor (3/7) int leggipagina(char *nomefile) FILE *fp; minieditor.c char s[maxriga+1]; /* +1 per \0 */ int i; /* leggi righe */ for (i=0; i<nrighe; i++) fgets(s,maxriga,fp); if (s[strlen(s)-1]== \n ) s[strlen(s)-1] = \0 ; testo[i]=malloc((strlen(s)+1)*sizeof(char)); strcpy(testo[i],s); 12

67 Mini-Editor (3/7) int leggipagina(char *nomefile) FILE *fp; char s[maxriga+1]; /* +1 per \0 */ int i; /* leggi righe */ for (i=0; i<nrighe; i++) fgets(s,maxriga,fp); if (s[strlen(s)-1]== \n ) s[strlen(s)-1] = \0 ; Lettura riga su stringa locale (la stessa per tutte le righe) minieditor.c testo[i]=malloc((strlen(s)+1)*sizeof(char)); strcpy(testo[i],s); 13

68 Mini-Editor (3/7) int leggipagina(char *nomefile) FILE *fp; char s[maxriga+1]; /* +1 per \0 */ int i; /* leggi righe */ Elimina eventuale a-capo for (i=0; i<nrighe; i++) fgets(s,maxriga,fp); if (s[strlen(s)-1]== \n ) s[strlen(s)-1] = \0 ; testo[i]=malloc((strlen(s)+1)*sizeof(char)); strcpy(testo[i],s); minieditor.c 14

69 Mini-Editor (3/7) int leggipagina(char *nomefile) FILE *fp; char s[maxriga+1]; /* +1 per \0 */ int i; Alloca i-esima riga (della /* leggi righe */ lunghezza corretta) e copia for (i=0; i<nrighe; contenuto i++) fgets(s,maxriga,fp); if (s[strlen(s)-1]== \n ) s[strlen(s)-1] = \0 ; testo[i]=malloc((strlen(s)+1)*sizeof(char)); strcpy(testo[i],s); minieditor.c 15

70 Mini-Editor (4/7) int menu (void) char com[maxriga], s0[maxriga], s1[maxriga]; int i, j; printf( comando (r/s/f/u): ); gets(com); switch(com[0]) case r :sscanf(com, r %s,s0); cerca(s0); break; case s :sscanf(com, s %s%s,s0,s1); sostituisci(s0,s1); break; case f :sscanf(com, f %s%d%d,s0,&i,&j); stampa(s0,i,j); break; case u : return 0; return 1; minieditor.c 16

71 Mini-Editor (5/7) void cerca (char *s) int i, conta; minieditor.c char *riga; for (i=0; i<nrighe; i++) riga = testo[i]; conta=0; while ((riga=strstr(riga,s))!=null) conta++; riga++; if (conta>0) printf( Trovato %d volta/e in riga %d\n, conta, i); 17

72 Mini-Editor (5/7) void Evita cerca stringa (char appena *s) trovata, incrementando riga al carattere successivo. Si accettano int i, conta; sovrapposizioni. char *riga; Es. for aa (i=0; viene i<nrighe; trovato 2 volte i++) in xaaay riga = testo[i]; conta=0; while ((riga=strstr(riga,s))!=null) conta++; riga++; if (conta>0) printf( Trovato %d volta/e in riga %d\n, conta, i); minieditor.c 18

73 Mini-Editor (6/7) void sostituisci (char *s0, char *s1) int i,l,l0=strlen(s0),l1=strlen(s1); char *riga, *nuova; for (i=0; i<nrighe; i++) riga = testo[i]; while ((riga=strstr(riga,s0))!=null) l = strlen(testo[i])+l1-l0; nuova = malloc((l+1)*sizeof(char)); strncpy(nuova,testo[i],riga-testo[i]); nuova[riga-testo[i]]= \0 ; strcat(nuova,s1); strcat(nuova,riga+l0); free(testo[i]); riga=testo[i]=nuova; minieditor.c 19

74 Mini-Editor (6/7) void sostituisci (char *s0, char *s1) int i,l,l0=strlen(s0),l1=strlen(s1); char *riga, *nuova; for (i=0; i<nrighe; i++) riga = testo[i]; while ((riga=strstr(riga,s0))!=null) l = strlen(testo[i])+l1-l0; nuova = malloc((l+1)*sizeof(char)); strncpy(nuova,testo[i],riga-testo[i]); nuova[riga-testo[i]]= \0 ; strcat(nuova,s1); strcat(nuova,riga+l0); free(testo[i]); riga=testo[i]=nuova; Puntatore a stringa iniziale o a sottostringa trovata in essa minieditor.c 20

75 Mini-Editor (6/7) void sostituisci (char *s0, char *s1) int i,l,l0=strlen(s0),l1=strlen(s1); char *riga, *nuova; for (i=0; i<nrighe; i++) riga = testo[i]; while ((riga=strstr(riga,s0))!=null) l = strlen(testo[i])+l1-l0; nuova = malloc((l+1)*sizeof(char)); strncpy(nuova,testo[i],riga-testo[i]); nuova[riga-testo[i]]= \0 ; strcat(nuova,s1); strcat(nuova,riga+l0); free(testo[i]); riga=testo[i]=nuova; Puntatore a nuova stringa (eventualmente di lunghezza diversa) minieditor.c 21

76 Mini-Editor (6/7) void sostituisci (char *s0, char *s1) int i,l,l0=strlen(s0),l1=strlen(s1); char *riga, *nuova; for (i=0; i<nrighe; i++) riga = testo[i]; while ((riga=strstr(riga,s0))!=null) l = strlen(testo[i])+l1-l0; nuova = malloc((l+1)*sizeof(char)); strncpy(nuova,testo[i],riga-testo[i]); nuova[riga-testo[i]]= \0 ; strcat(nuova,s1); strcat(nuova,riga+l0); free(testo[i]); riga=testo[i]=nuova; minieditor.c 22

77 Mini-Editor (6/7) void sostituisci (char *s0, char *s1) Concatena 3 pezzi: int -i,l,l0=strlen(s0),l1=strlen(s1); Parte iniziale (prima della sottostringa trovata) char -Stringa *riga, s1*nuova; for -(i=0; parte finale i<nrighe; (dopo la i++) sottostringa trovata) riga = testo[i]; while ((riga=strstr(riga,s0))!=null) l = strlen(testo[i])+l1-l0; nuova = malloc((l+1)*sizeof(char)); strncpy(nuova,testo[i],riga-testo[i]); nuova[riga-testo[i]]= \0 ; strcat(nuova,s1); strcat(nuova,riga+l0); free(testo[i]); riga=testo[i]=nuova; minieditor.c 23

78 Mini-Editor (7/7) void stampa (char *nomefile, int i, int j) FILE *fp; int k; minieditor.c if (strcmp(nomefile, stdout )==0) fp = stdout; else fp = fopen(nomefile, w ); if (j>=nrighe) j=nrighe-1; for (k=i; k<=j; k++) fprintf(fp, %s\n,testo[k]); if (fp!= stdout) fclose(fp) 24

79 I puntatori e l allocazione dinamica di memoria

80 Argomenti trattati Il puntatore come dato e riferimento dato Variabili e operatori sui puntatori Utilizzo avanzato dei puntatori con Vettori e matrici Strutture L allocazione dinamica di memoria e le strutture dati dinamiche Esercizi 2

81 Tecniche di programmazione Gestione di riferimenti a dati privi di nome Manipolazione dei puntatori e aritmetica Parametri per riferimento Strutture puntate Vettori e matrici dinamiche 3

82 Suggerimenti I puntatori sono un efficace strumento per Parametri per riferimento Allocazione dinamica (esplicita) di dati Vantaggi Accesso a dati altrimenti non manipolabili (mediante nome) Maggior flessibilità e possibilità di gestire meglio la memoria disponibile Possibilità di adattare la dimensione dei dati all input del programma (in esecuzione) 4

83 Materiale aggiuntivo Sul CD-ROM Testi e soluzioni degli esercizi trattati nei lucidi Scheda sintetica Esercizi risolti Esercizi proposti Esercizi proposti da altri libri di testo 5

I puntatori e l allocazione dinamica di memoria

I puntatori e l allocazione dinamica di memoria I puntatori e l allocazione dinamica di memoria L allocazione delle variabili Allocazione e rilascio espliciti di memoria Le funzioni malloc e free 2 2006 Politecnico di Torino 1 Allocare = collocare in

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

Allocazione dinamica della memoria

Allocazione dinamica della memoria Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori

Dettagli

Gestione dinamica della memoria

Gestione dinamica della memoria Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.

Dettagli

L Allocazione Dinamica della Memoria

L Allocazione Dinamica della Memoria L Allocazione Dinamica della Memoria Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania mpalesi@diit.unict.it http://www.diit.unict.it/users/mpalesi Sommario Questo documento

Dettagli

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

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc() Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili

Dettagli

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

I puntatori e l allocazione dinamica di memoria. Esercizi risolti I puntatori e l allocazione dinamica di memoria Esercizi risolti 1 Esercizio Si vuole realizzare un tipo struct, utilizzato per informazioni su operazioni di vendita, avente i seguenti campi: codice: numero

Dettagli

La gestione della memoria dinamica Heap

La gestione della memoria dinamica Heap Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti

Dettagli

L'allocazione dinamica della memoria

L'allocazione dinamica della memoria L'allocazione dinamica della memoria Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino I puntatori Le variabili di tipo puntatore permettono di accedere alla memoria

Dettagli

Struct, enum, Puntatori e Array dinamici

Struct, enum, Puntatori e Array dinamici Struct, enum, Puntatori e Array dinamici Tratti dal corso del Dr. Francesco Fabozzi Corso di Informatica Tipi di dato in C Abbiamo esaminato diversi tipi di dato che il C mette a disposizione dell utente

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

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

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

Il linguaggio C Strutture

Il linguaggio C Strutture Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Linguaggio C -- Strutture 2 Ringraziamenti Questi

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

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

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

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t)) Allocazione dinamica della memoria: malloc() In C è possibile allocare dinamicamente un area di memoria (ossia, durante l esecuzione di un programma) tramite le funzioni malloc() e calloc() (occorre includere

Dettagli

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Le strutture Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Dichiarazione di una struttura: struct point { int x; int y; }; La dichiarazione di una struttura

Dettagli

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/fi1 A.A. 2010/2011

Dettagli

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

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente ! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente!!la loro esistenza deve essere prevista e dichiarata a priori! Questo può rappresentare un problema soprattutto per variabili

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

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

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

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica

Allocazione della memoria. Allocazione dinamica della memoria. Allocazione della memoria. Allocazione automatica Allocazione dinamica della memoria Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Allocazione della memoria Il termine allocazione viene utilizzato per indicare l assegnazione di un blocco

Dettagli

5. Quinta esercitazione autoguidata: liste semplici

5. Quinta esercitazione autoguidata: liste semplici 22 5. Quinta esercitazione autoguidata: liste semplici 5.1. Liste rappresentate mediante strutture e puntatori (LISTE1.C, LISTE2.C) Scrivere un programma che - costruisce una lista di k interi (con k letto

Dettagli

Allocazione dinamica della memoria

Allocazione dinamica della memoria Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Tipi di memoria dati Nella macchina astratta C esistono tre tipi di memoria per allocare

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

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C... Sommario PREFAZIONE...XI Aggiornamenti e novità... xi Lo scopo di questo libro... xii Diagramma delle dipendenze... xii La metodologia di insegnamento... xiii Panoramica sul libro... xvi Ringraziamenti...

Dettagli

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Le strutture Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Dichiarazione di una struttura: struct point { int x; int y; }; La dichiarazione di una struttura

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 5 Struct, Union e allocazione dinamica della memoria Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/

Dettagli

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture. Unità Didattica 5 Linguaggio C Stringhe. Accesso a file ASCII. Strutture. 1 Stringhe Una stringa è una sequenza di caratteri (es: ciao, sd!n29dnqa ); In C non esiste una variabile di tipo stringa; Una

Dettagli

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/fi1 A.A. 2010/2011

Dettagli

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

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL Materiale di ausilio utilizzabile durante l appello: tutto il materiale è a disposizione, inclusi libri, lucidi, appunti, esercizi svolti e siti Web ad accesso consentito in Lab06. L utilizzo di meorie

Dettagli

Linguaggio C. Esercizio 1

Linguaggio C. Esercizio 1 Linguaggio C Esercizi su puntatori e liste Walter Didimo (e-mail:didimo@dia.uniroma3.it) supplemento al Corso di Calcolatori Elettronici (Riccardo Torlone) 1 Esercizio 1 Siano p e q due puntatori a variabili

Dettagli

Gestione di files Motivazioni

Gestione di files Motivazioni Gestione di files Motivazioni Un programma in esecuzione legge (sequenzialmente) una sequenza di caratteri prodotti "al volo" dall'utente (tramite tastiera) il programma in esecuzione scrive (sequenzialmente)

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Testo A Secondo Appello 016-17 febbraio 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene

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

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

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa. 3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il

Dettagli

Linguaggi di programmazione + laboratorio a.a. 2012/2013

Linguaggi di programmazione + laboratorio a.a. 2012/2013 Linguaggi di programmazione + laboratorio a.a. 2012/2013 Scrivere un programma in linguaggio C che legga da tastiera una sequenza di lunghezza ignota a priori di numeri interi positivi. Il programma, a

Dettagli

Consideriamo un vettore allocato dinamicamente

Consideriamo un vettore allocato dinamicamente Libreria per per la la gestione/manipolazione dei dei vettori Consideriamo un vettore allocato dinamicamente int * v; v = (int *) malloc (n * sizeof (int) ); Conversione di tipo da void * a int * Numero

Dettagli

Problema. Vettori e matrici. Vettori. Vettori

Problema. Vettori e matrici. Vettori. Vettori e matrici Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Problema Si vuole un programma che chieda 10 numeri dalla tastiera e li visualizzi dall ultimo al primo Soluzione attuale (con le

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

Le basi del linguaggio Java

Le basi del linguaggio Java Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una

Dettagli

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

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length); Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di

Dettagli

Strutture Dinamiche. Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica Strutture Dinamiche Fondamenti di Informatica 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione Companies, srl 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato));

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

Introduzione al C. Unità Gestione Dinamica della Memoria

Introduzione al C. Unità Gestione Dinamica della Memoria Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità Gestione Dinamica della Memoria D. Bloisi, A. Pennisi, S. Peluso, S. Salza Gestione

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento

Dettagli

Allocazione statica della memoria

Allocazione statica della memoria 2015 - Roberta Gerboni 1 2 Allocazione statica della memoria Cosa succede nella memoria del computer quando il un programma vengono dichiarate delle variabili? memoria Ad esempio: int main() 57 { int x=

Dettagli

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori Salvatore Mandrà 7 Ottobre 2008 1 Esercizio L esercizio prevede l implementazione di funzioni per il prodotto di una matrice per un vettore, attraverso

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

File e puntatori a file

File e puntatori a file File e puntatori a file Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it La libreria stdio.h mette a disposizione delle funzioni che hanno la peculiarità di trattare con questa nuova tipologia di

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

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

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

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Puntatori. Unità 6. Domenico Daniele Bloisi. 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

Espressione di chiamata di funzione

Espressione di chiamata di funzione Avvertenza Quanto segue NON è un libro, ma è una copia dei lucidi usati a lezione che NON sostituisce i libri di testo adottati e consigliati per l insegnamento di Informatica Generale. Questa copia è

Dettagli

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto

Dettagli

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste 4 Le liste collegate 4.0 Le liste collegate c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 2001/2002 4.0 0 4 Le liste collegate Rappresentazione di liste 4.1

Dettagli

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

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt); Un esempio per iniziare Il controllo del programma in C DD Cap.3 pp.91-130 /* calcolo di 8!*/ #include #define C 8 int main() int i=1; int fatt=1; while (i

Dettagli

Fondamenti di Informatica 2

Fondamenti di Informatica 2 Fondamenti di Informatica 2 della prova scritta del 28 Febbraio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int min = 3; int i; Scrivere la porzione di codice

Dettagli

Caratteri e stringhe

Caratteri e stringhe Caratteri e stringhe Vettori di caratteri Il tipo stringa Terminatore nullo Input/output di stringhe 2 Vettori di caratteri Stringhe in C Nel linguaggio C non è supportato esplicitamente alcun tipo di

Dettagli

Vettori di caratteri. Caratteri e stringhe. Stringhe in C. Vettori di caratteri. char saluto[10] ; B u o n g i o r n o 4. Esempio.

Vettori di caratteri. Caratteri e stringhe. Stringhe in C. Vettori di caratteri. char saluto[10] ; B u o n g i o r n o 4. Esempio. Vettori di caratteri Il tipo stringa Terminatore nullo Input/output di stringhe Caratteri e stringhe 2 Stringhe in C Vettori di caratteri Nel linguaggio C non è supportato esplicitamente alcun tipo di

Dettagli

Le funzioni, e le istruzioni di input/output

Le funzioni, e le istruzioni di input/output Linguaggio C Le funzioni, e le istruzioni di input/output 1 Funzioni! Sono sottoprogrammi per svolgere un particolare compito! Sequenze di istruzioni (raggruppate tramite le parentesi graffe) alle quali

Dettagli

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri Funzioni (Passaggio dei parametri per riferimento) Passaggio dei parametri Per passaggio dei parametri si intende l associazione fra parametri attuali e parametri formali che avviene al momento della chiamata

Dettagli

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Complementi - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Università degli Studi di Brescia Prof. Massimiliano Giacomin

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

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin Linguaggio C tipi di dati definiti dall utente Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Tipi di dati in C Predefiniti

Dettagli

Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1

Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1 Caratteri e stringhe Il tipo stringa Terminatore nullo Input/output di stringhe 2 2006 Politecnico di Torino 1 Stringhe in C Nel linguaggio C non è supportato esplicitamente alcun tipo di dato stringa

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

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

1 (6) 2 (7) 3 (7) 4 (7) 5 (6) CORSO DI LAUREA IN INGEGNERIA ELETTRICA, CHIMICA e MATERIALI Informatica B anno accademico 010-011 Prof. Danilo ARDAGNA Seconda Prova in Itinere 7.06.011 Durata 1h 30 Valutazioni 1 (6) (7) 3 (7) 4 (7)

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

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22 Lezione 21 e 22 - Allocazione dinamica delle matrici - Generazione di numeri pseudocasuali - Funzioni per misurare il tempo - Parametri del main - Classificazione delle variabili Valentina Ciriani (2005-2008)

Dettagli

Fondamenti di Informatica T-1, 2014/2015 Modulo 2. Prova d Esame 2A di Martedì 29 Gennaio 2015 tempo a disposizione 2h

Fondamenti di Informatica T-1, 2014/2015 Modulo 2. Prova d Esame 2A di Martedì 29 Gennaio 2015 tempo a disposizione 2h Avvertenze per la consegna: apporre all inizio di ogni file sorgente un commento contenente i propri dati (cognome, nome, numero di matricola) e il numero della prova d esame. Al termine, consegnare tutti

Dettagli

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano Gestione della memoria p. 1/11 Programmazione Laboratorio Roberto Cordone DI - Università degli Studi di Milano Tel. 02 503 16235 E-mail: roberto.cordone@unimi.it Ricevimento: su appuntamento Lezioni:

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

Esercizio 1. Esercizio 1 - Soluzione

Esercizio 1. Esercizio 1 - Soluzione Esercizio 1 Progettare e Codificare in C un programma che permetta di Chiedere all utente quanti numeri vuole inserire Leggere i numeri inseriti dall utente e calcolare la somma dei fattoriali Esempio:

Dettagli

Fondamenti di Informatica AA 2016/2017

Fondamenti di Informatica AA 2016/2017 Fondamenti di Informatica AA 2016/2017 Eng. Ph.D. Michela Paolucci DISIT Lab http://www.disit.dinfo.unifi.it Department of Information Engineering, DINFO University of Florence Via S. Marta 3, 50139, Firenze,

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

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008

PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008 PROVA SCRITTA DEL CORSO DI CORSO DI LAUREA IN INGEGNERIA BIOMEDICA ED ELETTRICA 9/6/2008 MOTIVARE IN MANIERA CHIARA LE SOLUZIONI PROPOSTE A CIASCUNO DEGLI ESERCIZI SVOLTI ESERCIZIO 1 (5 punti) Descrivere

Dettagli

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico Gestione dei file Stefano Ferrari Università degli Studi di Milano stefano.ferrari@unimi.it Programmazione anno accademico 2016 2017 Gli stream Si dice stream qualsiasi sorgente di dati in ingresso e qualsiasi

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

Esercizio 1: calcolo insieme intersezione

Esercizio 1: calcolo insieme intersezione Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 3 Esercitazione: 19 ottobre 2005 Esercizi su array e matrici Esercizio 1: calcolo insieme intersezione Problema: *******************************************************************

Dettagli

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie ! La libreria standard del C è in realtà un insieme di librerie! Per usare una libreria, non occorre inse -rirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle! Ogni file sorgente

Dettagli

Allocazione dinamica

Allocazione dinamica Allocazione dinamica Quando non si sa a priori quanto un array debba essere grande allocazione dinamica di array Quando si deve restituire un array come risultato di una funzione (a meno di non barare

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

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica) Compendio sottoinsieme del C++ a comune col C (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica) Librerie 1/2 Il solo insieme di istruzioni di un linguaggio di programmazione

Dettagli

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014 Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014 Damiano Macedonio Esercizio 1 Scrivere una funzione che riceve in ingresso un puntatore ad un array di interi e modifica tale array

Dettagli

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna: Prova di Laboratorio del 12.1.2005 [durata 90 min.] Corso A-B di Programmazione (A.A. 2004/05) 1. Leggere da tastiera un insieme di numeri interi ed inserirli in un vettore A 2. Calcolare tramite una funzione

Dettagli

Implementazione di Liste puntate

Implementazione di Liste puntate Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Implementazione di Liste puntate 2 1 Indice Liste puntate semplici: Gli elementi sono logicamente

Dettagli

Esercizio n.1 FONDAMENTI DI INFORMATICA 1. Esercizio n.2. Soluzione. LINGUAGGIO C Funzioni e gestione file: esercitazione

Esercizio n.1 FONDAMENTI DI INFORMATICA 1. Esercizio n.2. Soluzione. LINGUAGGIO C Funzioni e gestione file: esercitazione Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/fi1 A.A. 2010/2011

Dettagli

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio 1-La memoria dinamica La scrittura di un programma (indipendentemente dal linguaggio adottato) deve sempre tener conto

Dettagli

Il puntatore. Il puntatore

Il puntatore. Il puntatore Il puntatore È un tipo scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Il dominio di una variabile di tipo puntatore è un insieme di indirizzi: Il valore di una

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

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

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione Array Tipi di dato semplici e strutturati i tipi di dato visti finora erano tutti semplici: int, char, float,... i dati manipolati sono spesso complessi (o strutturati) con componenti elementari o strutturate

Dettagli

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

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C 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

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