Сортировка имени и идентификатора в C - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь написать код, который может сортировать имена.Поэтому я попытался написать программу, но она не работает так, как я хочу.Я хочу, чтобы имена сортировались по алфавиту.Я также хотел бы отсортировать идентификатор на основе того, какой идентификатор имеет наибольшее значение.вся помощь оценена.Вроде новый для C и кодирования в целом!

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

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

int compare(const void *s1, const void *s2)
{
  struct class  *e1 = (struct class *)s1;
  struct class *e2 = (struct class *)s2;
  int gendercompare = strcmp(e1->name, e2->name);
  if (gendercompare == 0)  
    return e2->gender - e1->gender;
  else
    return -gendercompare;
}

main()
{
  int i;
  int employeecount;

  struct class info[]={{"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000}};

  employeecount=3; 

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

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

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

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Я думаю, вам может потребоваться обновить функцию compare следующим образом:

#include <string.h>

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

int compare(const void *s1, const void *s2)
{
  struct class *e1 = (struct class *)s1;
  struct class *e2 = (struct class *)s2;
  return strcmp(e1->gender, e2->gender);
}

strcmp достаточно для сравнения.

Другие мелкие детали очень хорошо упоминаются в ответах @ Jabberwocky.

0 голосов
/ 27 февраля 2019

Компиляция с включением большего количества предупреждений, чтобы помочь вам диагностировать проблемы:

gcc -std=c17 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds         54908259.c    -o 54908259
54908259.c: In function ‘compare’:
54908259.c:14:23: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
   int gendercompare = strcmp(e1->name, e2->name);
                       ^~~~~~
54908259.c: At top level:
54908259.c:21:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main()
 ^~~~
54908259.c: In function ‘main’:
54908259.c:26:38: warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
   struct class info[]={{"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000}};
                                      ^~~~
54908259.c:26:38: note: (near initialization for ‘info[0].id’)
54908259.c:26:60: warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
   struct class info[]={{"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000}};
                                                            ^~~~
54908259.c:26:60: note: (near initialization for ‘info[1].id’)
54908259.c:26:80: warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
   struct class info[]={{"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000}};
                                                                                ^~~~
54908259.c:26:80: note: (near initialization for ‘info[2].id’)
54908259.c:31:14: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("%i\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
             ~^             ~~~~~~~~~~
             %ls
54908259.c:30:3: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
   for (i = 0; i < employeecount; ++i)
   ^~~
54908259.c:32:5: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘for’
     printf("\n");
     ^~~~~~
54908259.c:37:14: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("%i\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
             ~^             ~~~~~~~~~~
             %ls
0 голосов
/ 27 февраля 2019

Есть несколько проблем, см. // <<<< комментарии, которые я добавил:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>   // <<<< you forgot to include string.h

struct class {
  char gender[13];
  char name[13];
  int id;            // <<<< int *id; having a pointer here is pointless,
                     //      you simple want an integer value here.
                     //      That's the main problem in your code
};

int compare(const void *s1, const void *s2)
{
  struct class *e1 = (struct class *)s1;
  struct class *e2 = (struct class *)s2;
  int gendercompare = strcmp(e1->name, e2->name);
  if (gendercompare == 0)
    return e2->gender - e1->gender;
  else
    return -gendercompare;
}

int main(void)   // <<<< it's int main(void) , not main()
{
  int i;
  int employeecount;

  struct class info[] = { {"male","AAA",2000},{"female","BBB",1000},{"male","CCC",3000} };

  employeecount = 3;

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

  // <<<< use employeecount instead of 3, it's the same thing but it's more consistent.
  //      Not something that would prevent your code from working
  qsort(info, employeecount, sizeof(struct class), compare);

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

Есть также логическая проблема в вашей функции compare, кажется, вы хотите отсортировать по полу, сначала мужчины.

Поскольку функция сравнения должна возвращать значение <0, 0 или> 0, вы можете просто вернуть возвращаемое значение strcmp.Также вам не нужны приведения, но e1 и e2 должны быть const, поскольку s1 и s2 равны const.

int compare(const void *s1, const void *s2)
{
  const struct class *e1 = s1;
  const struct class *e2 = s2;
  return -strcmp(e1->gender, e2->gender);
}

См. Также ответ ConsistentProgrammer для получения информации офункция сравнения, сортирующая по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...