Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  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 : 2
    Points
    2

    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 :
    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    Par défaut

    Code :
    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 : 2
    Points
    2

    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 :
    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    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 : 2
    Points
    2

    Par défaut

    Code :
    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
    23 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 927
    Points : 31 977
    Points
    31 977

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •