Jump to content
gaspar1423

Array de clientes

Recommended Posts

gaspar1423

Boas tenho um problema que preciso de resolver hoje o mais rápido possível.

Tenho de implementar um prog para gerir o registo de um conjunto de clientes e os seus acessos a internet

o programa deve usar/declarar um array dinamico de clientes. o array deve ser dimensionado a medida das necessidades,

cada cliente é caracterizado pelo nome(ajustado ao tamanho necessario) e telemovel e guarda uma lista ligada dos acessos efectuados a internet(com data, hora de inicio e fim).

Eu tenho tudo feito e a funcionar a 50% pois o programa não insere as sessoes no 2º cliente, so no primeiro. Podem me dizer o que tenho mal sff?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

typedef struct sessao{
char *data;
char *tinicio;
char *tfim;
struct sessao *psessao;

}SESSAO;

typedef struct cliente{
char *pnome;
int telemovel;
int nsessoes;
SESSAO *psessao;
}CLIENTE;

CLIENTE *init_array();
void insere_client(CLIENTE *pclientes, char *nome, int telemovel);
void insere_sessao(CLIENTE *pclientes, char *nome, char *data, char *tinici, char *tfim);
void print_array(CLIENTE *pclientes);
void save_txt(CLIENTE *pclientes, char *nome);

int main(int argc, const char * argv[])
{
CLIENTE *pclinte=NULL;

pclinte=init_array();

insere_client(pclinte,"PEDRO",912345678);
insere_client(pclinte, "MARIA", 962345678);

insere_sessao(pclinte, "PEDRO", "23/1/2013", "12:00", "12:30");
insere_sessao(pclinte, "PEDRO", "22/1/2013", "12:00", "12:30");
insere_sessao(pclinte, "PEDRO", "2/2/2013", "12:00", "12:30");

insere_sessao(pclinte, "MARIA", "23/1/2013", "12:30", "13:00");
insere_sessao(pclinte, "MARIA", "22/1/2013", "12:30", "13:00");
insere_sessao(pclinte, "MARIA", "2/1/2013", "12:30", "13:00");


print_array(pclinte);
save_txt(pclinte, "PEDRO");
save_txt(pclinte, "MARIA");

return 0;
}


CLIENTE *init_array(){	  //inicializa o array de clientes
CLIENTE *pclientes=NULL;
int i=0;

pclientes=(CLIENTE *)malloc(sizeof(CLIENTE)*MAX);

for (i=0; i<MAX; i++) {

	(pclientes+i)->telemovel=0;
	pclientes[i].nsessoes=0;
	pclientes[i].psessao=NULL;
}

return pclientes;

}

void insere_client(CLIENTE *pclientes, char *nome, int telemovel){  //insere um cliente no array
int i=0;

for (i=0; i<MAX; i++) {
	if (pclientes[i].pnome==NULL) {
		pclientes[i].pnome=(char *)malloc(sizeof(char)*MAX);
		strcpy(pclientes[i].pnome, nome);
		pclientes[i].telemovel=telemovel;
		pclientes[i].psessao=NULL;
		return;
	}
}

}
void insere_sessao(CLIENTE *pclientes, char *nome, char *data, char *tinici, char *tfim){   //insere uma sessao num cliente
SESSAO *psessao=NULL, *paux=NULL;
int i=0;

for (i=0; i<MAX; i++) {
	if (strcmp(pclientes[i].pnome, nome)==0) {
		psessao=(SESSAO *)malloc(sizeof(SESSAO));
		psessao->data=(char *)malloc(sizeof(char)*MAX);
		psessao->tinicio=(char *)malloc(sizeof(char)*MAX);
		psessao->tfim=(char *)malloc(sizeof(char)*MAX);
		strcpy(psessao->data, data);
		strcpy(psessao->tinicio, tinici);
		strcpy(psessao->tfim, tfim);


		if ((pclientes+i)->psessao==NULL) {
			//inicio
			 psessao->psessao=NULL;
			pclientes[i].psessao=psessao;
			pclientes[i].nsessoes++;

		}
		else{
			paux=pclientes[i].psessao;

			//meio e fim
			if (psessao->data>= paux->data) {
				psessao->psessao=paux;
				pclientes[i].psessao=psessao;
				pclientes[i].nsessoes++;
			}

		}
	}
	return;
}

}


void print_array(CLIENTE *pclientes){	   //imprime as estuturas
int i=0;
SESSAO *saux=NULL;
for (i=0; i<MAX; i++) {
	if (pclientes[i].pnome!=NULL) {
		printf("Nome: %s, telemovel: %d\n", pclientes[i].pnome, pclientes[i].telemovel);
		saux=pclientes[i].psessao;
		if (saux!=NULL) {
			for (int i=0; i<pclientes[i].nsessoes; i++) {
				printf("data: %s, tinicio: %s, tfim: %s\n",saux->data,saux->tinicio,saux->tfim);
				saux=saux->psessao;
			}
		}


	}
}
}

