如何根据另一个序列重新排列一个char数组(这是一个按升序排序的float数组)?

时间:2019-02-03 08:55:25

标签: c

对于一项任务,我的任务是创建一个多诊所患者出勤查看器。我得到了以下数据:给定年份中4种不同病例的出勤率。对于该项目,我们必须完成5个功能。我的成绩下降了4,但仍然无法保持1的水平。根据问题,我必须显示“案件的最低到最高百分比和年份名称”。我了解气泡排序,并且能够按升序排列百分比。但是,我要做的就是按照我能得到的升序显示案件名称。

我试图创建一个2D char数组,其中包括4种情况的名称以及一个带有百分比的float数组。然后,在排序算法的“交换”部分中,我也尝试与char数组进行交换。

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 :(得分:0)

要交换字符串,您需要 $('#client-files-table').on('click', '.js-download', function () { var link = $(this); $.ajax({ url: '/clients/clientfiles/downloadfile?clientFileId=' + link.attr('data-clientfile-id'), method: 'GET', //data: { // __RequestVerificationToken: getToken() //}, success: function () { window.location = '/clients/clientfiles/downloadfile?clientFileId=' + link.attr('data-clientfile-id'), loadPartials(); }, error: function () { toastr.error('Unable to download.'); } }); }); 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]

答案 1 :(得分:0)

当您拥有“属于”的两个不同值之类的数据时,请勿将它们放在两个不同的数组中。取而代之的是制作一个可以容纳两个值的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