Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2012, 17:03   #1
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию Последовательность литер

Задан текст - последовательность литер. Распечатать его, обращая каждую групп из 5 следующих друг за другом литер, т.е. печатая литеры этой группы в обратном порядке. Последнюю групп обращать, даже если она содержит менее 5 литер. В программе не должно быть циклов. Использую только рекурсию
sidestep вне форума Ответить с цитированием
Старый 25.02.2012, 17:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наработки в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2012, 17:14   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://www.programmersforum.ru/showthread.php?t=34061
_Bers вне форума Ответить с цитированием
Старый 26.02.2012, 06:48   #4
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Вот код программы, которая обращает слово, но на конце слова стоит точка, то есть тут мы можем узнать конец
Код:
#include <stdio.h>
#include <conio.h>
void sl()
	{char c;
scanf ("%c", &c);
if (c!='.')
	sl();
printf ("%c", c);
	}
void main()
{
	sl();
    getch();
}
А как узнать в данной ситуации?
sidestep вне форума Ответить с цитированием
Старый 26.02.2012, 06:53   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

распиши, что должен делать, и что делает по факту, приведенный выше код.
_Bers вне форума Ответить с цитированием
Старый 26.02.2012, 07:05   #6
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

мы вводим слово с точкой на конце, например "ма."
дальше с помощью
Код:
if (c!='.')
мы убеждаемся, что 'м' не '.' и вызываем sl(), но так как мы не дошли до
Код:
printf ("%c", c)
, то мы вернемся потом.
Аналогично с буквой 'а'. Теперь, что же касается '.' В данном случае условие не сработает и точка напечатается и потом вернемся к двум printf, которые мы не успели сделать. По принципу рекурсии
Можно было также сделать, чтобы точка не выводилась
например изменить кусок программы:
Код:
{char c;
scanf ("%c", &c);
if (c!='.'){
	sl();
	printf ("%c", c);}
	}
sidestep вне форума Ответить с цитированием
Старый 26.02.2012, 08:20   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

У тебя получается:

Функция sl()
1. мы вводим слово с точкой на конце, например "ма."
2. мы убеждаемся, что 'м' не '.' и вызываем sl(), то бишь снова уходим на пункт 1

Получается: вводим "слово", убеждаемся, что первый символ строки не точка, и снова вводим "слово", убеждаемся, что первый символ строки не точка, и снова вводим....


Ты понял свою ошибку?
_Bers вне форума Ответить с цитированием
Старый 26.02.2012, 08:28   #8
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Ты имеешь ввиду, что не надо сразу все слово вводить? а по символам ?
sidestep вне форума Ответить с цитированием
Старый 26.02.2012, 09:27   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от sidestep Посмотреть сообщение
Ты имеешь ввиду, что не надо сразу все слово вводить? а по символам ?
Я имею ввиду, что у тебя ошибка в самом алгоритме.
Не думай о коде. Думай только об алгоритме. Распиши обычными русскими словами, какую именно последовательность действий ты хочешь получить.

Например, алгоритм твоей задачи может выглядеть так:

1. Пользователь вводит строку.
2. Нужно шагать по всей строке пока не будет достигнут признак конца строки (специальный символ, символизирующий конец строки)
3. И запоминать позицию каждого очередного пятого символа (что бы знать с какой позиции начать "обратное отображение"
5. Прошагав очередные 5 символов - вывести их в обратном порядке (вывести задом наперед символы, зная позицию последнего символа из очередной пятёрки)
6. Уйти на пункт 2.

Дальше конкретизируешь алгоритм, разбивая большую сложную задачку на кучку мелких:

1. Функция инициализации. Отвечает за ввод первоначальных данных. Именно она запустит механизм ввода строки от пользователя.

2. Рекурсивная (так нужно по заданию) функция пробега по всему массиву. Ей нужно знать позицию в строке, с которой она начинает шагать свои 5 символов подряд. Функция либо прошагает 5 символов, и выведет их в обратном порядке, либо прошагает менее 5 символов, и этот остаток выведет в обратном порядке. Или - завершит свою работу. И тем самым, рекурсия будет остановлена.

Эту рекурсивную функцию, так же можно при желании раздробить на основную функцию пробега по массиву, и на функцию, задача которой - вывод данных в обратном порядке.

Дополнительной функции вывода пятёрки символов в обратном порядке требуется знать позицию последнего символа очередной пятёрки, и точное количество символов в этой очередной пятёрке (количество символов, которое нужно отобразить в обратном порядке необходимо, потому что их может оказаться и меньше пяти)

Итого:

1. Инициализация. Требуется знать в какой приёмник данных можно поместить строку. В качестве приёмника может выступать массив, или указатель на данные.

2. Рекурсивный пробег. Требуется знать, с какой позиции в строке осуществляется пробег. Каждая следующая рекурсия выполняется не с самого начала строки, а с этой позиции (а значит, позиция самой первой рекурсии - ноль)

3. Вывод очередной партии символов в обратном порядке. Требуется знать позицию последнего символа в партии, а так же длину этой партии.

В общем, прежде, чем приниматься за конструирование кода, ты должен иметь в голове предельно четкий и ясный алгоритм - всю последовательность действий.

Тогда написать код будет очень просто.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод/вывод на экран литер masterbet Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.11.2011 22:39
последовательность -=Дрюня=- Помощь студентам 5 15.11.2011 14:27
Дана последовательность литер мурчик Помощь студентам 0 25.10.2011 22:54
Последовательность aleksei128 Помощь студентам 12 22.12.2010 23:48
"введите текст из 100 литер..." katya36 Помощь студентам 39 22.12.2008 17:39