确定数组是升序,降序还是随机的程序(C语言)

时间:2017-06-04 09:26:08

标签: c arrays sorting

我必须构建一个扫描“size”的程序,然后以“size”的大小编写数组。 如果升序则返回1,如果降序则返回-1,如果两者都不返回0。

所以我想出了这个,它没有用。

int UpOrDown(int *arr,int size)
{
int i,j,flag;
if(arr[0]<arr[1])// ascending or random
{
    flag=1;
    {
        for(i=1;i<size;i++)
            if(arr[i]>arr[i+1])
                flag=0;
    }
    if (flag=0) return 0;
    else return 1;
}
else //descending or random
{
    flag=-1;
        if(arr[0]>arr[1])  
        {
            for(i=1;i<size;i++)
                if(arr[i]<arr[i+1])
                    flag=0;
        }
        if (flag=0) return 0;
        else return -1;
}

我很感激一些指导。

5 个答案:

答案 0 :(得分:1)

您的代码有一些错误:

  • 打破数组边界
  • 错误地使用=代替==

似乎过于复杂。这是我的解决方案。

#include <stdio.h>

int UpOrDown(int *arr, int size)
// return -1 (falling), 0 (unknown), +1 (rising)
{
    int rising = 0, falling = 0;
    for(int i = 1; i < size; i++) {
        if(arr[i] > arr[i-1]) {
            rising = 1;
        }
        else if(arr[i] < arr[i-1]) {
            falling = 1;
        }
    }
    return rising - falling;
}

int main(void)
{
    int arr1[1] = { 1 };
    int arr2[2] = { 1, 2 };
    int arr3[2] = { 2, 1 };
    int arr4[3] = { 1, 2, 1 };
    int arr5[3] = { 2, 1, 2 };

    printf("%d\n", UpOrDown(arr1, 1));
    printf("%d\n", UpOrDown(arr2, 2));
    printf("%d\n", UpOrDown(arr3, 2));
    printf("%d\n", UpOrDown(arr4, 3));
    printf("%d\n", UpOrDown(arr5, 3));

    return 0;
}

节目输出:

0
1
-1
0
0

答案 1 :(得分:0)

我在你的程序中发现了一些错误。请尝试使用  if(flag == 0)返回0; 代替  if(flag = 0)返回0;

答案 2 :(得分:0)

对于所提出的函数实现中的初学者,没有结束括号。

通常,参数size的值可以等于01。在这种情况下,由于第一个语句

,函数具有未定义的行为
if(arr[0]<arr[1])

此外,由于参数的类型为int,因此用户可以提供负值。因此,最好将参数声明为类型size_t

同样在这样的循环中

    for(i=1;i<size;i++)
        if(arr[i]>arr[i+1])
            flag=0;

当变量i等于size - 1时,尝试在数组之外访问。

在此对应于else语句

的代码段中
else //descending or random
{
    flag=-1;
        if(arr[0]>arr[1])  
        {
            for(i=1;i<size;i++)
                if(arr[i]<arr[i+1])
                    flag=0;
        }
        if (flag=0) return 0;
        else return -1;
}

即使数组只有两个彼此相等的元素,该函数也可以返回-1。

我可以建议以下功能实现。至少它有效。:)

#include <stdio.h>

int UpOrDown(const int a[], size_t n)
{
    int ordered = !(n < 2 || a[0] == a[1]);

    if (ordered)
    {
        ordered = a[0] < a[1];
        size_t i = 2;

        while (i < n && ordered == a[i - 1] < a[i]) i++;

        if (i != n)
        {
            ordered = 0;
        }
        else
        {
            ordered = ordered == 0 ? -1 : 1;
        }
    }

    return ordered;
}

int main( void )
{
    int a[] = { 1 };
    int b[] = { 1, 1 };
    int c[] = { 1, 2 };
    int d[] = { 2, 1 };
    int e[] = { 1, 2, 2 };

    printf("a: %d\n", UpOrDown(a, sizeof(a) / sizeof(*a)));
    printf("b: %d\n", UpOrDown(b, sizeof(b) / sizeof(*b)));
    printf("c: %d\n", UpOrDown(c, sizeof(c) / sizeof(*c)));
    printf("d: %d\n", UpOrDown(d, sizeof(d) / sizeof(*d)));
    printf("e: %d\n", UpOrDown(e, sizeof(e) / sizeof(*e)));
}

程序输出

a: 0
b: 0
c: 1
d: -1
e: 0

答案 3 :(得分:0)

嗯,你怎么试试这个(尽管很长) 您将原始数组的数据保存到另一个临时数组:

for(int i=0;i<size;i++)
{
  //assuming arr is your array and size is the no. of data//

  arr[i]=temp[i]; //here we store each data of the original to a temporary
}

然后提升临时数组:

//Selection sorting the temp array in ascending

for(int i=0;i<size;i++)
{
for(int j=i+1;j<size;j++ )
  {
    if(temp[i]<temp[j])
     {
        swap = temp[i];
        temp[i] = temp[j];
        temp[j] = swap;
     }
  }
}

然后比较你的原始数组和上升的临时数组,如果它们相等,原始数组是升序的,如果没有移动到以降序做同样的方式(即下降临时数组然后再次比较,如果它们是相等的你原来的数组是下降的)

如果两者都没有,你的数组是随机的

答案 4 :(得分:-1)

        int UpOrDown(int *arr,int size)
{
int i = 0 ; //try to intialize the elements its good habbit also put spaces like i had done .its just good coding guidance 
int j = 0 ;
int flag = 0;

if ( arr[0] < arr[1] )// ascending or random
{
        for(i = 1 ; i < size ;i++)
           {
            if(arr[i]>arr[i+1])
                flag = 1;
             else
    {
                flag = 0 ;
        break ;
    }

            }
}

else //descending or random
{

            for(i=1;i< size;i++)
                {
                  if(arr[i]<arr[i+1])
                    flag = -1;
        else
        {
                    flag = 0 ;
        break ;
        }
            }
  }
return flag;
}

我在考虑你的代码中没有重复的元素