0

C ++の練習のためにROT13に取り組んでいます。ただし、このコードはエラーを返し、コンパイルに失敗します。理由がわかりません! 次の行にコードのスニペットを投稿しています

string encode(string &x)
{
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";

    for (size_t l=0;l<x.size();++l){
        cout<<x[l];
        cout<< strchr(alphabet,x[l]);    
    }
    return x;
}

Q2. また、alphabet[] から一致する文字のインデックスを返すのを手伝ってください (たとえば、「f」の場合は 5)。これに 13 を追加して、それを x に追加するなど..

Q3. 実践以外に、より効率的なアルゴリズムを開発するのに役立つ CS のコースはどれですか? それは計算理論、離散数学、またはアルゴリズムですか?

4

2 に答える 2

2

順番に、質問 1 から始めます。

以下は私にとってはうまくコンパイルされます:

#include <iostream>
#include <cstring>

std::string encode(std::string &x)
{
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    char *ptr;
    for (size_t l=0;l<x.size();++l){
        std::cout<<x[l];
        std::cout<< std::strchr(alphabet,x[l]);
    }
    return x;
}

int main (int argc, char* argv []) {
    return 0;
}

確実に:

  • coutおよびに指定されたヘッダーを含めますstrchr
  • 名前空間std::を使用していない限り、接頭辞を使用してください。std
  • その問題を修正しptrます。

質問2:

便利な ROT-13 メソッドを探している場合は、ソース用と翻訳用の 2 つの C 文字列を使用することを検討してください。

char from[] = "abcdefghijklmnopqrstuvwxyz";
char to  [] = "nopqrstuvwxyzabcdefghijklm";

次にstrchr、最初のものでそれを検索するために使用し、そのポインターを使用して2番目のもので同等のものを見つけることができます.

char src = 'j';
char *p = strchr (from, src);
if (p == NULL)
    std::cout << src;
else
    std::cout << to[p - from];

文字が見つからない場合はそのまま出力し、見つかった場合は翻訳を検索します。そこに大文字を入れることもできます。

質問 3:

効率的なアルゴリズムについて学びたい場合は、驚くべきことに、アルゴリズムのコースを受講することをお勧めします :-)

計算理論は少し無味乾燥に聞こえますが、アルゴリズムの背後にある理論的基礎を十分にカバーしている可能性があります。離散数学はアルゴリズムに適用できますが、繰り返しますが、おそらく非常に理論的なものです。もちろん、それは言葉の意味に基づいています。もちろん、カバーされる実際の主題分野はまったく異なる可能性があるため、コースを提供している人々と一緒に検討する必要があります.

余分なビット:

自分の作品と比較するものを探している場合は、上記の提案に基づいてまとめたものを次に示します。

#include <iostream>
#include <cstring>

std::string rot13 (std::string x)
{
    char from[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char to  [] = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM";
    std::string retstr = "";
    for (size_t i = 0; i < x.size(); ++i) {
        char *p = std::strchr (from, x[i]);
        if (p == 0)
            retstr += x[i];
        else
            retstr += to[p - from];
    }
    return retstr;
}

int main (int argc, char* argv []) {
    std::string one = "This string contains 47 and 53.";
    std::string two = rot13 (one);
    std::string three = rot13 (two);
    std::cout << one << '\n';
    std::cout << two << '\n';
    std::cout << three << '\n';
    return 0;
}

戻り文字列の構築は、おそらくもっと効率的に行うことができたでしょう (最後にのみ文字列になる新しい文字配列など) が、メソッドの「ルックアップ」部分をよく示しています。

出力は次のとおりです。

This string contains 47 and 53.
Guvf fgevat pbagnvaf 47 naq 53.
This string contains 47 and 53.

必要に応じて、ここで確認できます。

于 2012-02-27T12:59:44.483 に答える
0

にキャストalphabetすると、const char*後で機能するはずです。type[]とは異なりますのでご注意くださいtype *

于 2012-02-27T12:56:14.717 に答える