SpecialOne Posted April 25, 2009 at 09:27 PM Report #259089 Posted April 25, 2009 at 09:27 PM A ideia é fazer um programa que liste as chamadas não atendidas de um telemovel, usando listas ligadas. O programa esta com alguns bugs, nomeadamente, entra em ciclo infinito e so imprime so numero e a hora, a data não imprimi não sei porque. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNA{ int num; char data[8]; /* Formato da data di-me-an do tipo 21-12-09 */ char hm[5]; /* formato da hora ho:mi do tipo 21:34 */ struct ListNA *seg; } Chamadas; typedef Chamadas *NaoAtendi; NaoAtendi insereCab(int n,char *d, char *h,NaoAtendi l){ NaoAtendi aux; aux = (NaoAtendi) malloc(sizeof(Chamadas)); aux -> num = n; strcpy(aux->data,d); /* Copia para a lista aux campo data a data que é fornecida como parametro */ strcpy(aux->hm,h); /* Copia para a lista aux campo hora a hora que é fornecida como parametro */ aux -> seg = l; /* Aqui poe a lista aux a apontar para a lista inicialmentada dada, desta forma esta a inserir os novos dado à cabeça da lista */ return aux; } int vazia(NaoAtendi l){ return l == NULL; } NaoAtendi seguinte(NaoAtendi l){ return l -> seg; /* Esta função é parcial, se a lista for vazia da erro */ } void imprimeCha(NaoAtendi l){ NaoAtendi p; for(p=l;(p->seg) != NULL;seguinte(p)){ printf("Numero: %d \n data: %s \n hora: %s \n",p->num,p->data,p->hm); printf("\n"); } } int main(){ int n; char dat[8]; char hora[5]; NaoAtendi l; printf("Registo de chamadas não atendidas\n\n"); printf("Insira o numero de telemovel\n"); scanf("%d",&n); printf("Insira a data com o seguinte formato di-me-an, do tipo 12-01-09\n"); scanf("%s",dat); printf("Insira a hora com o seguinte formato ho:mi, do tipo 12:23\n"); scanf("%s",hora); l = insereCab(n,dat,hora,l); imprimeCha(l); return 0; }
Baderous Posted April 25, 2009 at 09:33 PM Report #259090 Posted April 25, 2009 at 09:33 PM Quando estás a inserir à cabeça, tens de actualizar a lista l para ficar a apontar para o novo nó da lista, e deves retornar o l e não o aux. Para além disso, as strings não têm espaço suficiente para armazenar os dados, daí que não apareçam. Por ex: data[8] armazena 8 caracteres, no entanto uma data é composta pelos 8 caracteres (dd-mm-aaaa) + '\0' (caracter terminador de string).
SpecialOne Posted April 25, 2009 at 09:44 PM Author Report #259092 Posted April 25, 2009 at 09:44 PM Em relação a data, a data deve estar no seguinte formato, di-me-an sendo o array: data[8] e vendo o seguinte exemplo 25-04-09: data[0] = 2 data[1] = 5 data[2] = - data[3] = 0 data[4] = 4 data[5] = - data[6] = 0 data[7] = 9 data[8] = ' \0 ' Se o indice começa em 0 e o formato que eu vou usar ocupa 8 posições a nona posição data[8] fica para o termiandor.
SpecialOne Posted April 25, 2009 at 09:47 PM Author Report #259093 Posted April 25, 2009 at 09:47 PM Em relação a lista, a ideia é fornecer uma lista l, criar uma auxiliar onde vao ser inseridos os dados novos, numero, data e hora e depois seria aux -> seg = l, ou seja, o campo seguinte dos dados inseridos ficaria a apontar para a cabeça da lista que ja existia.
Baderous Posted April 25, 2009 at 09:50 PM Report #259095 Posted April 25, 2009 at 09:50 PM Em relação a data, a data deve estar no seguinte formato, di-me-an sendo o array: data[8] e vendo o seguinte exemplo 25-04-09: data[0] = 2 data[1] = 5 data[2] = - data[3] = 0 data[4] = 4 data[5] = - data[6] = 0 data[7] = 9 data[8] = ' \0 ' Se o indice começa em 0 e o formato que eu vou usar ocupa 8 posições a nona posição data[8] fica para o termiandor. data[8] reserva espaço em memória para um array de 8 caracteres, ou seja, para um array cujos índices variam entre 0 e 7. Não é entre 0 e 8, isso são 9 caracteres! Em relação a lista, a ideia é fornecer uma lista l, criar uma auxiliar onde vao ser inseridos os dados novos, numero, data e hora e depois seria aux -> seg = l, ou seja, o campo seguinte dos dados inseridos ficaria a apontar para a cabeça da lista que ja existia. Sim, eu sei bem qual é a ideia, isso já não é propriamente novo para mim. O que te estou a dizer é que tens de actualizar o l que é o teu apontador para a lista, para que ele fique a apontar para o novo nó que inseriste na lista, senão perdes a referência para a mesma.
SpecialOne Posted May 12, 2009 at 12:45 PM Author Report #263357 Posted May 12, 2009 at 12:45 PM Ola, o problema esta meio resolvido. Ja insere à cabeça e depois imprime tudos os dados que inseri. Uma outra duvida que tenho é, quando executo o programa e insiro o numero, data e hora, ao fim da inserção eles são impressos, mas se voltar a executar e inserir novos dados os que inseri na primeira execução ja não estão la, como resolvo isso? Eu sei que na função main eu declaro l como apontador para a estrutura (NaoAtendi l;) e depois faço l = criaLista(); para inicializar a lista l (fica l = NULL), penso que o problema estara nesta zona. Existe alguma forma de validar a data e hora, so tipo, hora valida = hora entre 0 e 23 e minutos entre 0 e 59. data valida = dia entre 1 e 31, mes entre 1 e 12 e ano entre 00 e 99. O programa na sua versão "fraca" a funcionar é: #include <stdio.h> #include <stdlib.h> #include <string.h> /* Estrutura da lista */ typedef struct ListNA{ int num; char data[9]; /* Formato da data di-me-an do tipo 21-12-09 */ char hm[6]; /* formato da hora ho:mi do tipo 21:34 */ struct ListNA *seg; } Chamadas; typedef Chamadas *NaoAtendi; /* Função que verifica se uma lista esta vazia */ int vazia(NaoAtendi l){ return l == NULL; } /* Função que cria uma lista vazia */ NaoAtendi criaLista(){ return NULL; } /* Função que insere na cabeça da lista a informação relativa a chamadas não atendidas */ NaoAtendi insereCab(int n,char *d, char *h,NaoAtendi l){ NaoAtendi aux; aux = (NaoAtendi) malloc(sizeof(Chamadas)); if(vazia(l)) { aux -> num = n; /* Se a lista l (fornecida como parametro estiver vazia */ strcpy(aux->data,d); /* Copia para a lista aux campo data a data que é fornecida como parametro */ strcpy(aux->hm,h); /* Copia para a lista aux campo hora a hora que é fornecida como parametro */ aux -> seg = NULL; l = aux; return l; } else { aux -> num = n; /* Se a lista l (fornecida como parametro estiver vazia */ strcpy(aux->data,d); /* Copia para a lista aux campo data a data que é fornecida como parametro */ strcpy(aux->hm,h); /* Copia para a lista aux campo hora a hora que é fornecida como parametro */ aux -> seg = l; return aux; } } /* Função que imprime chamadas*/ void imprimeCha(NaoAtendi l) { NaoAtendi r; for(r=l;!vazia(r);r=r->seg){ printf("Numero: %d \n data: %s \n hora: %s \n",r->num,r->data,r->hm); } free(r); } int main(){ int n,i,k; char dat[9]; char hora[6]; NaoAtendi l; l = criaLista(); printf("Quantos numeros quer inserir ?\n"); scanf("%d",&k); for(i=0;i<k;i++){ printf("Insira o numero de telemovel\n"); scanf("%d",&n); printf("Insira a data com o seguinte formato di-me-an, do tipo 12-01-09\n"); scanf("%s",dat); printf("Valor da variavel data %s\n",dat); printf("Insira a hora com o seguinte formato ho:mi, do tipo 12:23\n"); scanf("%s",hora); } l = insereCab(n,dat,hora,l); imprimeCha(l); return 0; }
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