Fondamenti di Informatica Librerie di funzioni - Robotica
Fondamenti di Informatica Librerie di funzioni - Robotica
Fondamenti di Informatica Librerie di funzioni - Robotica
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>