C - сортировка номеров с прикрепленными именами - PullRequest
1 голос
/ 09 марта 2019

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

for (b = 0; b < ch - 1; b++) {
    for (c = 0; c < ch - b - 1; c++) {
        if (array[c] > array[c + 1]) {
            sort = array[c];
            array[c] = array[c + 1];
            array[c + 1] = sort;
            //sorting the guessing result in ascending order
        }
    }
}
//printing to a file
printf("Sorted list in ascending order:\n");

for (b = 0; b < ch; b++)
    printf("%d\n", array[b]);

fprintf(file, "Sorting: %s %d\n", user_name, ch);
fclose(file);

1 Ответ

3 голосов
/ 09 марта 2019

Простой способ сортировки «чисел с прикрепленными именами» состоит в том, чтобы поместить число и имя в struct и получить массив из этого struct.Затем просто используйте стандартную функцию qsort для сортировки массива.

Это может выглядеть так:

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

// Define a type to hold the score together with the name of the player
typedef struct
{
    char name[42];
    int score;
} PlayerStats;

// Make a compare function to be used by qsort
int cmpfunc (const void * a, const void * b){
    const PlayerStats* pA = a;
    const PlayerStats* pB = b;
    if (pA->score > pB->score) return -1;
    if (pA->score < pB->score) return 1;
    return 0;
}

// A function for printing the players and their score
void print_stats(PlayerStats *ps, size_t n)
{
    for(size_t i=0; i<n; ++i) printf("%s : score=%d\n", ps[i].name, ps[i].score);
}

int main(){
    // Make an array of players with scores.
    PlayerStats player_stats[3] = {{"p1", 17}, {"p2", 9}, {"p3", 42}};
    size_t numElements = sizeof player_stats / sizeof player_stats[0];
    size_t sizeElement = sizeof player_stats[0];

    printf("Unsorted:\n");
    print_stats(player_stats, numElements);

    // Use the standard qsort for sorting the array
    qsort(player_stats, numElements, sizeElement, cmpfunc);

    printf("Sorted:\n");
    print_stats(player_stats, numElements);

    return 0;
}

Вывод:

Unsorted:
p1 : score=17
p2 : score=9
p3 : score=42
Sorted:
p3 : score=42
p1 : score=17
p2 : score=9

Попробуйте здесь:https://ideone.com/HMgDbn

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

int cmpfunc (const void * a, const void * b){
    const PlayerStats* pA = a;
    const PlayerStats* pB = b;
    if (pA->score > pB->score) return 1;   // Change -1 to 1
    if (pA->score < pB->score) return -1;  // Change 1 to -1
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...