0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 26
1

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

15.05.2014, 21:42. Показов 11605. Ответов 59
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Подскажите как реализовать с помощью рекурсии задачу: описать функцию, которая удаляет из строки все лишние пробелы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2014, 21:42
Ответы с готовыми решениями:

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со...

Удаление лишних пробелов
Помогите пожалуйста с задачей: Разработать алгоритм и программу для удаления лишних пробелов в...

Удаление лишних пробелов
Доброго времени суток уважаемые профики С++. Хотелось бы узнать как сделать функцию удаление...

Удаление лишних пробелов
Знаю, тема изъёрзана) но вот код, и своих функций он не выполняет( #include <iostream> using...

59
25 / 25 / 14
Регистрация: 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 если нет - выходим из функции

вроде так
1
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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;
}
2
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 26
16.05.2014, 18:37  [ТС] 4
Огромное спасибо))
0
5 / 5 / 2
Регистрация: 22.10.2012
Сообщений: 249
28.04.2015, 21:42 5
Подскажите как сделать что бы была функция в другом файле?
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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;
}
1
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
29.04.2015, 11:32 7
JleHuH213, это ты целый год задачу решаешь?
0
Людвиг Бодмер
29.04.2015, 11:36
  #8

Не по теме:

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

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 12:52 9
Людвиг Бодмер, А без циклов осилим?
Строка не начинается с пробелов.
Циклы вообще не используем.
static нельзя.
в функцию подается только строка и ничего больше'

Интересно просто. Это 100% возможно.
Да и решать рекурсию так интереснее. Чтоб без циклов. Она на то и рекурсия. Мне ответ решения совсем не нужен. Это просто любопытство.
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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;
}
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 14:21 11
Норм. Условия соблюдены. Но есть вариант без stl. , когда строка массив символов.

Добавлено через 7 минут
Когда уже обработанную строку внутри рекурсивной функции можно в другие функции подсовывать вне рекурсивной функции .
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
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;
}
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 22:53 13
_Ivana, char s[] = "____________A string_________without___________spaces "; в gcc серединный не убирает (подчеркивания=пробел)
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
29.04.2015, 22:55 14
Какие серединные? Надо же лишние только удалить - СокрЛП() в 1С А серединные - не лишние. Хотя и с серединными не сложно.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 23:00 15
Нет. Надо выполнить зачистку по всей строке. Любое множество подряд идущих пробелов должно стать одним пробелом. Это условие задачи этой вот темы, в которую мы "окунулись"

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

Не по теме:

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

0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
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;
}
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 23:17 17
ну и какой новичок это осилит?
(s+1, d+1-(*s==' '&&*(s-1)==' ') )

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

И 1 условие не соблюдено. Похоже моя вина, что не договорил, что только один аргумент
foo(S) ; //Только так А не foo(S1,S2)
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
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);}
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
29.04.2015, 23:32 19
Цитата Сообщение от _Ivana Посмотреть сообщение
task(s, s);
Ерунда не ерунда. 1 аргумент нужен. С 2 легче.

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

Не по теме:

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



Добавлено через 5 минут
строку портить можно. Она не константная.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
29.04.2015, 23:35 20
daslex, щас попробую сделать.
1
29.04.2015, 23:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2015, 23:35
Помогаю со студенческими работами здесь

Удаление лишних пробелов
И снова здравствуйте, Господа эксперты. Помогите пожалуйста Удалить в тексте лишние пробелы. Данные...

Удаление из текста лишних пробелов
Задание: Удалить из текста повторяющиеся знаки пробела и те пробелы, которые стоят перед абзацем. ...

Удаление лишних пробелов из текста
Здравствуйте, нужна помощь в написании конечного автомата. Удаление лишних пробелов из текста нужна...

Удаление лишних пробелов в конце строки
На проверочном сайте мое решение не проходит из-за лишнего пробела в выходной строке, как его...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru