我必须构建一个扫描“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;
}
我很感激一些指导。
答案 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
的值可以等于0
或1
。在这种情况下,由于第一个语句
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;
}
我在考虑你的代码中没有重复的元素