Algoritmos e Estruturas de Dados [LEEC] (2024/2025)
Biblioteca
Compilar na consola um programa que usa a biblioteca
- Crie uma pasta para o seu projeto e lá dentro:
- crie uma subpasta biblioteca com os ficheiros da biblioteca - basta descarregar e expandir o arquivo biblioteca.zip;
- crie uma subpasta programa com os ficheiros do seu programa - no Mooshak, só se submete esta pasta comprimida.
- Para compilar, dê este comando dentro da pasta do projeto:
gcc -Wall -Ibiblioteca -Iprograma biblioteca/*.c programa/*.c -o prog.exe
Configuração dum projeto Code::Blocks que usa a biblioteca
- Entre no Code::Blocks para criar um projeto vazio, mas com um nome adequado.
Há vantagem em, no último passo da criação do projeto, desativar a configuração "Release" e manter apenas a configuração "Debug".
Depois de criar o projeto, saia.
- Dentro da pasta do projeto:
- crie uma subpasta biblioteca com os ficheiros da biblioteca - basta descarregar e expandir o arquivo biblioteca.zip;
- crie uma subpasta programa com os ficheiros do seu programa - no Mooshak, só se submete esta pasta comprimida.
- Volte a entrar no Code::Blocks e adicione ao projeto o conteúdo das duas pastas.
- Agora precisa de ensinar o Code::Blocks a encontrar os ficheiros ".h".
Faça:
- Project > Build options... > Debug > Search directories
- Add > Escreva biblioteca > OK
- Add > Escreva programa > OK
- OK.
- Aproveite para, em Compiler Flags, ativar as flags de compilação "-Wall" e "-Wextra", marcando estas opções:
- Enable all common compiler warnings (overrides many other settings) [-Wall]
- Enable extra compiler warnings [-Wextra]
Porquê a pasta "alternativas"?
Muitas vezes, dá jeito adicionar a um projeto Code::Blocks todos os ficheiros da biblioteca duma só vez. Mas isto só é viável se, no meio de todos os ficheiros instalados, não ocorrerem duas implementações do mesmo TAD. Isso causaria erros de "multiple definition of ...".
É por isso que, quando há diferentes implementações do mesmo TAD na biblioteca, escolhe-se uma delas para figurar na diretoria principal, e as outras são relegadas para a pasta "alternativas".
Depois de carregar toda a biblioteca no projeto, temos sempre a liberdade de remover uma determinada implementação e trocá-la por outra contida na pasta "alternativas".
Alteração importante a partir da versão 5
Após comentários/dúvidas de alguns alunos, foi decidido, na biblioteca, tornar públicas as implementações das funções universais.
- Assim, por exemplo, para eliminar uma sequência s, pode agora escrever-se destroiSequencia(s) ou destroiTudoSequencia(s).
- Continua a ser necessário usar destroi(x) ou destroiTudo(x) apenas nos contextos genéricos, onde não se conhece o tipo de x.
- Para confirmar esta alteração, olhe por exemplo para o TAD Int:
- no ficheiro "Int.h", foram acrescentados os protótipos das implementações das funções universais;
- no ficheiro "Int.c", essas implementações perderam a palavra static.
Sem relação com a alteração anterior, aproveitou-se para repensar a função criaInfo, que passou a garantir a unicidade do bloco informativo de cada tipo.
- A forma anterior de usar essa função continua a funcionar, mas...
- Se quisermos preparar o tipo Aluno para os seus objetos poderem serem guardados em coleções genéricas, eis a nova forma recomendada de escrever a função criaAluno:
Aluno criaAluno(int num){
Aluno a = malloc(sizeof(struct Aluno));
if (a == NULL) semMemoria();
a->info = criaInfo("Aluno", destroiAluno, NULL, comparaAluno, NULL, textoAluno); // NOVA MANEIRA
a->numero = num;
a->p = 0;
a->t1 = 0;
a->t2 = 0;
return a;
}
Toda a documentação de AED adaptou-se a estas alterações. A ideia é tornar mais simples o uso das coleções genéricas.
Arquivo completo - versão 9 - 13/mai/2025
base
simples
iterador
sequencia
dicionario
pilha
fila