#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, и когда результат вышел не так, как ожидалось, я подумал, что это неправильный процесс. Надо было присмотреться повнимательнее.