Decrypter Posted May 20, 2009 at 03:52 PM Report #265845 Posted May 20, 2009 at 03:52 PM Boa tarde, 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. * */ #pragma once using namespace std; class Clientes { char nome[10]; int telefone; int bi; char morada[10]; char mail[10]; public: 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); } //GET char *getNome() { return nome; } int getTelefone() { return telefone; } int getBi() { return bi; } char *getMorada() { return morada; } char *getMail() { return mail; } }; .Cpp #include <iostream> #include<cstring> #include<cctype> #include "Clientes.h" #include "Recursos.h" using namespace std; const int max = 100; //Recursos recurso[999]; int contador=0; Clientes cliente[100]; void adicionar_cliente() { int i; int num, b,t; char n[10]; char m[10]; char ma[10]; char nome[10]; cout <<"\nNúmero de clientes a adicionar:\t"; cin >>num; cout << "\n\n-- Por favor preencha os seguintes campos --"<<endl; for (i=0;i<num;i++) { cout<<"\nNome ( 20 letras máximo):\t"; getchar(); gets(n); cliente[i].setNome(n); cout<<"Telefone (9 números):\t"; cin >>t; cliente[i].setTelefone(t); cout<<"BI (8 números):\t"; cin >>b; cliente[i].setTelefone(b); cout<<"Morada (20 caracteres):\t"; getchar(); gets(m); cliente[i].setNome(m); cout<<"Mail (20 caracteres):\t"; getchar(); gets(ma); cliente[i].setNome(ma); cout<<"\n " <<nome; } if(num>1) cout <<"Clientes adicionados com sucesso!"; else cout<<"Cliente adicionado com sucesso!"; contador+=num; } void alterar() { int bi_aux; int i; cout <<"Qual o BI do cliente que deseja alterar?"; cin >> bi_aux; //----- ISTO -----// } void listar() { // ---- ISTO --// } int menu_principal() { int opcao; do { 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"; cin >> opcao; switch (opcao) { case 1: { adicionar_cliente(); break; } case 2: break; case 3: break; case 4: { //listar(); break; } case 5: break; case 6: break; case 7: break; case 8: break; case 9: cout<<"Em construção"; break; default: break; } }while(opcao!=10); return 0; } int main () { menu_principal(); } 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 .
TheDark Posted May 20, 2009 at 11:23 PM Report #266008 Posted May 20, 2009 at 11:23 PM Em C++, a diferença entre class e struct é a acessibilidade dos seus membros: classes são private e structs são public. - 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. E para que servem os métodos get*? Com eles consegues aceder aos valores. - 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? 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*. - O que me aconselham a por nos campos construtor e destructor ? 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. - O que acham do código até agora? 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... Desaparecido.
OldCoder Posted May 21, 2009 at 01:34 AM Report #266027 Posted May 21, 2009 at 01:34 AM 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.
Decrypter Posted May 21, 2009 at 08:51 PM Author Report #266269 Posted May 21, 2009 at 08:51 PM 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 ? Muito obrigado pelos conselhos 😛
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now