alphasil Posted July 17, 2012 at 09:45 PM Report #469060 Posted July 17, 2012 at 09:45 PM 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
pmg Posted July 17, 2012 at 10:45 PM Report #469064 Posted July 17, 2012 at 10:45 PM 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!
HappyHippyHippo Posted July 17, 2012 at 11:11 PM Report #469070 Posted July 17, 2012 at 11:11 PM 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
alphasil Posted July 18, 2012 at 01:43 PM Author Report #469158 Posted July 18, 2012 at 01:43 PM OI HHH Percebido esta parte, então que deveria fazer evitar isso ?? gmc11
Flinger Posted July 18, 2012 at 01:45 PM Report #469160 Posted July 18, 2012 at 01:45 PM (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 at 01:46 PM by Flinger
alphasil Posted July 18, 2012 at 02:08 PM Author Report #469166 Posted July 18, 2012 at 02:08 PM 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
HappyHippyHippo Posted July 18, 2012 at 02:16 PM Report #469169 Posted July 18, 2012 at 02:16 PM 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
alphasil Posted July 18, 2012 at 02:35 PM Author Report #469171 Posted July 18, 2012 at 02:35 PM 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
HappyHippyHippo Posted July 18, 2012 at 02:49 PM Report #469173 Posted July 18, 2012 at 02:49 PM 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
Flinger Posted July 18, 2012 at 03:09 PM Report #469182 Posted July 18, 2012 at 03:09 PM (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 at 03:09 PM by Flinger
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