web-dev-qa-db-fra.com

trier les membres du tableau de structure

Étant donné un tableau de structure (en C), je tente d’imprimer les résultats en groupes de genre et en sous-ordre par ordre numérique. Par exemple:

struct employee{
char gender[13]
char name[13];
int id;
};

Disons que je définis le tableau de structure comme suit:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

Comment puis-je imprimer les résultats comme 

1234 Matt
1235 Josh


2345 Jessica
12
bardockyo

Vous devrez implémenter une fonction de tri comparant les structures à votre guise.

int compare(const void *s1, const void *s2)
{
  struct employee *e1 = (struct employee *)s1;
  struct employee *e2 = (struct employee *)s2;
  int gendercompare = strcmp(e1->gender, e2->gender);
  if (gendercompare == 0)  /* same gender so sort by id */
    return e1->id - e2->id;
  else
    return -gendercompare;  /* the minus puts "male" first as in the question */
}

Et utilisez ensuite qsort de la bibliothèque standard.

qsort(data, count, sizeof(struct employee), compare);

Dans la fonction de comparaison, vous pouvez vérifier si l'identifiant est égal, puis vous pouvez trier par nom (en utilisant également strcmp()) comme vous le souhaitez.

Ken

Edit: vient de compiler et de corriger cela. Voici un petit programme de test

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

    struct employee{
      char gender[13];
      char name[13];
      int id;
    };

    int compare(const void *s1, const void *s2)
    {
      struct employee *e1 = (struct employee *)s1;
      struct employee *e2 = (struct employee *)s2;
      int gendercompare = strcmp(e1->gender, e2->gender);
      if (gendercompare == 0)  /* same gender so sort by id */
        return e1->id - e2->id;
      else
        return -gendercompare;
    }

    main()
    {
      int i;
      struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);

      qsort(info, 3, sizeof(struct employee), compare);

      for (i = 0; i < 3; ++i)
        printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
    }

Avec sortie:

$ ./a.exe
1234    male    Matt
2345    female  Jessica
1235    male    Josh
1234    male    Matt
1235    male    Josh
2345    female  Jessica
19
kallikak

Utilisez votre algorithme de tri préféré sur le tableau struct. Lorsque vous comparez deux éléments du tableau pour déterminer lequel est le plus "grand", comparez leurs genres; si les sexes sont les mêmes, comparez leurs nombres. (Vous souhaiterez peut-être définir une fonction distincte pour effectuer cette comparaison afin de clarifier les choses.) Ensuite, imprimez le tableau trié dans l'ordre en utilisant le formatage souhaité. Gardez une trace du moment où le genre bascule d'homme à femme pour pouvoir ajouter trois nouvelles lignes supplémentaires, comme dans votre exemple.

Edit: pour emprunter sans vergogne à kallikak, vous pouvez simplement passer votre fonction de comparaison à qsort, mais le renvoyer 1 si une structure est "supérieure", -1 si elle est "inférieure" et (si nécessaire) 0 si elle est identique (en utilisant la procédure que j'ai décrite ci-dessus). Jetez un oeil à Comment écrire une fonction de comparaison pour qsort à partir de stdlib? pour obtenir de l’aide sur l’écriture d’une fonction de comparaison personnalisée.

2
1''

Pense que c'est plus facile à comprendre, comme je suis faible en pointeur, j'espère que ça aide ............

#include<bits/stdc++.h>

using namespace std;


struct employee{
  char gender[13];
  char name[13];
  int id;
};

bool compare(employee s1,employee s2)
{
  return s1.id<s2.id;
}

main()
{
  int i;
  struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
  sort(info,info+3,compare);
  for (i = 0; i < 3; i++)
  printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name);
}
0
Progga Ilma