Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Modularizao em C
Denominados de mdulos
Para tanto, usa-se um ligador ou link-editor Resultado: um nico arquivo em linguagem de mquina
Modularizao em C
Mdulos so muito teis para construir bibliotecas de funes interrelacionadas. Por exemplo:
Em C, preciso listar no incio de cada mdulo aquelas funes de outros mdulos que sero utilizadas:
Exemplo: considere um arquivo STR.c contendo funes para manipulao de strings, dentre elas:
int comprimento (char* strg) void copia (char* dest, char* orig)
Modularizao em C
Exemplo (cont): Qualquer mdulo que utilizar essas funes dever incluir no incio o cabealho das mesmas, como abaixo.
/* Programa Exemplo.c */ #include <stdio.h> int comprimento (char* str); void copia (char* dest, char* orig); void concatena (char* dest, char* orig); int main (void) { char str[101], str1[51], str2[51]; printf("Entre com uma seqncia de caracteres: "); scanf(" %50s[^\n]", str1); printf("Entre com outra seqncia de caracteres: "); scanf(" %50s[^\n]", str2); copia(str, str1); return 0; } concatena(str, str2);
4
Modularizao em C
Exemplo (cont):
A partir desses dois fontes (Exemplo.c e STR.c), podemos gerar um executvel compilando cada um separadamente e depois ligando-os Por exemplo, com o compilador Gnu C (gcc) utilizaramos a seguinte seqncia de comandos para gerar o arquivo executvel Teste.exe:
> gcc c STR.c
> gcc c Exemplo.c > gcc o Teste.exe STR.o Exemplo.o
Questo:
preciso inserir manualmente e individualmente todos os cabealhos de todas as funes usadas por um mdulo?
Modularizao em C
Soluo
cabealhos das funes oferecidas pelo mdulo e, eventualmente, os tipos de dados que ele exporta
typedefs, structs, etc.
Exemplo:
Modularizao em C
/* Arquivo STR.h */ /* Funo comprimento: Retorna o no. de caracteres da string str */ int comprimento (char* str);
/* Funo copia:
Copia a string orig para a string dest */ void copia (char* dest, char* orig); /* Funo concatena: Concatena a string orig na string dest */ void concatena (char* dest, char* orig);
7
Modularizao em C
/* Programa Exemplo.c */
#include <stdio.h> #include "STR.h" int main (void) { char str[101], str1[51], str2[51];
concatena(str, str2);
TADs em C
Mdulos podem ser usados para definir um novo tipo
implementao
Quem usa o tipo abstrato precisa apenas conhecer a funcionalidade que ele implementa, no a forma como ele implementado Facilita manuteno e re-uso de cdigos, entre outras vantagens
TADs em C: Exemplo
/* TAD: Matriz m por n (m e n >= 1)*/ struct matriz { int lin; int col; float* v; }; /* Tipo Exportado */ typedef struct matriz Matriz; /* Funes Exportadas */ /* Funo cria - Aloca e retorna matriz m por n */
Arquivo matriz.h
/* Continua... */
10
TADs em C: Exemplo
/* Continuao... */
*/
*/
*/
Arquivo matriz.h
11
TADs em C: Exemplo
#include <stdlib.h> /* malloc, free, exit */ #include <stdio.h> /* printf */ #include "matriz.h"
Arquivo matriz.c
12
TADs em C: Exemplo
/* Continuao... */ Matriz* cria (int m, int n) { Matriz* mat = (Matriz*) malloc(sizeof(Matriz));
mat
lin col
return mat;
}
mat m n v
13
Arquivo matriz.c
TADs em C: Exemplo
/* Continuao... */
float acessa (Matriz* mat, int i, int j) { int k; /* ndice do elemento no vetor armazenamento por linha*/ if (i<1 || i>=mat->lin || j<1 || j>=mat->col) { printf("Acesso invlido!\n"); exit(1);
} k = (i-1)*mat->col + j - 1;
return mat->v[k];
}
Arquivo matriz.c
14
TADs em C: Exemplo
/* Continuao... */
void atribui (Matriz* mat, int i, int j, float v) { int k; /* ndice do elemento no vetor */ if (i<1 || i>=mat->lin || j<1 || j>=mat->col) { printf("Atribuio invlida!\n"); exit(1);
} k = (i-1)*mat->col + j -1; mat->v[k] = v; }
Arquivo matriz.c
15
16
// verificando se a insero foi feita corretamente a = acessa(M,1,2); b = acessa(M,2,3); c = acessa(M,3,5); d = acessa(M,5,1); printf ("M[1][2]: printf ("M[2][3]: printf ("M[3][5]: printf ("M[5][1]: %4.2f %4.2f %4.2f %4.2f \n", a); \n", b); \n", c); \n", d);
system("PAUSE"); return 0; }
17
TADs em C: Exemplo
/* ... continua */ Racional Soma(Racional R1, Racional R2); /* Soma dois nmeros racionais R1 e R2 e retorna o resultado */ Racional Multiplica(Racional R1, Racional R2); /* Multiplica dois nmeros racionais R1 e R2 e retorna o resultado */ int TestaIgualdade(Racional R1, Racional R2); /* Verifica se 2 nmeros racionais R1 e R2 possuem numeradores e denominadores iguais. Retorna 1 nesse caso e 0 caso contrrio */
Arquivo Racionais.h
19
TADs em C: Exemplo
Implementao (Arquivo Racionais.c):
20
TADs em C: Exemplo
/* Racionais.c */ #include Racionais.h /* Funes Exportadas */ ...
Arquivo Racionais.c
21
TADs em C: Exerccio
#include <stdio.h> #include "Racionais.h" void main(void){ /* Teste do TAD: Exerccio... */ }
Arquivo Teste_Racionais.c
22
TADs em C: Observaes
Os tipos de dados e funes descritos no arquivo de cabealho
Racionais.h so exportados para os mdulos que incluem esse arquivo via #include "Racionais.h"
interna do TAD no devem constar no arquivo de cabealho, apenas no arquivo de implementao (Racionais.c)
no so exportados ao cliente
so inacessveis para quem utiliza o TAD cliente s precisa/deve ter acesso verso compilada de Racionais.c
23
Exerccios
Escrever um programa C que executa operaes sobre
elementos como tipo base, ao invs de um struct com dois campos como foi feito
O que preciso alterar no programa do item anterior para essa nova verso do TAD?
igualdade alternativa, que verifique a igualdade dos dois nmeros sem a restrio de que seus numeradores e denominadores devam ser iguais para retorno verdadeiro
24
{1,4} ok {1,4,1} no ok
25
Representao dos valores do tipo Implementao das operaes Construo dos arquivos .h e .c
27
Conjuntos em C
Como representar um conjunto de inteiros em C?
Supondo
28
Conjuntos em C
Como representar um conjunto de inteiros em C?
# define N 100 //por exemplo, conjunto que tem nmeros de 0 a 99 int conjunto[N]; //conjunto[i]=1 se i est no conjunto; 0, caso contrrio
Ex.: C = {4, 2, 1}
0 0 1 1 2 1 3 0 4 1 5 0 99 0
Ex. C = { }
0 0 1 0 2 0 3 0 4 0 5 0 99 0
29
Conjunto de Operaes?
30
Operaes usuais
Unio(A,B,C) Interseco(A,B,C) Diferena(A,B,C) Membro(x,A) Cria_Conj_Vazio(A) Insere(x,A) Remove(x,A) Atribui(A,B) Min(A) Max(A) Igual(A,B)
31
32
33
exemplo: Min({2,3,1}) = 1
Max(A): Similar a Min(A) s que retorna o mximo do
conjunto
Igual(A,B): retorna true se e somente se os conjuntos
34
Exerccio
Em duplas, definir o arquivo conjunto.h
35
TADs em C: Exemplo
/* TAD: conjunto*/ /* Tipo Exportado */ Typedef int elem; struct conjunto { //usar struct interessante para encapsular// elem* v; //vetor booleano que armazenar o conjunto sendo que //o ndice corresponde ao elemento, e o valor true se o elemento est // no conjunto, false caso contrrio }; typedef struct conjunto Conjunto;
/* Funes Exportadas */ /* Funo unio Une os elementos do conjunto A e B em um conjunto C */ void uniao (Conjunto *A, Conjunto *B, Conjunto *C); /* Funo Interseco Armazena em C os mesmos elementos que esto no conjunto A e B*/ void interseccao (Conjunto *A, Conjunto *B, Conjunto *C); /* Funo libera Libera a memria de um conjunto */
Arquivo conjunto.h
36
TADs em C: Exemplo
/* Continuao... */ /* Funo diferena atribui ao conjunto C a diferena entre os conjuntos A e B */ void diferena(Conjunto *A, Conjunto *B, Conjunto *C); /* Funo membro verifica se o elemento elem est no Conjunto A */ int membro(elem x, Conjunto *A); /* Funo Cria_Conj_Vazio Cria um conjunto vazio e retorna o conjunto criado. A varivel erro retorna 0 se o conjunto foi criado corretamente e 0 caso contrario. Deve ser usado como primeira operao sobre um conjunto. */ Conjunto *Cria_Conj_Vazio (int *erro);
/* Funo insere insere o elemento elem no conjunto A e retorna se a execuo foi realizada com sucesso(1) ou no(0)*/ int insere(elem x, Conjunto *A); Arquivo conjunto.h
37
TADs em C: Exemplo
/* Continuao... */ /* Funo remove (diferente da de PASCAL) remove o elemento elem do Conjunto A, retorna 1 se o elemento foi retirado e 0 se o elemento no est no conjunto */ int remove(elem x, Conjunto *A); /* Funo copia faz a copia do conjunto A para o B*/ void copia(Conjunto *A, Conjunto *B); /* Funo min retorna o menor elemento do conjunto A se o conjunto est vazio retorna TAM */ elem min(Conjunto *A); Arquivo conjunto.h
38
TADs em C: Exemplo
/* Continuao... */ /* Funo max retorna o maior elemento do conjunto A - se o conjunto est vazio retorna TAM */ elem max(Conjunto *A); /* Funo igual verifica se o conjunto A igual a Conjunto B */
Arquivo conjunto.h
TADs em C: Exemplo
#include <stdlib.h> /* malloc, free, exit */ #include <stdio.h> /* printf */ #include conjunto.h
40
Arquivo conjunto.c
TADs em C: Exemplo
/* Continuao... */ void uniao (Conjunto *A, Conjunto *B, Conjunto *C) { int i;// varivel auxiliar para realizao do loop for(i = 0; i<TAM;i++){ if (A->v[i]==1) || (B->v[i]==1) { C->v[i]=1; } }
} void interseccao(Conjunto *A, Conjunto *B, Conjunto *C) { int i; // varivel auxiliar para realizao do loop
for(i = 0; i<TAM;i++){ if (A->v[i]==1) && (B->v[i]==1) { C->v[i]=1; } }
41
Arquivo conjunto.c
TADs em C: Exemplo
/* Continuao... */ /* faz o conjunto vazio ser o valor para a varivel conjunto A. Deve ser usado como primeira operao sobre um conjunto.*/ Conjunto* Cria_Conj_Vazio(int *erro) {
int i; // varivel auxiliar para realizao do loop Conjunto* conj = (Conjunto*) malloc(sizeof(Conjunto)); if (conj == NULL) {
erro= 1; exit(1); } conj->v = (int*)malloc(TAM*sizeof(int));
conj
for(i=0;i<TAM;i++){
conj->v[i]=0; } erro = 0; return conj; }
conj
TAM-1
Arquivo conjunto.c
42
TADs em C: Exemplo
/* Continuao... */ int insere(elem x, Conjunto *A) {
return 1;
}
Arquivo conjunto.c
43
43
TADs em C: Exemplo
/* Continuao... */ int remove(elem x, Conjunto *A) { if (x>=TAM || x<0 ||(A->v[x]==0)) { return 0; } A->v[x]=0; return 1; }
Arquivo conjunto.c
44
44
TADs em C: Exemplo
/* Continuao... */
elem min (Conjunto *A) { int i; for(i = 0; i<TAM;i++){ if (A->v[i]==1) { return i; } } return TAM; // condio de conjunto vazio } elem max (Conjunto *A) { int i; for(i = TAM - 1; i>-1;i--){ if (A->v[i]==1) { return i; } } return TAM; // condio de conjunto vazio }
Arquivo conjunto.c
45
TADs em C: Exemplo
/* Continuao... */ void diferenca(Conjunto *A, Conjunto *B, Conjunto *C){ int i; // varivel auxiliar para realizao do loop
for(i = 0; i<TAM;i++){ if (A->v[i]==1) && (B->v[i]==0) { C->v[i]=1; } }
46
Arquivo conjunto.c
TADs em C: Exemplo
/* Continuao... */
47
Arquivo conjunto.c
47
.h e .c). Sabe-se que um nmero complexo possui a forma: a + bi, onde a a parte real e b a parte imaginria, ambas representadas por valores reais Operaes: Criao de um nmero complexo z a partir de dois reais, a e b. Adio: se z1 = a + bi e z2 = c + di, ento z1 + z2 = a + c + (b + d)i Multiplicao : z1*z2 = (ac - bd) + (ad + cb)i
48