Corso di Fondamenti di programmazione a.a.2009/2010

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
I tipi Strutturati.
INFORMATICA Algoritmi fondamentali
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array, matrici Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Array multidimensionali
Array (vettori) In linguaggio C / C++.
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
Universita di Camerino
Array di array Capitolo 20 febbraio 2004 Array di array.
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Anno accademico Array e puntatori in C.
Algoritmi in C++ (1) da completare
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione 1, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata al.
Process synchronization
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Variabili e tipi primitivi Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: i commenti Anno Accademico 2009/2010.
Array bidimensionali Paragrafo5.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
INFORMATICA Esercizi.
Struct, enum, Puntatori e Array dinamici
Algoritmi e Programmazione Avanzata
Lezione 24 maggio 2007 Strutture File Allocazione dinamica della memoria.
Java base III: Array e Stringhe
AN FI Array Array in Java. AN FI Array Dichiarazione di array in Java [ ]; //oppure u [] ; int a[]; int[] a; u La dimensione non è specificata.
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.
Prof. Cerulli – Dott.ssa Gentili
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ARRAY MULTIDIMENDIONALI
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
Programmazione di Calcolatori
Lezione n° 18: Maggio Problema del trasporto: formulazione matematica Anno accademico 2008/2009 Prof. Cerulli – Dott.ssa Gentili Lezioni di.
Prof. Cerulli – Dott.ssa Gentili
IL MASSIMO DI UN ARRAY ESERCIZIO
Ricerca sequenziale in un array di interi
Complessità di un algoritmo
Strutture dati elementari
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
LdL - LP1 - lez 11 - ver 6 - aa Linguaggi di programmazione I Stringhe (II) Prof. Luigi Di Lascio Lezione 11.
s STRINGHE DI CARATTERI a p e \0
I VETTORI E LE MATRICI IN PHP Motta Ilaria I.T.E. Agostino Bassi.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Operatori di incremento e decremento
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Esercizi.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 4 – Info B Marco D. Santambrogio – Matteo Ferroni –
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata.
Transcript della presentazione:

