2013-11-23 2 views
1

сейчас я работаю над программой, которая сообщает вам, является ли введенная вами строка палиндром или нет, и я застрял на последнем шаге. Существуют три основные функции, которые удаляют все пробелы в предложении, отбрасывают их в нижний регистр и реверсируют их, тогда именно тогда моя функция проверяет их, а затем возвращает логическое значение. Так что прямо сейчас в этой функции, С Днем Рождения! выйдет как yadhtribyppah. Это то, что я в своей функции до сих пор:Функция, которая проверяет, является ли строка palindrom

string updated1; 
string updated2; 

updated1 = makeLower(verify); 

updated2 = removeNonLetters(updated1); 

updated1 = reverse(updated2); 


for (int i = 0; i < updated2.length(); i++) 
{ 
    if (updated2[i] != updated1[i]) 
    { 
     break; 
     return false; 
    } 
    else if (updated2[i] == updated1[i]) 
    { 
     return true; 

    } 



} 

}

ответ

1

Предполагая, что нет ошибок в других функциях, измените цикл для:

for (int i = 0; i < updated2.length(); i++) 
{ 
    // If we find even one inequality, we know its not a palindrome. 
    if (updated2[i] != updated1[i]) 
     return false; 
} 
// if the for loop has been executed satisfactorily, we know that it is a palindrome. 
return true; 
+0

благодарственные, это работало большое ! Основная проблема была в моей основной, но этот ответ помогает прояснить эту функцию. Благодаря! – user3015834

0

Причина это не работает, потому что у вас есть break заявление до вашего возвращения заявления. Это вырывается из цикла, и, таким образом, возврат никогда не вызван.

Возможные решения:

1) Удалите оператор разрыва в «если не равно» дела. 2) Возвращает false по умолчанию вне цикла в конце функции.

EDIT:

я только что заметил, что вы возвращения из внутри «если равно» случае. Если вы это сделаете, тогда будет проверяться только первый набор символов. Лучшим алгоритмом было бы вернуть false в случае «если не равный», удалить случай «если равен», а затем вернуть значение true по умолчанию в конце функции.

1
  1. Удалите break и вместо того, чтобы просто вернуться ложным в случае, если символы различаются.
  2. Не стоит return true внутри цикла. Вы не знаете, что это палиндром, пока вы не прошли через все персонажи! Вместо этого просто верните true, если цикл for завершается, вне цикла.
0

Вы не должны иметь что break перед return заявление в первом if, а также не должны return true во втором, потому что вы не закончить цикл.

Вы можете сделать все это так:

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

bool isnotalpha(char c){return !isalpha(c);} 

int main(void) 
{ 
    string updated1="AbbA",updated2; 
    transform(updated1.begin(),updated1.end(),updated1.begin(),tolower); 
    updated1.erase(remove_if(updated1.begin(),updated1.end(),isnotalpha),updated1.end()); 
    updated2=updated1; 
    reverse(updated2.begin(),updated2.end()); 

    bool palindrome=true; 
    for(int i=0; i<updated1.length(); i++) 
    { 
     if(updated1[i]!=updated2[i]) palindrome=false; 
     //if(updated1[i]!=updated1[updated1.length()-1-i]) palindrome=false; Can be done without using updated2 
    } 
    if(palindrome) cout << "Palindrome!" << endl; 
    else cout << "Not Palindrome!" << endl; 

    return 0; 
} 
0

Вы не должны полностью изменить строку просто нужно проверить, если она симметрична

bool testIt(const string value) 
{ 
    string updated2 = makeLower(removeNonLetters(value)); 
    int L = updated2.length(); 
    for(var i = 0; i < L/2; i++) 
    { 
    if (updated2[i] != updated2[L-1-i]) 
     return false; 
    } 
    return true; 
} 
Смежные вопросы