Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 冒泡排序不排序和额外元素_C_Arrays_Sorting_Scanf - Fatal编程技术网

C 冒泡排序不排序和额外元素

C 冒泡排序不排序和额外元素,c,arrays,sorting,scanf,C,Arrays,Sorting,Scanf,我正在尝试按降序进行冒泡排序,结果总是很奇怪。当我在数组中输入元素时,对于元素1,它不止一次地要求我输入元素1,这会导致一个额外的元素被引入,另一件事是数组中根本不包含最后一个元素,我不理解这一点。这是我完整程序的输出,下面是我的代码: 输入: 数组中有多少个元素?:4 在数组中输入元素: 元素0: 97 32 要素1: 13 要素2: 22 要素3: 244 元素0:32 要素1:13 要素2:22 要素3:0 我的代码: #include <stdio.h> void sor

我正在尝试按降序进行冒泡排序,结果总是很奇怪。当我在数组中输入元素时,对于元素1,它不止一次地要求我输入元素1,这会导致一个额外的元素被引入,另一件事是数组中根本不包含最后一个元素,我不理解这一点。这是我完整程序的输出,下面是我的代码:

输入:

数组中有多少个元素?:4
在数组中输入元素:
元素0:
97
32
要素1:
13
要素2:
22
要素3:
244
元素0:32
要素1:13
要素2:22
要素3:0
我的代码:

#include <stdio.h>

void sort(int array[], int n);

int main() {

    int num = 0;
    printf("How many elements in your array?: ");
    scanf("%d",&num);
    while(num > 9)
        {
        printf("Only enter an array that is size 9 or less.\n");
        printf("Enter a new number: ");
        scanf("%d", &num);
        }
    int array[num];
    printf("Enter elements in your array: \n");
    for(int i = 0; i < num; i++)
    {   
        printf("Element %d: \n",i);
        scanf("%d ",&array[i]);
    }
    sort(array, num);
    for(int j = 0; j < num; j++)
    {
        printf("Element %d: %d\n", j, array[j] );

    }
    return 0;
}

void sort(int array[], int size)
{
    int temp;
    for(int i = 0; i < size; i++)
    {
        /*if(array[i] > array[i+1]) // smallest to biggest
        {
            *temp = array[i];
            array[i] = array[i+1];
            array[i+1] = temp;

        }*/
        if(array[i] > array[i+1]) // 1 2
        {
            temp = array[i];
            array[i] = array[i+1];
            array[i+1] = temp;
        }
    }
}
#包括
无效排序(int数组[],int n);
int main(){
int num=0;
printf(“数组中有多少个元素?:”;
scanf(“%d”和&num);
while(num>9)
{
printf(“仅输入大小为9或更小的数组。\n”);
printf(“输入新编号:”);
scanf(“%d”和&num);
}
int数组[num];
printf(“在数组中输入元素:\n”);
for(int i=0;iarray[i+1])//从最小到最大
{
*温度=阵列[i];
数组[i]=数组[i+1];
阵列[i+1]=温度;
}*/
if(array[i]>array[i+1])/12
{
温度=阵列[i];
数组[i]=数组[i+1];
阵列[i+1]=温度;
}
}
}

除了注释之外,您的“冒泡排序”永远不会排序,因为它不是冒泡排序。变量的气泡排序实现类似于:

int i, j, swap;

for (i = 0; i < size - 1; i++) {
    for (j = 0; j < size - i - 1; j++) {
        if (array[j] > array[j + 1]) {  /* For decreasing order use < */
            swap = array[j];
            array[j] = array[j + 1];
            array[j + 1] = swap;
        }
    }
}
注意:输入失败后,您必须丢弃
stdin
中保留的任何字符,否则,在下一次迭代中,您的转换将再次失败,导致无限循环——使用
scanf
进行用户输入的主要陷阱之一)

您可以对数组值使用缩写检查(而不是在得到正确的输入之前循环,您只需执行bailing,这样可以消除丢弃字符等)。但是,没有理由不能在该循环中实现完全健壮的解决方案(在填充所有数组元素或用户取消输入之前实现完全检查和循环)


请仔细检查,如果您还有任何问题,请告诉我。

不要使用
scanf
进行用户输入。这是问题的一半。如果输入-1会发生什么?您的
排序将溢出缓冲区,因为当
i
size-1
时,
数组[i+1]
超出了限制。因此,您正在与一个未定义的值进行比较,该值将影响排序。另外,这不是冒泡排序,您只是对相邻条目进行排序,而不是对整个内容进行排序。
scanf(“%d”,&array[i])删除
%d
后面的空格。然后注释掉对
sort
的调用,并确保您至少从一个好的数组开始。您认为最好同时提及其他问题吗?但是是的…正确的实现。谢谢你,这帮了大忙!它消除了我的许多误解。很高兴它有帮助。学习正确使用
scanf
很大程度上是一个字符计数问题,了解哪些转换(数字转换)使用前导空格,哪些不使用前导空格,这样您就可以知道
stdin
成功完成后(以及失败后)剩下的内容。这就是为什么
fgets
(或POSIX
getline
)这一面向行的输入函数是用户输入的首选方式的一大原因,但是
scanf
对于格式化输入确实有其有效的用途,就像
getchar
对于面向字符的输入一样。
    int num = 0,
        rtn;
    for (;;) {  /* loop continually until valid input received */
        printf ("\nHow many elements in your array?: ");
        rtn = scanf ("%d", &num);
        if (rtn == EOF) {
            fprintf (stderr, "user canceled input.\n");
            return 1;
        }
        else if (rtn == 0) {
            int c;
            fprintf (stderr, "error: invalid input.\n");
            /* discard any characters that remain after input failure */
            for (c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
        }
        else if (num > 9) {
            fprintf (stderr, "error: elements must be 9 or less.\n");
        }
        else
            break;
    }
    printf("\nEnter elements in your array: \n");
    for (int i = 0; i < num; i++) {   
        printf("Element[%2d]: ", i);
        if (scanf("%d",&array[i]) != 1) {
            fprintf (stderr, "error: invalid input.\n");
            return 1;
        }
    }
#include <stdio.h>

void sort(int *array, int size);

int main (void) {

    int num = 0,
        rtn;
    for (;;) {  /* loop continually until valid input received */
        printf ("\nHow many elements in your array?: ");
        rtn = scanf ("%d", &num);
        if (rtn == EOF) {
            fprintf (stderr, "user canceled input.\n");
            return 1;
        }
        else if (rtn == 0) {
            int c;
            fprintf (stderr, "error: invalid input.\n");
            for (c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
        }
        else if (num > 9) {
            fprintf (stderr, "error: elements must be 9 or less.\n");
        }
        else
            break;
    }

    int array[num];     /* VLA for array */

    printf("\nEnter elements in your array: \n");
    for (int i = 0; i < num; i++) {   
        printf("Element[%2d]: ", i);
        if (scanf("%d",&array[i]) != 1) {
            fprintf (stderr, "error: invalid input.\n");
            return 1;
        }
    }

    sort (array, num);

    putchar ('\n');
    for(int j = 0; j < num; j++)
        printf("Element %d: %d\n", j, array[j]);

    return 0;
}

void sort(int *array, int size)
{
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {  /* For decreasing order use < */
                int swap = array[j];
                array[j] = array[j + 1];
                array[j + 1] = swap;
            }
        }
    }
}
$ ./bin/bubblesort_input

How many elements in your array?: twenty
error: invalid input.

How many elements in your array?: 12
error: elements must be 9 or less.

How many elements in your array?: 6

Enter elements in your array:
Element[ 0]: 12
Element[ 1]: 2
Element[ 2]: -12
Element[ 3]: -4
Element[ 4]: 5
Element[ 5]: 1

Element 0: -12
Element 1: -4
Element 2: 1
Element 3: 2
Element 4: 5
Element 5: 12