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

SpecialOne

Listar chamadas não atendidas de um telemovel.

6 mensagens neste tópico

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;
}


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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; 

}

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