Jump to content
Sign in to follow this  
Ang3lo

Ordenar Ficheiro

Recommended Posts

Ang3lo

Boa tarde,

Gostaria de saber se em C é possível ordenar um ficheiro, isto é tenho um campo limitado por um limitador ( | )

mas o limitador não tem que ser esse é opcional. Agora o primeiro campo pode ser números se escolher essa opção

ou letras se escolher outra opção. Agora a minha duvida é como posso ordenar um ficheiro que tem X linhas por

ordem crescente ou decrescente?

Obrigado

Share this post


Link to post
Share on other sites
Localhost

A tua explicação foi muito confusa. Dá exemplos.


here since 2009

Share this post


Link to post
Share on other sites
Ang3lo

Supondo que tenho um ficheiro assim

125|Angelo

128|Rui

75|Bruno

150|Carina

55|Catarina

80|Patricia

Se quiser ordena por ordem crescente terá de ficar assim

55|Catarina

75|Bruno

80|Patricia

125|Angelo

128|Rui

150|Carina

Se quiser ordena por ordem decrescente terá de ficar assim

150|Carina

128|Rui

125|Angelo

80|Patricia

75|Bruno

55|Catarina

Ou seja tenho de ordenar pelo primeiro campo ate à '|'

Neste exemplo o primeiro campo eram números mas tenho de fazer isto

para o caso de serem palavras também(ordenar alfabeticamente).

Share this post


Link to post
Share on other sites
Localhost

Lês para um vector de estruturas e ordenas pelo primeiro campo.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Sim, convém saberes utilizar estruturas para resolver este problema.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Primeiro tens que definir a estrutura que vai conter os dois campos (um com o número de identificação e outro com o nome/string).

typedef struct
{
    int id;
    char my_string[1024];
} Person;

Depois, visto que tens várias pessoas no ficheiro vais ter que declarar um vector de estruturas (se sabes o que é um vector de int's p.e. também sabes o que é um vector de estruturas).

Person people[1000];

Assim vais ter espaço para 1000 pessoas.

Depois precisas de ler a informação (o número para o int (id) e o nome para a string (my_string)). Deixo isto para ti. Para acederes a um campo de uma estrutura fazes (pegando na estrutura que declarei anteriormente como exemplo):

people[0].id = 10;

Aqui vais estar a aceder à primeira posição do vector de estruturas (posição 0) e ao campo id e vais atribuir-lhe o valor 10. De uma maneira geral: estrutura.campo = valor.

Depois de lida toda a informação utilizas a função qsort. Procura no google por ela e tenta usá-la.

-----

Como alternativa podias ter dois vectores (um de int's e outro de strings) e ordenavas o vector de int's e ao mesmo tempo o vector de strings com uma função feita por ti. Podias utilizar o bubble sort para começar visto que é de fácil implementação. Os valores num vector ficavam nas mesmas posições aos valores correspondentes de outro vector i.e. se um número de identificação K ficasse na posição X do vector de ints, a string S correspondente a K ficava também na posição X do vector de strings.


here since 2009

Share this post


Link to post
Share on other sites
Ang3lo

Muito obrigado pela explicação, já fiquei a perceber  :)

Mas infelizmente e por indicação do docente sou obrigado a usar array de apontadores e usar um algoritmo Qsort para o ordenar.

A minha duvida é se uma posição do array que aponta para string com esta forma:

file[0]= /ficheiro/ficheiro1.txt | 1 | 125 |

file[1]= /ficheiro/ficheiro23.txt | 4 | 130 |

file[2]= /ficheiro/ficheiro12.txt | 6 | 200 |

file[3]= /ficheiro/ficheiro2.txt | 9 | 50 |

Se é possível ordenar por qualquer um dos campos separador pela ' | '

Ou se é possível inserir logo ordenadamente por um dos campos também.

Obrigado

Share this post


Link to post
Share on other sites
Localhost

Já respondi a essas dúvidas no meu post anterior. Não percebi foi que tinhas vários ficheiros (não tinhas indicado isso atrás) mas fica essencialmente a mesma coisa.

Já agora, deixo aqui um link com informação sobre a função qsort: qsort function.


here since 2009

Share this post


Link to post
Share on other sites
Ang3lo

Segui o teu conselho e implementei a minha função Bsort, vi o seu funcionamento num video no

youtube e a implementação é bastante simples :P

Depois foi só coordenar a ordenação nos dois array e ficou tudo ordenado como queria :)

Agora a minha duvida é se em vez de querer ordenar quiser fazer um random como posso fazer isso?

Ou seja ir a um array e alternas as posições ao calhas....

Obrigado

Share this post


Link to post
Share on other sites
Ang3lo

Apenas mais uma questão nos casos anteriores ordenei por inteiros do maior para o mais pequeno e vice-versa,

mas caso fossem string e tivesse que ordenar alfabeticamente como procedia?

Obrigado

Share this post


Link to post
Share on other sites
KTachyon

Pois, mas cuidado com os caracteres acentuados e com as letras capitalizadas, que o strcmp lida apenas com o valor ascii.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

De notar que ele tem no exemplo de ficheiro que deu alguns nomes que levam acentos e os mesmos não existem no ficheiro.


here since 2009

Share this post


Link to post
Share on other sites
Ang3lo

Obrigado pelo aviso :)

Caso a string a comparar tenha espaço o strcmp continua a funcionar?

No caso de (p.ex)

Angelo Miguel

Angelo Silva

Obrigado

Share this post


Link to post
Share on other sites
KTachyon

O espaço é um valor mais baixo em ascii, e funciona como na ordenação alfabética (palavras mais curtas aparecem primeiro).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

Eu acho que ele não quer ordenar *uma* string alfabeticamente. Penso que ele quer ordenar *todas* as strings alfabeticamente. Sendo assim, utilizando a função qsort para ordenar e a função strcmp para a função de comparação, continuaria a funcionar.


here since 2009

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×
×
  • 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.