Как переставить массив символов в соответствии с другой последовательностью (которая является массивом с плавающей точкой, отсортированным по возрастанию)? - PullRequest
0 голосов
/ 03 февраля 2019

Для выполнения задания мне было поручено создать просмотрщик посещений пациентов поликлиники.Мне были предоставлены следующие данные: Процент посещаемости для 4 различных случаев за данный год.Для проекта нам необходимо выполнить 5 функций.У меня выпало 4, но я все еще не могу разобраться с 1. В соответствии с вопросом, я должен отобразить «От наименьшего к наивысшему проценту дела и имени дела за год».Я понимаю сортировку пузырьков и могу расположить проценты в порядке возрастания.Однако я изо всех сил стараюсь отобразить названия дел в соответствии с тем возрастающим порядком, который я могу получить.

Я попытался создать двумерный массив символов, который включает в себя имена 4-х случаев, а также массив с плавающей точкой с процентами.Затем, включив его в часть «подкачки» алгоритма сортировки, я попытался также поменяться с массивом символов.

float year2010Cases[4] = { 11.2,8.9,15.6,15.9 };
char  caseName[4][28] = { "Respiratory Tract Infection", "Diabetes 
Mellitus","Hyperlipidemia","Hypertensive Disease" };
char swap[1][28];

#include <stdio.h>
void main(void)
{

    int c, d;
    float temp;
    char swap[1][28];


    for (c = 0; c < 3; c++)
    {
        for (d = 0; d < 3 - c; d++)
        {
            if (year2010Cases[d] > year2010Cases[d + 1]) 
            {
                temp = year2010Cases[d];
                year2010Cases[d] = year2010Cases[d + 1];
                year2010Cases[d + 1] = temp;

                swap[1][28] = caseName[d][28];
                caseName[d][28] = caseName[d + 1][28];
                caseName[d + 1][28] = swap[1][28];
            }
        }
    }

    printf("Sorted list in ascending order:\n");

    for (c = 0; c < 4; c++)
        printf("%.1f\n", year2010Cases[c]);

    printf("Sorted list in ascending order:\n");

    for (c = 0; c < 4; c++)
        printf("%s \n", caseName[c][28]);
}

Я ожидал, что имена дел будут отображаться в том же порядке, что и процентыони меняются одновременно с обменом процентов.Однако, для моих фактических результатов, он вообще ничего не отображает ниже второго «Сортированного списка в порядке возрастания: \ n»

Ответы [ 2 ]

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

Когда у вас есть данные вроде двух разных значений, которые «принадлежат друг другу», вы не помещаете их в два разных массива.Вместо этого вы делаете struct, который может содержать оба значения.После этого вы делаете array of the struct.Например:

// Define a type to hold both percentage and name
typedef struct
{
    float percentage;
    char  caseName[28];
} CaseType;

// In some function make the array
CaseType year2010Cases[4] = {
    {11.2, "Respiratory Tract Infection"},
    {8.9, "Diabetes Mellitus"},
    {15.6, "Hyperlipidemia"},
    {15.9, "Hypertensive Disease"}};

Одним из преимуществ этого является то, что два значения, которые принадлежат друг другу, всегда остаются вместе.Еще одним преимуществом является то, что мы можем использовать стандарт qsort для сортировки данных.Как:

typedef struct
{
    float percentage;
    char  caseName[28];
} CaseType;


// Compare function used by qsort
int compar(const void * a, const void * b)
{
    CaseType* pa =  (CaseType*)a;
    CaseType* pb =  (CaseType*)b;
    if (pa->percentage > pb->percentage) return 1;
    if (pa->percentage < pb->percentage) return -1;
    return 0;
}

int main(void)
{
    CaseType year2010Cases[4] = {
        {11.2, "Respiratory Tract Infection"},
        {8.9, "Diabetes Mellitus"},
        {15.6, "Hyperlipidemia"},
        {15.9, "Hypertensive Disease"}};
        printf("Original list:\n");

    for (int c = 0; c < 4; c++)
        printf("%.1f - %s\n", year2010Cases[c].percentage, year2010Cases[c].caseName);

    // Sort the array with a single call of qsort
    qsort(year2010Cases, 4, sizeof *year2010Cases, compar);

    printf("-------------------------------------\n");
    printf("Sorted list:\n");

    for (int c = 0; c < 4; c++)
        printf("%.1f - %s\n", year2010Cases[c].percentage, year2010Cases[c].caseName);

    return 0;
}

Вывод:

Original list:
11.2 - Respiratory Tract Infection
8.9 - Diabetes Mellitus
15.6 - Hyperlipidemia
15.9 - Hypertensive Disease
-------------------------------------
Sorted list:
8.9 - Diabetes Mellitus
11.2 - Respiratory Tract Infection
15.6 - Hyperlipidemia
15.9 - Hypertensive Disease
0 голосов
/ 03 февраля 2019

Чтобы поменять строки, вам нужно strcpy() (прототип в <string.h>)

            //swap[1][28] = caseName[d][28];
            //caseName[d][28] = caseName[d + 1][28];
            //caseName[d + 1][28] = swap[1][28];
            strcpy(swap[0], caseName[d]);
            strcpy(caseName[d], caseName[d + 1]);
            strcpy(caseName[d + 1], swap[0]);

Также обратите внимание, что swap[1] и casename[j][28] не существуют.


Позвольте мне добавить предложение (слишком длинное для комментария): вместо этого отсортируйте индексы.

int indexes[] = { 0, 1, 2, 3 };
// sort indexes <== YOUR TASK
// indexes now is { 1, 0, 2, 3 }
for (i = 0; i < 4; i++) {
    printf("%f for %s\n", year2010Cases[indexes[i]], caseName[indexes[i]]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...