2015-08-06 3 views
-2

Я столкнулся с этим вопросом в своих заметках: Учитывая массив целых чисел, напишите функцию, чтобы проверить, являются ли элементы в этом массиве палиндромами. Я работал над своим кодом, и он выглядит примерно так это:Отладка палиндрома C++

#include<iostream> 
#include<cmath> 
using namespace std; 

bool is_a_palindrome(int integers[], int length){ 
    int i; 
    int middle = floor(length/2); 

    //while (length != 0 && length > 0){ 
    for (i = 0; i < middle; i++){ 

     if (integers[i] != integers[length - 1 -i]){ 
      return -2; 
     } 
     else{ 
      return true; 
     } 
    } 
} 

int main(){ 

    int array[4] = {1,2,2,1}; 
    int length = 4; 
    is_a_palindrome(array, length); 
} 

Когда я запускаю код, я ожидаю получить либо 1 за то, что истинно или -2 для него ложные. На данный момент я ничего не получаю. Я не уверен, где проблема. Любая помощь приветствуется.

фиксированный код в соответствии с комментариями:

#include<iostream> 
#include<cmath> 
using namespace std; 

bool is_a_palindrome(int integers[], int length){ 
    int i; 
    int middle = floor(length/2); 

    //while (length != 0 && length > 0){ 
    for (i = 0; i < middle; i++){ 

     if (integers[i] == integers[length - 1 -i]){ 
      return true; 
     } 
     else{ 
      return false; 
     } 
    } 
} 

int main(){ 

    int array[4] = {1,2,2,1}; 
    int length = 4; 
    return is_a_palindrome(array, length); 
} 
+6

Пожалуйста, разместите свой фактический код, а не скриншот. – CoryKramer

+1

Нажмите [править], скопируйте свой код вместо ссылки на изображение, выберите часть кода вашего вопроса и нажмите кнопку '[{}]' в верхней части редактора. Нажмите [сохранить]. – dasblinkenlight

+0

это напоминает мне [Почему эта программа ошибочно отвергается тремя компиляторами C++?] (Http://stackoverflow.com/questions/5508110/why-is-this-program-erroneously-rejected-by-three-c-compilers) –

ответ

2

Есть несколько проблем, к отредактированному ответу:

  1. Вы возвращаете истину, как только значение в передней такого же, как значение в спине. Если у вас есть массив {1,2,3,5,6,8,7,8,9,1}, ваша функция вернет true, потому что есть 1 в передней и задней части массива.

  2. Вы возвращаете -2 вместо false в функции, которая возвращает логическое значение.

  3. Главное возвращает int, и вы возвращаете вызов своей вспомогательной функции, которая возвращает логическое значение.

Что вы можете сделать, это использовать вектор вместо массива и использовать функцию std :: reverse для проверки того, являются ли векторы одинаковыми. Или вы могли бы исправить свой цикл for, чтобы не возвращаться раньше, а скорее проверьте, не изменилось ли значение в «переднем и заднем» и вернет true, если вы пройдете весь цикл for. Что-то вроде этого:

` for (i = 0; i < middle; i++) 
    { 
     if (integers[i] != integers[length - 1 -i]) 
      return false; 
    } 
    return true; 
` 

Остальное для Вас, чтобы исправить, но я думаю, что несколько человек уже определили эти проблемы для вас. Удачи!

-2

Вы забыли return перед вызовом к вашей функции палиндромом.

int main() { 
    int array[4] = {1,2,2,1}; 
    into length = 4; 

    return yourPalindromeFunction(array, length); 
} 

Поскольку вы ничего не пишете, C++ создает возвращаемое по умолчанию значение, равное нулю.

+0

'main()' не требует возврата. Стандарт C++ 11 3.6.1.5 «... Если элемент управления достигает конца main без столкновения с оператором return, эффект заключается в выполнении return 0;' – NathanOliver

+0

Конечно, и это проблема. Он получает '0' вместо' true' (1) или '-2'. Тем не менее, я редактирую, чтобы лучше объяснить. – blashser

2

Некоторые комментарии (для того, когда вы исправили разметку вашего вопроса):

  • Вы ожидаете выход, но вы на самом деле печать что-то?
  • main ожидает, что вы вернетесь и int, но вы ничего
  • не возвращаетесь Почему вы возвращаетесь -2 вместо false? Тип возврата - boolean, поэтому он не может хранить целочисленное значение.
  • Подумайте, где положить return true. Когда что-то такое палиндром?
+1

Просто отметить, нет ли возврата в 'main', он автоматически вернет 0. –

+0

Спасибо, я действительно не был уверен, что это верно для каждого компилятора. –

+1

@BenRuIl вызывается в стандарте 3.6.1.5 '... Если элемент управления достигает конца main без столкновения с оператором return, эффект заключается в выполнении возврата 0;' – NathanOliver