C: panoramica - I parte

Documenti analoghi
Dati aggregati. Violetta Lonati

C: panoramica. Violetta Lonati

Introduzione alla programmazione in linguaggio C

Elementi del linguaggio di programmazione C

Il linguaggio C. Notate che...

Introduzione al linguaggio C Puntatori

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

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

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

Primi passi col linguaggio C

Tipi di dato semplici

Funzioni in C. Violetta Lonati

Laboratorio di algoritmi e strutture dati

Linguaggio C - sezione dichiarativa: costanti e variabili

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Il primo programma C. Un programma utile. Compilazione & linking con il compilatore GNU. Introduzione alla programmazione in linguaggio C

Caratteri e stringhe

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

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

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

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

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Strategie di programmazione

Laboratorio di programmazione

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

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

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

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

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

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

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Uso avanzato dei puntatori Allocazione dinamica della memoria

Programmazione in Java (I modulo)

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

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Corso sul linguaggio C Modulo Tipi di dato

Costanti e Variabili

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

Caratteristiche di un linguaggio ad alto livello

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

Laboratorio di informatica Ingegneria meccanica

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Corso di Fondamenti di Programmazione canale E-O. Tipi di dato. Un esempio

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

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

Verso i puntatori: Cosa è una variabile?

Sintassi: Per la dichiarazione di variabili dei tipi fondamentali:

Il linguaggio C. Puntatori e dintorni

Stringhe. Stringhe costanti. t[0] t[1] t[2] t[3] t[4] s o l e \0. Esempio. char t[5] = { l, u, n, a, \0 }; definisce l array

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

Puntatori. Fondamenti di Programmazione

Esercitazione 11. Liste semplici

Introduzione a Matlab

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

Variabili. Tipi di dati di base. Variabili. Variabili

I CARATTERI E LE STRINGHE

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Struttura dei programmi C

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

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

Perché il linguaggio C?

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Le parole chiave char, int, float, double, ed enum descrivono i. che modificano i tipi base

Funzioni, Stack e Visibilità delle Variabili in C

Stringhe e allocazione dinamica della memoria

Input/Output di numeri

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

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

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

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

Lezione 8 Struct e qsort

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

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

1 PANORAMICA SUL LINGUAGGIO C

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2014

Tipi di dato primitivi

Introduzione al linguaggio C

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

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

4 - Tipi di dato primitivi

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

Esercizi Programmazione I

Array multidimensionali e stringhe

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

Linguaggio C Informatica Grafica

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Il linguaggio C - Introduzione

Corso di Fondamenti di Informatica

Variabili e Istruzioni

Ripasso R1. Dati strutturati. Esempi. Array. Dichiarazione di un array. Dichiarazione di un array in C

Conversioni fra Tipi di Dati. Luca Abeni

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

Espressione di chiamata di funzione

Transcript:

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

Argomenti Intro Uso del compilatore gcc Struttura di un programma C Tipi di base Definizione di tipi Input e output formattati Lettura e scrittura di caratteri Dati aggregati: array, stringhe, strutture, enumerazioni Array Stringhe Strutture Enumerazioni Funzioni Definizione di funzioni Chiamata di funzioni Dichiarazione di funzioni Parametri, argomenti e variabili locali Violetta Lonati C: panoramica - I parte AA 2009/2010 2/45

Violetta Lonati C: panoramica - I parte AA 2009/2010 3/45

Uso del compilatore gcc Si usa da linea di comando: gcc file da compilare.c Per default produce il file eseguibile a.out Per eseguire il file basta digitare./a.out Opzioni utili: -o file di output per salvare l output nel file specificato, -c per arrestare la compilazione prima della fase di link, -s per arrestare la compilazione prima della fase di assemble, -E per arrestare la compilazione dopo la fase di preprocessing, -W, con parametro all, per la segnalazione di avvertimenti (warning), -l, con parametro m, per linkare le librerie matematiche, -ansi per ignorare le funzionalità di gcc incompatibili con lo standard ANSI, -pedantic per aumentare il livello di pedanteria nel segnalare cose non conformi allo standard ANSI! Esempio $ gcc -lm -Wall -o cerchio cerchio.c $./cerchio Violetta Lonati C: panoramica - I parte AA 2009/2010 4/45

Forma generale di un programma C Esempio di programma #i n c l u d e <s t d i o. h> i n t main ( void ) { p r i n t f ( Ciao! \ n ) ; return 0 ; } Struttura generale di un programma DIRETTIVE i n t main ( void ) { ISTRUZIONI } Violetta Lonati C: panoramica - I parte AA 2009/2010 5/45

Violetta Lonati C: panoramica - I parte AA 2009/2010 6/45

Tipi numerici in C In C esistono due tipi numerici built-in (di base): numeri interi int numeri decimali in virgola mobile float La dimensione dei tipi varia a seconda della macchina. L operatore sizeof consente di determinare quanta memoria occupa una variabile di un determinato tipo: sizeof ( int ) rappresenta il numero di byte necessari a memorizzare una variabile di tipo int, sizeof ( a ) rappresenta il numero di byte necessari a memorizzare la variabile a. Violetta Lonati C: panoramica - I parte AA 2009/2010 7/45

Tipo int Possono avere segno oppure no: signed int: il bit più a sinistra vale 0 se il numero è 0 e 1 se è < 0 unsigned int: bisogna specificarlo nella dichiarazione Possono avere diverse dimensioni: short int: nelle dichiarazioni si può abbreviare in short long int: nelle dichiarazioni si può abbreviare in long Il range di variabilità non è fissato nel C standard ma cambia a seconda della macchina, gli unici vincoli sono i seguenti: short int int long int Il file di intestazione limits.h fornisce alcune macro che definiscono i valori limite, per l architettura corrente, dei tipi interi. Sei possibili dichiarazioni per i tipi interi: short si ; int i ; long li ; unsigned short usi; unsigned int ui ; unsigned long uli ; Violetta Lonati C: panoramica - I parte AA 2009/2010 8/45

Tipo float In C ci sono tre tipi di numeri in virgola mobile: float: single-precision double: double-precisione long double: extended-precision Anche per i float il range di variabilità non è fissato Il file di intestazione float.h fornisce alcune macro che definiscono, per l architettura corrente, la precisione dei tipi float. Le costanti possono essere scritte in molti modi, purchè contengano un decimale e/o un esponente. Ad esempio: 57.0 5 7. 57.0 e0 57E0 5. 7 e1 5. 7 e+1. 5 7 e+2 570. e 1 Per default le costanti sono memorizzate come double. Se basta la singola precisione, basta usare la lettera f o F alla fine della costante (es: 57.0f). Violetta Lonati C: panoramica - I parte AA 2009/2010 9/45

Tipo char L ultimo tipo built-in del C è il tipo char (carattere) char ch ; ch = a ; / a minuscola / ch = A ; / A maiuscola / ch = 0 ; / zero / ch = ; / s p a z i o / Il valore di un char può cambiare a seconda della character set della macchina. Si può generalmente assumere che le lettere minuscole siano contigue nell ordine alfabetico, idem per le maiuscole, idem per le cifre. I char sono usati dal C come tipi interi: le variabili char possono essere incrementate o confrontate come interi (l esito del confronto dipende dall ordinamento del character set). Il file di intestazione ctype.h fornisce alcune funzioni per l elaborazione di caratteri e la conversione di lettere da maiuscole a minuscole e viceversa. Violetta Lonati C: panoramica - I parte AA 2009/2010 10/45

Tipo char - esempi Assumendo che il character set sia ASCII: char ch ; i n t i ; i = a ; / ora i v a l e 97 / ch = 6 5 ; / ora ch v a l e A / ch++; / ora ch v a l e B / Per convertire lettere minuscole in maiuscole: i f ( a <= ch && ch <= z ) ch = ch a + A ; Oppure: #i n c l u d e <c t y p e. h>... i f ( i s l o w e r ( ch ) ) ch = toupper ( ch ) ; Violetta Lonati C: panoramica - I parte AA 2009/2010 11/45

Definizione di tipi La parola chiave typedef consente di definire nuovi tipi a partire da quelli built-in o dai tipi precedentemente definiti Esempio Definiamo un nuovo tipo Bool. Bool potrà essere usato nelle dichiarazioni di variabili esattamente come gli altri tipi built-in. #d e f i n e VERO 1 #d e f i n e FALSO 0 typedef i n t Bool ; / D i c h i a r a z i o n e d e l t i p o Bool / i n t main ( void ) { } Bool f l a g ; / D i c h i a r a z i o n e d e l l a var f l a g / f l a g = VERO; / Assegno a f l a g v a l o r e VERO /... Violetta Lonati C: panoramica - I parte AA 2009/2010 12/45

Violetta Lonati C: panoramica - I parte AA 2009/2010 13/45

Input e output formattati printf e scanf danno la possibilità di stampare output e leggere output formattati. Il primo argomento è dato dalla stringa di formato che può contenere sequenze di escape (es \n) specifiche di formato: %d per gli interi; %f per i float in notazione decimale; %e per i float in notazione esponenziale; %c per i char; è possibile specificare anche il numero di decimali, di 0 iniziali, l allineamento... Funzionamento di scanf in presenza di spazi bianchi: gli spazi bianchi iniziali vengono ignorati nella lettura di int e float, ma non di char; uno spazio bianco nella stringa di formato significa salta uno o più caratteri bianchi ; ad esempio scanf( %c, &ch ) salta gli spazi bianchi e poi memorizza ch. Violetta Lonati C: panoramica - I parte AA 2009/2010 14/45

Lettura e scrittura di caratteri getchar e putchar permettono di leggere e stampare un carattere alla volta. ch = getchar(); memorizza in ch il prossimo carattere da standard input; putchar( ch ); stampa il carattere ch su standard output. / Trasforma l a r i g a da minuscole a maiuscole / char ch ; while ( ( ch = g e t c h a r ( ) )!= \n ) { i f ( i s l o w e r ( ch ) ) p u t c h a r ( toupper ( ch ) ) ; e l s e p u t c h a r ( ch ) ; } / S a l t a g l i s p a z i b i a n c h i / while ( ( ch = g e t c h a r ( ) ) == ) ; Violetta Lonati C: panoramica - I parte AA 2009/2010 15/45

Violetta Lonati C: panoramica - I parte AA 2009/2010 16/45

Array unidimensionali Dichiarazione #d e f i n e N 100 i n t a [N + 2 ] ; Indicizzazione a[ i ] indica l i-esimo elemento dell array a. Al posto di a[ i ] si può mettere una qualsiasi espressione intera. Attenzione agli effetti collaterali in a[ i ] = b[i++]; Inizializzazione i n t a [ 4 ] = {1, 2, 0, 0 } ; i n t b [ ] = {1, 2, 0, 0 } ; i n t c [ 4 ] = {1, 2 } ; Eventuali elementi mancanti sono inizializzati a 0. Violetta Lonati C: panoramica - I parte AA 2009/2010 17/45

Array unidimensionali - continua Lunghezza di un array sizeof( a ) / sizeof( a[0] ) Array costanti const int MESI[i] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} Il qualificatore const rende ogni elemento immodificabile. Esempi f o r ( i = 0 ; i < N; i++ ) a [ i ] = 0 / a z z e r o l array a / f o r ( i = 0 ; i < N; i++ ) s c a n f ( %d, &a [ i ] ) ; / l e g g o e memorizzo in a / f o r ( i = 0 ; i < N; i++ ) p r i n t f ( %d, a [ i ] ) ; / stampo / Violetta Lonati C: panoramica - I parte AA 2009/2010 18/45

Array unidimensionali - errori tipici La dimensione degli array deve essere costante Secondo l ansi C, la dimensione dell array va fissata in fase di compilazione (non di esecuzione) usando un espressione costante. / compilando con gcc pedantic produce warning! / i n t n ; i n t a [ n ] ; Non c è controllo dei limiti i n t a [N], i ; f o r ( i = 0 ; i <= N; i++ ) p r i n t f ( %d\n, a [ i ] ) ; / accede ad a [N] che non e d e f i n i t o!! / Violetta Lonati C: panoramica - I parte AA 2009/2010 19/45

Array unidimensionali - esercizi Rovescia: scrivete un programma che legga una sequenza di numeri interi terminata da 0 e li stampi dall ultimo (0 escluso) al primo. Potete assumere che la sequenza contenga al più 100 numeri non nulli. Cifre ripetute: scrivete un programma che legga in input un numero intero n usando scanf( %d, &n ) e stabilisca se n contiene qualche cifra ripetuta e in caso affermativo quali. Da base 10 a base b: scrivere un programma che data una coppia di numeri interi b e n (separati da spazio e in base 10) stampi la rappresentazione di n in base b. Potete assumere che il numero di cifre in base b sia sempre minore di 100. Da base b a base 10: scrivere un programma che dato un numero b (in base 10) e una sequenza s di cifre in {0,... b 1} terminata da un punto, stampi il numero la cui rappresentazione in base b è data da s. Potete assumere che il numero di cifre di s sia sempre minore di 100. Violetta Lonati C: panoramica - I parte AA 2009/2010 20/45

Array bidimensionali i n t mat [ R ] [ C ], r, c ; / i n i z i a l i z z o a 0 / f o r ( r = 0 ; r < R ; r++ ) f o r ( c = 0 ; c < C ; c++ ) mat [ r ] [ c ] = 0 ; Mappa di memorizzazione Un array di R righe e C colonne viene memorizzato come array di lunghezza R C. In altre parole M[i ][ j ] si trova i C + j posizioni dopo M[0][0]. Inizializzazione i n t a [ 3 ] [ 2 ] = { {1, 2}, {3, 4}, {0, 0} } ; i n t b [ ] [ 2 ] = { {1, 2}, {3, 4}, {0, 0} } ; / non s i puo omettere l a seconda dimensione! / i n t c [ 3 ] [ 2 ] = {1, 2, 3, 4, 0, 0 } ; i n t d [ 3 ] [ 2 ] = {1, 2, 3, 4 } ; / e v e n t u a l i e l e m e n t i mancanti sono i n i z i a l i z z a t i a 0 / Violetta Lonati C: panoramica - I parte AA 2009/2010 21/45

Array bidimensionali - esercizi Esami e studenti: scrivete un programma che permetta di inserire gli esiti di 5 esami per 5 studenti e calcoli la media di ciascuno studente e la media dei voti ottenuti in ciascun esame. Quadrato magico: scrivete un programma che legga un intero n e stampi un quadrato magico di dimensione n. Violetta Lonati C: panoramica - I parte AA 2009/2010 22/45

Stringhe Le stringhe in C sono array di char, terminati dal carattere di fine stringa. Il carattere di fine stringa ha valore 0 (i char sono trattati come interi!), ma è opportuno indicarlo come carattere \0. La lunghezza di una stringa è data dal numero dei suoi caratteri + 1 (per il simbolo di fine stringa). Inizializzazione char p a r o l a 1 [ 5 ] = c i a o ; char p a r o l a 2 [ ] = c i a o ; char p a r o l a 3 [ ] = { c, i, a, o, \0 } ; Lettura e scrittura di stringhe s c a n f ( %s, p a r o l a ) ; / senza &!!! / p r i n t f ( %s \n, p a r o l a ) ; Funzioni per elaborare stringhe <string. h> contiene le dichiarazioni di alcune funzioni utili: strcpy, strcmp, strcat, strlen,... Violetta Lonati C: panoramica - I parte AA 2009/2010 23/45

Stringhe - esempio / copia parola in b i s / char p a r o l a [ ] = c i a o, b i s [ 4 + 1 ] ; i n t i ; while ( p a r o l a [ i ]!= \0 ) { b i s [ i ] = p a r o l a [ i ] ; i ++; } b i s [ i ] = \0 ; p r i n t f ( %s \n, b i s ) ; Violetta Lonati C: panoramica - I parte AA 2009/2010 24/45

Stringhe - esercizio Una stringa si dice palindroma se è uguale quando viene letta da destra a sinistra e da sinistra a destra. Quindi enne è palindroma, ma papa non lo è. Scrivete un programma che legga una stringa terminata da. e stabilisca se è palindroma. Potete assumere che la stringa sia al più di 100 caratteri. Violetta Lonati C: panoramica - I parte AA 2009/2010 25/45

Strutture Si tratta di tipi di dati aggregati. Ogni variabile strutturata è composta da membri, ciascuno dei quali è individuato da un nome. Ogni struttura ha un namespace distinto, quindi i nomi dei membri possono essere usati anche per altre cose! In altri linguaggi, le strutture sono chiamate record e i membri campi. / D i c h i a r a z i o n e d e l l a v a r i a b i l e s t r u t t u r a t a studente / / avente 3 membri : nome, cognome, anno. / s t r u c t { char nome [ 1 0 ] ; char cognome [ 1 0 ] ; i n t anno ; } s t u d e n t e ; Violetta Lonati C: panoramica - I parte AA 2009/2010 26/45

