2017-01-04 3 views
-4

Это мой код и его не работает.Функция, не возвращающая значения

если обры в положении предыдущего больше или меньше от следовать одному, если ее больше для все массива, так что я должен вернуть значение 1

, если в каком-то момент в массиве позиции предыдущей обр больше, то тогда следует один поэтому его следует вернуть значение 0 спасибо за любую помощь

#include <stdio.h> 
#include <stdlib.h> 
int Up_array(int *arr,int Size) 
{ 
    int i; 
    for(i=0;i<Size;i++) 

     if (arr[i] > arr[i+1]) 
     { 
      return 0; 
     } 
     else if(arr[i] <= arr[i+1]) 
     { 
      return 1; 
     } 
}  

void main() 
{ 
int *arr,Size,i; 

    printf("please enter the size of the array\n"); 
    scanf("%d",&Size); 
    arr=(int*)malloc(Size*sizeof(int)); 
    printf("please enter the array\n"); 
    for (i=0; i<Size ;i++) 
     scanf("%d",&arr[i]); 
    Up_array(arr,Size); 
    free(arr); 
    system("pause"); 
} 
+1

Пожалуйста, возьмите [тур] (https://stackoverflow.com/tour), научиться создавать [MCVE] (https://stackoverflow.com/help/mcve) и обратитесь к [Резиновая утка] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). У вас есть * конкретный * вопрос для нас? –

+0

'arr [i + 1]' может вызывать UB, поскольку в какой-то момент он будет эквивалентен 'arr [Size]', который выходит за рамки. Хотя при текущих проверках весь массив не проверяется только на первых двух элементах, переместите 'return 1;' из цикла и избавьтесь от 'else if' и измените цикл на' for (i = 0; я <размер-1, я ++) '. Я думаю, что будет делать то, что вы хотите, но это очень сложно сказать из вопроса. – George

+1

Ваша функция просто проверяет первые 2 элемента массива, так как возвращается в обеих ветвях 'if'. – Barmar

ответ

0

Вы не должны возвращаться в else блоке. Это немедленно вернет 1, как только он найдет два элемента, которые увеличиваются, он не проверяет остальную часть массива. В результате ваша функция просто проверяет первые два элемента массива.

Вместо этого подождите, пока вы не пройдете весь массив. Если вы не вернули 0 внутри цикла, это означает, что все элементы были восходящими, поэтому вы можете вернуть 1.

Кроме того, вам необходимо избегать доступа к внешнему массиву, поэтому вам необходимо остановить массив, когда i - Size - 2, так что arr[i+1] все еще находится внутри массива.

int Up_array(int *arr,int Size) 
{ 
    int i; 
    for(i=0;i<Size-1;i++) 
    { 
     if (arr[i] > arr[i+1]) 
     { 
      return 0; 
     } 
    } 
    return 1; 
}  

И вообще, когда условие в else if точная противоположность условию if, вы должны просто использовать else, не else if.

-1

Практически право. Вот код:

#include <stdio.h> 
#include <stdlib.h> 
int up_array(int *arr,int Size) 
{  
    // Checking corner case where Size = 1 (no index out of bound) 
    if(Size > 1) { 
     for(int i=0; i<Size-1; ++i) { 
      if (arr[i] > arr[i+1]) { 
       return 0; 
      } 
     } 
    } 
    return 1; 
}  

int main() 
{ 
    int *arr,Size; 

    printf("Please enter the size of the array:\n"); 
    scanf("%d",&Size); 
    arr=(int*)malloc(Size*sizeof(int)); 
    printf("Please enter the array (press enter after any number)\n"); 
    for (int i=0; i<Size ;i++) { 
     scanf("%d",&arr[i]); 
    } 

    printf("Result %d", Up_array(arr,Size)); 

    free(arr); 
    return 1; 
} 
+2

Вам не нужно 'if (Size> 1)', так как условие 'for()' будет сбой немедленно, и цикл никогда не будет выполняться. – Barmar

+1

Прошу [Tour] (https://stackoverflow.com/tour). Просто демпинг кода без объяснения не считается хорошим ответом. Пожалуйста, объясните * как * и * почему * вы сделали все, что вы сделали. –

+0

@ HermannDöppes, пожалуйста, укажите номер в [TOUR] (https://stackoverflow.com/tour), который на самом деле подскажет, что вы сказали? – Michi

Смежные вопросы