FORUM DARKERS

Tecnologia & Informática => Programação => C/C#/C++ => Topic started by: C00L3R on 12 de June , 2009, 10:21:04 PM

Title: Dados em ordem alfabética e crescente em C
Post by: C00L3R on 12 de June , 2009, 10:21:04 PM
Mais um "Post" de "C" para vocêis leitores iniciantes desta linguagem,Cof Cof eu também sou iniciante :)
só que estou compartilhando o que estou pesquisando e aprendendo,Bem hoje vamos fazer algo diferente
vamos pegar dados e organizar a partir de um método de "Sort" aqui vamos usar o método bolha não é um
dos melhores mas para coisas pequenas faz bem o trabalho...

qualquer dúvida leia aqui antes para entender o seu funcionamento
http://pt.wikipedia.org/wiki/Categoria:Algoritmos_de_ordena%C3%A7%C3%A3o

Bem em outras linguagens como RUBY,PHP,Python e Perl, tem funções de "sort" pré definidas
como por exemplo quando você chama função "sort" o Perl usa uma função interna usando método
de ordenação "Merge" ou seja por mistura e assim vai e acaba dando "return" do array organizado
Estes métodos são fáceis de implementar se a linguagem tem estás funções ou libs que o faça,Aqui
vamos pegar linguagem C nível de dificuldade é maior por termos que intender o algoritmo e fazer a roda
Bem vou postar um código todo comentado para ajudar você leitor

// Autor: Antonio Cooler
// License BSD
// Exemplo de como usar o método bolha para organizar informações
// http://BotecoUnix.com.br
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define w printf
#define MAX_BUF 256

//lê as funções do fim do código antes de iniciar
void bubble(void *p, int width, int N,int(*fptr)(const void *, const void *));
int compara_letras(const void *m, const void *n);
int compara_numeros(const void *m, const void *n);


int main() {
// Declaramos nossas vars como listas e para explicar o uso da função bubble
// já add os dados
long lista[]={4,2,1,5,3,8,10,9,0,45};
char nomes[6][20] = {"Madruga","Arara","Zebra","Elefante","Babaca","Gato"};
int i;
for(i=0; i<=9; i++) w("%d\n",lista[i]);
for(i=0; i<=5; i++) w("%s\n",nomes[i]);
w("--------------\nagora dando sort nas listas\n");
//Chama a função do nosso metodo de sort "bubble" no seguinte padrão
// nome_func(array, tamanho, elementos Func_a_ser_usada);
bubble(lista, 4, 10, compara_numeros);
bubble(nomes, 20, 6, compara_letras);    
for(i=0; i<=9; i++) w("%d\n",lista[i]);
for(i=0; i<=5; i++) w("%s\n",nomes[i]);
return 0;
}

//função bolha POG pura huHAUhUAHah
//definimos no apontador "p" nome do "array",na var "width" definimos tamanho e na var
//"N" definimos quantidade e no apontador "*fptr" definimos a função secundaria ou seja
// se é para comparar string ou long...
void bubble(void *p, int width, int N, int(*fptr)(const void *, const void *)) {
int i, j, k;
//unsigned força para negativo
unsigned char buf[MAX_BUF];
unsigned char *bp = p;
//aqui você não vai ter nenhum problema se você entendeu o algoritmo
 for (i = N-1; i >= 0; i--) {
  for (j = 1; j <= i; j++) {
   k = fptr((void *)(bp + width*(j-1)), (void *)(bp + j*width));
   if (k > 0) {
    memcpy(buf, bp + width*(j-1), width);
    memcpy(bp + width*(j-1), bp + j*width , width);
    memcpy(bp + j*width, buf, width);
   }
  }
 }
}
//comparando letras graças "strcmp" função da lib "string.h"
 int compara_letras(const void *m, const void *n) {
     char *m1 = (char *)m;
     char *n1 = (char *)n;
     return (strcmp(m1,n1));
 }
//comparando numeros
 int compara_numeros(const void *m, const void *n) {
     long *m1, *n1;
     m1 = (long *)m;
     n1 = (long *)n;
     return (*m1 > *n1);
 }

neste link tem boas explicações em outros casos http://pt.wikipedia.org/wiki/Bubble_sort

bem com este "post" você já tem uma função legal para usar nos seus programas
isso é apenas uma introdução a métodos de ordenação cabe a você estudar outros
métodos...
Title: Re: Dados em ordem alfabética e crescente em C
Post by: blackwinner on 14 de June , 2009, 11:39:53 PM
O método da bolha foi o primeiro algoritmo que eu aprendi para organizar dados... eu nunca vou me cansar de ver exemplos. hehe =]
Title: Re: Dados em ordem alfabética e crescente em C
Post by: guidjos on 02 de August , 2009, 01:38:40 PM
Tem vários métodos... bubble, radix, merge... eu prefiro o quicksort. Tive que implementar o algoritmo em C no ano passado.

Recomendo o quicksort. Já vem na biblioteca do C. Pesquisem qsort().

Lembrando que esses métodos não ordenam somente strings. Isso são algoritmos, que podem ser aplicados a qualquer tipo de dados. Na verdade, o C só trabalha com números. Mesmo quando o que se ordena é texto, o C enxerga valores da tabela ASCII.