По порядку, начиная с вопрос 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, рассмотрите возможность использования двух строк C,один для источника и один для перевода:
char from[] = "abcdefghijklmnopqrstuvwxyz";
char to [] = "nopqrstuvwxyzabcdefghijklm";
Затем вы можете использовать strchr
, чтобы найти его в первом и использовать этот указатель, чтобы найти эквивалент во втором.
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.
, который вы можете проверить здесь , если необходимо.