Pretende-se uma nova versão do programa que permita gerir as notas dos alunos duma turma.
Na versão original do programa, cada turma tem capacidade para 100 alunos e não pode crescer.
Nesta nova versão do programa, cada turma continua a ser criada com a capacidade inicial de 100 alunos, mas deve poder crescer automaticamente, consoante as necessidades.
Sempre que se tenta acrescentar um aluno numa turma cheia, duplica-se a capacidade da turma e assim o novo aluno já cabe.
Uma turma que esteja constantemente a receber novos alunos e a crescer, vai assumindo as seguintes capacidades: 100 → 200 → 400 → 800 → 1600 → ...
Está em causa uma simples alteração interna no TAD Turma. Portanto basta alterar o que for necessário no ficheiro "Turma.c" e o resto do programa permanece sem alteração.
Veja abaixo a nova versão do ficheiro "Turma.c". Bastou alterar o seguinte:
Aluno alunos[CAP_INICIAL];
Aluno *alunos; // vetor dinamicoO vetor dos alunos será allocado dinamicamente para poder crescer.
asseguraCapacidade, criaTurma, destroiTurma.Estas funções estão marcadas com o comentário "// MUDOU".
Decidimos programar a nova implementação do TAD Turma num novo ficheiro chamado "TurmaX.c".
Mas não deitamos fora o "Turma.c" original. Consoante a nossa decisão, podemos incorporar qualquer uma das duas implementações no projeto do Code::Blocks.
Não faz mal nenhum guardar as duas versões. Mas cuidado: não podemos incorporar as duas implementações ao mesmo tempo pois isso causaria erros de "Multiple definition ...".
O ficheiro "Turma.h" não sofre alteração.
O ficheiro "TurmaX.c" apresenta a visão privada do TAD Turma e implementa este TAD.
Esta implementação faz crescer automaticamente o vetor de alunos interno. Na versão original, o vetor tem tamanho fixo.
Para fazer crescer o vetor, o código mostra duas maneiras de programar a função privada asseguraCapacidade. A versão que usa a função do C realloc é mais simples do que versão baseada em malloc; mas importa observar as duas formas de resolver o problema.
|
O ficheiro "MainTurma.c" não sofre alteração.
O ficheiro "AlunoG.c" reimplementa o TAD Aluno usando objetos que podem ser usados em coleções genéricas.
Este é o primeiro exemplo em que usamos o TAD Info, da nossa biblioteca.
Para os alunos poderem ser usados em contextos genéricos, o que é preciso fazer é simples:
a->info = criaInfo("Aluno", destroiAluno, NULL, comparaAluno, NULL, textoAluno);
|
typedef void *obj; |
Aos objetos que contenham blocos informativos, podem aplicar-se as seguintes seis funções universais:
string tipo(obj ob); void destroi(obj ob); void destroiTudo(obj ob); int compara(obj ob1, obj ob2); int dispersao(obj ob, int dim); string texto(obj ob); |
|
Não vamos estudas esta implementação nas aulas. Para nós o importante será entender o ficheiro "Info.h" para saber com implementar objetos preparados para serem usados em coleções genéricas.
|