Knot Posted June 12, 2012 at 01:28 PM Report #462185 Posted June 12, 2012 at 01:28 PM Boas! Tenho uma estrutura que representa disciplinas e queria fazer uma função que permitisse editar os campos. estruturas criadas: typedef struct Disciplina { char codigo_dis[5]; char nome_disciplina[16]; int numero_alunos; } *DISCIPLINA; typedef struct Nodo { DISCIPLINA inf; struct Nodo *seguinte; NODO_TURNO apontador_t; NODO_TURNO apontador_tp; NODO_TURNO apontador_pl; }*NODO; typedef struct Lista_Disciplina { int nelementos; NODO inicio; } *LISTA_DISCIPLINA; Funçao alterar dados: void altera(DISCIPLINA x) { printf("\nDigite codigo:"); fflush(stdin); gets(x->codigo_dis); printf("\nDigite nome :"); fflush(stdin); gets(x->nome_disciplina); } Função criar_disciplina NODO criar_disciplina() { NODO D = (NODO) malloc(sizeof(struct Nodo)); D->inf = (DISCIPLINA) malloc(sizeof(struct Disciplina)); D->seguinte = NULL; D->apontador_t = NULL; D->apontador_tp = NULL; D->apontador_pl = NULL; return D; } Função de pesquisa NODO pesquisar(LISTA_DISCIPLINA L, NODO ele_pesquisa) { if (!ele_pesquisa || !L) return NULL; NODO aux = L->inicio; while (aux) { if (elementos_iguais(aux, ele_pesquisa)) return aux; else aux = aux->seguinte; } return NULL; } Chamada na funçao main LISTA_DISCIPLINA listadisciplinas = criar_lista_disciplina(); NODO disc_alterar; disc_alterar = criar_disciplina(); printf("Qual o codigo da disciplina que pertende alterar?\n"); scanf("%s",&(disc_alterar->inf->codigo_dis)); if(pesquisar(listadisciplinas,disc_alterar)) { altera(disc_alterar->inf); } else printf("\nCodigo da disciplina nao encontrado!\n\n"); Eu introduzo o codigo da disciplina que pretendo alterar, e se não encontrar na lista avisa "Codigo da disciplina nao encontrado!", quando encontra faz a função alterar, não dá erro nenhum, mas quando vou verificar não alterou os dados do campos codigo_disc, nem nome_disciplina. O que estarei a fazer mal?
HappyHippyHippo Posted June 12, 2012 at 01:42 PM Report #462192 Posted June 12, 2012 at 01:42 PM não estou a perceber a tua lógica ... NODO disc_alterar; // Ponteiro para "lixo" do tipo NODO disc_alterar = criar_disciplina(); // crias/alocas memória printf("Qual o codigo da disciplina que pertende alterar?\n"); // pedes o código da disciplina scanf("%s",&(disc_alterar->inf->codigo_dis)); // inseres a informação na memória alocada if(pesquisar(listadisciplinas,disc_alterar)) { // pesquisas o pelo NODO mas não guardas o resultado altera(disc_alterar->inf); // vais alterar os dados do elemento criado anteriormente 1º - não cries/aloques memória para um NODO, só necessitas de um buffer para o código da disciplina 2º - para pesquisar so necessitas de fornecer o código (buffer) 3º - tens de guardar o valor de retorno da função pesquisa (o verdadeiro ponteiro para NODO a alterar) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Knot Posted June 12, 2012 at 02:21 PM Author Report #462213 Posted June 12, 2012 at 02:21 PM Então e como guardo o valor de retorno da função pesquisa? A função pesquisa está a retornar o aux, do tipo NODO.
Flinger Posted June 12, 2012 at 02:27 PM Report #462220 Posted June 12, 2012 at 02:27 PM Tens de criar um apontador auxiliar onde guardas o resultado da pesquisa. Podes usar esse apontador para verificar depois se a chamada retornou algo (sucesso) ou NULL.
HappyHippyHippo Posted June 12, 2012 at 02:30 PM Report #462221 Posted June 12, 2012 at 02:30 PM Então e como guardo o valor de retorno da função pesquisa? A função pesquisa está a retornar o aux, do tipo NODO. tens de pensar que não está a retornar aux ... está sim a retornar a posição de memória do NODO a ser alterado usando o ponteiro já declarado (mas sem alocação de memória) por ti char codigo[5]; // ler codigo a pesquisar if((disc_alterar = pesquisar(listadisciplinas,codigo)) != NULL) { // estás a guardar a posição de memória retornada pela função e verificar se é válida altera(disc_alterar->inf); } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mateus8 Posted June 13, 2012 at 01:27 PM Report #462463 Posted June 13, 2012 at 01:27 PM (edited) HappyHippyHippo boas então quer dizer que para guardar os dados que introduzimos temos que usar a função que referiste [ char codigo[5]; // ler codigo a pesquisar if((disc_alterar = pesquisar(listadisciplinas,codigo)) != NULL) { // estás a guardar a posição de memória retornada pela função e verificar se é válida altera(disc_alterar->inf); } Edited June 13, 2012 at 01:28 PM by mateus8
Knot Posted June 13, 2012 at 01:29 PM Author Report #462465 Posted June 13, 2012 at 01:29 PM (edited) Já funcionou assim. Agora tenho outro problema, tenho a posiçao em memória, mas queria comparar os conteudos... Funçoes para inserir e comparar (quando faço 1 inscrição dá bem, mas quando tento fazer a segunda rebenta na int comparar, pois acho que está a comparar os ponteiros em vez de comparar os codigos das disciplinas): int comparar_insc_elementos(INSCRICAO_DISC A, INSCRICAO_DISC B) { INSCRICAO_DISC PA = (INSCRICAO_DISC) (A->pt_dis), PB = (INSCRICAO_DISC) (B->pt_dis); return strcmp(PA->pt_dis->codigo_dis,PB->pt_dis->codigo_dis); } void inserir_inscricao_ordenado(NO L, INSCRICAO_DISC D) { if (!L) return; int av=1; INSCRICAO_DISC ant,act; if (L->ptDISC==NULL) { D->seguinte=NULL; L->ptDISC=D; } else { ant=act=L->ptDISC; while(av) if(act==NULL) av=0; else if(comparar_insc_elementos(act, D)>0) av=0; else { ant=act; act=act->seguinte; } if(act==L->ptDISC) { D->seguinte=L->ptDISC; L->ptDISC=D; } else { ant->seguinte=D; D->seguinte=act; } } //L->nelementos++; } Na função main NODO D,ele_pesquisar; INSCRICAO_DISC ID; ele_pesquisar=criar_disciplina(); printf("Introduza o codigo da disciplina para fazer inscricao: "); scanf("%s",&(ele_pesquisar->inf->codigo_dis)); if ((D=pesquisar(listadisciplinas, ele_pesquisar))!=NULL) { D->inf->numero_alunos ++; ID=criar_insc_disc(); ID->pt_dis=D->inf;//o ponteiro inscricao da estrutura INSCRICAO_DISC passa a apontar para a disciplina inserir_inscricao_ordenado(no_pesquisar, ID); } else printf("\nDisciplina nao encontrada!"); A estrutura inscrição disciplina tem um ponteiro para a estrutura disciplina. Edited June 13, 2012 at 01:31 PM by Knot
mateus8 Posted June 13, 2012 at 01:49 PM Report #462484 Posted June 13, 2012 at 01:49 PM nos inserimos assim so que ele nao encontra acho que temos algum problema com os ficheiros
Flinger Posted June 13, 2012 at 02:28 PM Report #462501 Posted June 13, 2012 at 02:28 PM Que grande sarrabulhada que vocês aí têm... Antes de mais: scanf("%s",&(ele_pesquisar->inf->codigo_dis)); ele_pesquisar->inf->codigo_dis é do tipo char *, ou seja já é um apontador (aponta para a primeira posição do array), logo o "&" está lá a mais, e provavelmente a dar asneia. inserir_inscricao_ordenado(no_pesquisar, ID); de onde vem este no_pesquisar? void inserir_inscricao_ordenado(NO L, INSCRICAO_DISC D) O que são os tipos NO e INSCRICAO_DISC ? Não estão definidos no código que vocês postaram antes.
_neiah__ Posted June 21, 2012 at 03:16 PM Report #464618 Posted June 21, 2012 at 03:16 PM Olá, eu também estou a fazer um trabalho onde tenho de repor um valor de um valor guardado anteriormente numa estrutura... Será que alguém me pode ajudar? Não sei como hei de fazer isto... Este é o meu código: typedef struct ingrediente no, *pno; struct ingrediente{ char nome[sT_TAM]; // Nome do ingrediente int id_i; //Identificação do ingrediente int quant; //quantidade do ingrediente int limite_med; //Limite médio do ingrediente int consumo_med; //Consumo Médio pno prox; // Ponteiro para proximo no da lista }; ---------------------------------------------------- Código para repor pno repor1(pno p){ pno reporq; int r; printf("\n"); printf("| Repor Stock |\n"); printf("ID. Ingrediente para Repor: "); scanf("%d",&r); while(p != NULL && p->id_i != r) p = p->prox; if(p != NULL){ printf("\nNome:%s\n",p->nome); printf("Quantidade:%d\n",p->quant); printf("Nova Quantidade:"); scanf("%d", &reporq->quant); } else printf("Ingrediente inexistente\n"); }
Flinger Posted June 21, 2012 at 03:31 PM Report #464628 Posted June 21, 2012 at 03:31 PM pno reporq; int r; printf("\n"); printf("| Repor Stock |\n"); printf("ID. Ingrediente para Repor: "); scanf("%d",&r); while(p != NULL && p->id_i != r) p = p->prox; if(p != NULL){ printf("\nNome:%s\n",p->nome); printf("Quantidade:%d\n",p->quant); printf("Nova Quantidade:"); scanf("%d", &reporq->quant); } else printf("Ingrediente inexistente\n"); } Não faças a iteração sobre o apontador original. Usa um apontador auxiliar para isso. pno aux; aux=p; while(aux != NULL && ...) ... Quando encontrares o nó, faz o scanf da nova quantidade para uma variavel auxiliar (int aux_quantidade), fazes as verificações se a quantidade foi introduzida correctamente, e, de seguida, atribuis esse valor ao campo do nó que encontraste aux->quant=aux_quantidade;
_neiah__ Posted June 21, 2012 at 04:46 PM Report #464652 Posted June 21, 2012 at 04:46 PM (edited) Já modifiquei o código pno repor1(pno p){ int aux_quantidade; int r; pno aux; aux=p; printf("\n"); printf("| Repor Stock |\n"); printf("ID. Ingrediente para Repor: "); scanf("%d",&r); while(aux != NULL && aux->id_i != r) aux = aux->prox; if(aux != NULL){ printf("\nNome:%s\n",aux->nome); printf("Quantidade:%d\n",aux->quant); printf("Nova Quantidade:"); scanf("%d", &aux_quantidade); if (aux_quantidade >0 ) aux->quant=aux_quantidade; } else printf("Ingrediente inexistente\n"); } Já repõem a quantidade mas depois na listagem, só quando fecho o programa e o inicio de novo é que aparece a nova quantidade. Estou a trabalhar com ficheiros "*.dat", como faço para que ele actualize sem ter de fechar o programa? int m_repor1() { int i; // Ponteiro de lista pno lista = NULL; lista=recupera_lista("listaIngredientes.dat"); // Ciclo principal do programa do{ i=menu_r(); switch(i){ case 0: break; case 1: repor1(lista); grava_lista(lista); break; case 2: visualiza_i1(lista); break; } }while(i!=0); return 0; } Edited June 21, 2012 at 05:12 PM by _neiah__
Flinger Posted June 21, 2012 at 04:58 PM Report #464659 Posted June 21, 2012 at 04:58 PM verifica se estás a introduzir o id do ingrediente correctamente na variável r (com um printf, p exemplo). Verifica se estás a passar o apontador para a lista correctamente.
_neiah__ Posted June 21, 2012 at 06:09 PM Report #464690 Posted June 21, 2012 at 06:09 PM verifica se estás a introduzir o id do ingrediente correctamente na variável r (com um printf, p exemplo). Verifica se estás a passar o apontador para a lista correctamente. Já verifiquei e está tudo em ordem... Não entendo qual é o erro :/
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