Jump to content

Função alterar/modificar dados numa estrutura.


Recommended Posts

Posted

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?

Posted

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
Posted

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
Posted (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 by mateus8
Posted (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 by Knot
Posted

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.

  • 2 weeks later...
Posted

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");
}
Posted
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;
Posted (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 by _neiah__
Posted

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 :/

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.