18.08.2013 Views

Fondamenti di Informatica Librerie di funzioni - Robotica

Fondamenti di Informatica Librerie di funzioni - Robotica

Fondamenti di Informatica Librerie di funzioni - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong><br />

<strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong><br />

Tullio Facchinetti<br />

<br />

10 maggio 2009<br />

17:17<br />

http://robot.unipv.it/toolleeo<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Le librerie<br />

contengono co<strong>di</strong>ce e dati, cioè <strong>funzioni</strong> globali e variabili<br />

globali, che possono essere riutilizzati in <strong>di</strong>versi programmi<br />

• molte <strong>funzioni</strong> usate dai programmi C sono state<br />

standar<strong>di</strong>zzate<br />

• anche i nomi degli header da includere prima <strong>di</strong> usarle<br />

• per lavorare con i file, per poter<br />

chiamare le <strong>funzioni</strong> relative alle stringhe (lunghezza,<br />

confronto, sottostringa, ...) e molti altri header<br />

lo scopo del corso non è quello <strong>di</strong> prendere confidenza con la<br />

molteplicità <strong>di</strong> <strong>funzioni</strong> della libreria standard<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

tutte le <strong>funzioni</strong> e le variabili globali maggiormente<br />

utilizzate (come st<strong>di</strong>n e stdout) sono contenute nella<br />

libreria C, la cosiddetta libc<br />

• viene usata automaticamente dal compilatore per risolvere i<br />

simboli non definiti nei file sorgente<br />

• molte <strong>funzioni</strong> sono incluse nelle librerie standard e il<br />

programmatore non è tenuto a fornire alcuna informazione<br />

aggiuntiva al compilatore e al linker riguardo l’utilizzo <strong>di</strong> tali<br />

librerie, in quanto il compilatore le include automaticamente<br />

• se è necessario utilizzare una funzione che è inclusa in una<br />

libreria non standard, bisogna esplicitamente istruire il<br />

compilatore riguardo alla libreria che contiene la funzione<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

le librerie sono tipicamente memorizzate in file aventi<br />

estensione “.a”, dette librerie statiche<br />

• le librerie statiche sono create a partire dai file oggetto “.o”<br />

per mezzo del programma ar<br />

• sono usate dal linker per risolvere i riferimenti alle <strong>funzioni</strong> al<br />

momento della compilazione<br />

• le librerie standard del C sono solitamente poste nella<br />

<strong>di</strong>rectory /usr/lib e /lib<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

• la libreria matematica del C e’ tipicamente memorizzata nel<br />

file /usr/lib/libm.a<br />

• le <strong>di</strong>chiarazioni dei prototipi delle <strong>funzioni</strong> si trovano nei file <strong>di</strong><br />

intestazione, che si trovano <strong>di</strong> solito nella <strong>di</strong>rectory<br />

/usr/include<br />

• il file <strong>di</strong> intestazione della libreria matematica e’ il file<br />

/usr/include/math.h<br />

• la libreria standard del C e’ contenuta nel file<br />

/usr/lib/libc.a<br />

• contiene tutte le <strong>funzioni</strong> dello standard ANSI/ISO del<br />

linguaggio<br />

queste librerie vengono linkate in ogni programma per default<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

se si tenta <strong>di</strong> utilizzate una funzione <strong>di</strong> libreria senza aver<br />

esplicitamente istruito il compilatore sul file che contiene le<br />

<strong>funzioni</strong>, il linker genera un errore<br />

# gcc -Wall usemath.c -o usemath<br />

/tmp/ccbR4Ojn.o: In function ‘main’:<br />

/tmp/ccbR4Ojn.o(.text+0x19): undefined reference<br />

to ‘sqrt’<br />

• il file /tmp/ccbR4Ojn.o e’ un file creato temporaneamente<br />

dal compilatore per eseguire l’operazione <strong>di</strong> linking<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

• il compilatore non e’ sato in grado <strong>di</strong> trovare la funzione<br />

sqrt, utilizzata dal programma usemath<br />

• essa non e’ definita in libc.a<br />

la libreria matematica, come altre, vengono linkate per<br />

default dal linker<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

per abilitare il compilatore a linkare la libreria corretta e’ da<br />

utilizzare una istruzione come la seguente:<br />

