p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 19
    Points : 3
    Points
    3

    Par défaut Trier un tableau en utilisant qsort

    Ci-dessous le programme que j'ai écrit pour le tri d'un tableau sur la dernière colonne,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <stdio.h>
    #include <stdlib.h>
     
    void print ( double a[][5], int n ) {
        int i;
        for ( i = 0 ; i < n ; i++ ) {
            printf( "%.f %.f %.3E %.3E %.3E \n", a[i][0], a[i][1],a[i][2],a[i][3],a[i][4]);
        }
        printf("--\n");
    }
    int compare ( const void *pa, const void *pb ) {
        double (*a)[5] = pa;
        double (*b)[5] = pb;
        if ( a[0][1] < b[0][1] ) return -1;
        if ( a[0][1] > b[0][1] ) return +1;
        return 0;
    }
    main() {
      double data[][5] = {
    	  {37 , 1 , 8.360E-005 , 5.950E-006 , 3.241E-001},
    	  {9  , 1 , 1.690E-004 , 6.020E-006 , 2.445E-001},
    	  {20 , 1 , 1.640E-004 , 1.360E-005 , 2.645E-001},
    	  {34 , 1 , 2.220E-004 , 7.900E-006 , 3.515E-001},
    	  {49 , 1 , 7.530E-005 , 5.850E-006 , 3.541E-001},
    	  {55 , 1 , 1.410E-004 , 9.590E-006 , 2.436E-003},
      };
     
      print( data, 6 );
      qsort( data, 6, sizeof data[0], compare );
      print( data, 6 );
      return 0;
    }
    le résultat obtenu est faux:

    37 1 8.360E-005 5.950E-006 3.241E-001
    9 1 1.690E-004 6.020E-006 2.445E-001
    20 1 1.640E-004 1.360E-005 2.645E-001
    34 1 2.220E-004 7.900E-006 3.515E-001
    49 1 7.530E-005 5.850E-006 3.541E-001
    55 1 1.410E-004 9.590E-006 2.436E-003
    --
    9 1 1.690E-004 6.020E-006 2.445E-001
    20 1 1.640E-004 1.360E-005 2.645E-001
    34 1 2.220E-004 7.900E-006 3.515E-001
    49 1 7.530E-005 5.850E-006 3.541E-001
    55 1 1.410E-004 9.590E-006 2.436E-003
    37 1 8.360E-005 5.950E-006 3.241E-001
    --
    Appuyez sur une touche pour continuer...

    Pouvez vous m'aider à corriger ce programme?
    Merci

  2. #2
    Expert Confirmé Sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 761
    Points : 14 018
    Points
    14 018

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if ( a[0][1] < b[0][1] ) return -1;
        if ( a[0][1] > b[0][1] ) return +1;
    La dernière colonne est la numéro 4, pas la numéro 1. Pour l'instant, il classe suivant la colonne 1 où tous les éléments sont égaux à 1
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 19
    Points : 3
    Points
    3

    Par défaut

    merci pour la réponse.
    J'ai voulu refaire le travaille avec un tableau qui est le résultat d'une structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    typedef struct
    {
    	float Index;
    	float N;
    	float d;
    	float W;
    }ind_struct;
     
    ind_struct *ind_array;
     
    int main(void)
    {
     
        float Euclidien_distance[100];
    	float ind_array_distance[100][5];
    	int nLignes;
    .
    .
    /* d'autre opération pour mon calcul*/
    .
    .
     
        nLignes=0;
    	for (i=0; i<MAX_lignes; i++) {
    		if (ind_array[i].N == 1)
    		{
    			ind_array_distance[i][0]= ind_array[i].Index;
    			ind_array_distance[i][1]= ind_array[i].N;
    			ind_array_distance[i][2]= ind_array[i].d;
    			ind_array_distance[i][3]= ind_array[i].w;
    			ind_array_distance[i][4]= Euclidien_distance[i];
    			nLignes++;
     
    			printf( "%.f %.f %.3E %.3E %.3E \n",ind_array_distance[i][0],ind_array_distance[i][1],ind_array_distance[i][2],ind_array_distance[i][3],ind_array_distance[i][4]); /*Affichage correcte*/
     
    		}
    	}
        printf( "%.f %.f %.3E %.3E %.3E \n",ind_array_distance[i][0],ind_array_distance[i][1],ind_array_distance[i][2],ind_array_distance[i][3],ind_array_distance[i][4]);  /*Affichage NON correcte*/
     
    	qsort( ind_array_distance, nLignes, sizeof ind_array_distance[0], compare );
     
    	printf( "%.f %.f %.3E %.3E %.3E \n",ind_array_distance[i][0],ind_array_distance[i][1],ind_array_distance[i][2],ind_array_distance[i][3],ind_array_distance[i][4]); /*Affichage NON correcte*/
     
     
    }

    ça donne rien !!!!

  4. #4
    Expert Confirmé Sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 761
    Points : 14 018
    Points
    14 018

    Par défaut

    Tu ne montres pas comment a été construit le tableau ind_array utilisé dans ton code. Comment veux tu qu'on puisse te répondre ?

    ça donne rien !!!!
    Ce n'est pas une information pertinente : il se passe quelque chose : erreur de compilation ? plantage à l'exécution ? résultat inexact (et quel est alors le résultat obtenu et celui attendu) ? etc.
    On n'est pas devin et c'est à toi d'être claire dans tes demandes.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 19
    Points : 3
    Points
    3

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    void nomemory(char *string);
     
    #define NUM_IND 1000
     
    typedef struct
    {
    	float Index;
    	float N;
    	float d;
    	float w;
    }ind_struct;
     
    ind_struct *ind_array;
     
     
    int main(void)
    {
     
    	FILE *input_data;
     
    	/*-----------------------------------------------*/
    	/*Read the input data file*/
    	/*-----------------------------------------------*/
    	input_data=fopen("data.txt","r+");
    	if (input_data==NULL)
    	{
    		printf("the test input data is  not ready \n");
    	}
    	else
    	{
    	ind_array = (ind_struct *) calloc (NUM_IND, sizeof(ind_struct));
    		if (ind_array== NULL) nomemory("input");
    		else
    		{
    			for (i=0; i<MAX_lignes; i++) {
     
    				fscanf(input_data,"%e",&ind_array[i].Index);
    				fscanf(input_data,"%e",&ind_array[i].N);
    				fscanf(input_data,"%e",&ind_array[i].d);
    				fscanf(input_data,"%e",&ind_array[i].w);
    				printf("%.f  %.f  %.3E  %.3E \n",ind_array[i].Index,ind_array[i].N,ind_array[i].d,ind_array[i].w);
    			}
    		}
    	}

    c'est la façon que j'ai définit mon tableau ind_array.

  6. #6
    Expert Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 862
    Points : 36 098
    Points
    36 098

    Par défaut

    Tu n'as pas non plus poster la version "structure" de ta fonction de comparaison.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Trier un tableau en utilisant les procédures
    Par leratx dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 05/01/2010, 16h11
  2. Trier un tableau par rapport à un autre tableau
    Par deaven dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 02/05/2005, 09h27
  3. [Débutant] Remplir et trier un tableau
    Par james-dean dans le forum Assembleur
    Réponses: 15
    Dernier message: 01/05/2005, 17h40
  4. Trier un tableau par ordre croissant
    Par Halleck dans le forum Général Algorithmique
    Réponses: 15
    Dernier message: 01/11/2004, 00h04
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Général Algorithmique
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo