排序功能不会打印排序数组?

时间:2018-11-04 06:00:45

标签: c arrays sorting

我的排序功能无法打印排序后的数组吗?

我正在尝试编写一个程序,该程序收集数组元素,对数组进行排序,然后打印每个元素的阶乘。如果数组未正确排序,我不想超越自己并编写递归函数。在我看来这种排序还不错。人们批评我使用while循环,但是我还不知道另一种方式。任何输入表示赞赏。

#include <stdio.h>

int sorter(int numbList[]);
int getData(int numList[]);
//int recursive(int numList[]);

int main(void) {
    int x;
    int numberList[x];

    getData(&numberList[x]);
    sorter(&numberList[x]);

    //recursive(&numberList[x]);
    return 0;
}

//gets user input-data
int getData(int numbList[]) {
    int i;
    int x;
    printf("Enter number of Elements:\n");
    scanf("%d", &x);

    printf("Enter the values for each element starting from first 
element:\n");

    for (i = 0; i < x; i++) {
        scanf("%d", &numbList[i]);
    }

    printf("\nYou have filled the array list with\n");
    for (i = 0; i < x; i++) {
        printf("%d\n", numbList[i]);
    }
    return numbList[x];
}

//sorter function
int sorter(int numbList[]) {
    int x;
    int temp;
    int swapped;

    while (1) {
        swapped = 0;
        for (int i = 0; i < x; i++) {
            if (i > numbList[i + 1]) {
                temp = numbList[x];
                numbList[x] = numbList[x + 1];
                numbList[x + 1] = numbList[x];
                swapped = 1;
            }
            if (swapped == 0) {
                break;
            }
        }
        printf("Array as sorted:\n");
        for (int i = 0; i < x; i++) {
            printf("%d\t", numbList[x]);
        }
        return(numbList[x]);
    }
}

//recursive factorial function
/* int recursive(int numbList[]) {
    int b = 0;
    numbList[b] *= numbList[b - 1];
    return 0;
} */

3 个答案:

答案 0 :(得分:0)

一些提示作为代码中的注释: 它仍然无法完成任务,但是可以让您处于更好的状态...

int main(void) 
{
  //uninitialized x!
  int x;
  //Even if you get a value for x, VLAs are depreciated
  int numberList[x];
  //Both calls get the adress of last value + 1 in numberList.
  //So you a) go out of the array bounds, and b) why would you want
  //the last element's address??
  //Just use it like getData(numberList);
  getData(&numberList[x]);
  sorter(&numberList[x]);
  return 0;
}

//gets user input-data
//What is the return value for?
int getData(int numbList[])
{
  int i;
  int x;
  printf("Enter number of Elements:\n");
  scanf("%d",&x);

  printf("Enter the values for each element starting from first element:\n");
  for(i=0;i<x;i++){
    scanf("%d",&numbList[i]);
  }

  printf("\nYou have filled the array list with\n");
  for(i=0;i<x;i++){
    printf("%d\n",numbList[i]);
  }
  //see above
  return numbList[x];
}

//sorter function
//Again, what and why return?
int sorter(int numbList[])
{
  //uninitialized x!
  int x;
  int temp;
  int swapped;

while(1)
{

 swapped=0;
 for(int i=0;i<x;i++)
 {
   //What do you compare here? Think.
   if(i>numbList[i+1])
   {
    temp=numbList[x];
    numbList[x]=numbList[x+1];
    //What do you have temp for??
    numbList[x+1]=numbList[x];
    swapped=1;
  }
  //Pretty sure you want an else clause here
  if(swapped==0)
  {
    break;
  }
}

  printf("Array as sorted:\n");
  for(int i=0;i<x;i++)
  {
     printf("%d\t",numbList[x]);
  }
  return(numbList[x]);
  }
}

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 定义数组x时,元素numbList[x]的数量未初始化。这具有未定义的行为。您应该将指向计数的指针传递给getData,此函数应更新该值,分配数组,读取值并返回指向数组的指针。

  • 在没有\

  • 的情况下,请勿在多行上打断字符串
  • 交换代码已损坏:测试if (i > numbList[i + 1])不正确,应该是

    if (numbList[i] > numbList[i + 1])
    
  • 交换代码应使用i而不是x作为索引,交换代码中的最后一次分配应将temp存储到numbList[i + 1]中。
  • 内部循环应在x - 1处停止,以避免读取超出数组末尾的位置。
  • 如果swapped == 0,则应让内循环运行到最后并从外循环中断。

这是更正的版本:

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

int *getData(int *count);
void sorter(int numList[], int count);

int main(void) {
    int x;
    int *numberList;

    numberList = getData(&x);
    if (numberList != NULL) {
        printf("Elements entered:");
        for (int i = 0; i < x; i++) {
            printf(" %d", numberList[i]);
        }
        printf("\n");
        sorter(numberList, x);
        printf("Sorted array:");
        for (int i = 0; i < x; i++) {
            printf(" %d", numberList[i]);
        }
        printf("\n");
        free(numberList);
    }
    return 0;
}

//gets user input-data
int *getData(int *countp) {
    int i, x;
    int *numbList;

    printf("Enter the number of elements: ");
    if (scanf("%d", &x) != 1 || x <= 0) {
        printf("Invalid size:");
        return NULL;
    }
    numbList = calloc(sizeof *numbList, x);
    if (numbList == NULL) {
        printf("Memory allocation error:");
        return NULL;
    }
    printf("Enter the element values: ");
    for (i = 0; i < x; i++) {
        if (scanf("%d", &numbList[i]) != 1) {
            free(numbList);
            return NULL;
        }
    }
    *countp = x;
    return numbList;
}

//sorter function

void sorter(int numbList[], int x) {
    for (;;) {
        int swapped = 0;
        for (int i = 0; i < x - 1; i++) {
            if (numbList[i] > numbList[i + 1]) {
                int temp = numbList[i];
                numbList[i] = numbList[i + 1];
                numbList[i + 1] = temp;
                swapped = 1;
            }
        }
        if (swapped == 0) {
            break;
        }
    }
}

答案 2 :(得分:0)

您可以使用气泡排序算法技术,该技术是快速排序算法,它使用for循环而不是while循环

    int bubbleSorter(int numbList[])
{
    int temp;
    int i, x;

    bool swapped = false;
    for (i = 0; i < x - 1; i++)
    {
        swapped = false;
        for (j = 0; j < x - 1 - i; j++)
        {
            if (list[j] > list[j + 1])
            {
                temp = list[j];
                list[j] = list[j + 1];
                list[j + 1] = temp;
                swapped = true;
            }
            else {
                swapped = false;
            }

        }

        // if no number was swapped that means 
        //   array is sorted now, break the loop. 
        if (!swapped) {
            break;
        }

        printf("Array as sorted:\n");

        for (int i = 0; i<x; i++)
        {
            printf("%d\t", numbList[x]);
        }
        return(numbList[x]);
    }

}
相关问题