Esse foi um projeto desenvolvido por discentes do curso de Engenharia da Computação da Universidade Federal da Paraíba, curso este que pertence ao Centro de Informática, localizado na Rua dos Escoteiros S/N - Mangabeira - João Pessoa - Paraíba - Brasil. O programa decorrente do desenvolvimento do código foi empregado com o objetivo de permitir ao docente, utilizando de métodos avaliativos, calcular e atribuir as respectivas notas dos participantes do projeto.
- 🥋 Eduardo Asfuri Carvalho
- 🏓 Lucas Henrique Vieira da Silva
- 🥊 Marco Antonio de Vasconcelos Souza Filho
O projeto tem como objetivo desenvolver um sistema que consiga proporcionar ao usuário, de maneira eficiente, a partir de entradas no terminal e utilizando C++, a possibilidade de gerir dados de uma competição olímpica. O processo de gerenciamento do registro das pessoas é completamente autônomo por parte do usuário, enquanto o gerenciamento dos dados da competição é parcial, permitindo a inserção dos dados somente quando não houverem dados registrados. O sistema tem requisitos de desenvolvimento estabelecidos pelas especificações determinadas pelo docente, sendo eles12:
- Ser um sistema CRUD que possua menu e tenha opões para gerir
- Ter um diagrama de classes bem estabelecido que concorde com o código
- Possuir composição na superclasse
- Utilizar de herença e polimorfismo
- Gerar relatório como uma das opções do menu
- Ter todos os dados salvos em arquivo para que seja possível execuções sequenciais do programa
Sendo destaque utilizar de POO e ser um CRUD
Este projeto foi desenvolvido utilizando apenas funcionalidades da biblioteca padrão do C++ e do sistema operacional34, ou seja, nenhuma biblioteca externa foi incluída no código. Abaixo, dissertamos sobre a utilidade de cada uma das funcionalidades da biblioteca padrão implementadas, e exemplos de sua utilidade dentro do projeto:
-
<iostream>
: Usada para operações básicas de entrada e saída, como leitura de dados do teclado (std::cin
) e escrita de dados na tela (std::cout
).- Implementação: Em interações direta com um usuário, via terminal.
-
<string>
: Fornece suporte à manipulação de strings, permitindo o uso da classestd::string
para trabalhar com cadeias de caracteres de maneira mais conveniente a partir dos métodos fornecidos pela classe.- Implementação: Em validações de entradas do tipo
std::string
pelo usuário, em comparações utilizando.find()
e em conversões entre tipos utilizando dos métodos.toString()
e.stoi()
.
- Implementação: Em validações de entradas do tipo
-
<vector>
: Fornece a classestd::vector
, facilitando armazenar e manipular coleções de dados dinâmicos em formato de lista. A classestd::vector
permite criar arrays dinâmicos que podem redimensionar automaticamente à medida que novos elementos são adicionados, que tornam sua utilização, a priori, intuitiva com os métodos da classe.- Implementação: Em compor o Objeto de GerencimentoOlimpada com dois arrays dinâmicos primordiais para o funcionamento de todo o CRUD, que teve como auxílio métodos como
push_back()
eerase()
- Implementação: Em compor o Objeto de GerencimentoOlimpada com dois arrays dinâmicos primordiais para o funcionamento de todo o CRUD, que teve como auxílio métodos como
-
<fstream>
: Fornece as classes para leitura e escrita em arquivos, comostd::fstream
, e seus respectivos métodos.- Implementação: Ao ler e escrever os dados em arquivos
.txt
, ou seja, é primordial para a execução sequencial do programa, utilizando os métodos.open()
e.close
para a disposição do arquivo.
- Implementação: Ao ler e escrever os dados em arquivos
-
<limits>
: Fornece informações sobre os limites das variáveis numéricas (como o valor máximo e mínimo que um tipo de dado pode armazenar) usando a classestd::numeric_limits
.- Implementação: Ao tratar as entradas númericas do usuário, como ao utilizar o código
std::numeric_limits<std::streamsize>::max()
para receber nocin.ignore()
valores irrelevantes.
- Implementação: Ao tratar as entradas númericas do usuário, como ao utilizar o código
-
<algorithm>
: Inclui uma variedade de algoritmos genéricos, como ordenação (std::sort
), busca (std::find
), entre outros, que podem ser aplicados a contêineres como vetores.- Implementação: Ao converter os ìndices (
char
) de uma determinadastd::string
em minúsculo utilizando do métodostd::transform
.
- Implementação: Ao converter os ìndices (
-
<locale>
: Usada para trabalhar com diferentes configurações regionais, como formatos de números, datas, e outros parâmetros que podem variar conforme a localidade. A classestd::locale
permite adaptar o comportamento do programa ao ambiente cultural do usuário.- Implementação: Ao formatar todo nosso código para o idioma Português brasileiro, para, assim, utilizar de acentos e caracteres especifícos do idioma, como
ç, ~
, utilizamos do métodostd::setlocale()
.
- Implementação: Ao formatar todo nosso código para o idioma Português brasileiro, para, assim, utilizar de acentos e caracteres especifícos do idioma, como
-
O uso de
<unistd.h>
e<windows.h>
depende da plataforma em que o programa está sendo compilado. -
<unistd.h>
(Linux/Unix): Usada para acessar várias funcionalidades do sistema operacional POSIX, como chamadas de sistema para manipulação de arquivos, gerenciamento de processos, e manipulação de diretórios. Esta biblioteca é exclusiva para sistemas Unix-like.- Implementação: Ao decorar o terminal com uma pequena pausa utilizando do método
.sleep()
- Implementação: Ao decorar o terminal com uma pequena pausa utilizando do método
-
<windows.h>
(Windows): Inclui funcionalidades específicas para o sistema operacional Windows, como manipulação de janelas, interação com hardware, gerenciamento de processos e threads, e muito mais. Esta biblioteca é exclusiva para o sistema operacional Windows.- Implementação: Ao decorar o terminal com uma pequena pausa utilizando do método
.sleep()
- Implementação: Ao decorar o terminal com uma pequena pausa utilizando do método
Requisitos
- Um compilador c++, recomendamos o
clang++
ou og++
- Um terminal de linha de comando
Atenção: Lembre de baixar o projeto e extraí-lo devidamente do .zip
.
Utilizando g++
para compilar
cd /path/to/Projeto-CRUD
g++ main.cpp -I include/ src/*.cpp -o olimpiadas.out
Utilizando clang++
para compilar
cd /path/to/Projeto-CRUD
clang++ main.cpp -I include/ src/*.cpp -o olimpiadas.out
Para rodar
./olimpiadas.out
Utilizando g++
para compilar
cd /path/to/Projeto-CRUD
g++ main.cpp -I include/ src/*.cpp -o olimpiadas.exe
Utilizando clang++
para compilar
cd /path/to/Projeto-CRUD
clang++ main.cpp -I include/ src/*.cpp -o olimpiadas.exe
Para rodar
./olimpiadas.exe
Para warnings referentes a codificação, recomendamos o uso da seguinte flag na compilação (válido para clang++)
-Wno-invalid-source-encoding
OBS.: Utilizamos de barra normal ('/') considerando um ambiente como Git Bash, WSL e PowerShell, considere utilizar de barra invertida ('\') em caso de não compilar
Footnotes
-
Requisitos 1 e 6 -> O Projeto se propõe a ter execuções dependentes (sequenciais) a partir dos dados salvos nos arquivos criados/alterados nas execuções antecedentes, fazendo com que os dados não se percam, utilizando do famoso acrônimo CRUD para o gerenciamento dos dados. ↩
-
Requisitos 3 e 4 -> O Projeto deve ser feito utilizando POO e na linguagem C++ ↩