Corso di Fondamenti di programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi “La Sapienza” (lezioni 8 e 9) Matrici e stringhe Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Lun Mar Mer Es. temperature dei giorni dell’ultima settimana 1 riga per ogni giorno Una colonna per ogni ora del giorno in cui si è presa la temperatura Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne Nome della matrice Es. a[0][1] specifica l’elemento nella riga 0 e nella colonna 1 Per individuare un particolare elemento della tabella bisogna specificare due indici indice di riga indice di colonna Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Array n-dimensionali I vettori possono avere più di un indice possono ad esempio memorizzare i valori di tabelle costituite da un certo numero di righe e colonne a[2][2] Nome della matrice Es. a[2][2] specifica l’elemento nella riga 2 e nella colonna 2 I vettori che per identificare un particolare elemento richiedono due indici sono detti vettori bidimensionali o matrici Una matrice con m righe e n colonne è detta matrice m x n Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Matrici a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[i][j] identifica l’elemento della matrice a in posizione (i,j) Dichiarazione di una variabile di tipo matrice int b[2][2]; /* b è una matrice di interi costituita da due righe e due colonne */ Dichiarazione e inizializzazione int b[2][2]={{1,2},{3,4}}; (in alternativa possiamo ad esempio prendere da input i vari valori della matrice) a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] Se non vengono forniti tutti I valori di una riga i rimanenti Sono inizializzati a 0 Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Allocazione di memoria per matrici Elem 1 riga 1 Elem 2 riga 1 ….. Elem n riga 1 Elem 1 riga 2 Elem 2 riga 2 ….. Elem n riga 2 ….. Elem 1 riga m Elem 2 riga m ….. Elem n riga m Gli elementi della matrice sono memorizzati in celle consecutive di memoria, Una riga dopo l’altra Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Allocazione di memoria per matrici Elem 1 riga 1 Elem 2 riga 1 ….. Elem n riga 1 Elem 1 riga 2 Elem 2 riga 2 ….. Elem n riga 2 ….. Elem 1 riga m Elem 2 riga m ….. Elem n riga m &a[0][0] + (i*n)+ j Se a[0][0] memorizzato nella cella 1800 in che cella è memorizzato l’elemento i,j (assumendo una cella, un intero)? Serve conoscere il numero di colonne n per sapere in che cella trovare un generico elemento di una matrice !! Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Un primo esempio.. include <stdio.h> void printmatrice(int [ ][3]); int main() { int matrix1[2][3]={{1,2,3},{4,5,6}}; int matrix2[2][3]={1,2,3,4,5}; int matrix3[2][3]={{1,2},{4}}; printmatrice(matrix1); printmatrice(matrix2); printmatrice(matrix3); return 0; } Serve indicare il numero di colonne per consentire di saper trovare l’elemento (i,j) 1 2 3 4 5 6 4 5 0 1 2 0 4 0 0 IN OUTPUT Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Un primo esempio… void printmatrice (int a[ ][3]) { int i,j; for (i=0; i<=1;i++) for (j=0;j<=2;j++) printf (“%d ”, a[i][j]); printf(“\n”); } print(“\n”); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esercizio Si scriva un programma che prenda da input per ciascuno studente di una classe il voto conseguito in ciascuno degli esami dell’anno calcoli e stampi il voto più basso e più alto tra quelli dei vari studenti e, per ciascuno studente,la media dei voti degli esami dell’anno Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Soluzione #include <stdio.h> #define NUM_ESAMI 10 #define ALUNNI 100 int minimum (int [ ][NUM_ESAMI],int,int); int massimo (int [ ][NUM_ESAMI], int,int); float media(int [ ][NUM_ESAMI],int,int); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Soluzione main() { int i,j; int studentGrades[ALUNNI][NUM_ESAMI]; for (i=0; i<ALUNNI;i++) for (j=0;j<NUM_ESAMI;j++) printf(“inserisci voto %d esimo esame dell %d esimo alunno \n”, j,i); scanf(“%d”, &studentGrades[i][j]); } printf(“il voto più basso e il voto più alto sono: %d \n %d \n”, minimum(studentGrades, ALUNNI, NUM_ESAMI), massimo(studentGrades, ALUNNI, NUM_ESAMI)); printf (“la media dei suoi esami è %f\n”,media(studentGrades, i, NUM_ESAMI)); Da controllare Alunno che stiamo considerando Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Soluzione int minimum (int grades[ ][NUM_ESAMI],int alunni,int test) { int i,j; int lowgrade=100; /*upper bound del valore dei voti*/ for (i=0; i<alunni; i++) for (j=0; j<test;j++) if (grades[i][j]<lowgrade) lowgrade=grades[i][j]; } return lowgrade; Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Soluzione int massimo (int grades[ ][NUM_ESAMI],int alunni,int test) { int i,j; int highgrade=0; for (i=0; i<alunni; i++) for (j=0; j<test;j++) if (grades[i][j]>highgrade) highgrade=grades[i][j]; } return highgrade; Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Soluzione float media (int grades[ ][NUM_ESAMI],int alunno,int test) { int j; int total=0; for (j=0; j<test;j++) total+=grades[alunno][j]; } return (float) total / test; Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Puntatori I puntatori sono delle variabili che come valore contengono degli indirizzi di memoria int count; count contiene un _valore_ intero int *countPtr;  La variabile countPtr contiene l’indirizzo di una locazione di memoria che contiene un valore intero. Variabili di tipo puntatore devono essere dichiarate e inizializzate Es. int * countPtr; /*dichiarazoine*/ float * fcountPtr; countPtr = &count; /*inizializzazione*/ fcountPtr=NULL; /*NULL è una costante simbolica predefinita In molti file di intestazione incluso stdio.h. Se una variabile puntatore è inizializzata a NULL non punta ad alcuna locazione di memoria*/ Il nome di una variabile intera (es. count) fa direttamente riferimento ad un valore intero; Una variabile puntatore fa indirettamente riferimento ad un valore intero (deriferimento). 5 2340 2340 Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 countPtr

Operatore di indirizzo & (operatore unario di indirizzo) restituisce l’indirizzo di memoria associato al suo operando; int y=5; int *yPtr; yPtr=&y; 5 3200 y Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Operatore di indirizzo & (operatore unario di indirizzo) restituisce l’indirizzo di memoria associato al suo operando; int y=5; int *yPtr; yPtr=&y; & deve essere applicato ad una variabile. Non Può essere applicato a costanti, espressioni o a variabili dichiarate con la specifica di classe di memoria register 5 3200 y 3200 yPtr Viene allocata memoria per la variabile puntatore yPtr. Nella locazione di yPtr viene memorizzato l’indirizzo di memoria associato alla variabile y Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Operatore di deriferimento L’operatore * (detto operatore di deriferimento o di risoluzione dell’indirizzo) consente di accedere al valore contenuto nella locazione di memoria puntata da una variabile puntatore Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Operatore di deriferimento L’operatore * (detto operatore di deriferimento o di risoluzione dell’indirizzo) consente di accedere al valore contenuto nella locazione di memoria puntata da una variabile puntatore 5 *yPtr è il valore contenuto nella locazione di memoria il cui indirizzo è memorizzato in yPtr 3200 y 3200 yPtr Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 5

