Є деяка рядок (слово, число), например “будинки”. Необхідно заповнити цим словом рядок (послідовно буквами цього слова) за певну кількість ітерацій.
Наприклад: базова рядок – “будинки”, необхідне число символів результату 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, але там виділення буфера (символ ЬіЕ[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;
ІНТ Const BUFERSIZE = а;
ІНТ bufer = 0;
рядок Slovo;
cout<>слово;
do
{for(INT I = 0;i<slovo.size();i )
{
if(bufer<BUFERSIZ в)
cout<<слово[i];
bufer ++;
}
}while(bufer < BUFERSIZ в);
return 0;
}