• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

p_inacio

Ordenar ficheiros binarios

5 mensagens neste tópico

Tenho um ficheiro binario que contem dados de pessoas tais como nome,morada,localidade,numero de contribuinte,telefone, etc.

O que pretendia agora e ordenar este ficheiro por numero de contribuinte e alfabeticamente mas nao estou a conseguir fazelo...

Alguem me pode dar umas 'luzes' de como resolver isto ?

Obrigado  B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Das duas uma, ou é por número de contribuinte ou é alfabeticamente.

Aquilo que tens que fazer é criar uma estrutura "pessoa" que contenha esses dados, ler os dados para uma sequência dessas estruturas(uma lista ligada por exemplo), aplicar um algoritmo de ordenação, e por fim escrever os dados no ficheiro pela ordem "correcta".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aquilo que tens que fazer é criar uma estrutura "pessoa" que contenha esses dados, ler os dados para uma sequência dessas estruturas(uma lista ligada por exemplo), aplicar um algoritmo de ordenação, e por fim escrever os dados no ficheiro pela ordem "correcta".

uma forma mais eficiente seria usares uma estrutura de dados mais complexa como uma AVL (ou simplesmente árvore binária de procura se não quiseres ter muito trabalho) e deixas de precisar do algoritmo de ordenação.

claro que também podes inserir ordenadamente numa lista ligada mas é muito menos eficiente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estou a pensar em colocar tudo o q esta agr num vector de estruturas usando tb alocaçao de memoria... que acham ? seria mais ou menos uma coisa do genero...

CLIENTE *LerVector (int *tam) /* devolve um ponteiro para o início do vector e o seu tamanho */
{
CLIENTE *V;

*tam = 0;

V = (CLIENTE *) malloc (sizeof (CLIENTE));
if (V == NULL) return (NULL);
while (!feof (fc))
{
*tam = *tam + 1;
V = (CLIENTE *) realloc (V, (*tam) * sizeof (CLIENTE));
if (V == NULL) return (NULL);
fread(&V, sizeof(CLIENTE), 1, fc);   <- [b]ISTO ESTA CORRECTO?[/b]
}
fclose (fc);
return (V);
}

A variavel do tipo FILE está definida de forma global dai nao estar aki presente no corpo da funçao!

Ainda nao trabalhei com uma AVL mas vou tb tentar pegar na sugestao do pedrosorio

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

void OrdenarBubbleSort (CLIENTE *V, int tam)
{
int k, Num_trocas;
CLIENTE aux;
do
{
  Num_trocas = 0;
  for (k = 0; k < tam-1; k++)
  if (V[k].NC > V[k+1].NC)
  {
   aux = V[k];
   V[k] = V[k+1];
   V[k+1] = aux;
   Num_trocas++;
  }
} while (Num_trocas != 0);
}

int GuardarVectorFich (CLIENTE *V, int tam)
{
int i;
fc =fopen(CLIENTES,"wb");
if (fc == NULL)
return (-1); // Houve um erro na abertura do ficheiro
for (i = 0; i < tam; i++)
{
fwrite(&V,sizeof(CLIENTE),1,fc);
}
fclose (fc);
return (1); // Não houve qualquer problema
}

Pessoal o q tenho agr e isto... mas qd vou fazer uma nova consulta ( dps de ordenar) aos meus clientes no executavel, nao me mostra rigorosamente nada  B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora