Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите решить задачу на строки


Автор: Azadof 1.5.2009, 22:41
Помогите пожалуйста решить задачу на строки с таким условием:

Дана последовательность, содержащая от 1 до 30 слов. Слова разделены одним или несколькими пробелами. За последним словом – точка. Напечатать эту же последовательность слов, но в обратном порядке.

Автор: azesmcar 1.5.2009, 23:07
Код

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <functional>

struct reverse: std::unary_function<std::string, std::string>
{
    std::string operator ()(const std::string& r) {
        std::string c = r;
        std::reverse(c.begin(), c.end());
        return c;
    }
};

int main()
{
    std::string words = "hello my dear world.";
    std::stringstream stream;
    stream << ( words );
    std::transform(
        std::istream_iterator<std::string>(stream),
        std::istream_iterator<std::string>(),
        std::ostream_iterator<std::string>(std::cout, " "),
        reverse()
    );
}

А вообще в центр помощи с таким вопросами

Автор: toxx 1.5.2009, 23:12
блин ступил-_-

Автор: Dmi3ev 1.5.2009, 23:34
Код

//---------------------------------------------------------------------------
#include <iostream.h>
#include <string.h>
#include <stdio.h>
//---------------------------------------------------------------------------
int main()
{
        char s[256];//строка исходная
        char words[30][256];//сюда будем записывать слова
        char *d=" .";//разделители
        int count=0;//количество слов
        cout<<"Enter your string: "<<endl;
        cin.getline(s, 256);//прочитали строку исходную
        char *p;
        p=strtok(s, d);//первое слово
        strcpy(words[count++], p);//записываем первое слово
        while(p=strtok(NULL, d))//остальные слова
                strcpy(words[count++], p);//записываем остальные слова
        for (int i=count-1; i>=0; i--)//в обратном порядке выводим
                cout<<words[i]<<" ";
        cout<<"."<<endl;//точку ставим
        system("PAUSE");
        return 0;
}
//---------------------------------------------------------------------------

Автор: mes 2.5.2009, 10:41
Цитата(Azadof @  1.5.2009,  21:41 Найти цитируемый пост)
Напечатать эту же последовательность слов, но в обратном порядке. 

azesmcar, a задача то - изменить порядок слов, а не инвертировать каждое слово  smile  smile 

Автор: azesmcar 2.5.2009, 10:48
mes

Цитата

Напечатать эту же последовательность слов

Цитата

a задача то - изменить порядок слов

Возможно вы правы, но не сочетается smile 

Автор: stat007 2.5.2009, 11:34
самый оптимальный вариант:

Код

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    cout<<"Enter string: "<<endl;
    getline(cin,s);
    reverse(s.begin(),s.end());
    cout<<s;
    cout<<endl;
    return 0;
}

Автор: mes 2.5.2009, 11:37
Цитата(azesmcar @  2.5.2009,  09:48 Найти цитируемый пост)
Возможно вы правы, но не сочетается smile  

Цитата(Azadof @  1.5.2009,  21:41 Найти цитируемый пост)
эту же последовательность слов, но в обратном порядке

имхо, "в обратном порядке" относится к слову последовательность,
т.е. если последовательность 1;2;3;4;5;6, то она же в обратном порядке будет 6;5;4;3;2;1

но точно сказать, что хотел автор, может лишь автор smile 
напросилась аналогия : лучше гор могут быть только горы...©Высоцкий

Добавлено через 2 минуты и 28 секунд
Цитата(stat007 @  2.5.2009,  10:34 Найти цитируемый пост)
самый оптимальный вариант:

 smile, за одним маленьким исключением, код напечатает инверсированную последовательность букв, а не слов  smile 

Автор: stat007 2.5.2009, 11:53
Цитата

за одним маленьким исключением, код напечатает инверсированную последовательность букв, а не слов

Верно. Просто я понял его так.. smile 

Автор: Dmi3ev 2.5.2009, 13:10
Я думаю, что задача была такая
Допустим строка на входе:
Я пошел гулять.
На выходе:
гулять пошел Я.
Потому как просто перевернуть строку можно с помощью strrev() и скорее всего задача заключалась в изменении порядка слов (при этом сами слова изменять не нужно было)... Хотя автору виднее...
Я решил именно эту задачу... Я так это все понял...

Автор: zim22 2.5.2009, 15:01
Цитата(Dmi3ev @  2.5.2009,  13:10 Найти цитируемый пост)
Я думаю, что задача была такая

я тоже так думаю. 

Я бы её так решил, хотя вариант azesmcar мне больше нравится.
Код

#include <deque>
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>

int main()
{
  std::string string("my very big  and       beatiful  string.");  
  std::istringstream is(string);
  std::deque<std::string> deque;

  std::copy(std::istream_iterator<std::string>(is),
            std::istream_iterator<std::string>(),
            front_inserter(deque));

  std::copy(deque.begin(), 
            deque.end(), 
            std::ostream_iterator<std::string>(std::cout, " "));

    return 0;
}

Автор: Dmi3ev 2.5.2009, 16:10
А я бы ее решил, как решил, хотя все варианты нормальные  smile 

Автор: azesmcar 2.5.2009, 17:53
zim22

А почему не через reverse_iterator?

Код

deque.assign(
        std::istream_iterator<std::string>(is),
        std::istream_iterator<std::string>());

std::copy(deque.rbegin(), deque.rend(), std::ostream_iterator<std::string>(std::cout, " "));


Добавлено через 6 минут и 16 секунд
Ну если нужен ввод с клавиатуры - тут вообще писать нечего smile 
Код

#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>

int main()
{
    std::vector<std::string> data;
    
    data.assign(
        std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>()
    );

    std::copy(
        data.rbegin(), data.rend(),
        std::ostream_iterator<std::string>(std::cout, " ")
    );
}

Автор: zim22 2.5.2009, 21:39
Цитата(azesmcar @  2.5.2009,  17:53 Найти цитируемый пост)
А почему не через reverse_iterator?

не подумал об этом. 

Я не понимаю одного, почему используя функцию assign вектору успешно присваиваются значения из istringstream:
Код

std::string string("my very big  and       beatiful  string.");  
std::istringstream is(string);    

std::vector<std::string> data;
data.assign(std::istream_iterator<std::string>(is),
            std::istream_iterator<std::string>());        


А прямая инициализация в конструкторе вектора не работает... Хотя и там и там передаётся пара итераторов.
Код

std::vector<std::string> data(std::istream_iterator<std::string>(is),
                              std::istream_iterator<std::string>()
                              );


Автор: Azadof 2.5.2009, 21:47
Ребята! Огромное всем спасибо! Имелось ввиду, что только слова переставить : Всем Привет - Привет Всем. Вот так, сори что сразу не предупредил, не знал, что будут разногласия!))))))

Автор: azesmcar 2.5.2009, 22:19
zim22

Цитата

А прямая инициализация в конструкторе вектора не работает... Хотя и там и там передаётся пара итераторов.

аааа smile это очень интересная тема уважаемый.

Потому что вот это
Код

std::vector<std::string> data(std::istream_iterator<std::string>(is), std::istream_iterator<std::string>());

не вызов конструктора класса std::vector, это обявление прототипа функции по имени data, возвращающей std::vector<std::string> и принимающей два параметра типа std::istream_iterator<std::string> с именем формального параметра is и вторую, того же типа но без имени..скобки игнорируются. (подробнее см. в книге Герб Саттер - Решение новых сложных задач на С++).

А заставить работать это безобразие - проще простого. Просто взять в скобки.
Код

    std::vector<std::string> data(
        (std::istream_iterator<std::string>(std::cin)),
        (std::istream_iterator<std::string>()));


Добавлено @ 22:20
Azadof
помечайте тему решенной если вопросов больше нет.

Автор: zim22 2.5.2009, 23:09
Цитата(azesmcar @  2.5.2009,  22:19 Найти цитируемый пост)
это очень интересная тема уважаемый.

супер! очень интересно!  smile 

Автор: azesmcar 2.5.2009, 23:14
zim22

Вообще общее правило - Если что-то может быть интерпретировано как обявление, значит это обявление.
В стандарт добавили это правило для обратной совместимости с С.
 smile

Добавлено @ 23:16
кстати - студия 2008 (насчет ранних версий не уверен) выдает варнинг
Цитата

warning C4930: 'std::vector<_Ty> data(std::istream_iterator<_Ty>,std::istream_iterator<_Ty> (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)

Распространенная ошибка однако smile специально проверку добавили

Автор: bsa 2.5.2009, 23:30
Цитата(azesmcar @ 2.5.2009,  23:14)
Распространенная ошибка однако smile специально проверку добавили

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)