Strutture - continua Inizializzazione s t r u c t { char cognome [ 1 0 ] ; char nome [ 1 0 ] ; i n t anno ; } s t u d e n t e 1 = { F e r r a r i, Mario, 1988 }, s t u d e n t e 2 = { R o s s i, Maria, 1988 } ; Accesso ai membri s t u d e n t e. anno = 1987; p r i n t f ( %s \n, s t u d e n t e. nome ) ; Assegnamento E possibile farlo tra due variabili strutturate dello stesso tipo: tutti i membri vengono copiati. s t u d e n t e 1 = s t u d e n t e 2 ; Violetta Lonati C: panoramica - I parte AA 2009/2010 27/45

Definizione di tipi strutturati Ci sono due modi per definire tipi strutturati: / usando un tag / s t r u c t s t u d e n t e { char nome [ 1 0 ] ; char cognome [ 1 0 ] ; i n t anno ; } ;... s t r u c t s t u d e n t e stud1, stud2 ; / usando typedef / typedef s t r u c t { char nome [ 1 0 ] ; char cognome [ 1 0 ] ; i n t anno ; } Studente ;... Studente stud1, stud2 ; Violetta Lonati C: panoramica - I parte AA 2009/2010 28/45

Strutture nidificate typedef s t r u c t { f l o a t x, y ; } Punto ; typedef s t r u c t { Punto p1, p2 ; } R e t t a n g o l o ;... R e t t a n g o l o r ; r. p1. x = 0 ; r. p1. y = 1 ; r. p2. x = 5 ; r. p2. y = 3 ; Esercizio: Scrivete un programma che calcoli l area e il perimetro di rettangoli e cerchi. Violetta Lonati C: panoramica - I parte AA 2009/2010 29/45

Array di strutture #d e f i n e LUNG 20 / lunghezza massima per l e s t r i n g h e / #d e f i n e N 100 / numero massimo di v o c i / typedef char S t r i n g a [LUNG + 1 ] ; typedef s t r u c t { S t r i n g a n o m i n a t i v o ; S t r i n g a t e l ; } Voce ;... / d i c h i a r o r u b r i c a come array di N v o c i / Voce r u b r i c a [N ] ; Esercizio: Scrivete un programma per la gestione di una semplice rubrica. Attraverso un menu l utente deve poter visualizzare la rubrica e inserire nuovi numeri. Violetta Lonati C: panoramica - I parte AA 2009/2010 30/45

Enumerazioni Si tratta di tipi di dati i cui valori sono enumerati dal programmatore. enum { CUORI, QUADRI, FIORI, PICCHE } seme1, seme2 ; Ad ogni possibile valore si associa una costante di enumerazione intera. Per default i valori associati alle costanti sono 0, 1, 2,..., in questo ordine. E possibile scegliere altri valori. enum { VENDITE = 1 0, RICERCA = 21, PRODOTTI = 17 } s e t t o r e ; Si possono definire tipi enumerativi usando sia typedef che tag. typedef enum { FALSO, VERO } Bool ; Violetta Lonati C: panoramica - I parte AA 2009/2010 31/45

Violetta Lonati C: panoramica - I parte AA 2009/2010 32/45

Funzioni Le funzioni sono costituite da una sequenze di istruzioni raccolte sotto un solo nome. Le funzioni possono avere argomenti e possono calcolare e restituire dei valori, ma anche no! (a differenza delle funzioni matematiche) I programmi visti sin qui erano costituiti da una sola funzione, il main. A cosa servono le funzioni? permettono di evitare la duplicazioni di codice; sono riutilizzabili. Violetta Lonati C: panoramica - I parte AA 2009/2010 33/45

Esempio: calcolare la media #i n c l u d e <s t d i o. h> f l o a t media ( f l o a t x, f l o a t y ) { return ( x + y ) / 2 ; } i n t main ( void ) { f l o a t a, b, c, m; s c a n f ( %f%f%f, &a, &b, &c ) ; m = media ( a, b ) ; p r i n t f ( La media t r a %f e %f e %f \n, a, b, m ) ; } p r i n t f ( La media t r a %f e %f e %f \n, a, c, media ( a, c ) ) ; return 0 ; Violetta Lonati C: panoramica - I parte AA 2009/2010 34/45

Esempio: conto alla rovescia #i n c l u d e <s t d i o. h> void s t a m p a c o n t e g g i o ( i n t n ) { p r i n t f ( meno %d... \ n, n ) ; } i n t main ( void ) { i n t i ; } f o r ( i = 1 0 ; i > 0 ; i ) s t a m p a c o n t e g g i o ( i ) ; return 0 ; Violetta Lonati C: panoramica - I parte AA 2009/2010 35/45

Definizione di funzioni La forma generale di una funzione è la seguente: TIPO RESTITUITO NOME FUNZIONE ( PARAMETRI ) { DICHIARAZIONI ISTRUZIONI } TIPO RESTITUITO E il tipo del valore che la funzione restituisce attraverso l uso di return: le funzioni non possono restituire array, ma non ci sono restrizioni sugli altri tipi; se TIPO RESTITUITO è void, la funzione non restituisce alcun valore; se il TIPO RESTITUITO è omesso, per default è int; è comunque meglio indicarlo sempre! NOME FUNZIONE E il nome della funzione, che si usa per chiamare la funzione stessa. Violetta Lonati C: panoramica - I parte AA 2009/2010 36/45

Definizione di funzioni - continua PARAMETRI E una lista di parametri separati da virgole. ciascun parametro deve essere preceduto dal suo tipo (il tipo va ripetuto anche se ci sono più parametri dello stesso tipo) f l o a t media ( f l o a t x, y ) / SBAGLIATO! / Corpo della funzione Il corpo della funzione può contenere dichiarazioni e istruzioni; le variabili dichiarate nel corpo di una funzione si chiamano locali. f l o a t media ( f l o a t x, f l o a t y ) { f l o a t sum ; / d i c h i a r a z i o n e / } sum = x + y ; / i s t r u z i o n e / return sum / 2 ; / i s t r u z i o n e / Violetta Lonati C: panoramica - I parte AA 2009/2010 37/45

Chiamata di funzioni Una chiamata di funzione consiste nel nome della funzione seguito da una lista di argomenti tra parentesi. media ( 3, 6 ) media ( a, b b ) s t a m p a c o n t e g g i o ( 9 ) g e t c h a r ( ) La chiamata di una funzione coinvolge sempre due funzioni (che possono anche coincidere, nella ricorsione): una funzione chiamante e una funzione chiamata. Nei primi esempi, la funzione chiamante è il main. Quando una funzione viene chiamata, il controllo passa dalla funzione chiamante alla funzione chiamata. Quando questa termina (alla fine delle istruzioni oppure in presenza dell istruzione return), restituisce il controllo alla funzione chiamante. Violetta Lonati C: panoramica - I parte AA 2009/2010 38/45

Chiamata di funzioni - continua Se mancano le parentesi, la funzione non verrà chiamata. Se una funzione è di tipo void, bisognerà chiamarla così: g e t c h a r ( ) ; Una chiamata di funzione di tipo void è una istruzione, quindi deve concludersi con punto-e-virgola; s t a m p a c o n t e g g i o ( 9 ) ; Una chiamata di funzione di tipo non void è un espressione e produce un valore che può essere assegnato ad una variabile, testato, stampato, ecc m = media ( 3, 6 ) ; i f ( media ( a, b b ) > c ) p r i n t f (... ) ; Il valore restituito da una variabile può essere scartato: p r i n t f ( Ciao mondo!\ n ) ; c h a r s = p r i n t f ( Ciao mondo!\ n ) ; Violetta Lonati C: panoramica - I parte AA 2009/2010 39/45

Dichiarazione di funzioni La definizione di una funzione non deve necessariamente precedere il punto in cui viene chiamata. Ad esempio, le definizioni di funzioni possono seguire il main. Se il compilatore trova una chiamata prima della definizione, non sa quanti e di che tipo siano i parametri, quindi fa delle assunzioni e effettua dei casting. Non è detto che le queste assunzioni siano corrette! Per evitare questo problema, è possibile dichiarare le funzioni prima che vengano chiamate. TIPO RESTITUITO NOME FUNZIONE ( PARAMETRI ) ; Una dichiarazione di questo tipo si chiama prototipo o segnatura. Attenzione: ci deve essere coerenza tra dichiarazione e definizione!! Violetta Lonati C: panoramica - I parte AA 2009/2010 40/45

Esempio: media rivisitata #i n c l u d e <s t d i o. h> / p r o t o t i p o d e l l a f u n z i o n e media / f l o a t media ( f l o a t x, f l o a t y ) ; / main / i n t main ( void ) { f l o a t a, b, c, m; s c a n f ( %f%f%f, &a, &b, &c ) ; } p r i n t f ( La media t r a %f e %f e %f \n, a, b, media ( a, b ) ) ; return 0 ; / d e f i n i z i o n e d e l l a f u n z i o n e media / f l o a t media ( f l o a t x, f l o a t y ) { return ( x + y ) / 2 ; } Violetta Lonati C: panoramica - I parte AA 2009/2010 41/45

Parametri e argomenti I parametri di una funzione compaiono nella sua definizione: sono nomi che rappresentano i valori da fornire alla funzione al momento della chiamata. Gli argomenti sono invece le espressioni che compaiono nella chiamata di funzione tra parentesi. A volte i parametri sono chiamati parametri formali mentre gli argomenti sono chiamati parametri attuali. Se il tipo di un argomento non corrisponde al tipo del parametro, viene eseguita una conversione coerente con il prototipo della funzione oppure una conversione di default. Gli argomenti sono passati per valore: al momento della chiamata, ogni argomento è valutato e il valore è assegnato al corrispondente parametro; eventuali cambiamenti di valore dei parametri durante l esecuzione della funzione non influenzano il valore dell argomento! Violetta Lonati C: panoramica - I parte AA 2009/2010 42/45

Parametri e variabili locali Le variabili locali hanno le seguenti proprietà: sono utilizzabili solo dal punto in cui sono dichiarate fino alla fine della stessa funzione (block scope); non possono essere usate o modificate da altre funzioni; sono automaticaticamente allocate al momento della chiamata della funzione e deallocate al return (automatic storage duration); alla fine dell esecuzione della funzione non conservano il loro valore. I parametri hanno le stesse proprietà (block scope e automatico storage duration) delle variabili locali. Di fatto, la sola differenza tra variabili locali e parametri è che i parametri vengono inizializzati al momento della chiamata (con il valore degli argomenti della chiamata). Violetta Lonati C: panoramica - I parte AA 2009/2010 43/45

Conversione di tipi In C sono consentiti assegnamenti ed espressioni che mescolano i tipi, ma alcuni operandi verranno convertiti automaticamente (implicitamente) in modo da rendere possibile la valutazione dell espressione. Nelle chiamate di funzione è consentito passare argomenti di tipo diverso da quelli dei parametri; anche in questo caso si avranno delle conversioni implicite. Le regole di conversione implicita sono complicate! In sintesi: nelle espressioni aritmetiche gli operandi vengono promossi; negli assegnamenti il lato destro viene convertito al tipo del lato sinistro; se la funzione è dichiarata/definita prima della chiamata, ogni argomento è convertito implicitamente al tipo del parametro corrispondente; se la funzione non è dichiarata/definita prima della chiamata, il compliatore esegue delle promozioni di default E possibile anche effettuare conversioni esplicite con il cast. Violetta Lonati C: panoramica - I parte AA 2009/2010 44/45

Array come argomenti Se il vettore è unidimensionale, la dimensione può essere omessa. i n t f ( i n t a [ ] ) {... } Se il vettore è multidimensionale, solo la prima dimensione può essere omessa. i n t f ( i n t a [ ] [ LUN] ) {... } la funzione non ha modo di sapere quanto è lungo il vettore (l operatore sizeof non può essere usato...) quindi può essere utile passare la lunghezza come parametro aggiuntivo: i n t somma array ( i n t a [ ], i n t n ) { i n t i, sum = 0 ; f o r ( i = 0 ; i < n ; i++ ) sum += a [ i ] ; return sum ; } Violetta Lonati C: panoramica - I parte AA 2009/2010 45/45