Jump to content

Recommended Posts

Posted

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

Posted

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).

Posted

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

Posted

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

Posted

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

Posted

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 😛

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

Posted

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

Posted

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

Posted

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

Posted

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

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.