Algoritmos e Estruturas de dados - Bibliotecas - UTFPR
Algoritmos e Estruturas de dados - Bibliotecas - UTFPR
Algoritmos e Estruturas de dados - Bibliotecas - UTFPR
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Algoritmos</strong> e <strong>Estruturas</strong><br />
<strong>de</strong> <strong>dados</strong><br />
<strong>Bibliotecas</strong><br />
Prof. Dr. Fábio Rodrigues <strong>de</strong> la Rocha<br />
(<strong>Bibliotecas</strong>) 1 / 18
<strong>Bibliotecas</strong> - Introdução<br />
Definição<br />
<strong>Bibliotecas</strong> são conjuntos <strong>de</strong> funções “empacotadas” na forma <strong>de</strong> um<br />
arquivo. Se <strong>de</strong>sejarmos utilizar uma <strong>de</strong>stas funções, basta informar<br />
que o seu fonte C utilizará uma <strong>de</strong>terminada biblioteca. Mas vamos<br />
aos <strong>de</strong>talhes.<br />
(<strong>Bibliotecas</strong>) 2 / 18
<strong>Bibliotecas</strong> - Introdução<br />
O GCC (compilador utilizado internamente pelo co<strong>de</strong>blocks) é na<br />
verda<strong>de</strong> um conjunto <strong>de</strong> ferramentas que são executadas sem que o<br />
programador saida. De fato, existem vários estágios na compilação <strong>de</strong><br />
um fonte C até a geração <strong>de</strong> um executável.<br />
(<strong>Bibliotecas</strong>) 3 / 18
<strong>Bibliotecas</strong> - Introdução<br />
Pré-processador (cpp) - Etapa inicial que trata as diretrizes<br />
#<strong>de</strong>fine, #inclu<strong>de</strong>, #ifn<strong>de</strong>f, etc.<br />
veja o que ocorre ao executarmos o cpp teste.c on<strong>de</strong><br />
teste.c é:<br />
✞<br />
1 int main ( void ) {<br />
2 printf (" teste ");<br />
3 return (1) ;<br />
4 }<br />
✝ ✆<br />
É claro que este fonte .C precisa do<br />
#inclu<strong>de</strong> então execute novamente o<br />
cppcom o fonte .c que faz um inclu<strong>de</strong> e veja a<br />
diferença.<br />
(<strong>Bibliotecas</strong>) 4 / 18
✞<br />
1 # inclu<strong>de</strong> <br />
2 # if<strong>de</strong>f USA_MENSAGEM<br />
3 void mostra ( void ) {<br />
4 printf (" MSG \n");<br />
5 printf ("Oi");<br />
6 }<br />
7 # else<br />
8 void mostra ( void ) {<br />
9 printf (" NAO MSG \n");<br />
10 printf ("Oi");<br />
11 }<br />
12 # endif<br />
13 int main ( void ) {<br />
14 printf (" teste \n");<br />
15 mostra ();<br />
16 return (1) ;<br />
17 }<br />
✝ ✆<br />
(<strong>Bibliotecas</strong>) 5 / 18
<strong>Bibliotecas</strong> - Introdução<br />
Compilador (cc) - Transforma as instruções C em instruções<br />
assembly, tipicamente gera um arquivo .s (teste chamar<br />
o gcc teste.c -S<br />
Montador - transforma o arquivo com instruções assembly em um<br />
arquivo compilado .o, utiliza a ferramente gas(gnu<br />
assembler) ou as caso o gnu assembler não exista.<br />
Ligador Os módulos .ogerados pelo montador são aglutinadas<br />
para gerar o arquivo executável. Nesta etapa é que as<br />
bibliotecas são também são adionadas.<br />
(<strong>Bibliotecas</strong>) 6 / 18
Trabalhando com múltiplos arquivos .c<br />
menu.c<br />
menu.h<br />
mostra.c<br />
mostra.h<br />
principal.c<br />
lista.c<br />
lista.h<br />
pilha.c filas.c<br />
pilha.h<br />
filas.h<br />
(<strong>Bibliotecas</strong>) 7 / 18
✞<br />
1 // PRINCIPAL .C<br />
2 # inclu<strong>de</strong> " lista .h"<br />
3 # inclu<strong>de</strong> " filas .h"<br />
4 # inclu<strong>de</strong> " pilha .h"<br />
5 # inclu<strong>de</strong> " menu .h"<br />
6<br />
7 int main ( void )<br />
8 {<br />
9 Tipo_Lista a; Tipo_Pilha b; Tipo_Fila c;<br />
10<br />
11 inicializa_lista (&a);<br />
12 inicializa_pilha (&b);<br />
13 inicializa_fila (&c);<br />
14<br />
15 mostra_menu (" Operacoes com listas ");<br />
16 insere_lista (&a, 123) ;<br />
17 insere_lista (&a, 23) ;<br />
18 insere_lista (&a, 435) ;<br />
19<br />
20 insere_pilha (&b, 234) ;<br />
21 mostra_lista (a);<br />
22 return 0;<br />
23 }<br />
✝ ✆<br />
Código:principal.c<br />
(<strong>Bibliotecas</strong>) 8 / 18
✞<br />
1 // MENU .C<br />
2 # inclu<strong>de</strong> " mostra .h"<br />
3 # inclu<strong>de</strong> " menu .h"<br />
4<br />
5 void mostra_menu ( char st [] )<br />
6 {<br />
7 printf (" ************************************** \n");<br />
8 escreve_centralizado (st , 40) ;<br />
9 printf (" ************************************** \n\n");<br />
10 }<br />
✝ ✆<br />
Código:menu.c<br />
✞<br />
1 // MENU .H<br />
2 # ifn<strong>de</strong>f _MENU_<br />
3 # <strong>de</strong>fine _MENU_<br />
4 # inclu<strong>de</strong> <br />
5<br />
6 void mostra_menu ( char st [] );<br />
7<br />
8 # endif<br />
✝ ✆<br />
Código:menu.h<br />
(<strong>Bibliotecas</strong>) 9 / 18
✞<br />
1 // MOSTRA .C<br />
2 # inclu<strong>de</strong> " mostra .h"<br />
3 void escreve_centralizado ( char palavra [] , int tamanho_maximo ) {<br />
4 int x, y;<br />
5 x= strlen ( palavra );<br />
6 x = ( tamanho_maximo -x) /2;<br />
7<br />
8 for (y =1;y
✞<br />
1 // LISTA .H<br />
2 # ifn<strong>de</strong>f _LISTA_<br />
3 # <strong>de</strong>fine _LISTA_<br />
4 # inclu<strong>de</strong> < stdlib .h><br />
5 # inclu<strong>de</strong> <br />
6<br />
7 struct tipo_elemento {<br />
8 int valor ;<br />
9 struct tipo_elemento * proximo ;<br />
10 struct tipo_elemento * anterior ;<br />
11 };<br />
12 type<strong>de</strong>f struct {<br />
13 int qtd ;<br />
14 struct tipo_elemento *fim , * inicio ;<br />
15 } Tipo_Lista ;<br />
16 void inicializa_lista ( Tipo_Lista *a);<br />
17 void insere_lista ( Tipo_Lista *a, int v);<br />
18 void mostra_lista ( Tipo_Lista m);<br />
19 void mostra_elemento ( struct tipo_elemento * tmp );<br />
20 struct tipo_elemento * pesquisa_lista ( Tipo_Lista a, int alvo );<br />
21 void <strong>de</strong>saloca_todos_lista ( Tipo_Lista *a);<br />
22 void elimina ( Tipo_Lista *a, struct tipo_elemento * ponteiro_alvo );<br />
23 # endif<br />
✝ ✆<br />
Código:lista.h Código:lista.c<br />
(<strong>Bibliotecas</strong>) 11 / 18
✞<br />
1 // PILHA .H<br />
2 # ifn<strong>de</strong>f _PILHA_<br />
3 # <strong>de</strong>fine _PILHA_<br />
4<br />
5 # inclu<strong>de</strong> <br />
6 # inclu<strong>de</strong> < stdlib .h><br />
7<br />
8 type<strong>de</strong>f struct {<br />
9 struct tipo_elemento * topo ;<br />
10 int qtd ;<br />
11 } Tipo_Pilha ;<br />
12<br />
13<br />
14 void inicializa_pilha ( Tipo_Pilha *p);<br />
15 void insere_pilha ( Tipo_Pilha *p, int v);<br />
16 int remove_pilha ( Tipo_Pilha *p);<br />
17 int eh_vazia_pilha ( Tipo_Pilha p);<br />
18<br />
19 # endif<br />
✝ ✆<br />
Código:pilha.h Código:pilha.c<br />
(<strong>Bibliotecas</strong>) 12 / 18
✞<br />
1 // FILAS .H<br />
2 # ifn<strong>de</strong>f _FILAS_<br />
3 # <strong>de</strong>fine _FILAS_<br />
4<br />
5 # inclu<strong>de</strong> <br />
6 # inclu<strong>de</strong> < stdlib .h><br />
7<br />
8 # <strong>de</strong>fine VERDADE 1<br />
9 # <strong>de</strong>fine FALSO 0<br />
10<br />
11<br />
12 type<strong>de</strong>f struct {<br />
13 struct tipo_elemento * inicio ;<br />
14 struct tipo_elemento * fim ;<br />
15 int qtd ;<br />
16 } Tipo_Fila ;<br />
17<br />
18 void inicializa_fila ( Tipo_Fila *f);<br />
19 void insere_fila ( Tipo_Fila *d, int x);<br />
20 int retira_fila ( Tipo_Fila *f);<br />
21 int eh_vazia_fila ( Tipo_Fila f);<br />
22<br />
23 # endif<br />
✝ ✆<br />
Código:filas.h Código:filas.c<br />
(<strong>Bibliotecas</strong>) 13 / 18
Compilando e gerando arquivos objeto<br />
✞<br />
1 gcc -c menu .c<br />
2 gcc -c principal .c<br />
3 gcc -c mostra .c<br />
4 gcc -c lista .c<br />
5 gcc -c filas .c<br />
6 gcc -c pilha .c<br />
7 // Agora junta tudo num executavel " saida "<br />
8 gcc -o saida . exe menu .o principal .o mostra .o<br />
lista .o filas .o pilha .o<br />
✝ ✆<br />
Código:compilando<br />
(<strong>Bibliotecas</strong>) 14 / 18
Criando <strong>Bibliotecas</strong><br />
✞<br />
1 gcc -c menu .c<br />
2 gcc -c mostra .c<br />
3 gcc -c lista .c<br />
4 gcc -c pilha .c<br />
5 gcc -c filas .c<br />
6<br />
7 // Cria uma biblioteca com o nome " libestruturas_<strong>dados</strong> .a"<br />
8 ar rs libestruturas_<strong>dados</strong> .a lista .o pilha .o filas .o<br />
9<br />
10 // mostra quais arquivos objeto existem <strong>de</strong>ntro <strong>de</strong> uma biblioteca<br />
11 ar -t libestruturas_<strong>dados</strong> .a<br />
12<br />
13 // vamos ver o que existe <strong>de</strong>ntro da biblioteca matematica do C ?<br />
14 ar -t / usr / lib /i386 - linux - gnu / libm .a<br />
15<br />
16 // compila o programa principal , junta com a biblioteca e gera o executavel<br />
17 // saida<br />
18 gcc principal .c - lestruturas_<strong>dados</strong> menu .o mostra .o -o saida<br />
19 // Como as bibliotecas s o procuradas num d i r e t r i o p a d r o a linha<br />
20 // acima g e r a r um erro . Use gcc principal .c -L./ - lestruturas_<strong>dados</strong> menu .o mostra .o<br />
✝<br />
-o saida para procurar no diretorio corrente<br />
✆<br />
Código:criando bibliotecas<br />
(<strong>Bibliotecas</strong>) 15 / 18
Makefile<br />
Definição<br />
O Makefile é um arquivo texto que diz como um conjunto <strong>de</strong> arquivos<br />
fonte (aplicação) <strong>de</strong>ve ser compilado. O Makefile <strong>de</strong>ve ser criado no<br />
mesmo diretório on<strong>de</strong> esttão os arquivos .c e .h. e será lido por um<br />
programa chamado make que <strong>de</strong>ve ser digitado na linha <strong>de</strong> comando.<br />
Perceba que não é passado qual arquivo <strong>de</strong>ve ser lido, o programa<br />
make já sabe que será o Makefile que existir no diretório corrente.<br />
✞<br />
1 frr@frr - <strong>de</strong>sktop :~/ <strong>UTFPR</strong> / Disciplinas /2011 -2/ AED / fontes / multiplos$ make<br />
2 gcc -c menu .c<br />
3 gcc -c principal .c<br />
4 gcc -c mostra .c<br />
5 gcc -c lista .c<br />
6 gcc -c filas .c<br />
7 gcc -c pilha .c<br />
8 gcc -o saida . exe menu .o principal .o mostra .o lista .o filas .o pilha .o<br />
✝ ✆<br />
(<strong>Bibliotecas</strong>) 16 / 18
Makefile<br />
✞<br />
1 COMPILADOR = gcc<br />
2 APAGA =rm -f<br />
3 saida . exe : menu .o principal .o mostra .o lista .o filas .o pilha .o<br />
4 $( COMPILADOR ) -o saida . exe menu .o principal .o mostra .o lista .o filas .o pilha .o<br />
5<br />
6 principal .o: principal .c menu .h lista .h filas .h pilha .h<br />
7 $( COMPILADOR ) -c principal .c<br />
8<br />
9 menu .o: menu .c menu .h mostra .h<br />
10 $( COMPILADOR ) -c menu .c<br />
11<br />
12 mostra .o: mostra .c mostra .h<br />
13 $( COMPILADOR ) -c mostra .c<br />
14<br />
15 lista .o: lista .c lista .h <strong>de</strong>finicoes .h<br />
16 $( COMPILADOR ) -c lista .c<br />
17<br />
18 filas .o: filas .c filas .h <strong>de</strong>finicoes .h<br />
19 $( COMPILADOR ) -c filas .c<br />
20<br />
21 pilha .o: pilha .c pilha .h <strong>de</strong>finicoes .h<br />
22 $( COMPILADOR ) -c pilha .c<br />
23<br />
24 clean :<br />
25 $( APAGA ) saida . exe *.o<br />
✝ ✆<br />
(<strong>Bibliotecas</strong>) 17 / 18
Makefile<br />
Código:Makefile<br />
(<strong>Bibliotecas</strong>) 18 / 18