• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Decrypter

Sistema Gestão Bibliotecário

4 mensagens neste tópico

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 .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora