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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Neotwalker
21 / 1 / 0
Регистрация: 22.12.2013
Сообщений: 140
#1

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

23.07.2014, 19:29. Просмотров 1423. Ответов 5
Метки нет (Все метки)

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

Пример ввода

you should solve this problem. its easy.

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

problem this solve should you. easy its.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2014, 19:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывести слова в обратном порядке (C++):

Вывести слова в обратном порядке - C++
Привет всем. Я студент, помогите пожалуйста написать программу: дана строка состоящая из 30 слов между словами пробел и запятая вывести на...

Вывести слова в обратном порядке - C++
Здравствуйте, а можете помочь написать программу на С++, оч нужно, пожалуйста)) Задание: Пользователь вводит строку символов, вывести...

Вывести слова в строке в обратном порядке - C++
#include "stdafx.h" #include<iostream> #include<conio.h> #include<string> #include <fstream> using namespace std; int...

Строки, вывести слова в обратном порядке - C++
Подскажите,как вывести слова в обратном порядке? Вот код, что нужно исправить { char str1; char str2=", "; cout<<"Enter...

Вывести слова в строке в обратном порядке - C++
Привет всем. Помогите пожалуйста ! Дана строка состоящая из 30 слов между словами пробел и запятая вывести на экран слова в обратном порядке

Вывести строку, содержащую слова исходной строки, но в обратном порядке - C++
Помогите доработать задачу, пожалуйста. #include <iostream> #include <string> using namespace std; int main() { string...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Хедин
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!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 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
Модератор
Эксперт С++
1809 / 1166 / 226
Регистрация: 16.05.2013
Сообщений: 3,069
Записей в блоге: 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);
?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 16:15
Привет! Вот еще темы с ответами:

Вывести строку, содержащую эти же слова, разделенные одним пробелом и расположенные в обратном порядке - C++
Здравствуйте. можете прокомментировать эту программу? #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

вывести слова - анаграммы из словаря, состоящего из пар слов(при чтении в обратном порядке образуется другое слово) - C++
Ребят, помогите пожалуйста написать прогу на С++=(в задании не было сказано что бы считывало с файла, поэтому, можно все, прямо в проге...

Вывести строку, содержащую эти же слова, но расположенные в обратном порядке. Записать полученную строку в другой файл - C++
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: ...

Слова в обратном порядке (!не палиндром!) - C++
Задача состоит в следующем: определить символьный массив и ввести его с клавиатуры, затем подсчитать колличество символов 'e' (с этим...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.07.2015, 16:15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru