Palindrome类帮助C ++

时间:2016-03-15 13:30:03

标签: c++

您好我正在尝试写一个回文类,但结果却是错误的。

我需要创建一个Palindrome类并返回该短语是否为Palindrome。 这是我的代码。 Palindrome.h:

#ifndef PALINDROME_H
#define PALINDROME_H
#include <iostream>
#include<cstring>
using namespace std;

class Palindrome{
private:
   char str[1024];
   char s1[1024];
   char s2[1024];
   int a;
   int b;

public:
   Palindrome(char s2[1024], int a, int b)
   {
    s2[1024] = { 0 };
    a = 0;
    b = 0;
   }
   void removeNonLetters(char str[]);
   void lowerCase(char s1[]);
   bool isPalindrome(char s2[], int a, int b);
   }; // End of class definition


#endif

Palindrome.cpp:

#include "Palindrome.h"
void Palindrome::removeNonLetters(char str[])
{
    char s1[1024] = { 0 };

    int j = 0;
    int l1 = strlen(str);
    for (int i = 0; i < l1; i++)
    {
        if (str[i] <= '9' && str[i] >= '0')
       {
            s1[j++] = str[i];
       }
       else if ((str[i] >= 'A' && str[i] <= 'Z')
        || (str[i]) >= 'a' && str[i] <= 'z')
       {
            s1[j++] = str[i];
       }
     }
    cout << s1 << endl;
}
  void Palindrome::lowerCase(char s1[])
 {
       char s2[1024] = { 0 };
       int l2 = strlen(s1);
       int g = 0;
      for (int i = 0; i < l2; i++)
      {
          if (s1[i] >= 'a' && s1[i] <= 'z')
          {
             s2[g++] = s1[i];
          }
         else if (s1[i] >= 'A' && s1[i] <= 'Z')
        {
            s2[g++] = s1[i] + 32;
        }
    }
cout << s2 << endl;
}
bool Palindrome::isPalindrome(char s2[], int a, int b)
{
if (a >= b)
    return true;
    cout << "Yes" << endl;
if (s2[a] != s2[b])
   return false;
else
    return isPalindrome(s2, a + 1, b - 1); 
    cout << "No" << endl;
}

Main.cpp的:

#include "Palindrome.h"
int main()
{
    char str[1024] = { 0 };
    char s1[1024] = { 0 };
    char s2[1024] = { 0 };
    cout << "input a string:" << endl;

    cin.getline(str, sizeof(str));

    Palindrome removeNonLetters(char str[]);

    Palindrome lowerCase(char s1[]);

    int length = strlen(s2);

    Palindrome isPalindrome(s2, 0, length - 1); 

    return 0;
}

2 个答案:

答案 0 :(得分:2)

你老师可能不喜欢这样,但这就是我们在现实世界中的表现。

首先,达到标准库:

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

从字符串中删除非字母字符的功能:

std::string strip(std::string s)
{
    s.erase(std::remove_if(std::begin(s),
                           std::end(s),
                           [](auto c) { return !std::isalpha(c); }),
            std::end(s));
    return s;
}

将字符串转换为小写的函数:

std::string to_lower(std::string s)
{
    std::transform(std::begin(s),
                   std::end(s),
                   std::begin(s),
                   [](auto c) { return std::tolower(c); });
    return s;
}

检查字符串是否与前进相反的函数:

bool is_palindrome(const std::string& s)
{
    return std::equal(std::begin(s), std::end(s),
                      std::rbegin(s), std::rend(s));
}

将所有这些放在一起进行测试:

int main()
{
    auto word = std::string("a!b B <>A");
    if (is_palindrome(to_lower(strip(word)))) {
        std::cout << "palindrome" << std::endl;
    }
    else {
        std::cout << "not palindrome" << std::endl;
    }

    return 0;
}

完整列表:

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

std::string strip(std::string s)
{
    s.erase(std::remove_if(std::begin(s),
                           std::end(s),
                           [](auto c) { return !std::isalpha(c); }),
            std::end(s));
    return s;
}

std::string to_lower(std::string s)
{
    std::transform(std::begin(s),
                   std::end(s),
                   std::begin(s),
                   [](auto c) { return std::tolower(c); });
    return s;
}

bool is_palindrome(const std::string& s)
{
    return std::equal(std::begin(s), std::end(s),
                      std::rbegin(s), std::rend(s));
}

int main()
{
    auto word = std::string("a!b B <>A");
    if (is_palindrome(to_lower(strip(word)))) {
        std::cout << "palindrome" << std::endl;
    }
    else {
        std::cout << "not palindrome" << std::endl;
    }

    return 0;
}

答案 1 :(得分:0)

您的代码有很多问题。我希望这些指针有所帮助:

  • 您应该使用标准库。
  • 为什么类的构造函数采用任何参数? Nothign使用它们
  • 为什么会有成员变量?没有什么可以使用它们。
  • 为什么课堂上的功能呢?它们只是功能 - 它们应该在函数库或类似函数中。
  • 只是写给cout的函数是没用的。
  • 您的主要功能似乎甚至无法正确调用功能。

我试过了:

char str[1024] = { 0 };
cout << "input a string:" << endl;

cin.getline(str, sizeof(str));

int length = strlen(str);
Palindrome a(str,0, length);
a.removeNonLetters(str);
a.lowerCase(str);
a.isPalindrome(str, 0, length - 1);

cin.getline(str, sizeof(str));
return 0;

我没有得到异常,但得到以下输出:

input a string:
EVIL rats on no star **** live
EVILratsonnostarlive
evilratsonnostarlive
Yes

然而,这也有效:

input a string
hello
hello
hello
Yes

所以前两个函数似乎有用(如果删除空格也是故意的),但第三个函数没有。