Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивня Функция - Удаление пробелов 
V
    Опции темы
ressac
Дата 10.11.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



привет всем smile

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

Код

void dSpace(char * str, int i, int opc) // string + postion + option(0=поиск 1=удаление)
{
    if (i<strlen(str)) // проверка - в зоне стринга мы или уже нет
    {
        if(opc) // удалять?
        {
            str[i]=str[i+1];
            dSpace(str,i+1,1);
        }// есть проблел?
        else if (str[i]==' ')
            dSpace(str,i,1);

        dSpace(str,i+1,0); // поиск дальше 
    }

    if(i==0 && str[i]==' ') // это на тот случай когда два пробела подряд
        dSpace(str,0,1);
}


Это сообщение отредактировал(а) ressac - 10.11.2010, 15:09
PM MAIL   Вверх
xvr
Дата 10.11.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Код

void dSpace(char* dst, char* src)
{
 switch(*src)
  {
   case 0: *dst=0; break;
   default: *dst++=*src;
   case ' ': dSpace(dst,src+1); break;
  }
}

PM MAIL   Вверх
Incinerated
Дата 10.11.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Код

void dSpace(char  *str, int i)
{
    if (i<strlen(str)) // проверка - в зоне стринга мы или уже нет
    {
        int j = i;
        while (str[i]==' '){
            str[i]=str[j+1];
            str[j+1] = ' ';
            j++;
        }
        
            dSpace(str,i+1);
    }
}

int main(int argc, _TCHAR* argv[])
{
    char str[] = "  as       dnas d";
    dSpace(str,0);
    std::cout << str;
    _getch();
    return 0;
}


результат: "asdnasd"
PM MAIL   Вверх
ressac
Дата 10.11.2010, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



нет, это должно быть без while() 
это слишком просто с whilr smile)
PM MAIL   Вверх
xvr
Дата 10.11.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ressac @  10.11.2010,  21:02 Найти цитируемый пост)
это должно быть без while
Огласите весь список пожалста  smile 
Вот, вариация на тему из поста №2 - вообще без операторов:
Код

void dSpace(char* dst, char* src)
{
 *src?((*src!=' '?*dst++=*src),dSpace(dst,src+1)):(*dst=0);
}

Вызов:
Код

char text[]="abc def jhg";
dSpace(text,text);


PM MAIL   Вверх
ressac
Дата 10.11.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



xvr, не плохой варик, но надо без дополнительного стринга

Добавлено через 7 минут и 54 секунды
xvr, smile просто должна быть чистая рекурсия smile одна функция, и базовые операторы типа switch  и if smile
PM MAIL   Вверх
xvr
Дата 11.11.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ressac @  10.11.2010,  22:13 Найти цитируемый пост)
xvr, не плохой варик, но надо без дополнительного стринга
Ему не нужен дополнительный стринг - ему можно подать один и тот же в оба параметра (см. пример вызова)

Цитата(ressac @  10.11.2010,  22:13 Найти цитируемый пост)
просто должна быть чистая рекурсия
Она и есть.
Цитата(ressac @  10.11.2010,  22:13 Найти цитируемый пост)
одна функция, и базовые операторы типа switch  и if 
Функция есть. Других операторов нет. Если очень нужны - см. листинг во 2м посте


PM MAIL   Вверх
ressac
Дата 11.11.2010, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



извини не досмотрел, сейчас попробую её на деле

Добавлено через 10 минут и 39 секунд
Код

void dSpace(char* dst, char* src)
{
 switch(*src)
  {
   case 0: *dst=0; break;
   default: *dst++=*src;
   case ' ': dSpace(dst,src+1); break;
  }
}

эта пашет smile только не понимаю  как, можно объяснить ? и подробней плиз )



Код

void dSpace(char* dst, char* src)
{
 *src?((*src!=' '?*dst++=*src),dSpace(dst,src+1)):(*dst=0);
}


эта у меня не скомпилилась...
PM MAIL   Вверх
Incinerated
Дата 11.11.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(ressac @ 10.11.2010,  23:52)
Добавлено @ 01:02
Код

void dSpace(char* dst, char* src)
{
 switch(*src)
  {
   case 0: *dst=0; break;
   default: *dst++=*src;
   case ' ': dSpace(dst,src+1); break;
  }
}

эта пашет smile только не понимаю  как, можно объяснить ? и подробней плиз )

по мойму все просто =) (*src) - это разыменование указателя, т.е. обращение к значению текущего смещения указателя (изначально указатель на 1-ом символе) "0" - это конец строки, "default" - это что выполняется по умолчанию (если не пробел), т.е. 
Код

*dst++=*src;

сначала происходит запись символа по указателю src в символ по указателю dst и затем происходит смещение указателя dst на 1 вперед, и затем происходит вызов функции:
Код

case ' ': dSpace(dst,src+1); break;

в функцию передается текущий указатель на символ в который будет происходит запись следующего символа и смещенная на 1 символ строка (srс+1).
Надеюсь понятно объяснил =)

Это сообщение отредактировал(а) Incinerated - 11.11.2010, 11:04
PM MAIL   Вверх
ressac
Дата 11.11.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



в случаее
      если есть пробел то case ' ': dSpace(dst,src+1); break; и происходит вызов
      но для случаяя когда нет проблема где вызов?
PM MAIL   Вверх
Incinerated
Дата 11.11.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(ressac @ 11.11.2010,  10:17)
в случаее
      если есть пробел то case ' ': dSpace(dst,src+1); break; и происходит вызов
      но для случаяя когда нет проблема где вызов?

Код

   default: *dst++=*src;
   case ' ': dSpace(dst,src+1); break;

в случае default не стоит break;, т.е. после присваивания символа программа автоматически переходит в случай case ' ':
PM MAIL   Вверх
xvr
Дата 11.11.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

эта у меня не скомпилилась...

У меня тоже  smile Исправил:
Код

void dSpace(char* dst, char* src)
{
 *src?((*src!=' '?*dst++=*src:0),dSpace(dst,src+1),0):(*dst=0);
}



Это сообщение отредактировал(а) xvr - 11.11.2010, 20:14
PM MAIL   Вверх
ressac
Дата 11.11.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 25.11.2006

Репутация: нет
Всего: 1



xvr, спасибо, по истине красивая рекурсися и игра с языком smile 
PM MAIL   Вверх
xvr
Дата 11.11.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ressac @ 11.11.2010,  21:41)
xvr, спасибо, по истине красивая рекурсися и игра с языком smile

Только преподавателю не показывайте - расстреляет из рогатки за 'игры с языком'  smile 

PM MAIL   Вверх
Dov
Дата 12.11.2010, 00:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Ещё такой вариант, самый простой по-моему:
Код
void dSpace(char* dst, char* src)
{
    if(*dst = *src)
        dSpace(dst + (*src != ' '), src + 1);
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.