Есть некоторая строка (слово, число), например “home”. Необходимо заполнить этим словом строку (последовательно буквами этого слова) за определённое количество итераций.
Например: базовая строка – “home”, требуемое число символов результата 11, результат: “homehomehom”
В этой задаче главным требованием должно быть: сделать это как можно больше разными способами! (задача то сама по себе совсем элементарная).
Решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <cstdint> #include <string> #include <iostream> using namespace std; string rep1(const string& base, int rep) { string ret = ""; for (int i = 0; i < rep; i++) ret += base[i % base.length()]; return ret; } string rep2(const string& base, int rep) { string ret = ""; for (int i = 0; i < rep; i += base.length()) ret += rep - i > base.length() ? base : base.substr(0, rep - i); return ret; } string rep3(const string& base, int rep) { string ret = ""; for (int i = 0; i < rep / base.length(); i++) ret += base; return ret + base.substr(0, rep % base.length()); } string rep4(const string& base, int rep) { char buf[1000]; strcpy_s(buf, base.c_str()); while (strlen(buf) < rep) // удвоить длину memmove(buf + strlen(buf), buf, strlen(buf) + 1); buf[rep] = '\0'; return string(buf); } string rep5(const string& base, int rep) { string ret(base); while (ret.length() < rep) ret += ret; // удвоить длину return ret.erase(rep, ret.length() - rep); } int main() { setlocale(LC_ALL, "rus"); string(*tests[])(const string& base, int rep) = { rep1, rep2, rep3, rep4, rep5, // последовательность тестов }; while (true) { cout << "базовая строка?: "; string word; cin >> word; int rep; cout << "длина результата?: "; cin >> rep; for (int i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) cout << tests[i](word, rep) << endl; } return 0; } |
Вот как это будет выглядеть при исполнении:
Здесь показано несколько (5) вариантов решения для базовой строки в формате std::string. Но ещё много интересных вариантов может быть записано для строки в формате char[] (такой код будет даже проще для понимания).
P.S. В таком случае ваши функции вариантов (если вы хотите сохранить массив функций-обработчиков) могут иметь прототип:
1 2 3 4 5 | char* rep( const char* base, uint rep ) { static char ret[ 1000 ]; // здесь ваш код! ... return ret.erase( rep, ret.length() - rep ); } |
Предлагайте следующие варианты!
Наилучший по оптимальности из показанных будет rep4, но там выделение буфера (char buf[1000]) сделано с потолка и чисто для иллюстрации, легко его переполнить.
Добавлю ещё 2 вариата в развитие этого способа:
string rep6( const string& base, uint rep ) {
char* buf = (char*)alloca( rep * 2 );
strcpy( buf, base.c_str() );
while( strlen( buf ) < rep )
memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
buf[ rep ] = '\0';
return string( buf );
}
string rep7( const string& base, uint rep ) {
char buf[ rep * 2 ];
strcpy( buf, base.c_str() );
while( strlen( buf ) < rep )
memmove( buf + strlen( buf ), buf, strlen( buf ) + 1 ); // удвоить длину
buf[ rep ] = '\0';
return string( buf );
}
#include
#include
using namespace std;
int main()
{
int a;
cout<>a;
int const BUFERSIZE=a;
int bufer=0;
string slovo;
cout<>slovo;
do
{for(int i=0;i<slovo.size();i++)
{
if(bufer<BUFERSIZE)
cout<<slovo[i];
bufer++;
}
}while(bufer < BUFERSIZE);
return 0;
}