Lista de Testes de programação em C++

Introdução

Esta lista é apenas para testes, esses exercícios 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.

Compilando e Executando

Nessa seção abordamos o procedimento necessário para compilar e executar o código inicial fornecido com o exercício.

Tipos de Questões

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.

Dependências (precisam ser instalados no seu ambiente)

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!.

Instruções Categoria Implementação de Programa

Cada problema tem seu diretório e em cada diretório existe um aruivo CMakeLists correspondente, esse arquivo está configurado para compilar o código e rodar os testes para cada questão.

Os comandos para execução dos testes variam dependendo se o problema é do tipo “escreva uma função” ou “escreva um programa”, mas cada um dos problemas tem instruções específicas sobre como executar e realizar testes neles.

Abaixo seguem alguns exemplos de saídas para compilação e alguns problemas (que não estão inclusos nesta lista), suponha que tenhamos um problema do tipo “escreva um programa” com nome “intervalos” com a configuração de diretórios como mostrada abaixo:

+─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]

Para compilar e rodar os testes você precisaria fazer os seguintes comandos, a partir deste diretório:

  1. Entrar no diretório do problema, criar a pasta build e entrar nela

cd intervalos
mkdir build
cd build
  1. Execute o comando do cmake para gerar os arquivos intermediários. Esse comando cria na pasta build os arquivos Makefile que geram os executáveis e rodam os testes.
cmake ../

Possível saída:

cmake preparation

  1. Execute o comando do cmake para compilar o projeto intervalos dentro da pasta build. Esse comando criará um executável dentro de build chamado (de forma genérica) de program.
cmake --build .

Possível saída:

cmake building

  1. Se houver erro de compilação, corrija e volte ao passo anterior. Se a compilação for bem sucedida, prossiga com o comando abaixo dentro da pasta build para executar os testes.
cmake --build . --target verify
  1. 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 os testes forem bem sucedidos, você deve encontrar uma saída como essa abaixo:

IO testing

Instruções Categoria Implementação de Função

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.
       ├─── main.cpp      ---> Arquivo usado para seus tetes privados, ele não será levado em consideração para execução dos testes automáticos.
       ├─── 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]
  1. Edite o arquivo fibonacci/src/function.cpp e implemente a solução do problema.
  2. Entre na pasta do projeto, no caso fibonacci:

cd fibonacci
mkdir build
cd build
  1. Execute o comando do cmake para gerar os arquivos intermediários. Esse comando cria a pasta build que conterá os arquivos Makefile e onde o executável será gerado.
cmake ../
  1. Execute o comando do cmake para compilar o projeto fibonacci dentro da pasta build. Esse comando criará dentro da pasta build 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:

cmake build

  1. 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
  1. 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 do build) no linux:
cmake --build . --target run_tests

Se os testes forem bem sucedidos, você deve encontrar uma saída como essa abaixo:

unit testing


© DIMAp/IMD/UFRN 2021.

GitHub

View Github