2014-11-07 5 views
0

Один одномерный массив называется ребристым, если каждый элемент, у которого есть предшественник и преемник, либо строго больше двух из них (как предшественника, так и преемника) или строго меньше, чем оба из них. Для одномерного массива с длиной n (2 < n < 100) выясните, является ли массив ребристым или нет.Проверьте, является ли массив ребристым

#include <stdio.h> 

int main() 
{ 

    int n, i, j; 
    int check=0; 
    scanf ("%d", &n); 
    if (n<2 || n>100) 
    { 
     printf("Invalid input"); 
    } 
    j=n; 
    int m[j]; 

     for (j=0; j<n; j++) 
     { 
      scanf ("%d", &m[j]); 

     } 
     for (i=0; i<n-2; i++) 
     { 
      if (((m[i] < m[i+1]) && (m[i+1] > m[i+2])) || 
      ((m[i] > m[i+1]) && (m[i+1] < m[i+2]))) 
     { 
       check=1; 
     } 
       else check=0; 

     } 


    if (check==1) 
     { 
      printf ("YES"); 
     } 
    else if (check==0) 
     { 
      printf ("NO"); 
     } 

    return 0; 



} 

Это результат я получаю для моих тестов http://prntscr.com/53zoc3. Каждый раз, когда я отправляю свои ответы, я получаю другой результат, хотя, например, третий и четвертый случай http://prntscr.com/53zt79. Мне просто интересно, могу ли я получить мнение о том, что мне нужно исправить для проблемы второго случая, и если вообще мой код кажется хорошим. Заранее спасибо!

ответ

1

Прежде всего, я не вижу, где массив инициализируется.

Во-вторых, вы пытаетесь получить доступ к памяти за пределами массива в цикле.

for (i = 0; i < n - 1; i++) { 
    if (((m[i] < m[i + 1]) && (m[i + 1] > m[i + 2])) 
      || ((m[i] > m[i + 1]) && (m[i + 1] < m[i + 2]))) { 
     check = 1; 
    } else 
     check = 0; 
} 

Если i равно n - 2 тогда m[i+2] будет эквивалентно m[n]. Однако допустимый диапазон индексов 0, n - 1

Также вы прервать нужду цикла, если проверка устанавливается на 0.

И если вход не удовлетворяет условию

if (n < 2 || n > 100) 
    printf("Invalid input"); 

программы должны концы.

2

Ваша проблема check после того, как цикл for задан только проверкой последнего (но одного) элемента массива. Но более ранние элементы не могут пройти ребристый тест.

Если какой-либо элемент в цикле не прошел «ребристый» тест, вам нужно прекратить тестирование каких-либо других элементов, потому что в этот момент вы знаете, что массив не ребристый.

Так добавить разрыв в случае отказа:

for (i = 0; i < n - 1; i++) { 
    if (((m[i] < m[i + 1]) && (m[i + 1] > m[i + 2])) 
      || ((m[i] > m[i + 1]) && (m[i + 1] < m[i + 2]))) { 
     check = 1; 
    } else { 
     check = 0; 
     break; 
    } 
} 
+0

У меня был перерыв в предыдущей версии моего кода, но это то, что происходит, когда я отправляю его http://prntscr.com/53zzly, и я не могу понять, почему. – marija

+0

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

+0

В настоящий момент я работаю с этим кодом, просто добавив перерыв в том же месте, что и вы. Не работает с другим кодом, извините, если я выразился неправильно. – marija

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