Jump to content

Calculo de idades de forma correta


alphasil
 Share

Recommended Posts

Oi

Nesta função int proximoAnimal não me faz o calculo de idades de forma correta, alguma dica sff??

#include <stdio.h>
#include <stdlib.h>
typedef struct animal{
   char especie[100],raca[100], dono[100];
   int idade;
   float preco;
}INFO;
typedef struct elemento{
   INFO nodo;
   struct elemento *seguinte;
   struct elemento *anterior;
}ELEM;

//Inserçao no inicio da fila
void insAnimal(INFO info, ELEM **initLista, ELEM **fimLista)
{
   ELEM *novo;
   novo=(ELEM*)malloc(sizeof(ELEM));
   if(novo==NULL)
   {
    printf("Erro na lista");
    exit(1);
   }
   novo->nodo=info;
   novo->seguinte=NULL;
   novo->anterior=NULL;
   if(*initLista==NULL)
   {
    *initLista=novo;
    *fimLista=novo;
   }
   else
   {
    novo->anterior=*fimLista;
    (*fimLista)->seguinte=novo;
    *fimLista=novo;
   }
   /*
   Se for no fim da fila
   novo->anterior=*fimLista;
   (*fimLista)->seguinte=*fimLista;
   *fimLista=novo;
   */
}

int listarInicio(ELEM *initLista)
{
   ELEM *aux;
   if(initLista==NULL)
   {
    printf("Fila Vazia...");
    return -1;
   }
   aux=initLista;
   for(aux=initLista;aux!=NULL; aux=aux->seguinte)
   {
    printf("%s  %s  %s  %d  %.2f \n", aux->nodo.especie,aux->nodo.raca, aux->nodo.dono, aux->nodo.idade, aux->nodo.preco);
   }
   return 0;
}
int listarFim(ELEM *fimLista)
{
   ELEM *aux;
   if(fimLista==NULL)
   {
    printf("Fila Vazia...");
    return -1;
   }
   aux=fimLista;
   while(aux!=NULL)
   {
    printf("%s  %s  %s  %d  %.2f \n", aux->nodo.especie,aux->nodo.raca, aux->nodo.dono, aux->nodo.idade, aux->nodo.preco);
    aux=aux->anterior;
   }
   return 0;
}
//Proximo elemento da fila a ser atendido com inserção no fim da Fila
int proximoAnimal(INFO info, ELEM **initLista, ELEM **fimLista)
{
   ELEM *aux;
   aux = *initLista;
   if(aux==NULL)
   {
    printf("Fila Vazia...");
    return -1;
   }
   if(aux->anterior==NULL)
   {
    printf("Elemento retirado... %s", aux->nodo.dono);
    *initLista=aux->seguinte;
    if(*fimLista)
    aux->anterior=NULL;
   }
   else
   printf("Elemento n e primeiro da fila...");
   return 0;
}
//fUNCAO TOTAL DE IDADES
int totIdades(ELEM *initLista)
{
   if(initLista==NULL)
   {
    printf("Fila Vazia...");
    return -1;
   }
   return(initLista->nodo.idade+totIdades(initLista->seguinte));
}

int main()
{
   ELEM *initLista=NULL, *fimLista=NULL;
   INFO info;
   int op;
   do
   {
   printf("Especie: \n");
   fgets(info.especie,100, stdin);
   printf("raca: \n");
   fgets(info.raca,100, stdin);
   printf("Dono: \n");
   fgets(info.dono,100, stdin);
   printf("Idade: \n");
   scanf("%d", &info.idade);
   getchar();
   printf("Preco: \n");
   scanf("%f", &info.preco);
   getchar();
   printf("Mais ? \n");
   scanf("%d", &op);
   getchar();
   insAnimal(info,&initLista,&fimLista);
   }
   while(op!=0);
   printf("\nListagem inicial da fila: \n");
   //listarInicio(initLista);
   //listarFim(fimLista);
   proximoAnimal(info,&initLista,&fimLista);
   printf("\nListagem finalda fila: \n");
   listarInicio(initLista);
   printf("Total idades: %d" ,totIdades(initLista));
   return 0;
}

Obrigado

gmc11

 

