Jump to content

Calculo de idades de forma correta


Recommended Posts

Posted

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

 

Posted

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!

Posted

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
Posted (edited)
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
Posted

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

 

Posted (edited)

Pois, culpa minha que postei o bocado de código da função errada...

devia ser aqui:

int totIdades(ELEM *initLista)
{
if(initLista==NULL)
{
		printf("Fila Vazia...");
		return -1;
}
Edited by Flinger

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.