13.12.2012 Views

Algoritmos e Estruturas de dados - Bibliotecas - UTFPR

Algoritmos e Estruturas de dados - Bibliotecas - UTFPR

Algoritmos e Estruturas de dados - Bibliotecas - UTFPR

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!