-7
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次の2つの関数とreplaceNiWithNIクラスを実装しますMyClass
    • getNiCount内の「Ni」の出現回数を返す必要がありますszTestString1/2(大文字と小文字を区別)
    • replaceNiWithNI「Ni」のすべての出現箇所szTestString1/2を「NI」に置き換える必要があります(大文字と小文字を区別)
  2. getNiCount2つの関数とを呼び出しreplaceNiWithNIます。
  3. 画面の最後のコメントで指定された文字列を表示します。実際の値に置き換える必要がありますXY
  4. クラスは(ASCII)と(Unicode)MyClassの両方を処理できる必要があります。szTestString1szTestString2

一般的な要件:

コードは次のようになります

  • わかりやすく、メンテナンスしやすい(優先度1)
  • 技術的にエレガント(優先度2)
  • 可能な限り(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;
}
4

1 に答える 1

4

ここにはいくつかの問題があります。

  1. セミコロンの位置が間違っているため、プログラムのコンパイルに失敗します

    cout<<"\nNew String 2 is :";<<b
    
  2. strcpy(a,x);初期化されていないコピー先であるため、プログラムがクラッシュしますa。メモリが割り当てられていません。newこれを機能させるには、これを呼び出す必要がありますa。これは、必要な配列のサイズ(おそらく関数の別のパラメーター)を知る必要があることも意味します。

  3. std::stringとを使用するstd::wstringことは、ほとんどの場合、生のchar配列を処理するよりも望ましい方法です。たとえば、この質問を参照してください。私はあなたが持っているのでおそらくあなたはすでにそれを考慮していたと思います#include <string>

  4. 異なるタイプで同じ操作を実行する必要があるため、演習のポイントはテンプレートを使用することだったのではないかと思います。

  5. あなたが言った

    getNiCount発生数を返す必要があります。

    それでもあなたgetNiCountは何も返しません。

  6. using namespace std;多くの場合、悪い習慣と見なされます。

  7. 一般に、ポストインクリメントではなくプレインクリメントを優先する価値がありますが、この特定のケースでは、オーバーヘッドはありません。


上記の推奨事項を含む例を示すには:

#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あなたが持っていたように、あなたが文字を見つけて置き換える方法を残しました。ライブラリのメンバー関数std::string<algorithm>ライブラリで利用できるより洗練されたオプションがあります。

于 2012-08-20T02:27:57.940 に答える