Ang3lo Posted May 29, 2011 at 11:55 AM Report #391787 Posted May 29, 2011 at 11:55 AM 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
Localhost Posted May 29, 2011 at 11:58 AM Report #391788 Posted May 29, 2011 at 11:58 AM A tua explicação foi muito confusa. Dá exemplos. here since 2009
Ang3lo Posted May 29, 2011 at 12:27 PM Author Report #391791 Posted May 29, 2011 at 12:27 PM 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).
Localhost Posted May 29, 2011 at 12:32 PM Report #391792 Posted May 29, 2011 at 12:32 PM Lês para um vector de estruturas e ordenas pelo primeiro campo. here since 2009
Ang3lo Posted May 29, 2011 at 12:55 PM Author Report #391796 Posted May 29, 2011 at 12:55 PM Vector de estruturas? :dontgetit:
Localhost Posted May 29, 2011 at 01:26 PM Report #391804 Posted May 29, 2011 at 01:26 PM Sim, convém saberes utilizar estruturas para resolver este problema. here since 2009
Ang3lo Posted May 29, 2011 at 01:55 PM Author Report #391808 Posted May 29, 2011 at 01:55 PM Pois...mas não sei :\
Localhost Posted May 29, 2011 at 04:47 PM Report #391850 Posted May 29, 2011 at 04:47 PM 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
Ang3lo Posted June 3, 2011 at 09:33 PM Author Report #393370 Posted June 3, 2011 at 09:33 PM 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
Localhost Posted June 3, 2011 at 10:53 PM Report #393387 Posted June 3, 2011 at 10:53 PM 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
Ang3lo Posted June 4, 2011 at 10:56 PM Author Report #393546 Posted June 4, 2011 at 10:56 PM 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
Localhost Posted June 5, 2011 at 05:43 AM Report #393567 Posted June 5, 2011 at 05:43 AM Utilizas a função rand. Geras números entre 0 e N - 1 em que N é a quantidade de elementos que tens no vector. Mais informações: http://www.cplusplus.com/reference/clibrary/cstdlib/rand/. here since 2009
Ang3lo Posted June 5, 2011 at 11:15 AM Author Report #393584 Posted June 5, 2011 at 11:15 AM Mais uma vez obrigado pela dica, já esta a funcionar 🙂
Ang3lo Posted June 5, 2011 at 11:28 AM Author Report #393588 Posted June 5, 2011 at 11:28 AM 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
Localhost Posted June 5, 2011 at 11:32 AM Report #393590 Posted June 5, 2011 at 11:32 AM Utilizavas a função strcmp dentro da função de comparação (que utilizas para chamar a qsort). Mais informações sobre a qsort: https://wiki.portugal-a-programar.pt/dev_geral/c/c_qsort/ here since 2009
KTachyon Posted June 5, 2011 at 12:09 PM Report #393596 Posted June 5, 2011 at 12:09 PM 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
Localhost Posted June 5, 2011 at 12:11 PM Report #393598 Posted June 5, 2011 at 12:11 PM 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
Ang3lo Posted June 5, 2011 at 12:17 PM Author Report #393600 Posted June 5, 2011 at 12:17 PM 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
KTachyon Posted June 5, 2011 at 12:31 PM Report #393603 Posted June 5, 2011 at 12:31 PM 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
Localhost Posted June 5, 2011 at 12:44 PM Report #393605 Posted June 5, 2011 at 12:44 PM 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
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