# gcc -Wall usemath.c /usr/lib/libm.a -o usemath<br />

• la libreria libm.a contiene i file oggetto delle <strong>funzioni</strong><br />

matematiche come sin, cos e exp<br />

• il linker cerca tra i file oggetto contenuti nella libreria<br />

• ricerca la funzione da linkare<br />

quando la funzione desiderata viene trovata, il programma<br />

principale puo’ quin<strong>di</strong> essere correttamente compilato<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

il file eseguibile finale include il co<strong>di</strong>ce macchina delle<br />

<strong>funzioni</strong> scritte dal programmatore e <strong>di</strong> tutte le <strong>funzioni</strong> <strong>di</strong><br />

libreria richiamate dal programma<br />

• e’ possibile evitare <strong>di</strong> specificare tutto il percorso <strong>di</strong> ciascun<br />

file <strong>di</strong> libreria sulla linea <strong>di</strong> comando<br />

• il compilatore prevere una scorciatoia con l’opzione -l per<br />

linkare le librerie<br />

esempio<br />

# gcc -Wall calc.c -lm -o calc<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Uso <strong>di</strong> librerie esterne<br />

• l’opzione -lNOME tenta <strong>di</strong> linkare i file oggetto contenuti nella<br />

libreria <strong>di</strong> nome libNOME.a<br />

• libNOME.a e’ cercato nelle <strong>di</strong>rectory standard del compilatore<br />

• le <strong>di</strong>rectory nelle quali ricercare le librerie possono essere<br />

specificate nella linea <strong>di</strong> comando<br />

la compilazione <strong>di</strong> un programma includera’ varie opzioni del tipo<br />

-lNOME <strong>di</strong> linking, per includere tutti i file oggetto necessari, come<br />

librerie grafiche, per la comunicazione, ecc.<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Il comando ar<br />

utilizzando il comando ar e’ possibile creare delle<br />

librerie personalizzate, riunendo vari file oggetto in<br />

un unico o piu’ file <strong>di</strong> libreria<br />

e’ anche possibile verificare il contenuto <strong>di</strong> una libreria, sempre<br />

utilizzando il comando ar<br />

# ar t /usr/lib/libm.a<br />

...<br />

e_acos.o<br />

e_acosh.o<br />

e_asin.o<br />

e_atan2.o<br />

e_atanh.o<br />

e_cosh.o<br />

...<br />

sono i nomi dei file<br />

che contengono il<br />

co<strong>di</strong>ce compilato<br />

delle rispettive<br />

<strong>funzioni</strong><br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Il comando ar: esempio<br />

