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

Вывести слова в обратном порядке - C++

Восстановить пароль Регистрация
 
Neotwalker
21 / 1 / 0
Регистрация: 22.12.2013
Сообщений: 132
23.07.2014, 19:29     Вывести слова в обратном порядке #1
Всем известно, что у каждого важного общественного деятеля есть собственный спичрайтер – существо, помогающее подготовить публичную речь, сделать ее более выразительной и интересной. Глава Ордена джедаев магистр Йода не исключение.
На первый взгляд может показаться, что спичрайтеру Йоды приходится тяжелее других: все-таки речь магистра своеобразна и ее изучение требует серьезных усилий. На самом деле все несколько проще. Спичрайтеру Йоды достаточно сначала придумать речь для обычного человека, после чего поменять порядок слов в каждом предложении на обратный. В силу того, что алгоритм преобразования обычной речи в речь магистра Йоды достаточно однообразен, спичрайтер решил автоматизировать этот процесс и попросил вас написать программу, которая будет преобразовывать речь, составленную им для обычного человека в речь для Йоды.
В единственной строке входного файла задана речь, составленная спичрайтером. Речь состоит из предложений, отделенных друг от друга точками (точка ставится сразу после последнего слова в предложении).
Каждое предложение состоит из слов. Предложение содержит по крайней мере одно слово. Соседние слова разделены ровно одним пробелом. Слово – непустая последовательность строчных латинских букв. Строка не содержит лишних пробелов. Гарантируется, что строка не пуста и ее длина не превосходит 20000 символов.
В одной строке выведите преобразованную для Йоды речь в соответствии с форматом входных данных. Следует строго соблюдать формат вывода речи, описанный во входных данных.

Пример ввода

you should solve this problem. its easy.

Пример вывода

problem this solve should you. easy its.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
23.07.2014, 20:09     Вывести слова в обратном порядке #2
Neotwalker, ну ок, давайте решать? Можно сделать как? В цикле отделяете слова, дописываете в начало строки. Затем прибавляете полученную строку в конечному тексту

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
string inverseText(const string &original)
{
    string result = "", line = "", buff = "";
    int count = original.length();
    for (int i = 0; i < count; ++i)
    {
        if (original[i] == ' ')
        {
            line = (line == "" ? buff : buff + " " + line);
            buff = "";
        }
        else if (original[i] == '.')
        {
            line = (line == "" ? buff : buff + " " + line);
            buff = "";
            result += line + ". ";
            line = "";
        }
        else buff += original[i];
    }
    return result;
}
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
23.07.2014, 20:14     Вывести слова в обратном порядке #3
Результат:
Вывести слова в обратном порядке

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
 
using namespace std;
 
class StringUtils {
public:
 
    //Разделяет содержимое вектора разделителями
    static vector<vector<string>> split(vector<string> data, string delimiters) {
        vector<vector<string>> result;
        for (int i = 0; i < data.size(); i++) {
            result.push_back(split(data[i], delimiters));
        }
        return result;
    }
 
    //Разделяет строку на части разделителями (delimiters)
    static vector<string> split(string values, string delimiters) {
        vector<string> parts;
 
        string::size_type lastPos = values.find_first_not_of(delimiters, 0);
        string::size_type pos = values.find_first_of(delimiters, lastPos);
        while (string::npos != pos || string::npos != lastPos) {
            parts.push_back(values.substr(lastPos, pos - lastPos));
            lastPos = values.find_first_not_of(delimiters, pos);
            pos = values.find_first_of(delimiters, lastPos);
        }
 
        return parts;
    }
 
    //Объединяет вектор в строку с разделителем 
    static string combine(vector<string> data, string delimiter) {
        string result = "";
        for (int i = 0; i < data.size(); i++) {
            result += data[i] + ((i < data.size() - 1) ? delimiter : "");
        }
        return result;
    }
 
    //Объединяет содержимое вектора в в строки
    static vector<string> combine(vector<vector<string>> data, string delimiter) {
        vector<string> result;
        for (int i = 0; i < data.size(); i++) {
            result.push_back(combine(data[i], delimiter));
        }
        return result;
    }
 
    //Главная функция инвертирования текста
    static string inverse(string text) {
        
        //Разбор строки на вектор предложений (а предложения, в свою очередь, векторы слов)
        vector<vector<string>> data = split(split(text, "."), " ");
        
        //Вся магия
        //Перебор каждого предложения
        for (int i = 0; i < data.size(); i++) {
 
            //Перебор каждого слова в предложении до середины
            for (int j = 0; j < data[i].size() / 2; j++) {
                
                //Перестановка слов
                string temp = data[i][j];
                data[i][j] = data[i][data[i].size() - j - 1];
                data[i][data[i].size() - j - 1] = temp;
            }
        }
 
        //Возвращается готовая строка
        return combine(combine(data, " "), ". ") + ".";
    }
};
 
 
void main() {
    cout << StringUtils::inverse("Some text. Inverted. Bla bla. Wow its inverted string. Some some TEXT.");
    _getch();
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.07.2014, 06:53     Вывести слова в обратном порядке #4
немного наркомании)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
 
#include <boost/tokenizer.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/adaptor/reversed.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/range/algorithm_ext/push_back.hpp>
 
 
template<typename Iterator>
struct string_view : boost::iterator_range<Iterator> {
 
   using boost::iterator_range<Iterator>::iterator_range;
   
   void assign(Iterator const b, Iterator const e) {
      *this = {b, e};    
   }
};
 
 
template<typename Sequence, typename Separator, typename OutputIterator>
OutputIterator join_copy(Sequence const& sequence, Separator const& separator, OutputIterator output) {
   auto first      = std::begin(sequence);
   auto const last = std::end(sequence);
   
   if (first != last) {
      output = boost::copy(*first, output);
      
      while (++first != last) {
         output = boost::copy(separator, output);
         output = boost::copy(*first, output);
      }
   }
   
   return output;
}
 
template<typename Container, typename Sequence, typename Separator>
auto join(Sequence const& sequence, Separator const& separator) {
   Container result;
   join_copy(sequence, separator, std::back_inserter(result));
   
   return result;
}
 
template<template<typename, typename...> class Container, typename ...Args, typename Sequence>
auto copy_range(Sequence const& sequence) {
   using sequence_value = typename boost::range_value<Sequence>::type;
   using container_type = Container<sequence_value, Args...>;
    
   return boost::copy_range<container_type>(sequence);    
}
 
 
int main() {
   std::string const text = "you should solve this problem. its easy.";
   
   using separator_type = boost::char_separator<char>;
   using iterator_type  = std::string::const_iterator;
   using value_type     = string_view<iterator_type>;
   using tokenizer_type = boost::tokenizer<separator_type, iterator_type, value_type>;
   
   join_copy(
         tokenizer_type(text, separator_type(".")) | boost::adaptors::transformed(
               [] (auto const sentence) {
                     return join<std::string>(
                           copy_range<std::vector>(tokenizer_type(sentence, separator_type(" "))) | boost::adaptors::reversed
                         , " ") + ".";
               })
       , " "
       , std::ostream_iterator<char>(std::cout));
   std::cout << std::endl;
}
http://coliru.stacked-crooked.com/a/1a16c76e8b999a89
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
24.07.2014, 09:00     Вывести слова в обратном порядке #5
Как-то товарищи у вас все сложно. Позвольте малость подсократить историю:
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
#include <iostream>
#include <string>
#include <fstream>
#include <stack>
int main() {
    system("chcp 1251");
    std::stack<std::string> pul;
    std::string str;
    std::ifstream infile("text.txt");
    while(!infile.fail()) {
        if(!(infile >> str))
            break;
        if(str.find('.') != std::string::npos) {
            std::cout << str.substr(0, str.size() - 1);
            while(!pul.empty()) {
                std::cout << ' ' << pul.top();
                pul.pop();
            }
            std::cout << ". ";
        }
        else
            pul.push(str);
    }
    return 0;
}
W910
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 16
01.07.2015, 16:15     Вывести слова в обратном порядке #6
Можно тоже самое, только с вводом
C
1
gets(str);
?
Yandex
Объявления
01.07.2015, 16:15     Вывести слова в обратном порядке
Ответ Создать тему
Опции темы

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