0% acharam este documento útil (0 voto)
4 visualizações12 páginas

Controle de Bolsas na USP em C++

Enviado por

49gykmgc92
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações12 páginas

Controle de Bolsas na USP em C++

Enviado por

49gykmgc92
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

ESCOLA POLITÉCNICA DA UNIVERSIDADE DE SÃO PAULO

Departamento de Engenharia de Computação e Sistemas Digitais

PCS 3111 - LABORATÓRIO DE PROGRAMAÇÃO


ORIENTADA A OBJETOS PARA ENGENHARIA ELÉTRICA
EXERCÍCIO PROGRAMA 1 – 2º SEMESTRE DE 2025

1 Introdução
A USP deseja criar um software para controlar as bolsas oferecidas aos alunos de graduação.
Existem diferentes programas de bolsas, como o PIBIC (iniciação científica), PEEG (monitoria) e
PUB (ensino, pesquisa, extensão, e inclusão e pertencimento). O software deve permitir o
cadastro de bolsas de diferentes tipos e impedir o acúmulo de bolsas.

Os alunos e professores deverão ser cadastrados no software. Entre as informações de cadastro,


deve-se informar o número USP, o qual será usado para atrelar a bolsa ao aluno e a um professor
responsável. O software deve emitir um relatório com os dados do usuário – no caso dos alunos,
apresentando todas as suas bolsas.

1.1 Objetivo
O objetivo deste projeto é fazer o software para o controle das bolsas para alunos de graduação.
Este projeto será desenvolvido incrementalmente e em dupla nos dois Exercícios Programa de
PCS3111.

A solução deve empregar adequadamente conceitos de Orientação a Objetos apresentados na


disciplina: classe, objeto, atributo, método, encapsulamento, construtor e destrutor – o que
representa o conteúdo até, inclusive, a Aula 5. A qualidade do código também será avaliada
(nome de atributos/métodos, nome das classes, duplicação de código, indentação etc.).

2 Projeto
Deve-se implementar em C++ as classes Data, Professor, Bolsa, Aluno e
GerenciadorDeUsuario, além do arquivo [Link], que contém a interface com o usuário.

Atenção:
1. O nome das classes, arquivos e a assinatura dos métodos devem seguir exatamente o
especificado neste documento. As classes não devem possuir outros membros
(atributos ou métodos) públicos além dos especificados. Note que você poderá definir
atributos e métodos privados, caso necessário.
2. Não é permitida a criação de outras classes além dessas.
3. Não faça outros #defines de constantes além dos definidos neste documento. Você
pode (e deve) somente fazer #ifndef/#define para permitir a inclusão adequada de
arquivos.
O não atendimento a esses pontos pode resultar em erro de compilação na correção
automática e, portanto, nota 0 na correção automática.

1
Cada uma das classes deve ter um arquivo de definição (“.h”) e um arquivo de implementação
(“.cpp”). Os arquivos devem ter exatamente o nome da classe. Por exemplo, deve-se ter os
arquivos “[Link]” e “Data.h”. Note que você deve criar os arquivos necessários.

Todas as classes possuem construtores e destrutores (conceito da Aula 5 – são os métodos com
o mesmo nome da classe), mas é possível começar a implementar os métodos ainda sem esse
conceito. Coloque a palavra virtual nos destrutores, como indicado. Não se preocupe com isso
– será explicado o significado na Aula 7.

Cuidado: não use o Copilot ou outros LLMs para fazer o EP. O objetivo do EP é você praticar
os conceitos de OO em um projeto maior. Lembre-se de que na prova não haverá Copilot ou
acesso à Internet!

2.1 Classe Data


A Data representa uma data, com apenas mês e ano. Embora a biblioteca padrão do C++11
possua classes para lidar com datas, elas usam conceitos avançados que só veremos mais
adiante no curso – além de serem mais complicadas do que precisamos. Para simplificar,
criaremos uma classe. Essa classe deve possuir apenas os seguintes métodos públicos:

Data(int mes, int ano);


virtual ~Data();

int getMes();
int getAno();

O construtor deve receber o mês (de 1 a 12) e o ano (maior que 1900). Note que não é feita uma
verificação dos valores (por enquanto). As informações recebidas no construtor são retornadas
pelos getters. O destrutor não tem comportamento especificado. Deixe-o vazio.

2.2 Classe Professor


O Professor é o responsável por uma bolsa. Essa classe deve possuir apenas os seguintes
métodos públicos:

Professor(int nusp, string nome, string unidade);


virtual ~Professor();

