alphasil Posted July 17, 2012 Report Share Posted July 17, 2012 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 More sharing options...
pmg Posted July 17, 2012 Report Share Posted July 17, 2012 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 More sharing options...
HappyHippyHippo Posted July 17, 2012 Report Share Posted July 17, 2012 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 Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 18, 2012 Author Report Share Posted July 18, 2012 OI HHH Percebido esta parte, então que deveria fazer evitar isso ?? gmc11 Link to comment Share on other sites More sharing options...
Flinger Posted July 18, 2012 Report Share Posted July 18, 2012 (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 July 18, 2012 by Flinger Link to comment Share on other sites More sharing options...
alphasil Posted July 18, 2012 Author Report Share Posted July 18, 2012 Resolvido Obrigado pessoal por mais esta explicação, mas desta vez não fui eu que inventei, estava assim num exemplo dado na aula...lol gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 18, 2012 Report Share Posted July 18, 2012 já deve ser prai a 3ª vez que dizes que vens com código errado da aula ... não queria estudar ai ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 18, 2012 Author Report Share Posted July 18, 2012 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 More sharing options...
HappyHippyHippo Posted July 18, 2012 Report Share Posted July 18, 2012 na única função que se enquadra nos moldes da função que estás a trabalhar (recursiva e de contagem) : int contConc(ELEM *lista){ if(lista==NULL) return 0; return(1+contConc(lista->seguinte)); } eu vejo um 0 .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flinger Posted July 18, 2012 Report Share Posted July 18, 2012 (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 July 18, 2012 by Flinger Link to comment Share on other sites More sharing options...
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