• programma prog (prog.c, che richiede l’uso <strong>di</strong> due <strong>funzioni</strong><br />

definite nei file func1. e func2.c<br />

• si assume che i singoli file oggetto func1.o e func2.o siano<br />

stati compilati<br />

comando per la generazione dell’eseguibile:<br />

$ gcc -o prog prog.c func1.o func2.o<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Il comando ar: esempio<br />

si utilizza il comando ar per includere i file oggetto<br />

in una libreria personalizzata<br />

$ ar q libprog.a func1.o<br />

ar: creating libprog.a<br />

$ ar q libprog.a func2.o<br />

$<br />

• l’opzione q in<strong>di</strong>ca ad ar <strong>di</strong> appendere il file oggetto alla fine<br />

della libreria <strong>di</strong> nome libprog.a<br />

• inizialmente la libreria non esiste: il primo comando crea il file<br />

libprog.a e vi inserisce il file oggetto func1.o<br />

• il secondo comando semplicemente aggiunge il file oggetto<br />

func2.o alla libreria gia’ esistente<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Il comando ar: esempio<br />

e’ possibile verificare il contenuto della libreria col comando<br />

$ ar t libprog.a<br />

func1.o<br />

func2.o<br />

si puo’ utilizzare la libreria per la compilazione <strong>di</strong> prog con il<br />

comando<br />

$ gcc -Wall prog.c ./libprog.a -o prog<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Il comando ar: esempio<br />

• e’ possibile inserire in una libreria molti file oggetto<br />

• non tutti devono essere necessariamente linkati nel<br />

programma eseguibile, ma soltanto quelli che contengono le<br />

<strong>funzioni</strong> necessarie sono linkati<br />

• un singolo file oggetto puo’ contenere il co<strong>di</strong>ce <strong>di</strong> piu’ <strong>funzioni</strong><br />

se soltanto un sottoinsieme <strong>di</strong> queste <strong>funzioni</strong> sono<br />

utilizzate dal programma principale, tutto il file oggetto<br />

prelevato dalla libreria viene linkato nel file eseguibile,<br />

andando ad aumentare le <strong>di</strong>mensioni del file<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria <strong>di</strong> input/output st<strong>di</strong>o.h<br />

contiene definizioni <strong>di</strong> macro, costanti,<br />

<strong>di</strong>chiarazioni <strong>di</strong> <strong>funzioni</strong> e <strong>di</strong> tipi utilizzati per le<br />

comuni operazioni <strong>di</strong> input/output<br />

e’ necessaria l’istruzione<br />

#include <br />

• <strong>di</strong>chiara tutte le <strong>funzioni</strong> per l’accesso a file, come fopen,<br />

fclose, fread e fwrite<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria standard stdlib<br />

<strong>di</strong>chiara costanti e <strong>funzioni</strong> <strong>di</strong> utilita’ generale,<br />

quali quelle per l’allocazione della memoria,<br />

conversione tra tipi e altre<br />

e’ necessaria l’istruzione<br />

#include <br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria standard stdlib<br />

tra i tipi <strong>di</strong> dato<br />

• size t, un tipo intero che è il tipo del valore restituito<br />

dall’operatore sizeof<br />

tra le costanti<br />

• la macro NULL, generalmente viene definita come 0, 0L,<br />

oppure (void*)0, che rappresenta il puntatore nullo<br />

• RAND MAX (maggiore o uguale a 32767), rappresenta il valore<br />

massimo che viene restituito dalla funzione rand()<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

• la funzione bsearch implementa l’algoritmo <strong>di</strong> ricerca binaria<br />

• la funzione qsort implementa l’algoritmo <strong>di</strong> or<strong>di</strong>namento<br />

QuickSort<br />

entrambe sono implementate in modo generalizzato,<br />

ovvero applicabile a qualsiasi insieme omogeneo <strong>di</strong> dati<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

<strong>di</strong>chiarate come segue<br />

• void *bsearch ( void *key, void *base, size t<br />

nmemb, size t size, compar fn t compar);<br />

effettua una ricerca binaria dell’elemento key all’interno<br />

dell’insieme base; l’insieme consiste <strong>di</strong> nmemb elementi,<br />

ciascuno avente <strong>di</strong>mensione size; viene usata la funzione<br />

compar per confrontare due elementi dell’insieme;<br />

• void qsort (void *base, size t nmemb, size t size,<br />

compar fn t compar);<br />

effettua l’or<strong>di</strong>namento <strong>di</strong> nmemb elementi dell’insieme base,<br />

ciascuno dei quali ha <strong>di</strong>mensione size; viene usata la funzione<br />

compar per confrontare due elementi dell’insieme;<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

• sono <strong>funzioni</strong> generiche<br />

• operano allo stesso modo su ogni tipo <strong>di</strong> insieme<br />

• trattano ciascun elemento dell’insieme semplicemente come<br />

una sequenza <strong>di</strong> bit avente una determinata lunghezza<br />

• deve essere specificata la <strong>di</strong>mensione del singolo elemento<br />

• la funzione qsort utilizza questa informazione anche per<br />

scambiare due valori<br />

• si deve specificare quanti sono elementi<br />

alla funzione non interessa il significato dei bit che<br />

compongono i valori da scambiare, ma soltanto la loro<br />

posizione in memoria e la <strong>di</strong>mensione<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

gli algoritmi <strong>di</strong> or<strong>di</strong>namento e <strong>di</strong> ricerca, devono poter<br />

confrontare tra loro due valori dell’insieme<br />

• per la ricerca questo serve per decidere se l’elemento<br />

analizzato corrisponde a quello da trovare e, in caso contrario,<br />

per procedere opportunamente con la ricerca<br />

• per l’or<strong>di</strong>namento, bisogna stabilire la relazione d’or<strong>di</strong>ne tra<br />

due elementi, ovvero stabilire se sono uguali oppure quale dei<br />

due e’ maggiore dell’altro<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

non esiste un unico modo per confrontare due elementi: il<br />

confronto <strong>di</strong>pende dal significato dei bit che li compongono<br />

• il confronto tra due interi e’ banale e viene fatto dal<br />

compilatore<br />

• cosi’ quello tra numeri a virgola mobile<br />

• nel caso fosse necessario confrontare elementi piu’<br />

“complessi”, per esempio una struttura composta da vari<br />

campi dal significato particolare, deve allora essere il<br />

programmatore a fornire una opportuna funzione <strong>di</strong> confronto<br />

• dati due elementi questa ritorna un co<strong>di</strong>ce che in<strong>di</strong>ca la<br />

relazione d’or<strong>di</strong>ne<br />

• l’uguaglianza per la ricerca e’ un caso particolare<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Ricerca e or<strong>di</strong>namento<br />

l’ultimo parametro <strong>di</strong> entrambe le <strong>funzioni</strong> e’ un<br />

puntatore a funzione, che punta ad una funzione definita<br />

dall’utente la quale confronta due elementi dell’insieme<br />

typedef int (*__compar_fn_t) (void *, void *);<br />

accetta come parametri i puntatori agli elementi da confrontare, e<br />

ritorna<br />

• un valore minore <strong>di</strong> 0 se il primo parametro e’ minore del<br />

secondo<br />

• 0 se sono uguali<br />

• un valore maggiore <strong>di</strong> 0 se il primo parametro e’ maggiore del<br />

secondo<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Controllo dell’esecuzione del programma<br />

• void abort (void);<br />

termina imme<strong>di</strong>atamente ed in modo anormale il programma,<br />

ed equivale alla ricezione del segnale <strong>di</strong> abort SIGABRT<br />

• void exit (int status);<br />

causa la normale terminazione del programma, ritornando il<br />

valore status<br />

• int atexit (void (*func) (void));<br />

permette <strong>di</strong> registrare una funzione la quale sara’ eseguita<br />

appena prima della normale terminazione del programma; la<br />

funzione accetta il puntatore alla funzione da richiamare<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Controllo dell’esecuzione del programma<br />

• char *getenv (char *name);<br />

restituisce la stringa che nell’ambiente <strong>di</strong> lavoro del<br />

programma e’ associata al nome fornito name, oppure NULL se<br />

non esiste alcuna stringa<br />

• int system (char *command);<br />

passa la stringa fornitale all’ambiente <strong>di</strong> lavoro per<br />

l’esecuzione del comando associato e restituisce il co<strong>di</strong>ce<br />

d’uscita del comando invocato<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


exit e atexit<br />

• atexit puo’ essere chiamata piu’ volte, per registrare piu’ <strong>di</strong><br />

una funzione per l’esecuzione al termine del programma<br />

• le <strong>funzioni</strong> registrate sono eseguite in or<strong>di</strong>ne inverso rispetto<br />

alla loro registrazione<br />

• il controllo viene restituito all’ambiente chiamante<br />

• il programma restituisce un valore numerico<br />

• generalmente in<strong>di</strong>ca lo stato del programma o la causa della<br />

sua terminazione<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Generazione <strong>di</strong> numeri casuali<br />

la generazione <strong>di</strong> numero casuali (pseudo-casuali, in realta’) si<br />

effettua utilizzando le <strong>funzioni</strong> rand() e srand<br />

la sequenza <strong>di</strong> numeri generata da rand “somiglia” ad<br />

una sequenza casuale <strong>di</strong> numeri<br />

• in realta’ e’ generata da un opportuno algoritmo<br />

• e’ un processo deterministico<br />

• tenta <strong>di</strong> “simulare” il piu’ fedelmente possibile una sequenza<br />

casuale<br />

il problema <strong>di</strong> generare numeri casuali con un computer non e’<br />

banale, e ha una estrema rilevanza in applicazioni come la<br />

crittografia, le simulazioni, ecc.<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Generazione <strong>di</strong> numeri casuali<br />

rand() ritorna un numero pseudo-casuale compreso<br />

nell’intervallo [0, RAND MAX]<br />

• e’ semplice ottenere un numero pseudo-casuale in un qualsiasi<br />

intervallo [a, b]<br />

• si utilizza opportunamente l’operatore modulo<br />

valore = a + rand() % (b - a + 1);<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Generazione <strong>di</strong> numeri casuali<br />

• il generatore <strong>di</strong> numero pseudo-casuali puo’ venire inizializzato<br />

impostando il valore del seme con la funzione srand<br />

• il seme determina quale sara’ la sequenza <strong>di</strong> numeri<br />

pseudo-casuali fornita dal generatore<br />

molto utile per ripetere in modo deterministico un<br />

programma che utilizza numeri casuali<br />

• per esempio per andare alla ricerca <strong>di</strong> comportamenti<br />

particolari che si verificano solo in seguito a determinate<br />

sequenze <strong>di</strong> numeri pseudo-casuali<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Generazione <strong>di</strong> numeri casuali<br />

#include <br />

#include <br />

int main(int argc, char **argv)<br />

{<br />

int a, b, i;<br />

int seme = 0, n = 1;<br />

switch (argc) {<br />

case 3 :<br />

sscanf(argv[2],<br />

"%d", &n);<br />

case 2 : {<br />

sscanf(argv[1],<br />

"%d", &seme);<br />

break;<br />

}<br />

case 1 : break;<br />

default : return;<br />

}<br />

/* continua... */<br />

i valori <strong>di</strong> default sono 0 per il seme e<br />

1 per il numero <strong>di</strong> lanci<br />

valuta il numero <strong>di</strong> parametri passati<br />

sulla linea <strong>di</strong> comando<br />

se sono stati passati 2 parametri, allora<br />

il secondo e’ il numero <strong>di</strong> lanci, e il<br />

primo parametro viene valutato sotto<br />

(non c’e’ break!)<br />

il valore del seme viene letto sia che<br />

il numero <strong>di</strong> parametri e’ 2 che 1 (in<br />

questo caso e’ passato solo il seme)<br />

altrimenti saranno usati i valori <strong>di</strong><br />

default<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Generazione <strong>di</strong> numeri casuali<br />

}<br />

/* ...continua */<br />

srand(seme);<br />

for (i = 0; i < n; i++) {<br />

a = 1 + rand() % 6;<br />

b = 1 + rand() % 6;<br />

printf("%d %d\n", a, b);<br />

}<br />

return 0;<br />

inizializzazione del seme<br />

un ciclo per ogni lancio<br />

primo dado<br />

secondo dado<br />

stampa il risultato<br />

il programma legge da linea <strong>di</strong> comando il seme e il numero <strong>di</strong><br />

lanci da effettuare, rispettivamente in questo or<strong>di</strong>ne; Se i parametri<br />

non vengono forniti, sono usati i valori <strong>di</strong> default<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Manipolazione <strong>di</strong> stringhe<br />

una delle librerie piu’ utili <strong>di</strong>sponibili per il<br />

linguaggio C e’ quella per la manipolazione <strong>di</strong><br />

stringhe e <strong>di</strong> porzioni <strong>di</strong> memoria<br />

sono utilizzabili includendo il file<br />

#include <br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Manipolazione <strong>di</strong> stringhe<br />

• void *memcpy (void *dest, void *src, size t n);<br />

copia n byte da partire dall’in<strong>di</strong>rizzo src in dest<br />

• void *memmove (void *dest, void *src, size t n);<br />

copia n bytes dall’in<strong>di</strong>rizzo src a dest, garantendo il corretto<br />

funzionamento nel caso in cui le aree <strong>di</strong> memoria si<br />

sovrappongano<br />

• void *memset (void *s, int c, size t n);<br />

imposta n byte al valore <strong>di</strong> c a partire dall’in<strong>di</strong>rizzo s<br />

• int memcmp (void *s1, void *s2, size t n);<br />

confronta n byte a partire dagli in<strong>di</strong>rizzi s1 e s2<br />

• void *memchr (void *s, int c, size t n);<br />

ricerca il valore c negli n byte che iniziano all’in<strong>di</strong>rizzo s<br />

• char *strcpy (char * dest, char * src);<br />

copia la stringa src in dest<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Manipolazione <strong>di</strong> stringhe<br />

• char *strncpy (char *dest, char *src, size t n);<br />

copia la stringa src in dest fino ad un massimo <strong>di</strong> n caratteri<br />

• char *strcat (char *dest, char *src);<br />

concatena (appende) la stringa src in fondo alla stringa dest<br />

• char *strncat (char *dest, char *src, size t n);<br />

concatena (appende) la stringa src in fondo alla stringa dest<br />

fino ad un massimo <strong>di</strong> n caratteri<br />

• int strcmp (char *s1, char *s2);<br />

confronta le due stringhe s1 e s2; ritorna un valore minore <strong>di</strong><br />

0 se s1 e’ minore <strong>di</strong> s2, 0 se s1 == s2 e maggiore <strong>di</strong> 0 se s1<br />

e’ maggiore <strong>di</strong> s2<br />

• int strncmp (char *s1, char *s2, size t n);<br />

confronta n caratteri delle stringhe s1 e s2; il valore ritornato<br />

e’ il medesimo <strong>di</strong> strcmp;<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


Manipolazione <strong>di</strong> stringhe<br />

• char *strchr (char *s, int c);<br />

trova la prima occorrenza <strong>di</strong> c all’interno della stringa s<br />

• char *strrchr (char *s, int c);<br />

trova l’ultima occorrenza <strong>di</strong> c all’interno della stringa s<br />

• char *strstr (char *haystack, char *needle);<br />

trova la prima occorrenza della stringa needle all’interno<br />

della stringa haystack<br />

• char *strtok (char * s, char *delim);<br />

<strong>di</strong>vide la stringa s in token delimitati dai caratteri in delim<br />

• size t strlen (char *s);<br />

ritorna la lunghezza della stringa s in byte<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria matematica<br />

la libreria matematica implementa tutte le <strong>funzioni</strong><br />

piu’ comuni per effettuare calcoli matematici<br />

il relativo file <strong>di</strong> intestazione:<br />

#include <br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria matematica<br />

<strong>funzioni</strong> trigonometriche:<br />

• double acos(double x): arcocoseno <strong>di</strong> x<br />

• double asin(double x): arcoseno <strong>di</strong> x<br />

• double atan(double x): arcotangente <strong>di</strong> x<br />

• double atan2(double x, double y): arcotangente <strong>di</strong> y/x<br />

• double cos(double x): coseno <strong>di</strong> x<br />

• double sin(double x): seno <strong>di</strong> x<br />

• double tan(double x): tangente <strong>di</strong> x<br />

attenzione: tutti gli angoli<br />

sono espressi in ra<strong>di</strong>anti, non in gra<strong>di</strong>!<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria matematica<br />

esponenziali e logaritmi<br />

• double exp(double x): esponenziale x (e x )<br />

• double log(double x): logaritmo naturale <strong>di</strong> x (ln x)<br />

• double log10(double x): logaritmo <strong>di</strong> x n base 10<br />

(log 10 x)<br />

levamento a potenza<br />

• double pow(double x, double y): calcola x y<br />

• double sqrt(double x): calcola √ x<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria matematica<br />

arrotondamento<br />

• double fmod(double x, double y): calcola il modulo x/y<br />

• double ceil(double x): restituisce il piu’ piccolo intero<br />

non minore <strong>di</strong> x<br />

• double floor(double x): restituisce il piu’ grande intero<br />

non maggiore <strong>di</strong> x<br />

• double fabs(double x): restituisce il valore assoluto <strong>di</strong> x<br />

• double round(double x): arrotonda x all’intero piu’ vicino<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>


La libreria matematica<br />

costanti utili nei calcoli matematici piu’ comuni:<br />

#define M_E 2.7182818284590452354 /* e */<br />

#define M_LOG2E 1.4426950408889634074 /* log_2 e */<br />

#define M_LOG10E 0.43429448190325182765 /* log_10 e */<br />

#define M_LN2 0.69314718055994530942 /* log_e 2 */<br />

#define M_LN10 2.30258509299404568402 /* log_e 10 */<br />

#define M_PI 3.14159265358979323846 /* pi */<br />

#define M_PI_2 1.57079632679489661923 /* pi/2 */<br />

#define M_PI_4 0.78539816339744830962 /* pi/4 */<br />

#define M_1_PI 0.31830988618379067154 /* 1/pi */<br />

#define M_2_PI 0.63661977236758134308 /* 2/pi */<br />

#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */<br />

#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */<br />

#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */<br />

Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> <strong>Librerie</strong> <strong>di</strong> <strong>funzioni</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!