void save_txt(CLIENTE *pclientes, char *nome){	  //grava as esteruturas para um ficheiro .txt
FILE *fp=NULL;
SESSAO *saux=NULL;
char filename[MAX]="";
int i=0;

//copia o nome da pessoa a gravar as sessoes e concatena o .txt para gravar o ficheiro de texto

strcpy(filename, nome);
strcat(filename, ".txt");

if((fp=fopen(filename,"w+"))==NULL){
fprintf(stdout, "Nao foi possivel gravar o ficheiro");
return;
}else{
	for (i=0; i<MAX; i++) {
		if (strcmp(pclientes[i].pnome, nome)==0) {
			fprintf(fp,"%d\n", pclientes[i].nsessoes);
			saux=pclientes[i].psessao;
			for (int j=0; j<pclientes[i].nsessoes; j++) {
				fprintf(fp,"%s %s %s\n", saux->data,saux->tinicio, saux->tfim);
			}
			return;

		}
	}
}

}

só consegui por assim...

eu até agora só selecionava a botao de inserir codigo e ele ficava direito, não o porque de agora não dar :S

Edited by gaspar1423
tag quote a fechar mal

Share this post


Link to post
Share on other sites
HappyHippyHippo

é impossível ler o código que apresentaste ...

- elimina todos os dados de estilo através do botão do editor (segundo que parece uma borracha)

- adiciona o tipo de linguagem a ser apresentada na tag do gechi [ code=c] (sem o espaço claro)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
brunoais

Pronto, as tags code já estão bem.

Agora só falta resolver o resto, mas não tenho tempo para o resolver convenientemente.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
pmg

Na funcao print_array estas a usar a variavel i duas vezes e, ciclos diferentes.

for (i = 0; i < MAX; i++)
{
       for (int i = 0; i < pclientes[i].nsessoes; i++) /* ... */ ;
}

No segundo for, quais "i" pertencem ao primeiro ciclo e quais "i" pertencem ao segundo ciclo?


O teu problema imediato acontece na funcao insere_sessao (parecido com o problema de cima!!).

for (i = 0; i < MAX; i++) {
   if (strcmp(pclientes[i].pnome, nome) == 0) {
       /* ... */
       if ((pclientes + i)->psessao==NULL) {
       } else {
           paux = pclientes[i].psessao;        /* <==== PARA QUE SERVE ESTE i? */
           /* ... */
       }
   }
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
gaspar1423

Na funcao print_array estas a usar a variavel i duas vezes e, ciclos diferentes.

for (i = 0; i < MAX; i++)
{
       for (int i = 0; i < pclientes[i].nsessoes; i++) /* ... */ ;
}

No segundo for, quais "i" pertencem ao primeiro ciclo e quais "i" pertencem ao segundo ciclo?


O teu problema imediato acontece na funcao insere_sessao (parecido com o problema de cima!!).

for (i = 0; i < MAX; i++) {
   if (strcmp(pclientes[i].pnome, nome) == 0) {
       /* ... */
       if ((pclientes + i)->psessao==NULL) {
       } else {
           paux = pclientes[i].psessao;        /* <==== PARA QUE SERVE ESTE i? */
           /* ... */
       }
   }
}

Obrigado pmg.

Sobre o primeiro erro , depois de publicar vi-o e resolvi-o e sobre o segundo vi a tua observação e vi que pra além disso estar mal, o erro também vem de trás, da maneira como declaro o array de clientes. Já resolvi e aqui está o meu código. Se tiverem algum reparado a fazer agradecia.

Mais uma vez obrigado a todos pela ajuda :thumbsup:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
typedef struct sessao{
char *data;
char *tinicio;
char *tfim;
struct sessao *psessao;
}SESSAO;
typedef struct cliente{
char *pnome;
int telemovel;
int nsessoes;
SESSAO *psessao;
}CLIENTE;
typedef struct array{
int nr_clientes;
CLIENTE *prim;
}ARRAY;
ARRAY *init_array(int nr_clientes);
void insere_cliente(ARRAY *pclientes, char *nome, int telemovel);
void insere_sessao(ARRAY *pclientes, char *nome, char *data, char *tinici, char *tfim);
void print_array(ARRAY *pclientes);
void save_txt(ARRAY *pclientes, char *nome);

int main(int argc, const char * argv[])
{
ARRAY *pcliente=NULL;

pcliente=init_array(2);


insere_cliente(pcliente,"PEDRO",912345678);
insere_cliente(pcliente, "MARIA", 962345678);

insere_sessao(pcliente, "PEDRO", "23/1/2013", "12:00", "12:30");
insere_sessao(pcliente, "PEDRO", "22/1/2013", "12:00", "12:30");
insere_sessao(pcliente, "PEDRO", "2/2/2013", "12:00", "12:30");

insere_sessao(pcliente, "MARIA", "23/1/2013", "12:30", "13:00");
insere_sessao(pcliente, "MARIA", "22/1/2013", "12:30", "13:00");
//insere_sessao(pcliente, "MARIA", "2/1/2013", "12:30", "13:00");


print_array(pcliente);
save_txt(pcliente, "PEDRO");
save_txt(pcliente, "MARIA");
return 0;
}

ARRAY *init_array(int nr_clientes){
ARRAY *pclientes=NULL;
int i=0;

pclientes=(ARRAY *)malloc(sizeof(ARRAY));
pclientes->nr_clientes=nr_clientes;
pclientes->prim=(CLIENTE *)malloc(sizeof(CLIENTE)*nr_clientes);

for (i=0; i<nr_clientes; i++) {
    (pclientes->prim+i)->telemovel=0;
    (pclientes->prim+i)->nsessoes=0;
    (pclientes->prim+i)->psessao=NULL;    
}

return pclientes;

}

void insere_cliente(ARRAY *pclientes, char *nome, int telemovel){ //insere um cliente no array
int i=0;
CLIENTE *caux=NULL;

for (i=0; i<pclientes->nr_clientes; i++) {
    caux=pclientes->prim+i;
    if (caux->pnome==NULL) {
        caux->pnome=(char *)malloc(sizeof(char)*MAX);
        strcpy(caux->pnome, nome);
        caux->telemovel=telemovel;
        caux->psessao=NULL;
        return;
    }
}

}
void insere_sessao(ARRAY *pclientes, char *nome, char *data, char *tinici, char *tfim){ //insere uma sessao num cliente
CLIENTE *cliente=NULL;
SESSAO *psessao=NULL, *paux=NULL;
int i=0;

for (i=0; i<pclientes->nr_clientes; i++) {
    cliente=pclientes->prim+i;
    if (strcmp(cliente->pnome, nome)==0) {
        psessao=(SESSAO *)malloc(sizeof(SESSAO));
        psessao->data=(char *)malloc(sizeof(char)*MAX);
        psessao->tinicio=(char *)malloc(sizeof(char)*MAX);
        psessao->tfim=(char *)malloc(sizeof(char)*MAX);
        strcpy(psessao->data, data);
        strcpy(psessao->tinicio, tinici);
        strcpy(psessao->tfim, tfim);


        if (cliente->psessao==NULL) {
            //inicio
            psessao->psessao=NULL;
            cliente->psessao=psessao;
            cliente->nsessoes++;

        }
        else{
            paux=cliente->psessao;

            //meio e fim
            if (psessao->data>= paux->data) {
                psessao->psessao=paux;
                cliente->psessao=psessao;
                cliente->nsessoes++;
            }

        }
        return;
    }
}

}

void print_array(ARRAY *pclientes){     //imprime as estuturas
int i=0;
SESSAO *saux=NULL;
CLIENTE *caux=NULL;
for (i=0; i<pclientes->nr_clientes; i++) {
    caux=pclientes->prim+i;
    if (caux->pnome!=NULL) {
        printf("Nome do cliente [%d]: %s, telemovel: %d\n", i,caux->pnome, caux->telemovel);
        saux=caux->psessao;
        if (saux!=NULL) {
            for (int j=0; j<caux->nsessoes; j++) {
                printf("data: %s, tinicio: %s, tfim: %s\n",saux->data,saux->tinicio,saux->tfim);
                saux=saux->psessao;
            }
        }


    }
}
}
void save_txt(ARRAY *pclientes, char *nome){     //grava as esteruturas para um ficheiro .txt
FILE *fp=NULL;
SESSAO *saux=NULL;
CLIENTE *caux=NULL;
char filename[MAX]="";
int i=0;

//copia o nome da pessoa a gravar as sessoes e concatena o .txt para gravar o ficheiro de texto

strcpy(filename, nome);
strcat(filename, ".txt");

if((fp=fopen(filename,"w+"))==NULL){
fprintf(stdout, "Nao foi possivel gravar o ficheiro");
return;
}else{
    for (i=0; i<pclientes->nr_clientes; i++) {
        caux=pclientes->prim+i;
        if (strcmp(caux->pnome, nome)==0) {
            fprintf(fp,"%d\n", caux->nsessoes);
            saux=caux->psessao;
            for (int j=0; j<caux->nsessoes; j++) {
                fprintf(fp,"%s %s %s\n", saux->data,saux->tinicio, saux->tfim);
                saux=saux->psessao;
            }
            return;

        }
    }
}

}

Edited by pmg
Falta LP

Share this post


Link to post
Share on other sites
pmg

So uma coisa importante a apontar: tens "memory leaks" no teu programa.

Para cada malloc() deves ter um free() correspondente!

E ainda uma coisita que é quase uma questao de gostos (embora possa esconder um erro): eu nao gosto do cast ao valor devolvido pelo malloc(). O malloc() devolve um valor de tipo "void*". Em C, valores de tipo "void*" sao atribuiveis sem problemas a ponteiros para qualquer tipo. A existencia do cast pode, caso nao tenhas incluido o header <stdloib.h>, originar um erro bastante dificil de detectar devido a diferences entre "int" e "void*" (que nao costumam ser aparentes em maquinas 32-bit).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.