проверка, отражает ли массив 1 массив 2

#c

Вопрос:

Вот моя функция.c:

   #include <stdio.h>

   int mirror(int arr1[], int arr2[], unsigned int len)
    {
         for(unsigned int i = 0; i < len; i  )
           {
               if(len == 0 || arr1[i] == arr2[i])
               { 
                     return 1;
               }
    
   
            }
 
         return 0;
      }
 

вот мой главный.c:

 #include <stdio.h>
#include "t2mirror.h"

 int main(void) 
 int a5[7] = {5,2,2,3,4,5,5};
int a6[7] = {5,5,4,3,2,2,5};

if (mirror(a5, a6, 7) == 1) { 
    printf("a5 and a6 are mirroredn");
} else {
    printf("a5 and a6 are NOT mirroredn");
}

if (mirror(a5, a6, 0) == 1) { 
    printf("a5 and a6 are mirroredn");
} else {
    printf("a5 and a6 are NOT mirroredn");
}

int a7[2] = {1,1};
int a8[2] = {1,2};

if (mirror(a7, a8, 2) == 1) { 
    printf("a7 and a8 are mirroredn");
} else {
    printf("a7 and a8 are NOT mirroredn");
}

int a9[3] = {10,15,20};
int a10[3] = {10,15,20};

if (mirror(a9, a10, 3) == 1) { 
    printf("a9 and a10 are mirroredn");
} else {
    printf("a9 and a10 are NOT mirroredn");
}




return 0;
 

}

Мне нужно отразить массив и проверить. если массив зеркально отображен, то вывод должен быть зеркальным, а в противном случае не зеркальным. Я не могу найти то место, где я допустил ошибку. В условии (a7,a8, 2) он должен выдавать результат, не отраженный, но он делает обратное. аналогично в (a9,a10,3) он должен быть не зеркальным. кто-нибудь может мне в этом помочь?

Комментарии:

1. Что должна делать ваша функция? Прямо сейчас он проверяет, есть ли хотя бы один идентичный элемент.

2. if(len == 0 необходимо протестировать вне цикла, иначе это бесполезно и не сможет сравнить массивы len 0 как равные

3. Не memncmp() достигнете того, что вы пытаетесь сделать?

4. плюс главная проблема: он сообщает «ОК», когда есть один идентичный элемент. Что является обратной стороной того, что вы хотите

5. Кроме того, вы должны проверить arr1[i] != arr2[len - 1 - i]

Ответ №1:

if(len == 0 || arr1[i] == arr2[i])

Проверка len == 0 не должна находиться внутри цикла. Вероятно, вы можете полностью удалить его. Кроме того, вы просто проверяете, есть ли у массивов общий элемент с одним и тем же индексом — это не соответствует алгоритму, который вы описываете.

Вам лучше проверить, когда первый элемент в arr1 не совпадает с соответствующим элементом в arr2. То есть:

 if(arr1[i] != arr2[len-i-1])
{
  return 0;
}
...

return 1; // at the end of the function, if we got here then all items matched
 

Комментарии:

1. и если бы я использовал две петли, одну вперед, а другую backward…it сделал бы то же самое?

2. @HarsimarKaur Да, это тоже работает. Производительность может немного отличаться, но, как правило, новичкам не о чем беспокоиться. Вложенный внутренний цикл, подобный for(int j=len-1; j>=0; j--) if(arr1[i] != arr2[j]) , вероятно, был бы немного менее эффективным, но это продвинутая тема.

3. Я тоже пытался это сделать, но вместо того, чтобы начинать j с len -1, я сделал это с len, и когда результат вышел не так, как ожидалось, я подумал, что это неправильный процесс. Надо было присмотреться повнимательнее.