Link to comment
Share on other sites

Porque é que o total de idades duma fila vazia é -1?

Repara que todas as filas tem, como parte integrante delas, uma lista vazia.

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!

Link to comment
Share on other sites

Porque é que o total de idades duma fila vazia é -1?

Repara que todas as filas tem, como parte integrante delas, uma lista vazia.

acho que essa explicação seja demasiado confusa para o @alphasil

@alphasil : pensa assim

imagina que tens na tua fila 3 entradas, com as idades 12, 14, 16 respectivamente

ao chamares a função esta primeiro vai verificar se se encontra vazia, como não está então irá retornar : 12 + soma do resto da fila

na segunda chamada recursiva, como a fila não se encontra vazia, terás 14 + soma do resto da fila

na terceira chamada recursiva terás 16 + soma do resto da fila

terás então uma quarta chamada final onde irá detectar uma fila vazia retornando -1

ao retornar a recursividade terás

12 + (14 + (16 + (-1)))

que é errado

o que o @pmg disse foi que quando não tens nenhum elemento na fila, o resultado será sempre 0 que se torna válido para qualquer número de elementos guardados na tua fila

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

int listarInicio(ELEM *initLista)
{
ELEM *aux;
if(initLista==NULL)
{
	    printf("Fila Vazia...");
		return -1;
}

o que o @pmg disse foi que quando não tens nenhum elemento na fila, o resultado será sempre 0 que se torna válido para qualquer número de elementos guardados na tua fila
Edited by Flinger
Link to comment
Share on other sites

OI HHH

Mas é acredita que estava assim:

Vê o exemplo:

#include "listaDupla.h"
int inserir(ELEM **iniLista, ELEM **fimLista, INFO info){
   ELEM *novo;
   novo=(ELEM*)malloc(sizeof(ELEM));
   if(novo==NULL){
			   printf("ERRO ao reservar memoria!\n");
			   return -1;
			   }
			   novo->nodo=info;
			   novo->seguinte=NULL;
			   novo->anterior=NULL;
   if(*iniLista==NULL){
				    *iniLista=novo;
				    *fimLista=novo;
				    }
   else{
	 novo->anterior=*fimLista;
	 (*fimLista)->seguinte=novo;
	 *fimLista=novo;
	 }
   return 0;
}
int listarIni(ELEM *iniLista){
   ELEM *aux;
   if(iniLista==NULL){
				   printf("lista vazia!\n");
				   return -1;
				   }
   aux=iniLista;
   while(aux!=NULL){ //for(aux=iniLista;aux!=NULL;aux=aux->seguinte){
				 printf("%d %s %s %d\n",aux->nodo.n_inscricao,aux->nodo.nome,aux->nodo.pais,aux->nodo.pontuacao);
				 aux=aux->seguinte;
				 }
}
int listarFim(ELEM *fimLista){
   ELEM *aux;
   if(fimLista==NULL){
				   printf("lista vazia!\n");
				   return -1;
				   }
   aux=fimLista;
   while(aux!=NULL){ //for(aux=iniLista;aux!=NULL;aux=aux->seguinte){
				 printf("%d %s %s %d\n",aux->nodo.n_inscricao,aux->nodo.nome,aux->nodo.pais,aux->nodo.pontuacao);
				 aux=aux->anterior;
				 }
}

int alteraPontuacao(ELEM *iniLista, int numero, int pont){
   ELEM *aux;
   aux=iniLista;
   while(aux!=NULL){
				 if(aux->nodo.n_inscricao==numero){
												   aux->nodo.pontuacao+=pont;
												   return 0;
												   }
				 aux=aux->seguinte;
				 }
   printf("concorrente nao existe!\n");
   return -1;
}

int contConc(ELEM *lista){
   if(lista==NULL) return 0;
   return(1+contConc(lista->seguinte));
}

int ContConc(ELEM *lista){
   ELEM *aux;
   int tot=0;
   for(aux=0;aux!=NULL;aux=aux->seguinte){
									   tot++;
									   }
   return tot;
}

E claro...eu feito inocente depois não me dá direito lol

gmc11

 

Link to comment
Share on other sites

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
 Share

×
×
  • 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.