順番に、質問 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.
必要に応じて、ここで確認できます。