【问题标题】:condition in a nested for loop in C won't workC中嵌套for循环中的条件不起作用
【发布时间】:2019-06-25 16:54:16
【问题描述】:

我是 C 新手,我正在练习 for 循环和指针。 在本练习中,我尝试编写一个对数组元素进行排序的函数。代码的第一部分(我输入元素的地方)正在工作,但下面的一切都让我很难过。我不明白问题出在 if/else 语句中还是循环结构中的其他任何地方。最后一个循环也不起作用(我只是希望它遍历排序的数组并打印元素,就像我之前对它未排序所做的那样。

希望我能得到一些帮助,如果你看到更多我应该注意的...

非常感谢。

我尝试检查我定义循环的方式是否准确,我输入了所有正确的值,以及我对数组排序的基本“想法”是否正常。

void sort_array_elements()
{
int x, i, j, k, temp;
printf("\n input the number of elements to store in the array: ");
scanf_s("%d", &x);

int arrnum[30];
ptr_int = &x;
printf("input %d elements in the array: \n", x);
for (i = 0; i < x; i++)
{
    scanf_s("%d\n", &arrnum[i]);
}

printf("the elements in the array before sorting: \n");
for (i = 0; i < x; i++)
{
    printf("element %d: %d\n", i, arrnum[i]);
}


for (i = 0; i < x; i++)
{
    for (j = 1; j < x; j++)
    {
        if (arrnum[i] > arrnum[j])
        {
            temp = arrnum[i];
            arrnum[i] = arrnum[j];
            arrnum[j] = temp;


        }
        else if (arrnum[i] == arrnum[j])
        {
            for (k = arrnum[i + 1]; k < x; k++)
            {
                if (arrnum[k] != arrnum[j])
                {
                    temp = arrnum[k];
                    arrnum[k] = arrnum[j];
                    arrnum[j] = temp;
                    break;
                }
            }
        }


    }

}

printf("the elements in the array after sorting: \n");

for (i = 0; i < x; i++)
{
    printf("element %d: %d\n", i, arrnum[i]);
}

}

【问题讨论】:

  • 我建议您完全删除所有 else 代码块。无论如何,您正在按k 进行索引,其值取决于输入数据。假设一个数组元素的值为10000000?那么arrnum[k] 会访问什么?
  • 你应该说if(x &gt; 30) x = 30;
  • scanf 中的 \n 是做什么的?它让你输入 n+1 个数字但你没有注意到?
  • @iooshine 变量ptr_int在哪里声明,它的含义是什么?
  • @iooshine 您应该将该功能拆分为其他几个功能。例如,一个函数输入一个数组。其他函数对数组进行排序。另一个函数输出一个数组。

标签: c for-loop if-statement


【解决方案1】:

我不确定您的排序算法中的 elseif 语句。该代码还可以通过不重复排序元素而仅将最小元素交换到 i 的位置来潜在地减少运行时间。还要考虑使用 qsort 内置函数对数组进行排序!我怀疑您的排序算法对数组做了一些奇怪的事情,这就是打印排序数组的循环不起作用的原因。此外,您从不使用 ptr_int 或指针(我想数组是一种指针)。

`

for(int i = 0; i<x; i++)
{
    for(int j = i; j<x; j++)
    {
        if(arr[j] < arr[i])
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
 }

`

【讨论】:

  • 谢谢!我理解你们所说的 else-if 没有必要。我还看到了我在最内部的 for 循环中的“if”语句中所做的错误以及我在循环内使用 scanf_s 时遇到的问题,由于“\n”而进行了一次额外的迭代......它真的很有帮助!我知道有一个内置的排序功能,但我想自己尝试“艰难的方式”来练习:)
  • @liooshine 没问题!你明白为什么你可以在我的例子中从 i 点开始 j 吗?如果不是,我可以尝试解释一下。也感谢您以艰苦的方式做到这一点,这是最好的学习方式!
  • 是的,我明白了!现在开始工作了! :D 非常感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多