| Laboratório de Bioinformática - LBI: veja nossos projetos |
Solução:
Veja abaixo os arquivos complexo.h
e complexo.c.
/*----------------------------------------
Tipo "complexo"
----------------------------------------*/
struct compl {
double a;
double b;
};
typedef struct compl * complexo;
complexo soma (complexo x, complexo y);
complexo diferenca (complexo x, complexo y);
complexo produto (complexo x, complexo y);
complexo quociente (complexo x, complexo y);
double modulo (complexo x);
#include "complexo.h" #include/* para malloc, NULL */ #include /* para sqrt */ complexo soma (complexo x, complexo y) { complexo r; r = (complexo)malloc(sizeof(struct compl)); if (r == NULL) { return NULL; } else { r->a = x->a + y->a; r->b = x->b + y->b; } return r; } complexo diferenca (complexo x, complexo y) { complexo r; r = (complexo)malloc(sizeof(struct compl)); if (r == NULL) { return NULL; } else { r->a = x->a - y->a; r->b = x->b - y->b; } return r; } complexo produto (complexo x, complexo y) { complexo r; r = (complexo)malloc(sizeof(struct compl)); if (r == NULL) { return NULL; } else { r->a = x->a * y->a - x->b * y->b; r->b = x->b * y->a + x->a * y->b; } return r; } /*---------------------------------------- Na funcao abaixo, deveria haver um modo melhor de indicar que o divisor e' zero (no momento retorna-se NULL). ----------------------------------------*/ complexo quociente (complexo x, complexo y) { complexo r; double m; r = (complexo)malloc(sizeof(struct compl)); if (r == NULL) { return NULL; } else { m = modulo(x); if (m == 0) { return NULL; } else { r->a = (x->a * y->a + x->b * y->b)/m; r->b = (x->b * y->a - x->a * y->b)/m; } } return r; } double modulo (complexo x) { return sqrt(x->a * x->a + x->b * x->b); }
n
do vetor de entrada:
0. void SelectionSort(int *v, int n) {
1. int i, j, k, t;
2. for(i=0; i<n-1; i++) {
3. j=i;
4. for(k=j+1; k<n; k++)
5. if (v[k] < v[j] )
6. j=k;
7. t=v[i]; v[i]=v[j]; v[j]=t;
8. }
9. }
Solução: Faremos uma análise apenas da ordem de grandeza do número de operações. As linhas 0, 1 e 9 são executadas uma vez só. As linhas 2, 3 e 7 são executadas O(n) vezes. As linhas 4 e 5 são executadas O(n2) vezes, pois trata-se de somar (n-1)+(n-2)+...+1, o que pode ser obtido usando-se a fórmula da soma de uma P.A. Finalmente, não dá para avaliar exatamente o número de vezes que a linha 6 será executada, pois depende dos dados, mas certamente não passará de O(n2).
Logo, a complexidade total é O(n2).
int i; int v[10]; int *p;
Quais dos seguintes comandos estão corretos, quais dão erros de compilação, e quais dão erros de execução? Suponha que os comandos são executados na ordem dada, e que os que dão erro não afetam os outros.
1. p = v; 2. i = *v; 3. p += 3; 4. v = p - 2; 5. *i = v[0]; 6. v[2] = p[1]; 7. p[7] = i; 8. *(v + 1) = i; 9. i = p + 2;
Solução:
p como v são do tipo int
*.i como *v são do tipo
int. A expressão *v equivale a
v[0].p é avançado três posições. O
compilador sabe que ele é um ponteiro para inteiros e portanto vai
avançá-lo exatamente da quantidade de memória ocupada por três
inteiros. Por exemplo, se um inteiro ocupa 4 bytes numa dada
implementação, o ponteiro avançará 12 bytes.v é constante e portanto não
pode ter seu valor alterado. O lado esquerdo da atribuição está ok, e
os tipos são compatíveis, mas dá erro pois v é
constante.*i não pode ser executado,
já que i não é ponteiro.int. A expressão
p[1] equivale a *(p+1).p[7] vai parar depois do final
do vetor v. De resto, estaria ok.*(v + 1) equivale a
v[1].i é int e
p + 2 é int *.
p é int *, qual é o tipo de
*p ? E de &p ?
Solução:
*p é int **.
&p é int.
Pilha que deve
poder ser usado conforme o seguinte programa de teste:
Pilha p;
InicializaPilha(&p);
for(i=1; i<=10; i++) {
if (Empilhou(&p, i)) {
printf("Empilhou %d ok\n", i);
}
}
while (!Vazia(&)) {
if (Desempilhou(&p, &i)) {
printf("%d\n", i);
} else {
printf("Erro ao desempilhar\n");
}
}
LiberaPilha(&p);
Implemente esta estrutura de dados "pilha de inteiros" em C usando vetor.
Depois, implemente esta mesma estrutura em C usando lista ligada.
Solução:
Veja aqui o programa teste testaPilha.c. Devem sair 10 mensagens empilhando os números de 1 a 10, depois os mesmos números na ordem inversa.
A implementação com vetor está aqui: pilha.h, pilha.c. Para compilá-la e testá-la, use:
gcc testePilha.c pilha.c -o testePilhaV ./testePilhaV
A implementação com lista ligada está aqui: pilha.h, pilha.c. Para compilá-la e testá-la, use:
gcc testePilha.c pilha.c -o testePilhaL ./testePilhaL