Esempio La specifica di conversione %p di printf consente di stampare in output indirizzi di locazioni di memoria #include <stdio.h> main() { int a; int *aPtr; a=7; aPtr=&a; printf(“The address of a is %p \n The value of aPtr is %p \n\n,&a,aPtr”); printf(“The value of a is %d \n The value of *aPtr is %d \n\n,a,*aPtr”); printf(“Proving that * and & are complements of each other \n”); printf(“&*aPtr=%p \n *&aPtr=%p \n”,&*aPtr,*&aPtr); return 0; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Precedenza degli operatori Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Chiamata per riferimento delle funzioni Come può essere realizzata in C? Se vogliamo poter modificare il contenuto di una variabile x con cui invochiamo una funzione e far sì che tali modifiche permangano anche all’uscita dalla funzione possiamo usare come parametro formale un puntatore (quindi passare lalla funzione l’indirizzo di x)… Un esempio.. Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Il valore originale del numero è: 5 Il nuovo valore del numero è: 125 Esempio /*eleva al cubo una variabile usando una chiamata per valore*/ #include <stdio.h> int cubeByValue(int); int main() { int number =5; printf(“Il valore originale del numero è: %d\n”,number); number=cubeByValue(number); printf(“il nuovo valore del numero è: %d\n”,number); return 0; } int cubeByValue(int n) return n*n*n; Il valore originale del numero è: 5 Il nuovo valore del numero è: 125 Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Il valore originale del numero è: 5 Il nuovo valore del numero è: 125 Esempio 2 /*eleva al cubo una variabile usando una chiamata per riferimento*/ #include <stdio.h> void cubeByReference(int *); int main() { int number =5; printf(“Il valore originale del numero è: %d\n”,number); cubeByReference(&number); printf(“il nuovo valore del numero è: %d\n”,number); return 0; } void cubeByReference(int *nPtr) *nPtr=(*nPtr)*(*nPtr)*(*nPtr); Il valore originale del numero è: 5 Il nuovo valore del numero è: 125 Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… int number=5; cubeByReference(&number); 5 6200 number Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… int number=5; cubeByReference(&number); Viene copiato in nPtr il valore dell’argomento con cui è stata invocata la funzione &number OVVERO l’indirizzo della locazione di memoria della variabile number OVVERO 6200 5 6200 number Invochiamo la funzione cubeByReference 6200 void cubeByReference(int *nPtr) { *nPtr=(*nPtr)*(*nPtr)*(*nPtr); } Viene allocata memoria per la variabile puntatore nPtr Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… int number=5; cubeByReference(&number); *nPtr è il valore contenuto nella locazione di memoria puntata da nPtr  5 L’istruzione quindi dice di elevare al cubo 5 e di memorizzare il valore risultante nella locazione di memoria puntata da nPtr 5 6200 number Invochiamo la funzione cubeByReference 6200 void cubeByReference(int *nPtr) { *nPtr=(*nPtr)*(*nPtr)*(*nPtr); } Si esegue l’istruzione *nPtr=(*nPtr)*(*nPtr)*(*nPtr); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… int number=5; cubeByReference(&number); L’istruzione quindi dice di elevare al cubo 5 e di memorizzare il valore risultante nella locazione di memoria puntata da nPtr 5 125 6200 number Il cubo di 5 è 125 Invochiamo la funzione cubeByReference 6200 void cubeByReference(int *nPtr) { *nPtr=(*nPtr)*(*nPtr)*(*nPtr); } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… int number=5; cubeByReference(&number); printf(“il nuovo valore del numero è: %d\n”,number); return 0; Si stampa il valore di number  125 5 125 6200 number Si ritorna il controllo al main che esegue la prossima istruzione 6200 void cubeByReference(int *nPtr) { *nPtr=(*nPtr)*(*nPtr)*(*nPtr); } La memoria allocata per nPtr viene rilasciata Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Cosa succede in memoria… Passaggio per valore evita di compromettere i valori delle variabili con cui sono invocate le funzioni (spesso non si vogliono modificare tali valori) Passaggio parametri per riferimento evita di dover allocare, ad ogni invocazione di funzione, memoria per copiare quantità di dati di input grandi che possono dover essere passati alla funzione esempio: se la funzione ha come input un vettore abbiamo bisogno solo di un parametro di tipo puntatore in cui copiare la locazione di memoria associata al primo elemento del vettore Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Qualificatore const Consente di specificare che il valore di una particolare variabile NON dovrà essere modificato Il compilatore intercetterà qualsiasi tentativo di modificare una variabile che sia stata dichiarata const e, nel caso in cui tale variabile sia modificata, darà un errore o un warning.  serve a proteggere da errori nell’implementazione del codice rendere più facile il debugging Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Modi di passare un puntatore a una funzione ‘Puntatore variabile a dati variabili’ i dati possono essere modificati attraverso il puntatore Il valore della variabile puntatore potrà essere modificato in modo che il puntatore possa fare riferimento ad altri dati Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio void convertToUppercase(char *s) while (*s != ‘\0’) #include <stdio.h> void convertToUppercase (char *); main() { char string[ ]=“caratteri”; printf(“la stringa prima della conversione è %s\n”,string); convertToUppercase(string); /*converte le lettere minuscole della stringa in maiuscole*/ printf(“dopo la conversione la stringa è %s\n”,string); return 0; } void convertToUppercase(char *s) while (*s != ‘\0’) if (*s >= ‘a’ && *s<= ‘z’) *s-=32; ++s; Vengono modificati i caratteri della Stringa. s punta a caratteri diversi della stringa durante l’esecuzione della funzione La stringa prima della conversione è:pippo Dopo la conversione la stringa è PIPPO Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Altri casi… Puntatore variabile a dati costanti (i dati non possono essere modificati) #include <stdio.h> void printCharacters (const char *); main() { char string [ ]=“stampa i caratteri”; printf (“la stringa è:\n”); printCharacters (string); putchar(‘\n’); return 0; } void printCharacters(const char *s) for (;*s!=‘\0’;s++) putchar(*s); la stringa è: stampa i caratteri Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Altri casi… Puntatore costante a dati variabili int *const ptr; il puntatore fa sempre riferimento alla stessa locazione di memoria Tramite il puntatore si può cambiare il valore della locazione di memoria int *const ptr; Puntatore costante a dati costanti Il valore della locazione di memoria non può essere modificato const int *const ptr; Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio #include <stdio.h> main () { int x=5,y; const int *const ptr=&x; *ptr=7; ptr=&y; return 0; } Cannot modify a const object Cannot modify a const object Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Prof. ssa Chiara Petrioli -- Fondamenti di programmazione, a. a

Bubblesort (versione 2) #include <stdio.h> #define SIZE 10 void bubbleSort(int *,const int); void swap (int *,int*); main() { int i,a[SIZE]={2,6,4,8,10,12,89,68,45,37}; printf(“ordine originale \n”); for (i=0;i<=SIZE-1;i++) printf(“%d”,a[i]); bubbleSort (a,SIZE); printf(“dati in ordine crescente \n”); printf(“\n”); return 0; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Bubblesort void bubbleSort(int *array, const int size) { int pass,j; for (pass=1;pass <=size-1;pass++) for (j=0;j<=size-2;j++) if(array[j]>array[j+1]) swap(&array[j],&array[j+1]); } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Swap void swap (int *element1Ptr, int *element2Ptr) { int temp; temp=*element1Ptr; *element1Ptr=*element2Ptr; *element2Ptr=temp; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Caratteri e stringhe Un carattere può essere visto come un intero Ha associato un intero, il codice ASCII corrispondente Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Caratteri e stringhe Una stringa è un vettore di caratteri che termina con il carattere nullo ‘\0’ Inizializzazione di una stringa char color [ ]= “blue”; char color [ ]={‘b’,’l’,’u’,’e’,’\0’}; b l u e \0 La dimensione del vettore è determinata automaticamente Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Caratteri e stringhe Una stringa è un vettore di caratteri che termina con il carattere nullo ‘\0’ Inizializzazione di una stringa char word[20]; printf (“inserisci stringa \n”); scanf(“%s”, word); b l u e \0 word indica l’indirizzo della cella di memoria in cui è memorizzato il primo elemento del vettore Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Manipolazione dei caratteri Libreria standard, header <ctype.h> Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Manipolazione dei caratteri Libreria standard, header <ctype.h> Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Sintesi ctype.h Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Manipolazione dei caratteri /*verifica se c è una cifra*/ int isdigit (int c) { return ((c>=‘0’)&&(c<=‘9’)); } /*verifica se c è una lettera*/ int isalpha (int c) return (((c>=‘a’)&&(c<=‘z’))|| ((c>=‘A’)&&(c<=‘Z’))); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Manipolazione dei caratteri /*restituisce la lettera minuscola corrispondente se c è una maiuscola, l’argomento inalterato in caso contrario*/ int tolower (int c) { if isupper( c ) c=c-’A’+’a’; return c; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Utilizzo delle funzioni di libreria per la manipolazione dei caratteri #include <stdio.h> #include <ctype.h> int main ( ) { printf(“%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n”, “According to islower:”, islower(‘p’)?”p is a”: “p is not a ”, “lowercase letter”, islower(‘P’)?”P is a”: “P is not a ”, islower(‘5’)?”5 is a”: “5 is not a ”, islower(‘!’)?”! is a”: “! is not a ”, “lowercase letter”); ) } (espressione 1)?espressione2:espressione 3; According to islower: p is a lowercase letter P is not a lowercase letter 5 is not a lowercase letter ! Is not a lowercase letter Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esercizio 1 /*calcola il numero di caratteri in una stringa*/ /*Post: restituisce il numero di caratteri della stringa (escluso il carattere di fine stringa */ int sizestringa(char s[]) { int i=0; while (s[i]!=‘\0’) i++; return i; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esercizio 2 /*individua la prima occorrenza del carattere c nella stringa s. Restituisce l’indice di tale prima occorrenza; -1 se il carattere c non compare*/ int stringchr (char s[ ], int c) { int i=0, while ((s[i]!=c) && (s[i]!=‘\0’)) i++; return ((s[i]==‘\0’)?-1:i); } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Funzioni di libreria sulle stringhe (funzioni per la conversione delle stringhe, stdlib.h) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio di uso Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Funzioni di libreria sulle stringhe (funzioni per la scrittura e lettura di caratteri e stringhe) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio #include<stdio.h> main() { char c, sentence[80]; int i=0; puts (“Enter a line of text:”); while((c=getchar())!= ‘\n’) sentence[i++]=c; sentence[i]=‘\0’; puts(“\n The line entered was:”); puts(sentence); return 0; } Enter a line of text: This is a test. The line entered was: Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Manipolazione di stringhe (string.h) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Esempio di uso Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Confronto tra stringhe (string.h) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Altre funzioni stringh Altre funzioni stringh.h (per un elenco completo vedere il Deitel&Deitel) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Altre funzioni stringh Altre funzioni stringh.h (per un elenco completo vedere il Deitel&Deitel) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Funzioni di libreria sulle stringhe (string Funzioni di libreria sulle stringhe (string.h--manipolazione delle stringhe e manipolazione della memoria) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Funzioni di libreria sulle stringhe (string Funzioni di libreria sulle stringhe (string.h--manipolazione delle stringhe e manipolazione della memoria) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Funzioni di libreria sulle stringhe (string Funzioni di libreria sulle stringhe (string.h--manipolazione delle stringhe e manipolazione della memoria) Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Alcune funzioni della string.h strcpy /*copia la stringa s2 nel vettore s1. Restituisce un puntatore al primo carattere della stringa*/ /*Pre: dim del vettore s1 sufficienti per contenere s2*/ /*Post: s1 contiene la stringa s2*/ void stringcopy(char *s1, char *s2) { for (;*s2 !='\0';s1++,s2++) *s1=*s2; *s1='\0'; } Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Alcune funzioni della string.h strcmp /*Post: confronta s1 e s2. Restituisce: -1 se s1 e' minore in ordine lessicografico di s2; 0 se sono uguali; 1 se s1 e' maggiore in ordine lessicografico di s2 */ int stringcmp(char *s1, char *s2) { while (*s1==*s2) if (*s1=='\0') return 0; s1++; s2++; } if (*s1 == '\0') return -1; else if (*s2 == '\0') return 1; else return (((*s1 - *s2)>0)?1:0); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Sottostringa /* Post: restituisce 1 se la prima stringa compare come sottostringa della seconda, 0 altrimenti Se la prima stringa e' vuota restituisce 1 (una stringa vuota e' sottostringa di q.siasi stringa Se la seconda stringa e' vuota e la prima no allora restituisce 0*/ int findstr (char *s1, char *s2) { char *temp_s1; char *temp_s2; while (s2!='\0') temp_s2=s2; temp_s1=s1; while ((*s1 == *s2)&&(*s1!='\0')&&(*s2!='\0')) s1++; s2++; } if (*s1=='\0') return 1; else if (*s2=='\0') return 0; else s2=++temp_s2; s1=temp_s1; return (s1=='\0'); Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010

Prof. ssa Chiara Petrioli -- Fondamenti di programmazione, a. a