ESCOLA POLITÉCNICA DA UNIVERSIDADE DE SÃO PAULO Departamento de Engenharia de Computação e Sistemas Digitais PCS - LABORATÓRIO DE PROGRAMAÇÃO ORIENTADA A OBJETOS PARA A ENGENHARIA ELÉTRICA EXERCÍCIO PROGRAMA 05 Resumo O EP tem como objetivo exercitar os conceitos básicos de orientação a objetos ao implementar uma rede social simples. O sistema deverá atender a especificação definida e seguir o projeto descrito neste documento. Introdução Deseja-se criar a PoliSocial, uma rede social da Poli. Esse projeto será desenvolvido incrementalmente e em dupla nos três Exercícios Programas de PCS. Por simplicidade a interface com usuário deverá ser feita em console. Para este primeiro EP a rede social deve permitir cadastrar pessoas, adicionar uma pessoa como contato, enviar mensagens para todos os contatos e curtir uma mensagem recebida. A solução deve empregar adequadamente conceitos de orientação a objetos apresentados na disciplina: classe, atributo, método, encapsulamento, coesão, acoplamento, construtor e destrutor.. Especificação A rede social deve possuir as seguintes funcionalidades: Deve ser possível cadastrar uma Pessoa. Uma pessoa deve ter um nome (string), uma data de nascimento (string) e um país de origem (string). Uma Pessoa pode adicionar uma outra Pessoa (cadastrada anteriormente na rede) como um contato. Por simplicidade não há necessidade de confirmação ao adicionar um contato. Note que se A adiciona B como contato, B não necessariamente tem A como contato. o Não permita que a pessoa se adicione como contato ou que adicione duas vezes o mesmo contato (não faça nada nesse caso). Uma Pessoa pode enviar Mensagens para todos os contatos que ela possui. Uma Mensagem tem um texto (string) e o número de vezes que ela foi curtida (int). Deve -se guardar as Mensagens que a pessoa enviou, assim como as Mensagens que ela recebeu. A Pessoa deve poder ver as mensagens enviadas e recebidas. Uma Mensagem recebida pode ser curtida. Ao fazer isso, o número de curtidas da mensagem deve ser incrementado. Não se preocupe em impedir que uma mesma pessoa curta a mesma mensagem várias vezes. Também não é necessário saber quem curtiu uma determinada mensagem o importante é só saber a quantidade de curtidas.
Por simplicidade o sistema deve ser limitado a 0 pessoas cadastradas. Portanto, uma Pessoa pode ter no máximo 9 contatos. Porém não há limitação no número de mensagens enviadas e recebidas. Projeto Para implementar essas funcionalidades você deve criar um conjunto de classes em C++ para uma solução orientada a objetos. Cada classe deve ter um arquivo de definição (.h ) e um arquivo de implementação (.cpp ). Para representar uma pessoa nesse sistema você deve criar uma classe Pessoa. Essa classe deve possuir os seguintes métodos públicos : // Cria uma pessoa Pessoa(string nome, string datadenascimento, string pais); // Destrói um objeto pessoa, destruindo todos os objetos auxiliares criados ~Pessoa(); // Métodos acessores: obtem o nome, data de nascimento e país string getnome(); string getdatadenascimento(); string getpais(); // Adiciona uma outra pessoa como contato desta pessoa void adiciona(pessoa *contato); // Envia um texto como mensagem para todos os contatos da pessoa void envia(string texto); // Recebe uma mensagem enviada por uma pessoa que tem esta pessoa como contato. // Este método é chamado pelo "envia" da pessoa que está enviando a mensagem void recebe(mensagem* m); // Obtêm a lista ligada com as mensagens recebidas ListaDeMensagens* getmensagensrecebidas(); // Obtêm a lista ligada com as mensagens enviadas ListaDeMensagens* getmensagensenviadas(); // Apresenta em tela o nome dos contatos que esta pessoa possui void vercontatos(); Defina os atributos necessários para implementar essa classe (seguindo a funcionalidade especificada) e crie métodos privados caso você deseje. Crie uma classe representando uma Mensagem. Cabe a você decidir os métodos e atributos dessa classe, assim como o que deve ser público e privado. Para guardar as Mensagens enviadas e recebidas, deve-se usar o conceito de lista ligada (assunto visto em PCS 0). Isso permitirá que possa se ter várias mensagens sem restrição de quantidade (a restrição é a memória disponível pelo seu computador). Para isso você deve implementar uma classe ListaDeMensagens, a qual deve possuir pelo menos os seguintes métodos: O mais elegante seria ter um método getcontatos que retorna um vetor com os contatos de uma pessoa. Porém, para simplificar o exercício, decidiu-se deixar um método vercontatos apenas.
// Cria uma lista ligada de mensagens ListaDeMensagens(); // Adiciona uma mensagem à lista ligada void adicionar(mensagem* m); // Obtém a cabeça da lista ligada // (Isso é necessário para varrer a lista) Elemento* getcabeca(); // Destrói a lista ligada, apagando todos os elementos criados ~ListaDeMensagens(); A classe Elemento representa um elemento da lista ligada, possuindo um ponteiro para o próximo Elemento e um valor que no caso deve ser uma Mensagem. Cabe a você decidir quais os métodos e atributos necessários para a classe Elemento. Use duas listas ligadas: uma para as mensagens enviadas e outra para as mensagens recebidas de cada Pessoa. 4 Interface com o usuário Por simplicidade, a interface com o usuário será feita em console. Sugere-se os menus apresentados no diagrama a seguir: Início Fim Escolha uma das pessoas: ) Bjarne Stroustrup ) Alan Kay ) Timothy Budd 4) Donald Knuth Digite um número ou 0 para voltar: 0 PoliSocial ----------- ) Cadastrar pessoa ) Logar como pessoa ) Terminar!= 0 e válido 0 Informe os dados da pessoa: Nome: Bjarne Stroustrup Data de nascimento: 0//950 Pais: Dinamarca Pessoa cadastrada com sucesso Mensagens enviadas ------------------ ) Olá a todos! ) Ainda estou projetando C++ Digite a mensagem: Olá a todos! Mensagem enviada a todos os contatos 4 -------------------------- Pessoa: Bjarne Stroustrup 0//950 Dinamarca Contatos: Alan Kay Timothy Budd -------------------------- Escolha uma opcao: ) Adicionar contato ) Ver mensagens enviadas ) Ver mensagens recebidas 4) Escrever mensagem 0) Voltar Pessoas ------- ) Bjarne Stroustrup ) Alan Kay ) Timothy Budd 4) Donald Knuth Escolha um contato para adicionar ou 0 para voltar: 4 Bjarne Stroustrup conectado a Donald Knuth Mensagens recebidas ------------------- ) Estou usando C++ para criar um jogo ( curtidas) ) C é C++-- ( curtidas) Digite o numero da mensagem para curtir ou 0 para voltar: Mensagem curtida Cada retângulo representa uma tela. As setas representam as transições de uma tela para outra os números na seta representam o número que deve ser digitado para ir para a tela destino (quando não há um número é porque a transição acontece incondicionalmente. Em vermelho são apresentados exemplos de dados e o formato de outras informações podem ser apresentadas dependendo do estado do sistema. Por exemplo, caso não existam pessoas cadastradas e se tentar Logar como pessoa (na tela inicial), deve-se apresentar uma mensagem de erro e retornar para a tela inicial. Na figura abaixo é apresentado um exemplo de uso do programa.
5 Entrega O projeto deverá ser entregue até dia 0/09 no Moodle do Stoa. A entrega deverá ser feita por apenas um aluno por dupla. 6 Dicas Implemente a solução aos poucos não deixe para implementar tudo no final. Não é possível obter como entrada um texto com espaços usando o cin, já que ele usa o espaço ou o fim de linha como separador. Para que seja possível digitar um texto com espaços é necessário usar a função getline(entrada, variável) (é preciso fazer #include <string> para usa-la). Essa função coloca em variável o valor digitado até o \n de entrada (no nosso caso a entrada é o cin). Um cuidado ao usar essa função é que se for usado um cin anteriormente, o texto digitado e não aproveitado pode ser capturado pelo getline. Por isso é recomendável chamar o cin.ignore(quantidade, \n ), que permite ignorar uma quantidade de caracteres até chegar a um \n. Portanto, para pegar uma string com espaço em C++ é necessário fazer: string nome; cin.ignore(00, '\n'); // Ignorando caracteres que sobraram de // um cin anterior getline(cin, nome); // guardando uma linha em nome string datadenascimento; getline(cin, datadenascimento); // guardando uma linha // em datadenascimento 4
Uma forma de organizar a interface em console é criar uma ou mais classes representando as telas. O main deve chamar uma classe de tela e pedir para ela começar o programa. Para criar um vetor de objetos é necessário fazer: Pessoa* pessoas[0]; Outros detalhes sobre isso serão vistos na Aula 4 e mais profundamente na Aula. Para saber se duas variáveis têm o mesmo objeto você pode usar o ==. Não use == para comparar strings. Nos menus prefira fazer com que o usuário digite um número é muito mais fácil comparar números! Na realidade as variáveis não têm um objeto, mas apontam para um objeto. Veremos isso melhor na Aula. 5