сортировка массива struct в массиве struct c - PullRequest
0 голосов
/ 26 февраля 2012

Я пытаюсь отсортировать массив структур по каждому члену структуры;т.е. я хочу напечатать 1 список, отсортированный по каждому члену структуры.Когда члены структуры являются целыми числами, нет проблем.Но один из членов - это другой массив структур, и я также хочу отсортировать весь беспорядок по каждому члену этой структуры.Вот код:

 #define PROPHET_COUNT 9000
 #define MAX_FAITH_COUNT 600

typedef struct s_ProphetStat {  
    int     precursorScore;
    int     cassandraScore;
    int     prophetId;} prophetStat;

typedef struct s_FaithStat{
    int     precursorScore;
    int     cassandraScore;
    int     faithId;
    prophetStat ProphetStat[PROPHET_COUNT];  } faithStat; 

void fauxScoringFunction(faithStat *FaithStat)
{
    for (int faithIndex = 0; faithIndex < MAX_FAITH_COUNT; ++faithIndex){
        for (int prophetIndex = 0; prophetIndex < PROPHET_COUNT; ++prophetIndex){
            int randomNumber = rand();
            FaithStat[faithIndex].ProphetStat[prophetIndex].precursorScore +=   randomNumber;
            FaithStat[faithIndex].ProphetStat[prophetIndex].cassandraScore +=   randomNumber;
            FaithStat[faithIndex].precursorScore += randomNumber;
            FaithStat[faithIndex].cassandraScore += randomNumber; }}
}

typedef int (*compfn)(const void*, const void*);`enter code here`

   int compareFaithPrecursorScores(faithStat *faithA, faithStat *faithB){
 if (faithA->precursorScore > faithB->precursorScore) return 1; if (faithA->precursorScore < faithB->precursorScore) return -1; return 0; }
    int compareFaithCassandraScores(faithStat *faithA, faithStat *faithB) {
  if (faithA->cassandraScore > faithB->cassandraScore) return 1; if (faithA->cassandraScore < faithB->cassandraScore) return -1; return 0; }
    int cannotFigureOut(...) { return 0; }

void fakemain(void)
{
    faithStat   *FaithStat =  (faithStat *)   calloc(MAX_FAITH_COUNT,   sizeof(faithStat) );
    fauxScoringFunction(FaithStat);
    // sort by cumulative precursorScore for each faith 
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithPrecursorScores);
    // print results();
    // sort by cumulative precursorScore for each faith
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithCassandraScores);
    // print results()
    // sort by prophet precursor score
    qsort(FaithStat, MAX_FAITH_COUNT * PROPHET_COUNT, sizeof(faithStat *), (compfn) cannotFigureOut);
}

Это функция сравнения "neverFigureOut ()", которую я пытаюсь написать.(Я компилирую код C, используя VS2010 C ++ (не мое решение), таким образом, противное приведение calloc. Все остальное мое уродство.)

Редактирует: пытаясь упростить, испортил функции сравнения.ИсправленоТакже, Edit: я пропустил важную часть информации: набор Пророков одинаков для каждой веры.Поэтому я хочу отсортировать по совокупным показателям предшественника (а затем отдельно по совокупному количеству кассандры) каждого пророка.То есть: Prophet [0] cumulativeScore = (Faith [0] .Prophet [0] .precursorScore + (Faith [1] .Prophet [0] .precursorScore ... Faith [MAX_FAITH_COUNT - 1] .Prophet [0] .precursorScore));

1 Ответ

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

Сначала return (a,b); просто возвращает b; в ваших compareFaithPrecursorScores и compareFaithCassandraScores вы, вероятно, захотите заменить , на -. Теперь у вас есть только конфессий , выделенных в вашей основной записи, поэтому в последней вы должны отсортировать те же FaithStat той же длины, что и раньше: MAX_FAITH_COUNT, а не MAX_FAITH_COUNT * PROPHET_COUNT.

Теперь в вашем cannotFigureOut вы просто сравниваете два faithStats, как и раньше, так что подпись все та же:

int cannotFigureOut(faithStat *faithA, faithStat *faithB){
 .... } 

(правка :) хорошо, поэтому (после ваших разъяснений) это не называется кумулятивным , это вводит в заблуждение. Вы имели в виду Итого Оценка. Кажется, что ваше последнее добавление говорит о том, что вы хотите отсортировать другой массив в целом, на этот раз из 9000 пророков (а не 600 вер). Оценка каждого пророка будет суммой его оценок по всем конфессиям; просто создайте функцию для заполнения массива пророков после его создания, а затем сортируйте как обычно.

Вы можете использовать ту же структуру prophetStat для хранения общего количества баллов на этот раз, а не значений для каждой веры, так что подпись будет

int cannotFigureOut(prophetStat *prophetA, prophetStat *prophetB){
 .... } 
...