string getNome();
int getNusp();
string getUnidade();

O construtor deve receber o número usp, nome e unidade do professor. Essas informações são
retornadas pelos getters. O destrutor não tem comportamento especificado – deixe-o vazio.

2.3 Classe Bolsa


A Bolsa representa uma bolsa concedida a um aluno, por um determinado período e com um
professor responsável. Essa classe deve possuir apenas a constante e os seguintes métodos
públicos:

2
#define BOLSA_USP 700.0

Bolsa(Data* inicio, Data* fim, Professor* responsavel);


virtual ~Bolsa();

Data* getInicio();
Data* getFim();
Professor* getResponsavel();

bool estaDentroDoPeriodo(Data* d);

double getValor(Data* data);

O construtor deve receber uma data de início, uma data de fim e um professor responsável pela
bolsa. Essas informações são retornadas pelos métodos getInicio, getFim e
getResponsavel, respectivamente. No destrutor, destrua apenas as datas de início e de fim (ou
seja, não destrua o professor).

O método estaDentroDoPeriodo deve retornar verdadeiro caso a Data d esteja entre as datas
de inicio e fim (inclusive se d for igual a inicio ou a fim). Ele deve retornar falso caso
contrário. Por exemplo, considere inicio = 10/2025 (mês 10 e ano 2025) e fim = 02/2026 (mês
02 e ano 2026). O método estaDentroDoPeriodo retornaria verdadeiro para as datas 10/2025,
11/2025, 12/2025, 01/2026 e 02/2026. Para as datas 09/2025 e 11/2026, por exemplo, ele deveria
retornar falso.

O método getValor deve retornar o valor de bolsa recebido pelo aluno na data informada. Caso
a data esteja dentro do período de bolsa (ou seja, dentro da data de início e de fim), o valor
recebido deve ser o do define BOLSA_USP. Caso a data esteja fora do período, o valor deve ser
0.

2.4 Classe Aluno


A classe Aluno representa um aluno que recebe bolsas. Essa classe deve possuir apenas os
seguintes métodos públicos:

Aluno(int nusp, string nome, int maximo);


virtual ~Aluno();

string getNome();
int getNusp();

bool temConflitoDeBolsas(Data* inicio1, Data* fim1,


Data* inicio2, Data* fim2);

bool adicionar(Bolsa* bolsa);


Bolsa** getBolsas();
int getQuantidadeDeBolsas();

double getValor(Data* data);

O construtor deve receber o número usp, o nome e o máximo de bolsas que o aluno pode
receber. O número USP é retornado pelo método getNusp e o nome pelo método getNome. No
destrutor destrua as bolsas atribuídas ao aluno e outros objetos alocados dinamicamente por
essa classe.

O método temConflitoDeBolsas é um método auxiliar que diz se há um conflito de bolsas


entre dois intervalos de datas. Ou seja, esse método deve retornar verdadeiro caso haja datas

3
em comum entre os intervalos definidos entre inicio1 e fim1, e entre inicio2 e fim2. Por
exemplo, para inicio1 = 08/2025 e fim1 = 12/2025, e inicio2 = 11/2025 e fim2 = 04/2026,
esse método deve retornar verdadeiro, já que ocorre uma intersecção entre 11/2025 e 12/2025.
Por outro lado, para inicio1 = 08/2025 e fim1 = 11/2025 e inicio2 = 12/2025 e fim2 =
02/2026, o método deve retornar falso.

O método adicionar deve adicionar a bolsa ao aluno. Caso o aluno tenha recebido mais bolsas
do que o máximo ou o período da bolsa conflite com outra bolsa já adicionada (o período de
uma bolsa conflita com o período de outra bolsa caso o intervalo de datas das bolsas tenha
intersecção), esse método não deve adicionar a bolsa e retornar falso. Caso contrário, o método
deve adicionar a bolsa e retornar verdadeiro.

O método getBolsas deve retornar um vetor com todas as bolsas do aluno. O método
getQuantidadeDeBolsas deve retornar a quantidade de bolsas adicionadas a esse vetor.

O método getValor deve retornar o valor recebido pelo aluno na data informada. Caso o aluno
não tenha recebido uma bolsa na data, o método deve retornar 0.

2.5 Classe GerenciadorDeUsuario


A classe GerenciadorDeUsuario gerencia os usuários conhecidos, o que inclui alunos e
professores. Essa classe deve possuir os seguintes métodos públicos:

GerenciadorDeUsuario(int maximo);
virtual ~GerenciadorDeUsuario();

bool adicionarAluno(Aluno* a);


bool adicionarProfessor(Professor* a);

Aluno* getAluno(int nusp);


Professor* getProfessor(int nusp);

Aluno** getAlunos(int& quantidade);


Professor** getProfessores(int& quantidade);

O construtor recebe a quantidade máxima de alunos e de professores que podem ser


armazenados em cada vetor. Por exemplo, se o máximo for 10, deve-se permitir adicionar até
10 alunos e 10 professores (ou seja, 20 usuários no total). O destrutor deve destruir os alunos e
professores e os vetores criados para armazená-los.

O método adicionarAluno deve adicionar um Aluno ao gerenciador. Caso não haja espaço
disponível ou haja um outro usuário com esse número USP (independentemente se aluno ou
professor), o método deve retornar false e não adicionar o objeto. Caso contrário, ele deve
retornar true e adicionar o objeto ao vetor de Aluno. O método adicionarProfessor tem o
mesmo comportamento, mas adicionando um Professor ao gerenciador. Portanto, caso já haja
um aluno ou professor com esse número USP ou não haja espaço disponível, o método deve
retornar falso e não adicionar o objeto. Caso contrário, ele deve adicionar o objeto e retornar
verdadeiro.

O método getAluno deve retornar o Aluno com o número USP informado. Caso não haja um
aluno com esse número USP, o método deve retornar nulo. Da mesma forma, o método
getProfessor deve retornar o Professor como o número USP informado ou nulo, caso não haja
um professor com esse número USP.

Os métodos getAlunos e getProfessores devem retornar, respectivamente, o vetor de


alunos e o vetor de professores previamente adicionados. O parâmetro quantidade será usado

4
como parâmetro de saída (veja o exercício da Aula 2), informando a quantidade de objetos no
vetor.

3 Main e [Link]
Coloque a main em um arquivo separado, chamado [Link]. Nele você deverá simplesmente
chamar uma função menu, a qual ficará no arquivo [Link]. Não faça include de menu no
arquivo com o main (jamais faça include de arquivos .cpp). Portanto, o [Link] deve ser
como apresentado a seguir.

void menu();

int main() {
menu();
return 0;
}

O menu deve criar um programa que se utiliza das classes especificadas para cadastrar alunos,
professores e bolsas, além de consultar os dados de usuários.

No menu você deve criar um GerenciadorDeUsuario, considerando um máximo de 10 (10


alunos e 10 professores).

3.1 Interface

5
A imagem anterior apresenta um diagrama que contém as telas da interface em console que
deve ser criada. Cada retângulo representa uma “tela”, ou seja, um conjunto de texto impresso
com possivelmente entrada de dados. As setas representam as transições de uma tela para outra
– os textos na seta representam o valor que deve ser digitado para ir para a tela destino ou a
condição necessária (quando não há um texto é porque a transição acontece
incondicionalmente). Em vermelho são apresentados exemplos de dados inseridos pelo usuário.

Observação: pode-se considerar que o usuário somente digitará entradas com escolhas
possíveis. Ou seja, não é preciso tratar entradas incorretas.

Atenção: A interface com o usuário deve seguir exatamente o especificado (incluindo


“:” e espaços entre “)” e “:” e o restante do texto - os demais espaços não serão
verificados). Se ela não for seguida, haverá desconto de nota. Não adicione outros
textos além dos apresentados no diagrama e exemplificados adiante.

Por simplicidade, considere que os nomes de professores, alunos e unidades não contêm espaço
e nem acentos.

As telas funcionam da seguinte forma:


● Opção 1: deve-se criar um novo aluno e adicioná-lo ao GerenciadorDeUsuario.
● Opção 2: deve-se criar um novo professor e adicioná-lo ao GerenciadorDeUsuario.
● Opção 3: deve-se listar os alunos, solicitar o NUSP de um aluno, listar os professores,
solicitar o NUSP de um professor, obter os dados de uma bolsa e criar uma bolsa, e
adicionar a bolsa ao aluno.
● Opção 4: deve-se obter um aluno ou um professor com o número USP informado no
GerenciadorDeUsuario e apresentar os seus dados. Caso o aluno não tenha bolsas, o
sistema deve apresentar a mensagem “Sem bolsas” no lugar das bolsas.
● Opção 0: deve-se terminar o programa.

3.2 Exemplo
Segue um exemplo de funcionamento do programa com a saída esperada e ressaltando em
vermelho os dados digitados pelo usuário.

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 1

