Форум программистов, компьютерный форум CyberForum.ru

Рекурсия. Удаление лишних пробелов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
akik
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 26
15.05.2014, 21:42     Рекурсия. Удаление лишних пробелов #1
Доброго времени суток! Подскажите как реализовать с помощью рекурсии задачу: описать функцию, которая удаляет из строки все лишние пробелы.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
srin
25 / 25 / 11
Регистрация: 05.05.2014
Сообщений: 115
15.05.2014, 23:41     Рекурсия. Удаление лишних пробелов #2
1. А какие пробелы лишние?
2. Алгоритм что-то типо этого:
2.1 функция main()

2.2 вызываем функцию "рекурсия"(). Она выглядит так:
2.3 ищем лишний пробел(ы) :
2.3.1 если есть - удаляем лишний пробел(ы) и переходим к пункту 2.2 (т.е. вызываем опять такую же функцию)
2.3.2 если нет - выходим из функции

вроде так
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
16.05.2014, 16:00     Рекурсия. Удаление лишних пробелов #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
akik,
C++
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
#include "string.h"
#include <iostream>
 
void DelSpace(char* str, int ind)
{
    int i;
    if ((str[ind]==' ')&&(str[ind+1])==' ')
        DelSpace(str,ind+1);
    for (i = ind; i < strlen(str)-1; i++)
    {
        str[i]=str[i+1];
    }
        str[i]=0;
    
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    char str[256];
    int i;
    gets (str);
    for (i=0;i<strlen(str);i++)
    { if ((str[i]==' ')&&(str[i+1]==' '))
        DelSpace(str,i+1);
    }
    std::cout<<str<<"\n";
    system("pause");
    return 0;
}
akik
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 26
16.05.2014, 18:37  [ТС]     Рекурсия. Удаление лишних пробелов #4
Огромное спасибо))
JleHuH213
0 / 0 / 1
Регистрация: 22.10.2012
Сообщений: 154
28.04.2015, 21:42     Рекурсия. Удаление лишних пробелов #5
Подскажите как сделать что бы была функция в другом файле?
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
29.04.2015, 10:31     Рекурсия. Удаление лишних пробелов #6
JleHuH213, например так:
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "Another.h"
int _tmain(int argc, _TCHAR* argv[])
{
    
    char str[256];
    int i;
    gets (str);
    for (i=0;i<strlen(str);i++)
    { if ((str[i]==' ')&&(str[i+1]==' '))
        DelSpace(str,i+1);
    }
    std::cout<<str<<"\n";
    system("pause");
    return 0;
}
Another.h:
C++
1
void DelSpace(char* str, int ind);
Another.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void DelSpace(char* str, int ind)
{
    int i;
    if ((str[ind]==' ')&&(str[ind+1])==' ')
        DelSpace(str,ind+1);
    for (i = ind; i < strlen(str)-1; i++)
    {
        str[i]=str[i+1];
    }
        str[i]=0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
29.04.2015, 11:32     Рекурсия. Удаление лишних пробелов #7
JleHuH213, это ты целый год задачу решаешь?
Людвиг Бодмер
29.04.2015, 11:36
  #8

Не по теме:

Kuzia domovenok, он же не топикстартер

daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 12:52     Рекурсия. Удаление лишних пробелов #9
Людвиг Бодмер, А без циклов осилим?
Строка не начинается с пробелов.
Циклы вообще не используем.
static нельзя.
в функцию подается только строка и ничего больше'

Интересно просто. Это 100% возможно.
Да и решать рекурсию так интереснее. Чтоб без циклов. Она на то и рекурсия. Мне ответ решения совсем не нужен. Это просто любопытство.
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
29.04.2015, 14:04     Рекурсия. Удаление лишних пробелов #10
daslex, как насчет такого варианта? :
C++
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
#include <iostream>
#include <string>
 
void DelSpace(std::string str)
{
    int i;
    i = str.find("  ");
    std::string rstr;
    if ( i > -1 )
      {
        rstr = str.replace( i,2," " );
        DelSpace (rstr); 
      }
      else if ( i == -1 )
      {
        std::cout << str << std::endl;    
      }  
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string str;
    getline(std::cin,str); 
    DelSpace(str);
    system("pause");
    return 0;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 14:21     Рекурсия. Удаление лишних пробелов #11
Норм. Условия соблюдены. Но есть вариант без stl. , когда строка массив символов.

Добавлено через 7 минут
Когда уже обработанную строку внутри рекурсивной функции можно в другие функции подсовывать вне рекурсивной функции .
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
29.04.2015, 22:44     Рекурсия. Удаление лишних пробелов #12
Цитата Сообщение от daslex Посмотреть сообщение
А без циклов осилим?
Строка не начинается с пробелов.
Циклы вообще не используем.
static нельзя.
в функцию подается только строка и ничего больше'
Интересно просто. Это 100% возможно.
Да и решать рекурсию так интереснее. Чтоб без циклов. Она на то и рекурсия. Мне ответ решения совсем не нужен. Это просто любопытство.
Ну вот наконец-то кто-то предложил интересные развлечения. Тоько зачем же ограничение, что строка не начинается с пробелов - мы и общий случай можем без единого гвоздя цикла Ну и без статиков и прочих внешних глобальных растяжек.
C++
1
2
3
4
5
6
7
8
9
char *task(char *b, char *e) {bool se = *e==' ', sb = *b==' ';
   if (se) *e=0; return sb || se ? task(b+sb, e-se) : b;}
char *end(char *p) {return *p ? end(p+1) : p-1;}
 
int _tmain(int argc, _TCHAR* argv[]) {
    char s[] = "            A string without spaces             ";
    cout << ">" << task(s, end(s)) << "<" << endl;
    system("pause"); return 0;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 22:53     Рекурсия. Удаление лишних пробелов #13
_Ivana, char s[] = "____________A string_________without___________spaces "; в gcc серединный не убирает (подчеркивания=пробел)
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
29.04.2015, 22:55     Рекурсия. Удаление лишних пробелов #14
Какие серединные? Надо же лишние только удалить - СокрЛП() в 1С А серединные - не лишние. Хотя и с серединными не сложно.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 23:00     Рекурсия. Удаление лишних пробелов #15
Нет. Надо выполнить зачистку по всей строке. Любое множество подряд идущих пробелов должно стать одним пробелом. Это условие задачи этой вот темы, в которую мы "окунулись"

Добавлено через 1 минуту

Не по теме:

Все, что я смог решить по определению не сложно

_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
29.04.2015, 23:08     Рекурсия. Удаление лишних пробелов #16
Пожалуйста. Еще проще. Правда в первый раз запрашивает за границей массива, но это ерунда
C++
1
2
3
4
5
6
7
void task(char *s, char *d) {*d = *s; if (*s) { task(s+1, d+1-(*s==' '&&*(s-1)==' ') );} }
 
int _tmain(int argc, _TCHAR* argv[]) {
    char s[] = "            A       string      without      spaces              ", d[500];
    task(s, d); cout << ">" << d << "<" << endl;
    system("pause"); return 0;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 23:17     Рекурсия. Удаление лишних пробелов #17
ну и какой новичок это осилит?
(s+1, d+1-(*s==' '&&*(s-1)==' ') )

я-то знаю, что эта строчка значит. Но задачка вообще-то для новичков для улучшения восприятия рекурсии. Не мне ответ нужен. Им. Я наш диалог помню и зачем так пишем. Тут заинтересованных, конечно, мало, но через годик другой кто-то интересующийся обязательно будет тут вычитывать тему, а ему вместо понятности ребусики решать.

И 1 условие не соблюдено. Похоже моя вина, что не договорил, что только один аргумент
foo(S) ; //Только так А не foo(S1,S2)
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
29.04.2015, 23:20     Рекурсия. Удаление лишних пробелов #18
Кстати, функция почти нормальная, можно даже вызывать без нарезания строки дестинейшна -
C++
1
task(s, s);
если не жалко испортить исходную строку и она не константная. Рекурсия без циклов на указателях рулит

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
И 1 условие не соблюдено. Похоже моя вина, что не договорил, что только один аргумент
foo(S) ; //Только так А не foo(S1,S2)
Ну уж совсем к ерунде то не цепляйтесь -
C++
1
void finalres (char *s) {task(s, s);}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
29.04.2015, 23:32     Рекурсия. Удаление лишних пробелов #19
Цитата Сообщение от _Ivana Посмотреть сообщение
task(s, s);
Ерунда не ерунда. 1 аргумент нужен. С 2 легче.

Добавлено через 2 минуты

Не по теме:

Да и с 1 легко. Но с 2 легче.



Добавлено через 5 минут
строку портить можно. Она не константная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2015, 23:35     Рекурсия. Удаление лишних пробелов
Еще ссылки по теме:

Удаление лишних пробелов C++
C++ Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
Удаление лишних символов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
29.04.2015, 23:35     Рекурсия. Удаление лишних пробелов #20
daslex, щас попробую сделать.
Yandex
Объявления
29.04.2015, 23:35     Рекурсия. Удаление лишних пробелов
Ответ Создать тему
Опции темы

Текущее время: 01:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru