it-swarm.com.de

mitglieder des Struktur-Arrays sortieren

In Anbetracht eines Strukturfeldes (in C) versuche ich, die Ergebnisse nach Geschlecht und in Unterreihenfolge in numerischer Reihenfolge auszudrucken. Zum Beispiel:

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

Angenommen, ich definiere das Strukturarray so:

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

Wie könnte ich die Ergebnisse gerne ausdrucken 

1234 Matt
1235 Josh


2345 Jessica
12
bardockyo

Sie müssen eine Sortierfunktion implementieren, die die erforderlichen Strukturen vergleicht

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 */
}

Verwenden Sie dann qsort aus der Standardbibliothek.

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

In der Compare-Funktion können Sie prüfen, ob die ID gleich ist. Dann können Sie nach Namen sortieren (auch mit strcmp()), wie Sie möchten.

Ken

Edit: Einfach kompiliert und behoben. Hier ist ein kleines Testprogramm

    #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);
    }

Mit Ausgabe:

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

Verwenden Sie Ihren bevorzugten Sortieralgorithmus für das struct Array. Wenn Sie zwei Elemente des Arrays vergleichen, um zu entscheiden, welches "größer" ist, vergleichen Sie deren Geschlechter. Wenn die Geschlechter gleich sind, vergleichen Sie ihre Zahlen. (Möglicherweise möchten Sie eine separate Funktion definieren, um diesen Vergleich durchzuführen, um die Dinge klarer zu machen.) Anschließend drucken Sie das sortierte Array in der gewünschten Reihenfolge. Verfolgen Sie, wann das Geschlecht von männlich zu weiblich wechselt, sodass Sie, wie in Ihrem Beispiel, drei zusätzliche Zeilen hinzufügen können.

Edit: Um sich schamlos aus dem Kallikak zu leihen, können Sie Ihre Vergleichsfunktion einfach an qsort übergeben. Sie muss jedoch 1 zurückgeben, wenn eine Struktur "größer" ist, -1, wenn sie "weniger" ist, und (falls erforderlich) 0, wenn sie gleich ist (mit dem oben beschriebenen Verfahren). Werfen Sie einen Blick auf Wie schreibt man eine Vergleichsfunktion für qsort aus stdlib? für Hilfe zum Schreiben einer benutzerdefinierten Vergleichsfunktion.

2
1''

Ich denke, es ist einfacher zu verstehen, da ich im Zeiger schwach bin. Ich hoffe, es hilft.

#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