Sistema Gestão Bibliotecário - C++ - Portugal-a-Programar
Sistema Gestão Bibliotecário
Por Decrypter, 20 de Maio de 2009 em C++
depois de um mês a gramar com UML, chegou a altura de programar. Para este trabalho tenho de implementar o famoso sistema de gestão bibliotecário, onde terão de estar presentes as seguintes opções:
Adicionar Clientes;
Apagar Clientes;
Alterar Clientes;
Listar Clientes;
Penso que tudo isto seria mais facil com estruturas mas, tenho de usar classes obrigatóriamente. Há maneira de juntar as duas ?
Até agora tenho feito o seguinte :
Classe Clientes.h:
*  Clientes.h
*  Teste
*  Created by Diogo Ribeiro on 05/02/09.
*  Copyright 2009 Universidade do Minho. All rights reserved.
char morada[10];
char mail[10];
Clientes()
~Clientes()
void setNome(char a[10])
strcpy(nome,a);
void setTelefone(int b)
telefone=b;
void setBi(int c)
bi=c;
void setMorada(char d[10])
strcpy(morada,d);
void setMail(char e[10])
strcpy(mail,e);
char *getNome()
int getTelefone()
int getBi()
char *getMorada()
char *getMail()
#include "Recursos.h"
//Recursos recurso[999];
Clientes cliente[100];
void adicionar_cliente()
int num, b,t;
cout <<"\nNúmero de clientes a adicionar:\t";
cout << "\n\n-- Por favor preencha os seguintes campos --"<<endl;
cout<<"\nNome ( 20 letras máximo):\t";
cliente[i].setNome(n);
cout<<"Telefone (9 números):\t";
cliente[i].setTelefone(t);
cout<<"BI (8 números):\t";
cliente[i].setTelefone(b);
cout<<"Morada (20 caracteres):\t";
cliente[i].setNome(m);
cout<<"Mail (20 caracteres):\t";
cliente[i].setNome(ma);
cout<<"\n " <<nome;
cout <<"Clientes adicionados com sucesso!";
cout<<"Cliente adicionado com sucesso!";
contador+=num;
int bi_aux;
cout <<"Qual o BI do cliente que deseja alterar?";
cin >> bi_aux;
//----- ISTO -----//
// ---- ISTO --//
cout << "\n\nSistema de Gestão de Bibliotecas\n";
cout << "\nEscolha uma das seguintes opções: \n";
cout << "\n1) Criar novo utente\n";
cout << "2) Alterar dados de utente\n";
cout << "3) Remover utente da base de dados\n";
cout << "4) Listar base de dados de utentes\n";
cout << "5) Adicionar novo recurso\n";
cout << "6) Alterar dados de um recurso\n";
cout << "7) Remover recurso da base de dados\n";
cout << "8) Listar base de dados de recursos\n";
cout << "9)Secção de empréstimos\n";
cout << "10) Sair do programa\n";
cout << "Escolha:\t";
adicionar_cliente();
//listar();
cout<<"Em construção";
}while(opcao!=10);
De momento tenho várias dúvidas:
- Estou com problema no listar visto que sempre que ponho para fazer o cout das variáveis ele diz que são private e dá-me erro.
- Para a função alterar, se não me engano, tenho de usar as funções get só que não faço ideia de como as por em funcionamento. Isto é, terei de usar um if para procurar , por exemplo o BI na minha classe e, usar as funções get para me retornarem os restantes dados do cliente?
- O que me aconselham a por nos campos construtor e destructor ?
- O que acham do código até agora?
Já procurei no repositório exemplos de tudo isto mas, tudo que encontro não usa classes, o que me deixa um pouco confuso.
Agradeço desde já qualquer ajuda .
Em C++, a diferença entre class e struct é a acessibilidade dos seus membros: classes são private e structs são public.
E para que servem os métodos get*? Com eles consegues aceder aos valores.
Usas um for para percorrer todos os clientes que existam, e lá dentro usas o tal if para comparar o valor do bi (recorrendo ao método getBi, como disseste), e quando encontras o correspondente, podes imprimi-lo usando os métodos get*, e altear os seus valores usando os métodos set*.
Não são campos (campos são as variáveis da classe), são métodos, ou funções-membro, ou mais genericamente membros (uma vez que membro serve para métodos e para campos).
Quanto ao que lá deves pôr... provavelmente código para inicializar os campos, como por exemplo igualar os inteiros a 0 e colocar '\0' no índice 0 dos arrays de char, de modo a que quando crias um objecto, obtenhas strings vazias.
Não devias utilizar strings da STL (#include <string> em vez de <cstring>) em vez de arrays de char?
Estás a pedir nome, morada e mail até 20 caracteres, mas só reservaste espaço para 9 + terminador.
E não estás a devolver um valor na função int main.
Outra coisa bonita para fazeres era declarares a classe e os seus membros no ficheiro Clientes.h, e definires os métodos no ficheiro Clientes.cpp, embora isso se calhar não faça parte do que é pretendido na cadeira. Como ali o meu comentário sobre o uso de strings em vez de arrays de char.
A maior parte do código do ficheiro cpp não vi...
Subscrevo o conselho do TheDark: a sério, se tiveres escolha, usa a string da STL em vez de char*, vais poupar muitas dores de cabeça...
Pelo que vejo, parece-me (não sei o que é pedido no exercício, por isso não tenho a certeza) que a ideia era teres uma classe Clientes (de que tipo, se é suposto ser uma lista ou um vector, isso já não sei...) que consiste numa colecção de objectos Cliente individuais.
A classe que estás a fazer parece-me mais "Cliente" que "Clientes". Seria mais sensato utilizar uma relação de inclusão.
Updates : As dúvidas que aqui apresentei já foram resolvidas. Quanto à string da STL não é suposto usarmos neste programa. Para já, o código está muito verde pois ainda está a ser desenvolvido. Sim , vou fazer um .cpp para os clientes e recursos também, foi uma ideia que me surgiu ontem e que foi hoje esclarecida com o professor.
De momento gostaria de adicionar o seguinte ao programa :
- Em vez de inserir a idade manualmente, o utilizador inseria a sua data de nascimento. ( dia/mês/ano , tudo em números)
- O programa automaticamente ia buscar a data actual e subtraia à data inserida, resultando assim a idade.
Com isto, conseguiria proporcionar um efeito live ao programa. Gostaria de usar esses dois pontos no seguinte :
- O programa sempre que aberto, ou de X em X tempo, corria todas as datas de nascimento e, caso alguém envelhecesse ele automaticamente actualizava a idade.
Das funções que ouvi falar, todas elas convertiam a data para o número de segundos desde determinado ano. Há alguma alternativa mais simples ? Que função me aconselham para este caso ?