Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Улучшенная задача со строкой C++

Денис Монолит Ученик (218), открыт 3 недели назад
Ранее я выкладывал вопросы со списком и строкой, задача осталась такая же со строкой, то есть, есть строка char str[] = "ABCD 1234 S12345678900987654321" Нужно перевернуть буквы таким образом, чтобы, слова остались на месте, а буквы поменяли расположение таким образом "DCBA 4321 12345678900987654321S", и при этом использовать рекурсию(любую), буфер обмена, goto, библиотеку <vector>, итераторы по типу (word.begin(), wordEnd()) ; нельзя, но можно использовать только 1 цикл любой, главное чтобы он был единственным в своëм экземпляре. Условие данной улучшенной задачи заключается в том, что нужно сделать так, чтобы количество символов в строке соответствовало количеству итераций, необходимо это сделать без дополнительных циклов и всего выше перечисленного, буду очень благодарен если кто сделает, Вот пример кода:

#include <iostream>

// Функция для вывода слов из строки в обратном порядке
void put_Rever(const char* s)
{
const char* start = s, * end = s, * cur = s; // Инициализация указателей на начало, конец и текущую позицию строки
bool Rever = false;
int i = 0;
while (Rever || *cur)
{
printf("%d: rever=%s, cur=%s\n", i, Rever == false ? "false" : "true", cur);
if (Rever) // Если нужно вывести слово в обратном порядке
{
if (cur > start) // Проверяем, не достигли ли начала слова
{
printf("\n%c", *--cur); // Выводим текущий символ и перемещаемся к предыдущему
}
else // Если достигли начала слова
{
if (*end) // Проверяем, не достигли ли конца строки
{
printf("\n%c", *end); // Выводим текущий символ конца слова
start = cur = end + 1; // Обновляем указатели для следующего слова
}
else // Если достигли конца строки
{
cur = end; // Устанавливаем cur на end, чтобы завершить цикл
}
Rever = false;
}
}
else if (*cur == ' ' || *++cur == '\0') // Если текущий символ пробел или конец строки
{
end = cur; // Устанавливаем end на текущую позицию
Rever = true;
}
i++;
}
}

int main()
{
setlocale(LC_ALL, "RU");
char str[] = "ABCD 1234 hrom S1234567890098765432112345678900987654321E"; // Ввод символов
printf("size=%d\n", sizeof(str)/sizeof(str[0]));
printf("Исходная строка: %s\n", str); //Вывод исходной строки
printf("\n");
put_Rever(str); // Вызов функции для вывода слов в обратном порядке
}

Код не мой, мне его ранее скидывали, просто я его немного модернизировал, чтобы можно было видеть количество итераций
2 ответа
/bin/laden Искусственный Интеллект (122525) 3 недели назад
чел, ты несешь бред.
какой смысл в глупом ограничении в 1 цикл, если этот один цикл у тебя делает несколько проходов все равно? просто чтобы было? При этом читабельность и надежность никакая.
Денис МонолитУченик (218) 3 недели назад
Я и сам считаю это бредом, но видишь ли я студент, и преподаватель задал нам такое задание на сдачу экзамена, в этом и суть, что задача бредовая максимально
Денис Монолит, может, он уже скажет, каким методом это надо решить, а не какими методами это нельзя решать? У вас там программирование или угадайка скрытых эротических желаний?
Дмитрий Лазарев Мыслитель (9141) 3 недели назад
попробуй это вариант:

#include <iostream>
#include <cstring> // Для strlen

// Рекурсивная функция для переворота символов в слове
void reverseWord(const char* start, const char* end, char* output, int& outIndex) {
if (start > end) return; // База рекурсии: если указатель start превысил end, выход
output[outIndex++] = *end; // Записываем символ с конца слова
reverseWord(start, end - 1, output, outIndex); // Рекурсивный вызов для следующего символа
}

// Функция для обработки строки и переворота слов
void put_Rever(const char* s, char* result) {
const char* start = s; // Указатель на начало текущего слова
int outIndex = 0; // Индекс для результирующей строки
int i = 0; // Счётчик итераций

while (*s) { // Единственный цикл для прохода по строке
printf("%d: s=%c\n", i++, *s);
if (*s == ' ' || *(s + 1) == '\0') { // Если пробел или конец строки
const char* end = (*s == ' ') ? s - 1 : s; // Конец слова
reverseWord(start, end, result, outIndex); // Переворачиваем слово
if (*s == ' ') result[outIndex++] = ' '; // Добавляем пробел, если он есть
start = s + 1; // Начало следующего слова
}
s++;
}
result[outIndex] = '\0'; // Завершаем результирующую строку
}

int main() {
setlocale(LC_ALL, "RU");
char str[] = "ABCD 1234 S12345678900987654321";
char result[100]; // Буфер для результата (достаточно большой)
printf("Исходная строка: %s\n", str);
printf("Размер строки: %zu\n", strlen(str)); // Исправлено: %zu вместо %d
printf("\n");
put_Rever(str, result); // Вызов функции
printf("\nРезультирующая строка: %s\n", result);
return 0;
}
АндрейВысший разум (483167) 3 недели назад
Нейросеть в очередной раз жидко oбoсралась, не в состоянии понять фразу "нельзя использовать рекурсию". А белковый придаток, засирающий Ответы высерами своего идола, способен лишь на Ctrl+C / Ctrl+V.
Андрей, :))
Похожие вопросы