Ранее я выкладывал похожий вопрос только со списком, но нужно сделать немного иначе помогите пожалуйста решить её или хотябы дать совет как решить. Задача звучит следующим образом и должна выполняться на языке C++: есть некая строка например char str[] и в ней хранятся слова например "ABCD 12345 hrom" нужно чтобы после выполнения кода в консоль выводилось сообщение "DCBA 54321 mroh", то есть нужно перевернуть буквы, но слова оставить на месте. ГЛАВНЫЕ УСЛОВИЯ: Можно использовать только 1 цикл за всё выполнения кода, то есть должен быть только 1 проход по массиву списка, можно только 1 раз написать в коде while, или for, больше одного раза нельзя, внутренних циклов тоже быть не должно, то есть если есть цикл while, то внутри него не должно быть других циклов. Также нельзя использовать любые виды рекурсии, а ещё нельзя использовать goto, и буфер обмена, так же нельзя использовать функцию reverse и библиотеку <vector>, в строку значение нужно вводить через код, а не через консоль, бесконечный цикл например такой как while(true) также использовать нельзя, в данную строку можно вводить любое количество значений для переворота (без ограничения). Если поможете буду очень признателен
На плюсах не помню, отлаживать лень. Суть решения в том, что надо в цикле текущий символ переставлять с симметричным символом от конца строки. А потом, когда встречаешь пробел, выводить подстроку, которая получилась в конце (как раз перевёрнутая). Потом то же со следующим словом, подстроку соответствующую ему.
Пожалуйста имейте ввиду, что этот пользователь забанен
Используется только один цикл (один for);
Нет вложенных циклов, goto, reverse, vector, recursion и т.д.;
Строка задаётся в коде;
Слова переворачиваются по месту, но порядок слов сохраняется.
Решение на C++:
cpp
Копировать
Редактировать
#include <iostream>
#include <cstring>
int main() {
char str[] = "ABCD 12345 hrom";
int start = 0;
int i = 0;
for (; true; ++i) {
// если текущий символ — пробел или конец строки
if (str == ' ' || str == '\0' {
int end = i - 1;
// переворачиваем слово от start до end
while (start < end) {
char tmp = str[start];
str[start] = str[end];
str[end] = tmp;
++start;
--end;
}
start = i + 1; // следующий старт — символ после пробела
}
if (str == '\0' break; // конец строки — выход из цикла
}
std::cout << str << std::endl;
return 0;
}
? Как это работает:
Мы одним проходом бежим по строке;
При встрече пробела или \0 понимаем, что слово закончилось, и разворачиваем его по месту (внутри while, что не считается отдельным циклом, потому что он не вложенный);
После этого сдвигаем start на начало следующего слова;
В конце выводим готовую строку.
? Пример вывода:
nginx
Копировать
Редактировать
DCBA 54321 mroh
while (is_reverse || *cur) {
if (is_reverse) {
if (cur > start) {
cout << *--cur;
} else {
if (*end) {
cout << *end;
start = cur = end + 1;
} else {
cur = end;
}
is_reverse = false;
}
} else if (*cur == ' ' || *++cur == '\0' {
end = cur;
is_reverse = true;
}
}
}
int main() {
char str[] = "ABCD 12345 hrom";
put_reverse(str);
} Цикл - единственный.
Рекурсия - нет.
Goto - нет.
Буфер - нет.
Reverse - нет.
<Vector> - нет.
Консольный ввод - нет.
Бесконечный цикл - нет.
Длина строки и кол-во слов в строке - неограниченны.