如何使用函数对数组排序?

时间:2019-12-14 18:26:43

标签: c arrays function

我真的是编程新手。我试图制作一个程序,将使用两个函数对数组进行排序,但我无法使其正常工作,我不知道自己做错了什么。

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


int sort();
int sp();
int x;


int main()
{
    int v[20],k;
    scanf("%d",&x);
    for (k=1;k<=x;k++)
    scanf("%d",&v[k]);
    sort(&v[20]);
    for (k=1;k<=x;k++)
        printf("%d",v[k]);
    return 0;
}


int sort (int *a[20])
{
    int i,j;
for (i=1;i<=x;i++)
    for (j=1;j<=x;j++)
    {if(*a[j]>*a[j+1])
        sp(&a[j],&a[j+1]);
    }

}

int sp(int *l, int *m)
{
    int n=*l;
    *l=*m;
    *m=n;
}

我测试了交换部分,该部分可以工作(sp函数),但是我不知道如何在函数中使用数组。

当我测试程序时,没有输出,程序只是停止。

1 个答案:

答案 0 :(得分:1)

已发布代码中的问题:

  1. 索引不正确地基于1 。 C是从零开始的索引系统。使用[0][19]索引20个元素的数组。
  2. 任意函数参数声明。在C语言中,int foo();声明一个名为foo的函数,该函数返回int并接受任意列表。因此,foo()foo(1)foo(1,2,3)foo("grandma's house", 3.14)都是兼容的。您的函数声明应精确成为您所期望的原型。在这种情况下,void sort(int a[], int len);
  3. 指针重定向不正确。您的sort函数应将指针和长度作为参数。但是,如前所述,声明参数列表是任意的,并且您的实现实际上采用了指向指针的指针(int *a[],它等效于int **a)。
  4. 检查您的IO输入操作。验证您的输入操作。不要以为他们有用。假设是所有人的母亲...
  5. 边界检查。通过验证输入数据首先不允许发生这种情况,确保您不会超出数组边界。

这些问题以及更多其他问题,将在下面解决:

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

void sort(int a[], int len);
void sp(int *l, int *m);

int main()
{
    int x, v[20];

    if (scanf("%d", &x) == 1 && x > 0 && x <= 20)
    {
        for (int i = 0; i < x;)
        {
            // prompt for input
            printf("a[%d] :", i);
            fflush(stdout);

            // try to read next element
            if (scanf("%d", v + i) != 1)
            {
                // failed to read. clear stdin through newline
                int c;
                do {
                    c = fgetc(stdin);
                } while (c != EOF && c != '\n');

                // if we actually hit EOF, stop reading and
                //  reset x to however many items we read well.
                if (c == EOF)
                {
                    x = i;
                    break;
                }

                continue;
            }

            // read successful, move to next element
            ++i;
        }

        for (int i = 0; i < x; ++i)
            printf("%d ", v[i]);
        fputc('\n', stdout);

        sort(v, x);

        for (int i = 0; i < x; ++i)
            printf("%d ", v[i]);
        fputc('\n', stdout);
    }

    return 0;
}


void sort(int a[], int len)
{
    if (len <= 1)
        return;

    int swapped = 1;
    while (swapped && len-- > 0)
    {
        swapped = 0;
        for (int i = 0; i < len; ++i)
        {
            if (a[i + 1] < a[i])
            {
                sp(a + i, a + i + 1);
                swapped = 1;
            }
        }
    }
}

void sp(int *l, int *m)
{
    int n = *l;
    *l = *m;
    *m = n;
}