Ir para o conteúdo
gaspar1423

Array de clientes

Mensagens Recomendadas

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

Editado por gaspar1423
tag quote a fechar mal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

        }
    }
}

}

Editado por pmg
Falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.