[c] le tri, l'échange et les pointeurs

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 126 fois - Téléchargée 30 fois

Contenu du snippet

J'ai commencé par coder une fonction swap, ensuite je me suis dit que je pourrais m'en servir pour faire un tri bulle mais je me suis rappellé que le tri bulle je ne l'aime pas ^^...
Donc j'ai essayé de coder une fonction sort à ma sauce et comme y'a une chose que j'aime bien en C et qui s'apelle "pointeur" bah j'en ai usé et abusé ^^

Ce code est donc fait en C, très probablement compatible C++ et prend pour exemple un tableau char de 5 éléments... J'utilise le mode console pour afficher les résultats... C'est surtout les algos qui comptent pour moi...

J'ai utilisé le type de données size_t parce que c'est plus court à écrire que unsigned long ^^ et surtout parce que je l'ai vu dans plusieurs biblios (il est là donc autant l'utiliser)...

Les fonctions qui ne sont pas de moi sont :
malloc()
free() (quand on utilise malloc vaut mieux avoir celui là aussi...)
memcpy()

Je les aurai bien aussi codées moi même mais bon l'assembleur en ligne n'est pas le même partout et puis a part memcpy j'aurai pas pu coder grand chose...

J'essairai de les commenter, car seule la fonction main() l'est... Mais ceux qui connaissent le tri par insertion doivent pouvoir facilement s'y retrouver.

Voila... 36 15 My Life c'est terminé...

Source / Exemple :


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

void swap(void*, void*, size_t);
void sort(void*, size_t, size_t, int (*)(void*, void*));

int char_superieur_ou_egal(void *a, void *b)
{
  return *((char*)a)>=*((char*)b);
}

int char_inferieur_ou_egal(void *a, void *b)
{
  return *((char*)a)>=*((char*)b);
}

void swap(void *buffer1, void *buffer2, size_t size)
{
  void *buffer3;
  
  buffer3 = malloc(size);
  
  memcpy(buffer3, buffer1, size);
  memcpy(buffer1, buffer2, size);
  memcpy(buffer2, buffer3, size);
  
  free(buffer3);
}

void sort(void *buffer, size_t size, size_t count, int (*compare)(void*, void*))
{
  size_t left, right, i;
  void *temp;
  
  temp = (void*) malloc(size);
  
  for(right=0; right<count; right++)
  {
    memcpy(temp, buffer+size*right, size);
    for(left=0; left<right; left++)
      if(compare(buffer+size*right, buffer+size*left)==1) break;
    if(left<right)
    {
      for(i=right; i>left; i--)
        memcpy(buffer+size*i, buffer+size*(i-1), size);
      memcpy(buffer+size*left, temp, size);
    }
  }
  
  free(temp);
  
}

#define TAB_COUNT 5
#define AFFICHER_LE_TABLEAU for (i=0; i<TAB_COUNT; i++) printf("%d\n", tab[i])

main()
{
  //on a besoin d'un tableau et d'une variable pour les boucles
  char tab[TAB_COUNT], i;
  int (*comparaison)(void*, void*);
  
  //on rempli le tableau dont on affiche les valeurs
  for (i=0; i<TAB_COUNT; i++)
    tab[i]=rand()%20;
  AFFICHER_LE_TABLEAU;

  //tri dans l'ordre décroissant
  printf("\n");
  sort(tab, sizeof(char), TAB_COUNT, &char_superieur_ou_egal);
  AFFICHER_LE_TABLEAU;
  
  //tri dans l'ordre croissant
  printf("\n");
  sort(tab, sizeof(char), TAB_COUNT, &char_inferieur_ou_egal);
  AFFICHER_LE_TABLEAU;
  
  //on inverse les deux premiers éléments du tableau
  printf("\n");
  swap(&tab[0], &tab[1], sizeof(char));
  AFFICHER_LE_TABLEAU;

  getch();
}

Conclusion :


Au programme, surtout ce qui touche à la mémoire :
-pointeurs
-pointeurs de fonction
-allocation dynamique
-libération de la mémoire

Le tout de façon générique (fonctionne avec "tous" les types)

Avec ca comme point de départ (surtout le swap...) on peut facilement mettre en oeuvre une biblio en C pour faire des listes chaînées, je pense que je vais me lancer là dedans.

A voir également

Ajouter un commentaire Commentaires
cs_Morgan2
Messages postés
1
Date d'inscription
dimanche 1 juillet 2012
Statut
Membre
Dernière intervention
14 juillet 2012

14 juil. 2012 à 19:39
Aide svp!
une fonction sommet qui retourne le sommet de la pile passée en paramètre
StanOfSky
Messages postés
43
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
7 octobre 2006

4 juin 2004 à 00:08
djl >> " int char_superieur_ou_egal(char *a, char *b)
{
return (strcmp(a, b) >= 0);
} // mais ou est l'interet ? "

l'interet est tout simplement de faire une fonction pour classer des chaines de caracteres dans l'odre alphabétique, mais c'est juste un exemple. apres c vrai que tu peux refaire ta fonction de comparaison de chaine de caracteres mais autant utiliser ce qui existe et fonctionne... (je precise que si tu veux classer des mots dans l'ordre alphabétique il faut aupravant mettre les lettres de chaque mot au meme format cad: soit majuscule soit minuscule)
bool n'est pas ansi c vrai, mais tu peux faire typedef char bool .... mais bon la plus part des compilateurs le reconnaissent ainsi...
c juste que niveau comprehension (et pas compression faute de frappe) c qd meme préférable (a noter que toute librairie , api etc qui se respecte defini un type booléen)

et j'avais ecrit :

int char_superieur_ou_egal(void *a, void *b)
{
return (strcmp((char*)a, (char*)b) >= 0);
}

parce que son compilateur provoque une erreur de cast si c pas de format int(*)(void*,void*)

dri >> "return (strcmp(a, b) >= 0
Il me semble que faire ca n'est justement pas bon. Je vérifirai mais il me semble qu'en le faisant on ne donne pas l'adresse des chaines à comparer mais l'adresse de leurs poibteurs respectifs... C'est pour ca que je voulais passer cette adresse à d'autres variables et que je suis passé par des memcpy, ne sachant faire autrement
"
et ben justement ca c bon puisque qu'une chaine de caractere c un tableau de taille FIXE dont le pointeur sur le premier caractere est le nom de ta variable sachant que ta chaine de caractere se finit des l'apparition du premier caractere nul '\0'
tu peux refaire ta fonction de comparaison si tu le veux mais strcmp te permet de savoir facilement(et de facon portable et optimisée) si les chaines sont identiques, inferieures ou supérieures...
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

30 mai 2004 à 11:17
Nan justement, je l'ai peut être mal expliqué, quand le compilo me balance cette erreur, c'est qu'il y en a une autre ailleurs (c'est ce que j'ai constaté) et du coup je réglai le problème de cette maniere alors qu'avant il l'acceptait... Et là bah ca génere aucune erreur... Parce qu'il n'y en a pas ailleurs.

Dri
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
29 mai 2004 à 17:58
et si tu fais

temp = malloc(size);

il te balance une erreur?
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

29 mai 2004 à 17:41
Bah je l'ai dit je le fais en C... Donc forcément j'ai fait gaffe à l'enregistrer en C

Dri
Afficher les 30 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.