Jump to content

Listar chamadas não atendidas de um telemovel.


Recommended Posts

Posted

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


Posted

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

Posted

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.

Posted

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.

Posted

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.

  • 3 weeks later...
Posted

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; 

}

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.