【问题标题】:print multiple arrays of diferent type in ascending order按升序打印多个不同类型的数组
【发布时间】:2017-11-29 12:55:35
【问题描述】:

我想根据numbers_column3 值按升序打印多个不同类型的数组。我有两个指针数组和一个浮点数组。我希望它们像 excel 文档一样保持组合在一起,第一行有 a1、a2 和 a3。我每列有三个数组。我展示的代码只是一个简单的例子。目前我的数组中有大约 20k 个值。有没有办法避免典型的冒泡排序?这将需要大量 malloc 和 strcpy 操作。

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

int main(int argc, char **argv)
{
    char *q6_tag_strings_line_column1[2000] = {0};
    char *q6_nationality_strings_line_column2[2000] = {0};
    float numbers_column3[2000] = {0};

    q6_tag_strings_line_column1[0] = 
    malloc(strlen("echo")+1);

    strcpy(q6_tag_strings_line_column1[0], 
    "echo");

    q6_nationality_strings_line_column2[0] = 
    malloc(strlen("hi")+1);

    strcpy(q6_nationality_strings_line_column2[0], 
    "hi");

    numbers_column3[0] = 5;

    q6_tag_strings_line_column1[1] = 
    malloc(strlen("how")+1);

    strcpy(q6_tag_strings_line_column1[1], 
    "how");

    q6_nationality_strings_line_column2[1] = 
    malloc(strlen("are")+1);

    strcpy(q6_nationality_strings_line_column2[1], 
    "are");

    numbers_column3[1] = 7;


    q6_tag_strings_line_column1[2] = 
    malloc(strlen("you")+1);

    strcpy(q6_tag_strings_line_column1[2], 
    "you");

    q6_nationality_strings_line_column2[2] = 
    malloc(strlen("what")+1);

    strcpy(q6_nationality_strings_line_column2[2], 
    "what");

    numbers_column3[1] = 4;
    return 0;
}

预期结果是

you what 4
echo hi 5
how are 7

【问题讨论】:

  • 为什么不将structtagnationalitynumber 字段一起使用,然后使用qsort() 对这些结构的数组进行排序?
  • 如果您还没有了解结构,那么您必须使用“并行数组”。如果您了解结构,请使用它们;这将使生活变得更轻松。此外,如果您的机器上没有可用的strdup(),请编写您自己的版本并使用它。它大大减少了代码。 (extern char *strdup(const char *str); char *strdup(const char *str) { size_t len = strlen(str) + 1; char *rv = malloc(len); if (rv != 0) memmove( rv, str); return rv; }`(如果malloc() 失败,您甚至可以决定中止或退出——这意味着您不必检查错误返回。)
  • @JonathanLeffler 我大概在 10 年前了解了结构,并且每年最多只使用一次,所以我对它们的记忆真的很模糊。我能够以最少的问题基本理解戴维斯。

标签: c arrays


【解决方案1】:

如果三个数组的元素在语义上是耦合的,为什么不创建一个带有tagnationalitynumber 字段的struct。这明确了数据元素之间的连接,并允许使用标准库qsort() 函数创建和排序此类结构的数组。这是一个示例程序:

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

struct Data {
    char *tag;
    char *nationality;
    float number;
};

int compare_Data(const void *a, const void *b);

int main(void)
{
    struct Data my_data[] = {
        { .tag = "North America",
          .nationality = "Canadian",
          .number = 3.3 },
        { .tag = "South America",
          .nationality = "Brazilian",
          .number = 5.5 },
        { .tag = "Asia",
          .nationality = "Japanese",
          .number = 1.1 },
    };

    puts("Before sorting:");
    for (size_t i = 0; i < sizeof my_data / sizeof *my_data; i++) {
        printf("Number:      %f\n"
               "Nationality: %s\n"
               "Tag:         %s\n",
               my_data[i].number,
               my_data[i].nationality,
               my_data[i].tag);
        putchar('\n');
    }

    qsort(my_data,
          sizeof my_data / sizeof *my_data,
          sizeof *my_data,
          compare_Data);

    puts("After sorting:");
    for (size_t i = 0; i < sizeof my_data / sizeof *my_data; i++) {
        printf("Number:      %f\n"
               "Nationality: %s\n"
               "Tag:         %s\n",
               my_data[i].number,
               my_data[i].nationality,
               my_data[i].tag);
        putchar('\n');
    }
    return 0;
}

int compare_Data(const void *a, const void *b)
{
    const struct Data *da = (const struct Data *) a;
    const struct Data *db = (const struct Data *) b;

    return (da->number > db->number) - (da->number < db->number);
}

程序输出:

Before sorting:
Number:      3.300000
Nationality: Canadian
Tag:         North America

Number:      5.500000
Nationality: Brazilian
Tag:         South America

Number:      1.100000
Nationality: Japanese
Tag:         Asia

After sorting:
Number:      1.100000
Nationality: Japanese
Tag:         Asia

Number:      3.300000
Nationality: Canadian
Tag:         North America

Number:      5.500000
Nationality: Brazilian
Tag:         South America

【讨论】:

  • 感谢您提供示例。我开始用谷歌搜索一些例子。结构听起来会让生活更轻松。
  • @noobprogrammer1987 -- 这听起来像是structs 擅长的事情,而库qsort() 函数很高效,并且已经编写好了;)
  • 能否请您刷新我对一些事情的记忆? .tag = "North America", 中的 . 是什么?这是什么sizeof my_data / sizeof *my_data?在qsort() 的第三部分使用sizeof *my_data 而不是sizeof my_data 会更好吗?我在看一个例子,他们以anyexample.com/programming/c/… 的方式做到了。
  • @noobprogrammer1987 -- .tagdesignated initializer 语法的一部分。这允许您指定要初始化的字段。 sizeof my_data 产生数组my_data[] 的大小(以字节为单位),而sizeof *my_data 产生数组第一个元素的大小。所以,sizeof my_data / sizeof *my_data 产生数组中的元素数。
  • 谢谢。我试图做一个小例子来感受一下。现在完美运行。
【解决方案2】:

我认为如果您将 column3 的索引存储在另一个数组中,那么您可以根据索引打印列。 例如 - 在对第 3 列进行排序期间,按如下方式存储索引,以便 新数组包含 [2,0,1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多