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

Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д

16.08.2013, 17:59. Показов 3248. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста решить задачку с использованием класса string. Я только учусь, и меня пока плохо получается..
Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д.
Вот мои наработки.. Но программа зациклилась и всё убила, пришлось перезапускать компьютер.
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
31
32
33
34
35
36
37
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <string>
using namespace std;
 
int main()
{
    string str, temp, firstWord, secondWord, general;
    string::size_type k = 0, position = 0;
    string separator = ",.:;!? ";
    cout << "Enter string: ";
    getline(cin, str);
    
    k = str.find_first_of(separator, position);
    while(k!=string::npos)
    {
        firstWord = str.substr(position, k-position);
        if(ispunct(str[k]))
            position = k+2;
        else position= k+1;
        secondWord = str.substr(position, k - position);
        if(ispunct(str[k]))
            position = k + 2;
        else position = k + 1;
        temp = firstWord;
        firstWord = secondWord;
        secondWord = temp;
        str.erase(position, k);
        general = firstWord + secondWord;
        str.insert(k , general);
    }
 
    cout <<"Changed string: " << str;
    getch();
    return 0;
}
Добавлено через 20 минут
Забыл дописать! Сообщение содержит знаки препинания, пробелы, то есть осмысленный текст, в котором также могут встречаться цифры.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2013, 17:59
Ответы с готовыми решениями:

Поменять слова в строке: первое со вторым, второе с третьим, третье с четвертым
Сейчас программа выдает по такому принципу: Поменять слова в сообщении по принципу: первое с n/2+1...

Обработка строковых данных в Delphi. Поменять местами слова: первое со вторым, третье с четвёртым и т.д.
Помогите пожалуйста с задачей. Дано:строка символов.Группы символов,разделенные одним или...

Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д.
всем ку. =) я еще плохо разбираюсь в строках.. помогите реализовать следуующее: вводим строку...

Поменять слова в сообщении по принципу: первое с последним, второе с предпоследним и т.д.
На уроке преподаватель не объясняет как решать. Задачи берутся из &quot;Основы программирования на языке...

18
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.08.2013, 18:07 2
Да строку разбей на слова, слова в массив сохрани и в цикле уже так как нужно этот массив обработай. От допустим у нас 10 слов, делим слов цикл будет от нуля до 5 for(int i=0;i<5;i++).
Меняй местами элементы массива
C++
1
2
3
4
5
6
7
int k=9;
for(int i=0;i<5;i++)
{
string temp=mass[i];
mass[i]=mass[k];
mass[k]=temp;
k--;
Дальше массив в строку переводишь и все.
}
0
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 18:19  [ТС] 3
ninja2, а какой массив мы переводим в строку?
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
16.08.2013, 18:19 4
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
2
3
4
5
6
7
int k=9;
for(int i=0;i<5;i++)
{
    string temp=mass[i];
    mass[i]=mass[k];
    mass[k]=temp;
    k--;
}
Здесь происходит обмен местами 1-го и последнего, 2-го и предпоследнего, А нужно 1-го и 2-го, 3-го и 4-го
0
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 19:42  [ТС] 5
BigLow, точно...
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.08.2013, 20:24 6
BigLow, Да чото подумал первое с последним, второе с предпоследним ошибся чуток. Тогда РВ проще использовать.

Darren_Clyde, От тебе мое элегантное решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <regex>
using std::regex;
using std::regex_replace;
 
