【问题标题】:C - How can I sort and print an array in a method but have the prior unsorted array not be affectedC - 如何在方法中对数组进行排序和打印,但不影响先前未排序的数组
【发布时间】:2013-09-23 20:19:56
【问题描述】:

这是一个交易或不交易游戏。

所以在我的 main 函数中,我这样调用我的 casesort 方法:

casesort(cases);

我的方法看起来像这样,我已经意识到这不是最有效的排序,但我会使用我所知道的:

void casesort(float cases[10])
{
int i;
int j;
float tmp;
float zero = 0.00;

for (i = 0; i < 10; i++)
{
    for (j = 0; j < 10; j++)
    {
        if (cases[i] < cases[j])
        {
            tmp = cases[i];
            cases[i] = cases[j];
            cases[j] = tmp;
        }
    }
}

//Print out box money amounts
printf("\n\nHidden Amounts: ");
for (i = 0; i < 10; i++)
{
    if (cases[i] != zero)
        printf("[$%.2f] ", cases[i]);
}

}

所以当我回到我的主目录时,结果发现数组已排序。我认为 void 会阻止该方法返回排序数组。我需要打印出实际的案例编号,我只需跳过任何填充了 0.00 的案例即可。但是在第一轮案例选择之后,我会在我的 MAIN 中打印出“5, 6, 7, 8, 9, 10”。我需要它来根据挑选的内容打印案例。我觉得这是一个简单的修复,只是我对 C 细节的了解仍在增长。有什么想法吗?

【问题讨论】:

  • “如何在方法中排序和打印数组,但不影响先前未排序的数组” - 你复制数组。
  • 我认为混淆来自于 C 中数组的性质。

标签: c arrays methods return void


【解决方案1】:

返回类型void与防止数组排序无关。它只是说该函数不返回任何内容。

您会看到传递的数组本身受到影响,因为数组在传递给函数时衰减为指针。制作数组的副本,然后传递它。这样你就有了原始列表。

【讨论】:

    【解决方案2】:

    在 C 中,数组是通过引用传递的。即它们作为指向第一个元素的指针传递。因此,当您将案例传递给您的函数时,您实际上是在为它提供要修改的原始数组。尝试创建一个副本并对副本进行排序,而不是对实际数组进行排序。创建一个副本也不错,因为您只有 10 个浮点数。

    【讨论】:

      【解决方案3】:

      如果您实际使用 c++,请考虑使用 qsort() 或 std::sort(),而不是滚动您自己的排序

      有两个明显的解决方案。 1)制作数组的副本并对副本进行排序(简单,浪费一些内存,这些天可能不是问题)。 2)创建一个并行整数数组并执行索引排序,即,不是对原始事物进行排序,而是对索引进行排序,然后在需要排序版本时使用索引取消引用数组,否则使用原始未排序数组。

      【讨论】:

        【解决方案4】:

        好吧,为您的输入制作一个本地副本并对其进行排序。像这样的:

        void casesort(float cases[10])
        {
            float localCases[10];
            memcopy(localCases, cases, sizeof(cases));
            ...
        

        然后使用localCases 进行排序。

        【讨论】:

          【解决方案5】:

          如果您不希望数组内容受到影响,那么您必须创建数组的副本并将其传递给您的排序例程(或在例程本身中创建副本)。

          C 中的数组是不同的™;有关更详细的说明,请参阅我的回答 here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-06
            • 2012-11-20
            • 1970-01-01
            • 1970-01-01
            • 2016-04-19
            • 2021-12-09
            相关资源
            最近更新 更多