Ambienti di Programmazione per il Software di Base
Ambienti di Programmazione per il Software di Base • Le Funzioni in C • Il passaggio di parametri • Le stringhe • Argomenti della riga di comando • Conversione dei dati in C Ambienti di Programmazione per il Software di Base
Funzioni • In C le funzioni sono caratterizzate da un nome, dal tipo della variabile ritornata e da una lista di parametri (opzionali) Tipo ritornato Corpo della funzione Parametri double max( double a, double b) { return (a>b) ? a : b; } Valore di ritorno • La lista dei parametri (anche se vuota) deve essere esplicitata • Il valore ritornato deve essere compatibile, a meno di conversione esplicita, con il tipo della funzione Ambienti di Programmazione per il Software di Base
Prototipi delle funzioni • Prima di essere usata, una funzione deve essere dichiarata (nel file che la usa) main. c max. c #include <stdio. h> double max (double a, double b) double max(double, double); { int main() return (a>b) ? a : b; { } double m = max(1, 3); printf(“Il massimo e` %dn“, m ); Prototipo di max return 0; (normalmente in max. h) } • I prototipi rendono le funzioni in C “type safe”, nel senso che i valori reali degli argomenti vengono all’occorrenza convertiti nei tipi formali specificati dal prototipo Ambienti di Programmazione per il Software di Base
Chiamata per valore • Con il passaggio per valore la funzione non può modificare il valore dei suoi argomenti bool greater(int i, int j) { // se i>j scambia i e j if (i>j) { int temp=i; Argomenti passati “per valore” i=j; sono scambiati nella funzione ma j=temp; nel programma chiamante hanno return true; i valori vecchi } else return false; } – Es: int i = 5, j=7; – Dopo la chiamata di greater (i, j) – i vale sempre 5 e j vale sempre 7 Ambienti di Programmazione per il Software di Base
Puntatori come parametri • L’uso dei puntatori permette ad una funzione di modificare il valore dei suoi argomenti bool greater(int *p 1, int *p 2) { /* se il valore puntato da p 1 > valore puntato da p 2 scambia i due valori*/ if (*p 1>*p 2) { int temp=*p 1; Se passo i puntatori le modifiche *p 1=*p 2; Hanno effetto sul programma *p 2=temp; chiamante return true; } else return false; } – Es: int i = 5, j=7; – Dopo la chiamata di greater (&i, &j) – i varrà 7 e j 5 Ambienti di Programmazione per il Software di Base
Chiamata per riferimento (ATTENZIONE: solo C++) • L’uso dei riferimenti permette ad una funzione di modificare il valore dei suoi argomenti bool greater(int& i, int& j) { // se i>j scambia i e j if (i>j) { int temp=i; Argomenti passati “by reference” i=j; j=temp; possono essere modificati dalla return true; funzione stessa } else return false; } – In C usare i puntatori (vedi lucido precedente) – Con i riferimenti è sufficiente chiamare greater (i, j); – Per ragioni di efficenza, oggetti di grandi dimensioni (in termini di memoria) vengono normalmente passati “by reference”. Ambienti di Programmazione per il Software di Base
Le Stringhe in C : Definizioni ● Stringa: una sequenza di caratteri memorizzati in locazioni contigue di memoria e terminata dal carattere ‘ ’, detto “terminatore di stringa” ‘s’ ‘t’ ‘r’ ‘i’ ‘n’ ‘g’ ‘a’ ‘ ’ Ambienti di Programmazione per il Software di Base x x x x
Le Stringhe in C : Ingresso/uscita di stringhe ● Creazione: char variabile[10]; char variabile[] = “valore_stringa”; ● Acquisizione: scanf(“%s”, address); con address espressione di tipo char * ● Modifiche allo stato della memoria: 1. memorizza i caratteri acquisiti da tastiera a partire dalla locazione di indirizzo address, fino al primo di un insieme di caratteri delimitatori (‘n’, blank, …) escluso 2. aggiunge in coda ai caratteri memorizzati il terminatore di stringa Ambienti di Programmazione per il Software di Base
Le Stringhe in C : Ingresso/uscita di stringhe ● Esempio: char *stringa #include <stdio. h> void main () { char stringa [10]; scanf(“%s”, stringa); } prova Ambienti di Programmazione per il Software di Base ‘p’ ‘r’ ‘o’ ‘v’ ‘a’ ‘ ’ x x x x x
Le Stringhe in C : Ingresso/uscita di stringhe ● Visualizzazione: printf(“%s”, address); con address espressione di tipo char * ● Effetto: visualizza i caratteri in memoria a partire dalla locazione di indirizzo address, fino al primo terminatore di stringa ● Esempio: #include <stdio. h> poi void main () { char stringa [10]; scanf(“%s”, stringa); printf(“%s”, stringa); }; Ambienti di Programmazione per il Software di Base poi
Le Stringhe in C : Ingresso/uscita di stringhe ● Costante di tipo stringa: sequenza di caratteri racchiusa tra doppi apici ● Esempio: #include <stdio. h> void main () { printf("%sn", "Allora!!!"); printf("%sn", "Allo ra!!!"); } Allora!!! Allo Ambienti di Programmazione per il Software di Base
Le Stringhe in C : strlen() ● Attenzione: per poter utilizzare le funzioni seguenti è necessario includere la direttiva per il preprocessore #include <string. h> ● La funzione strlen(): int strlen (char *s) ● Valore restituito: il numero di caratteri memorizzati a partire da s fino al primo delimitatore di fine stringa escluso ● Molto informalmente: restituisce la lunghezza di s Ambienti di Programmazione per il Software di Base
Le Stringhe in C : strlen() ● Esempio: char *stringa #include <stdio. h> void main () { char stringa [10]; int lung; …. ‘p’ ‘r’ ‘o’ ‘v’ ‘a’ ‘ ’ lung = strlen(stringa); } 5 Ambienti di Programmazione per il Software di Base x x x x x
Le Stringhe in C : strcpy() ● La funzione strcpy(): char *strcpy (char *s 1, char *s 2) ● Modifiche allo stato della memoria: copia i caratteri memorizzati a partire da s 2, fino al primo terminatore di stringa incluso, a partire da s 1 ● Valore restituito: s 1 ● Molto informalmente: sostituisce la stringa s 1 con la stringa s 2 Ambienti di Programmazione per il Software di Base
Le Stringhe in C : strcpy() ● Esempio: char *s 1 char *s 2 #include <stdio. h> void main () { char s 1 [8]; char s 2 [5]; …. printf(“%s”, strcpy(s 1, s 2); } via s 1 Ambienti di Programmazione per il Software di Base ‘p’ ‘r’ ‘o’ ‘n’ ‘t’ ‘i’ ‘ ’ ‘v’ ‘i’ ‘a’ ‘ ’ x ‘v’ x ‘i’ x ‘a’ x ‘ ’ x x x x x
Le Stringhe in C : strcat() ● La funzione strcat(): char *strcat(char *s 1, char *s 2) ● Descrizione: copia i caratteri memorizzati a partire da s 2, fino al primo carattere di fine stringa incluso, a partire dall’indirizzo del primo carattere di fine stringa successivo a s 1 ● Valore restituito: s 1 ● Molto informalmente: concatena la stringa s 2 alla stringa s 1 Ambienti di Programmazione per il Software di Base