Esse exercício tem por objetivos fazer você praticar sua habilidade de interpretar especificações de problemas, aliada a sua capacidade de projetar e implementar algoritmos.
Além disso, o desenvolvimento desse trabalho oferecer uma oportunidade prática para utilizar elementos básicos de programação em C++, como laços, condicionais simples e composto, tipos de dados básicos e heterogêneos, expressões lógicas, passagem de parâmetros, criação de funções, leitura de escrita de informações a partir da entrada e saída padrão, dentre outros.
Adicionalmente, você deverá ter contato com alguns elementos da STL (Standard Template Library) do C++, mais especificamente o uso de vetor dinâmico e estático, bem como alguns algoritmos básicos de manipulação de dados, dependendo das necessidades dos algoritmos que você projetar.
As tarefas a serem implementadas correspondem a cada um dos diretórios neste repositório (exceto os diretórios scripts
e pics
) sendo elas:
- negativos5
- intervalos
- soma_vizinhos
- fibonacci
- minmax
- inverter
- ponto_em_retangulo_1
- ponto_em_retangulo_2
Para facilitar a implementação de suas respostas, você vai encontrar nesse repositório o código de suporte organizado em várias pastas, uma para cada questão da lista. Esse código já está preparado para compilar cada projeto individualmente através do uso de cmake
e contém indicações sobre o que você precisa alterar através de comentários como // TODO
espalhados por alguns arquivos .cpp
e .h
. Para você usufruir dessa infraestrutura de compilação e testagem disponível, é importante que você não altere nenhum arquivo além do que for indicado nesse documento.
Em resumo, sua tarefa consiste em:
- Implementar todos as questões requisitadas na lista, incluindo seu código nos locais apropriados em cada pasta.
- Editar o arquivo
autor.md
e adicionar suas informações pessoais na Seção Identificação Pessoal. - Marcar cada uma das questões que você conseguiu resolver, na Seção Questões Finalizadas do arquivo
autor.md
.
Nessa seção abordamos o procedimento necessário para compilar e executar o código inicial fornecido com o exercício.
Existem duas categorias de exercícios: implementação de programa e implementação de função.
Para os exercícios que solicitam a implementação de um programa, você deve editar apenas o arquivo src/main.cpp
. Se você desejar criar outros arquivos .cpp
para modularizar melhor seu projeto você pode fazê-lo; nesse caso lembre-se de alterar o script do cmake
correspondente de maneira a incluir o novo arquivo fonte na lista de dependências do target ${APP_NAME}
com o comando target_sources( ${APP_NAME} PRIVATE "seu_arquivo.cpp" )
.
Nesta categoria você deve assumir que os dados de entrada para cada programa são lidos da entrada padrão, stdin, através da operação de extração(>>) do objeto std::cin
. Similarmente, a saída do programa deve ser enviada para a saída padrão, stdout, através do operador de inseção(<<) no objeto std::cout
.
int x;
std::cin>>std::ws>>x; //equivalente à scanf(" %d",&x);
std::cout<<x<<'\n'; //equivalente à scanf("%d\n",x);
Para os exercícios que solicitam a implementação de uma função, você precisa apenas editar o arquivo src/function.cpp
. Lá você vai encontrar o corpo vazio da função que precisa ser desenvolvida. Neste caso, é importante que você não mude a assinatura da função específica, assim os testes automáticos funcionarão.
No geral é importante que você siga à risca as instruções sobre a implementação dos exercícios, uma vez que as respostas são validadas de forma automática. De preferencia, não modifique qualquer coisa nos testes automáticos, a memos que seja acordado com o professor.
Para você poder compilar e executar os testes preparados para o exercício é necessário os seguintes requisitos:
- GNU gcc, clang, ou outro: compilador C++.
- cmake: para gerar os arquivos Makefiles, que gerenciam a compilação otimizada do projeto.
- Python 3.0: para executar o script de teste de comparação de saída gerada/esperada. Teste no seu terminal se o comando
python3 --version
funciona!.
Vamos considerar que desejamos compilar e testar o projeto Intervalos
, que requer a criação de um programa. Cada pasta de projeto que requer um programa como resposta está organizado da seguinte forma:
+─intervalos ---> Nome da posta do projeto
├─── CMakeLists.txt ---> Script de configuração do cmake.
├─── build ---> Pasta onde os executáveis serão gerados. [será criada]
├─── data_expected ---> Pasta que contém os arquivos de saída com as respostas corretas.
├─── data_in ---> Pasta que contém os arquivos de entrada para os testes.
└─── src ---> Pasta que contém arquivo que você precisa editar.
└─── main.cpp ---> Arquivo que precisa ser alterado para conter sua resposta. [editar]
A partir da pasta que contém as subpastas de cada questão faça:
- Edite o arquivo
intervalos/src/main.cpp
e implemente a solução do problema. - Entre na pasta do projeto, no caso
intervalos
:
cd intervalos
mkdir build
cd build
- Execute o comando do
cmake
para gerar os arquivos intermediários. Esse comando cria a pastabuild
que conterá os arquivos Makefile e onde o executável será gerado.
cmake ../
Possível saída:
- Execute o comando do
cmake
para compilar o projetointervalos
dentro da pastabuild
. Esse comando criará um executável dentro debuild
chamado (de forma genérica) deprogram
.
cmake --build .
Possível saída:
- Se houver erro de compilação, corrija e volte ao passo anterior. Se a compilação for bem sucedida, prossiga com o comando abaixo para entrar na pasta
build
e rodar os testes.
cmake --build . --target verify
- Observe os resultados dos testes do passo anterior. Se algum teste falhar você deve corrigir o problema e compilar o projeto novamente, como descrito no passo 4. Se você estiver na pasta
build
e desejar compilar novamente, pode executar os comandos abaixo, ao invés de retornar ao passo 4 (que deve ser executado de fora dobuild
)
cmake --build . --target verify
Se os testes forem bem sucedidos, você deve encontrar uma saída como essa abaixo:
Vamos considerar que desejamos compilar e testar o projeto Fibonacci
, que requer a criação de uma função. Essa pasta está organizada da seguinte forma:
+─fibonacci ---> Nome da posta do projeto
├─── CMakeLists.txt ---> Script de configuração do cmake.
├─── build ---> Pasta onde os executáveis serão gerados. [será criada]
├─── tests ---> Pasta que contém os arquivos de teste unitário.
└─── src ---> Pasta que contém arquivo que você precisa editar.
├─── function.h ---> Arquivo cabeçalho com definição da assinatura da função.
└─── function.cpp ---> Arquivo que precisa ser alterado para conter sua resposta. [editar]
- Edite o arquivo
fibonacci/src/function.cpp
e implemente a solução do problema. - Entre na pasta do projeto, no caso
fibonacci
:
cd fibonacci
mkdir build
cd build
- Execute o comando do
cmake
para gerar os arquivos intermediários. Esse comando cria a pastabuild
que conterá os arquivos Makefile e onde o executável será gerado.
cmake ../
- Execute o comando do
cmake
para compilar o projetofibonacci
dentro da pastabuild
. Esse comando criará dentro da pastabuild
uma biblioteca estática contendo a sua função,libfunc.a
, e um executável para executar os testes unitários,tests/all_tests
.
cmake --build .
Possível saída:
- Se houver erro de compilação, corrija e volte ao passo anterior. Se a compilação for bem sucedida, prossiga com o comando abaixo para entrar na pasta
build
e executar o comando:
cmake --build . --target run_tests
- Observe os resultados dos testes do passo anterior. Se algum teste falhar você deve corrigir o problema e compilar o projeto novamente, como descrito no passo 4. Se você estiver na pasta
build
e desejar compilar novamente, pode executar os comandos abaixo, ao invés de retornar ao passo 4 (que deve ser executado de fora dobuild
) no linux:
cmake --build . --target run_tests
Se os testes forem bem sucedidos, você deve encontrar uma saída como essa abaixo:
A submissão deve ser feita através do Sigaa, conforme explicitado na turma, bem como usando o seu repositório do github correspondente.
© DIMAp/IMD/UFRN 2021.