int main()
{
    string str="hellow world gacpada da eb";
    regex rv(" *([^ ]*) ([^ ]*) *");
    string result=regex_replace(str,rv,string("$2 $1 "));
    cout <<str<<endl;
    cout <<result<<endl;
 
    return 0;
}
Добавлено через 4 минуты
Решение в 10 строк
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
#include <regex>
int main()
{
    std::string str="hellow world gacpada da eb";   
    std::string result=std::regex_replace(str,std::regex(" *([^ ]*) ([^ ]*) *"),std::string("$2 $1 "));
    std::cout <<str<<std::endl; std::cout <<result<<std::endl;
    return 0;
}
1
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 21:51  [ТС] 7
ninja2, а как нам сделать, чтобы пользователь сам вводил сообщение?
Я пробую:
C++
1
getline(cin, str);
Он пишет ошибка. В чем может быть проблема?
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
16.08.2013, 21:54 8
Darren_Clyde, а какая ошибка?
0
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 21:57  [ТС] 9
ninja2, Я разобрался))) Пространство имен)) нужно было определить getline и cin в данном случае. Спасибо огромное за помощь, я очень благодарен!!
А возможно осуществить тоже самое, избегая регулярных выражений? просто боюсь такое решение мне не зачтут ( хотя оно и продуктивнее..
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.08.2013, 22:19 10
Darren_Clyde, можно с помощью функций substr, replace и find или if_find, короче это очень морочно, рв сила.

Добавлено через 1 минуту
Или что бы не мучится разбей строку на слова, запиши их в массив и в массиве уже поменяй нужные слова, а потом слова из массива в строку скопируй.
0
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 22:37  [ТС] 11
ninja2, объясните, пожалуйста, регулярное выражение, которое вы использовали
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
16.08.2013, 23:49 12
Darren_Clyde, Отета от фигня [^ ]* соответствует любому количеству символов кроме пробела.
пробел и звездочка означает что может быть любое количество пробелов, а может быть и ни одного пробела, то что находится в скобках соответсвует любому слову ([^ ]*) между ними пробел, хотя можно было и наверно нужно поставить пробел и звездочку между ними и после последнего звездочка.
Почитай про рв там просто.
2
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 23:51  [ТС] 13
ninja2, спасибо огромное!!!
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
17.08.2013, 00:02 14
Darren_Clyde, Еще про скобки, это скобки сохраняющие то что у нас двое пар сохраняющих скобок и мы можем использовать то что в них сохраняется в regex_replace это переменные $1 и переменная $2 просто меняем местами в выражении "$2 $1 " и все дела, еще есть переменная $0 в ней сохраняется вся строка которая соответствует данному выражению.

Добавлено через 3 минуты
можешь поэксперементировать в regex_replace "$2 $1 " заменить например на "[$0] [$1] [$2] " и посмотреть что получится.
1
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 17:09  [ТС] 15
ninja2, как я понял:
C++
1
 regex rv(" *([^ ]*) /* <- Эта часть означает наше первое слово*/ ([^ ]*) /* <- А эта по сути второе*/ *");
Я не понимаю, что означают звездочки слева и справа от двух скобок, если не сложно поставьте комментарии в коде, а то до меня не доходит..
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
17.08.2013, 19:14 16
Там пробел и звездочка ' *' означает что перед словом может быть пробелы, а может и не быть, и после двух слов могут быть пробелы а могут не быть. А от если б был бы там пробел и знак вопроса, ' ?' то это означает что полюбому должен быть хоть один пробел.
2
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 20:23  [ТС] 17
ninja2, спасибо! Я теперь понял. А пробел между двумя скобками (словами) играет какую-то роль?
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
17.08.2013, 20:39 18
Цитата Сообщение от Darren_Clyde Посмотреть сообщение
ninja2, спасибо! Я теперь понял. А пробел между двумя скобками (словами) играет какую-то роль?
Ну у тебя ж в тексте идет слово1 слово2 слово3 слово4 . Между слово1 и слово2 у тебя стоит пробел?. Вообще между скобками лучше поставить пробел и знак вопроса ' ?' отак чтобы обязательно был хотябы один пробел или болше, там 4 пробела мб ты случайно поставишь. Есть в РВ специальные символы \w соответсвует любому символу, и \p или я не помню точно нужно смотреть соответсвует любому пробельному символу, мб знак табуляции пробел. Я щас не сильно помню это нужно смотреть литературу по РВ и пытаться на практике делать.
Короче экспериментировать нужно.
2
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 20:47  [ТС] 19
ninja2, спасибо огромное!!
0
17.08.2013, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2013, 20:47
Помогаю со студенческими работами здесь

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

Поменять местами третье и первое слова
Всем привет! Никак не могу решить задачу: Составить программу на Паскале, которая поменяет местами...

Поменять местами первое и третье слова в тексте
Составить программу на Паскале, которая поменяет местами первое и третье слова в предложенном...

Поменять местами первое и второе слова,третье и четвертое и т.д.
дано предложение. Поменять местами первое и второе слова,третье и четвертое и т.д.Если количество...


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

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

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