Cadastro de Aluno
Digite o NUSP: 1234
Digite o nome: Maria
Aluno adicionado com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 1

6
Cadastro de Aluno
Digite o NUSP: 1235
Digite o nome: Jose
Aluno adicionado com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 1

Cadastro de Aluno
Digite o NUSP: 1236
Digite o nome: Joao
Aluno adicionado com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 2

Cadastro de Professor
Digite o NUSP: 1237
Digite o nome: Manoel
Digite a unidade: Poli
Professor adicionado com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 2

Cadastro de Professor
Digite o NUSP: 1238
Digite o nome: Claudia
Digite a unidade: FEA
Professor adicionado com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 3

Cadastro de Bolsa

Alunos
1234 - Maria
1235 - Jose
1236 - Joao
Digite o NUSP do aluno: 1234

Professores
1237 - Manoel - Poli
1238 - Claudia - FEA

7
Digite o NUSP do professor: 1237
Digite o mes e ano de inicio: 1 2025
Digite o mes e ano de fim: 6 2025
Bolsa cadastrada com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 3

Cadastro de Bolsa

Alunos
1234 - Maria
1235 - Jose
1236 - Joao
Digite o NUSP do aluno: 1234

Professores
1237 - Manoel - Poli
1238 - Claudia - FEA
Digite o NUSP do professor: 1238
Digite o mes e ano de inicio: 5 2025
Digite o mes e ano de fim: 11 2025
Erro ao cadastrar bolsa

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 3

Cadastro de Bolsa

Alunos
1234 - Maria
1235 - Jose
1236 - Joao
Digite o NUSP do aluno: 1235

Professores
1237 - Manoel - Poli
1238 - Claudia - FEA
Digite o NUSP do professor: 1238
Digite o mes e ano de inicio: 5 2025
Digite o mes e ano de fim: 11 2025
Bolsa cadastrada com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 3

Cadastro de Bolsa

Alunos
1234 - Maria
1235 - Jose

8
1236 - Joao
Digite o NUSP do aluno: 1234

Professores
1237 - Manoel - Poli
1238 - Claudia - FEA
Digite o NUSP do professor: 1238
Digite o mes e ano de inicio: 7 2025
Digite o mes e ano de fim: 12 2025
Bolsa cadastrada com sucesso

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 4

Consulta de Usuario
Digite o NUSP: 1234
Aluno: Maria
Bolsas:
1/2025 a 6/2025 - Orientador: Manoel
7/2025 a 12/2025 - Orientador: Claudia

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 4

Consulta de Usuario
Digite o NUSP: 1236
Aluno: Joao
Sem bolsas

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 4

Consulta de Usuario
Digite o NUSP: 1238
Professor: Claudia, Unidade: FEA

Gestao de bolsas USP


1) Adicionar aluno
2) Adicionar professor
3) Cadastrar bolsa
4) Consultar usuario
0) Sair
Escolha uma opcao: 0

4 Entrega
O projeto deverá ser entregue até o dia 17/10 (23h59) em um juiz específico, disponível em
<[Link] (nos próximos dias vocês receberão um login e uma senha).

9
As duplas podem ser formadas por alunos de qualquer turma e elas devem ser informadas no
e-Disciplinas até o dia 10/10. Caso não seja informada a dupla, será considerado que o aluno
está fazendo o EP sozinho. Note que no EP2 deve-se manter a mesma dupla do EP1 (será apenas
possível desfazer a dupla, mas não formar uma nova).

Atenção: não copie código de um outro grupo. Qualquer tipo de cópia será considerado
plágio e todos os alunos dos grupos envolvidos terão nota 0 no EP. Portanto, não envie o
seu código para um colega de outro grupo!

Códigos iguais gerados por LLMs (Copilot, ChatGPT, etc.) também serão considerados
como plágio.

Entregue todos os arquivos fonte (“.h” e “.cpp”), inclusive o main e o menu (que devem
obrigatoriamente ficar nos arquivos “[Link]” e “[Link]”, respectivamente), em um arquivo
comprimido no formato ZIP (outros formatos, como RAR e 7Z, podem não ser reconhecidos e
acarretar nota 0). O nome do arquivo não pode conter espaço, “.”, acentos ou ter mais de 11
caracteres. Os códigos fonte não devem ser colocados em pastas. Não entreguem no zip os
executáveis. A submissão pode ser feita por qualquer um dos membros da dupla – recomenda-
se que os dois submetam.

Atenção: faça a submissão do mesmo arquivo nos 4 problemas (Parte 1, Parte 2, Parte 3 e
Parte 4). Isso é necessário por uma limitação do juiz. Caso isso não seja feito, parte do seu
EP não será corrigida – impactando a nota.

Siga a convenção de nomes para os arquivos “.h” e “.cpp”. O não atendimento disso pode levar
a erros de compilação (e, consequentemente, nota zero).

Ao submeter os arquivos no juiz será feita apenas uma verificação básica buscando evitar erros
de compilação devido a erros de digitação do nome das classes e dos métodos públicos. Note
que a nota dada não é a nota final: neste momento não são executados testes – o juiz apenas
tenta chamar todos os métodos definidos neste documento para todas as classes. Por exemplo,
essa verificação é a seguinte para a classe Bolsa:

Professor* p = new Professor(1234, "ABC", "Poli");


Bolsa* b = new Bolsa(new Data(1, 2025), new Data(5, 2025), p);

Data* inicio = b->getInicio();


Data* fim = b->getFim();
Professor* responsavel = b->getResponsavel();
double valor = b->getValor(new Data(3, 2025));
bool dentro = b->estaDentroDoPeriodo(new Data(1, 2025),
new Data(5, 2025), new Data(3, 2025));

delete b;
return true;

Você pode submeter quantas vezes quiser, sem desconto na nota.

5 Dicas
● Entregue um EP que compila! Caso você não consiga implementar um método (ou ele
esteja com erro de compilação), faça uma implementação dummy dele. Uma
implementação dummy é a implementação mais simples possível do método, que

10
permite a compilação. Por exemplo, uma implementação dummy – e errada – do
método getValor da classe Aluno é:
double Aluno::getValor(Data* data) {
return -1;
}
● Caso o programa esteja travando, execute o programa no modo de depuração. O
depurador informará o erro que aconteceu – além de ser possível depurar para descobrir
onde o erro aconteceu!
● Faça #include apenas das classes que são usadas naquele arquivo. Por exemplo, se o
arquivo .h não usa a classe X, mas o .cpp usa essa classe, faça o include da classe X
apenas no .cpp. Incluir classes desnecessariamente pode gerar erros de compilação
estranhos (por causa de referências circulares).
o Inclua todas as dependências necessárias. Não dependa de #includes feitos por
outros arquivos incluídos.
● É muito trabalhoso testar o programa ao executar o main com menus, já que é necessário
informar vários dados para inicializar os registradores e a memória de dados. Para testar
o programa faça o main chamar uma função de teste que cria objetos com valores
interessantes para testar, sem pedir entrada para o usuário. Não se esqueça de remover
a função de teste ao entregar a versão final do EP.
o Uma opção é usar o recurso de paste no powershell (o terminal padrão do
VSCode). É só clicar com o botão direito no terminal do VSCode.
o Uma outra opção para testar é usar o comando:

ep < [Link] > [Link]

Esse comando executa o programa ep usando como entrada do teclado o texto


no arquivo [Link] e coloca em saí[Link] os textos impressos pelo
programa (sem os valores digitados). No caso do Windows, para rodar esse
comando você precisa de um prompt de comando (por uma limitação do
PowerShell). Para fazer isso, clique na seta para baixo do lado do + no terminal e
escolha Command Prompt.

● Implemente a solução aos poucos – não deixe para implementar tudo no final.
● Submeta no juiz o código com antecedência para descobrir problemas na sua
implementação. É normal acontecerem RuntimeErrors e outros tipos de erros no juiz que
não aparecem ao executar o programa no Windows. Veja a mensagem de erro do juiz
para descobrir em qual classe acontece o problema. Caso você queira testar o projeto
em um compilador similar ao do juiz, use o site [Link]

11
o Em geral, RuntimeErrors acontecem porque você não inicializou um atributo que
é usado (ao tentar acessar um membro de um objeto nulo). Por exemplo, caso
você não crie um vetor ou não inicialize o atributo quantidade, para controlar o
tamanho do vetor, ocorrerá um RuntimeError.

Atenção: jamais deixe o código fonte do seu EP público na Internet - algum aluno pode
usá-lo e isso será identificado como plágio. Se você usar o GitHub, deixe o repositório
privado (adicionando o outro membro da dupla como colaborador).

● Use o Fórum de dúvidas do EP no e-Disciplinas para esclarecer dúvidas no enunciado


ou problemas de submissão no juiz.
● Evite submeter nos últimos minutos do prazo de entrega. É normal o Juiz ficar
sobrecarregado com várias submissões e demorar para compilar.

12

Você também pode gostar