编程任务问

时间:2012-08-19 10:55:32

标签: c++

C++ Template:
class MyClass
{
public:
 getNiCount(...)
  {
  }
 replaceNiWithNI(...)
  {
  }
};
int main()
{
 const char *szTestString1 = "Ni nI NI nI Ni";
 const wchar_t *szTestString2 = L"Ni nI NI nI Ni";
 // Invoke getNiCount(...) of class MyClass
 // Invoke replaceNiWithNI(...) of class MyClass
 // Display on screen: "Found X occurrences of Ni. New string: Y"
}

任务说明:

  1. 实施类getNiCount的两个函数replaceNiWithNIMyClass
    • getNiCount应该返回szTestString1/2内的“Ni”的出现次数(区分大小写)
    • replaceNiWithNI应将szTestString1/2中出现的所有“Ni”替换为“NI”(区分大小写)
  2. 调用两个函数getNiCountreplaceNiWithNI
  3. 显示屏幕上最后一条评论中给出的字符串。 XY应替换为真实值。
  4. MyClass应该能够处理szTestString1(ASCII)和szTestString2(Unicode)。
  5. 一般要求:

    代码应为

    • 易于理解和维护(优先级1)
    • 技术优雅(优先级2)
    • as(CPU)尽可能高效(优先级3)

    您可以使用基于C ++语言的所有技术,工具包和框架。

    我的解决方案(不完整)

    逻辑如下...... 但是在我的系统中,function2“replace”崩溃了。无法修复它。

    #include<iostream>
    #include<string>
    using namespace std;
    
    class MyClass
    {
    public:
     void getNiCount(const char*,const wchar_t*);
      //cout<<"\nCount is :"<<count;
    
    void replaceNiWithNI(const char*,const wchar_t*);
    
    };
    
    void MyClass::getNiCount(const char* x,const wchar_t* y)
    {
         int count=0;
         int ycount=0;
       for(int i=0; x[i]!='\0';i++)
       {
           if(x[i]=='N')
           {   if(x[i+1]=='i')
                              count++;
           }
           }
       for(int i=0; y[i]!='\0';i++)
       {
           if(y[i]=='N')
           {   if(y[i+1]=='i')
                              ycount++;
           }
           }
           cout<<"\nFound "<<count<<" occurences of Ni in String 1";
           cout<<"\nFound "<<ycount<<" occurences of Ni in String 2";
    }
    
    void MyClass:: replaceNiWithNI(const char* x,const wchar_t* y)
    {    char* a;
         wchar_t* b;
         strcpy(a,x);
    
    
         for (int i=0;a[i]!='\0';i++)
         {
             if (a[i]=='N')
             {  if(a[i+1]=='i')
                {
                               a[i+1]='I';
                               }
             }
             }
         for (int i=0;y[i]!='\0';i++)
         {
             b[i]=y[i];
         }
         for (int i=0;b[i]!='\0';i++)
         {
             if (b[i]=='N')
             {  if(b[i+1]=='i')
                {
                               b[i+1]='I';
                               }
             }
         }
    
         cout<<"\nNew String 1 is :";
         puts(a);
         cout<<"\nNew String 2 is :";<<b
    
    }
    
    
    int main()
    {
     const char *szTestString1 = "Ni nI NI nI Ni";
     const wchar_t *szTestString2 = L"Ni nI NI nI Ni";
     MyClass ob1;
     ob1.getNiCount(szTestString1,szTestString2);
     ob1.replaceNiWithNI(szTestString1,szTestString2);
     getchar();
     return 0;
    }
    

1 个答案:

答案 0 :(得分:4)

这里有一些问题:

  1. 由于

    中的错误分号,您的程序无法编译
    cout<<"\nNew String 2 is :";<<b
    
  2. 您的程序在strcpy(a,x);崩溃,因为您正在复制到未初始化的a - 它没有分配内存。您需要在new上调用a才能使其正常工作,这也意味着您需要知道所需数组的大小(可能是该函数的另一个参数)。

  3. 使用std::stringstd::wstring几乎总是优于处理原始字符数组。例如,请参阅this question。我知道你可能已经考虑过了,因为你有#include <string>

  4. 由于您需要对不同类型执行相同的操作,我怀疑练习的重点可能是使用模板。

  5. 你说

      

    getNiCount应该返回出现次数......

    但是你的getNiCount没有返回任何内容。

  6. using namespace std;通常为considered bad practice

  7. 通常值favouring pre-increments rather than post-increments,尽管在这种特殊情况下,没有开销。


  8. 为您举例说明上述建议:

    #include <iostream>
    #include <string>
    
    template<typename StrType>
    class MyClass {
     public:
      int getNiCount(const StrType& input) const;
      void replaceNiWithNI(StrType& input) const;
    };
    
    template<typename StrType>
    int MyClass<StrType>::getNiCount(const StrType& input) const {
      int count = 0;
      for (int i = 0; i < input.size() - 1; ++i) {
        if (input[i] == 'N' && input[i + 1] == 'i')
          ++count;
      }
      return count;
    }
    
    template<typename StrType>
    void MyClass<StrType>::replaceNiWithNI(StrType& input) const {
      for (int i = 0; i < input.size() - 1; ++i) {
        if (input[i] == 'N' && input[i + 1] == 'i')
          input[i + 1] = 'I';
      }
    }
    
    
    int main() {
      const char* szTestString1 = "Ni nI NI nI Ni";
      MyClass<std::string> ob1;
      std::string testString1(szTestString1);
      int count1 = ob1.getNiCount(testString1);
      ob1.replaceNiWithNI(testString1);
      std::cout << "Found " << count1 << " occurences of Ni in String 1.  "
                << "New string: " << testString1 << '\n';
    
      const wchar_t* szTestString2 = L"Ni nI NI nI Ni";
      MyClass<std::wstring> ob2;
      std::wstring testString2(szTestString2);
      int count2 = ob2.getNiCount(testString2);
      ob2.replaceNiWithNI(testString2);
      std::wcout << L"Found " << count2 << L" occurences of Ni in String 2.  "
                 << L"New string: " << testString2 << '\n';
    
      getchar();
      return 0;
    }
    

    我通常会离开您找到的方式并替换Ni字符。 member functions of std::string<algorithm> library中提供了更复杂的选项。