Laboratório de Programação II (Lab2)


Informações Gerais

Caro aluno, na regulamentação desta disciplina você pode acessar informações básicas sobre ela, incluindo objetivos, ementa e referências.

A lista dos trabalhos da disciplina está mais abaixo. As tarefas específicas de cada trabalho são fornecidas aula-a-aula.

A minha sugestão para a obtenção de um bom desempenho na disciplina é, aula-a-aula, participar das aulas, praticar o conteúdo e tirar as dúvidas. Caso você possua uma dúvida no horário da aula, o ideal é tirá-la na própria ocasião, para que os demais alunos também se beneficiem das explicações. Entretanto, caso necessário, você também pode me contactar fora do horário de aula.

Você pode usar qualquer linguagem de programação nos seus trabalhos, mas, pela experiência de programação que eu possuo, eu só estarei apto a tirar dúvidas técnicas especializadas sobre C ou C++. Se você programar em outra linguagem estruturada ou orientada a objetos, eu entenderei os conceitos envolvidos, mas possivelmente não os detalhes da linguagem. Se você programar numa linguagem funcional, eu entenderei os recursos básicos, e deverei ser capaz de programar em pseudocódigo funcional, mas provavelmente não mais do que isso.


Avisos


Dicas para a Programação

Veja abaixo algumas dicas que considero úteis para a programação em C, e esteja à vontade para tirar dúvidas comigo a respeito.

Para a compilação:

Para a codificação:

Bibliografia

Consulte a regulamentação da disciplina, que contém uma variada seleção de livros.

Sobre a linguagem C, veja aqui uma lista de referências, mas a minha principal sugestão é sempre o livro de Kernighan e Ritchie, apesar da desatualização (há documentos na internet que falam das adições de C99, como este e este).

Sobre a linguagem C++, a minha sugestão é sempre o livro do Bjarne, embora eu o tenha consultado mais como referência do que lido linearmente (e isso com relação à 3ª edição).

Sobre conceitos de linguagens de programação em geral, eu particularmente aprendi bastante com o livro do Watt (editora), embora eu lembre de nem sempre concordar quando ele fala mal de C. :-)

Sobre a produção de código relativamente curto mas possivelmente elaborado, acho que o livro do Bentley é uma boa referência. A propósito, ele tem um apêndice sobre otimização de código (outro resumo); sobre esse assunto, veja também a página da Wikipédia.

Sobre a produção de código em larga escala… bom, isso não faz parte da minha experiência pessoal, mas este livro é famoso no assunto (alguns argumentam, porém, que ele é mais longo do que o necessário).


Trabalhos

Abaixo está a lista em construção dos trabalhos da disciplina. Alguns deles terminam com uma análise experimental.
  1. Quicksort (entrega: 2015-03-31)

    Tópicos abordados:

  2. Compactação de Arquivos (entrega: preferivelmente em 02/junho)

    Tópicos abordados:

  3. Heap genérico em C (entrega: até 30/junho)

    • Resumo do trabalho: deverão ser feitas duas implementações de heap binário "genérico". Com elas, um programa pode criar e manipular heaps de diferentes tipos (um heap de inteiros, outro de strings, etc), sem haver repetição de código.

      A primeira implementação será feita em C, à moda da função qsort. A ideia é que cada função receba não um ponteiro para heaps do tipo "X", mas sim um ponteiro void*, que apontará para o heap desejado. Para que a função saiba como manipular o heap, ela recebe também o número de bytes de cada elemento do heap, e também um ponteiro para uma função que, dados ponteiros para dois elementos, compara os elementos em questão. Na prática, essa abordagem pode levar a uma implementação um pouco mais lenta do que uma feita especialmente para um tipo primitivo fixo (devido às indireções com ponteiros), mas em compensação evita a repetição de código.

      A segunda implementação será feita em C++, à moda da função sort. A ideia é utilizar templates para permitir uma gerência de tipos em tempo de compilação, aumentando a segurança e a eficiência do código resultante.

      Ao final, as duas implementações de heap devem ser comparadas. Para isso, o seu programa deverá avaliar os tempos de execução de duas implementações genéricas do heapsort, uma usando a implementação de heap em C e a outra usando a implementação de heap em C++. A comparação entre os heapsorts deverá ser feita para vetores de pelo menos dois tipos diferentes (int's, strings, etc) e o seu programa deve fornecer entradas grandes o suficiente para fazer os algoritmos executarem em tempo apreciável, digamos, uns 20 segundos por heapsort. Sugestão: ordene inteiros e strings; as strings podem ser linhas de arquivos-texto, comparadas lexicograficamente; os inteiros podem ser obtidos aleatoriamente ou a partir de linhas de arquivos-texto, de alguma maneira: o tamanho da linha, o número de ocorrências de determinados caracteres, etc.

      Consulte as hiperligações acima para instrução técnica básica e recorra a mim em caso de dúvida. Boa programação!


Plano de Atividades

Aula Data Descrição
1 24/02 Apresentação da Disciplina; Trabalho 1, tarefa 1.
2 03/03 Trabalho 1, tarefa 2.
3 10/03 Trabalho 1, tarefa 3.
4 17/03 Trabalho 1: continuação das tarefas passadas.
5 24/03 Trabalho 1, tarefa 4.
6 31/03 ENTREGA DO TRABALHO 1.
7 07/04 Trabalho 2: descrição geral e início.
8 14/04 Trabalho 2: continuação.
21/04 Feriado Nacional – Tiradentes.
9 28/04 Trabalho 2: continuação.
10 05/05 Trabalho 2: continuação.
11 12/05 Trabalho 2: continuação.
12 19/05 Trabalho 2: continuação / Trabalho 3: descrição inicial e início.
13 26/05 Trabalho 2: finalização / Trabalho 3: continuação.
14 02/06 ENTREGA DO TRABALHO 2 / Trabalho 3: continuação.
15 09/06 Trabalho 3: continuação.
16 16/06 Trabalho 3: continuação.
17 23/06 Trabalho 3: finalização.
18 30/06 ENTREGA DO TRABALHO 3.

Aulas