Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Работа со строкой


Автор: stat007 30.10.2009, 21:09
Стоит такая задача:
Прочитайте последовательность слов из потока ввода. Пусть слово Quit будет означать конец ввода. Распечатать слова в порядке их ввода. Исключить одинаковые слова. Отсортирировать строку.

Я попытася выполнить это: "Пусть слово Quit будет означать конец ввода", но помоему не так как надо.
Код

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std; 
int _tmain(int argc, _TCHAR* argv[])
{
    bool stop=false;
    string st="quit";
    cout<<"Enter string: "<<endl;
    do
    {
        getline(cin, st);
        if(st!="quit")
        {
            cout<<"Your entrens: "<<st;
        cout<<endl;
        }
        else
        {
            cout<<"Good Bye!"<<endl;
            stop = true;
        }
    }
    while(stop==false);
    cout<<st<<endl;
    system("pause");
    return 0;
}

Помогите разобраться...... smile 

Автор: 586 31.10.2009, 03:43
Код
#include <iostream>
#include <string>
#include <list>
using namespace std;

list<string> words;

int _tmain(int argc, _TCHAR* argv[])
{
    string strInput;

    while(1)
    {
        cout<<"Enter string: ";
        getline(cin, strInput);
        if(strInput=="quit")
        {
            cout<<"Good Bye!"<<endl;
            break;
        }
        words.push_back(strInput);
    }

    if(words.empty())
        return 0;

    cout << "\nYour words:" << endl;
    for(list<string>::iterator i = words.begin(); i != words.end(); ++i)
        cout << *i << endl;

    words.sort();
    words.unique();

    cout << "\nSorted unique words:" << endl;
    for(list<string>::iterator i = words.begin(); i != words.end(); ++i)
        cout << *i << std::endl;

    system("pause");
    return 0;
}

Автор: zim22 31.10.2009, 09:45
Цитата(586 @  31.10.2009,  02:43 Найти цитируемый пост)
words.unique();

unique не удаляет повторяющиеся слова, а просто перемещает их в конец контейнера.

Автор: Dov 31.10.2009, 13:39
Цитата(586 @  31.10.2009,  02:43 Найти цитируемый пост)
if(strInput=="quit")

Здесь неплохо было бы сделать что-то похожее на это:
Код
if(!stricmp(strInput.c_str(), "quit"))


Цитата(zim22 @  31.10.2009,  08:45 Найти цитируемый пост)
unique не удаляет повторяющиеся слова, а просто перемещает их в конец контейнера.

zim22, ты уверен? Смутные сомнения меня одолевают...  smile 

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

Автор: zim22 31.10.2009, 17:45
Цитата(Dov @  31.10.2009,  12:39 Найти цитируемый пост)
ты уверен? Смутные сомнения меня одолевают...  

если выражаться точнее, то он не удаляет повторяющиеся элементы, а перемещает их в конец последовательности, причём на них можно ссылаться, но значения их не определены.
Цитата

MSDN: The number of elements in the sequence is not changed by the algorithm unique and the elements beyond the end of the modified sequence are dereferenceable but not specified.


Автор: 586 31.10.2009, 20:48
Цитата(zim22 @  31.10.2009,  17:45 Найти цитируемый пост)
если выражаться точнее, то он не удаляет повторяющиеся элементы, а перемещает их в конец последовательности, причём на них можно ссылаться, но значения их не определены.
Цитата
MSDN: The number of elements in the sequence is not changed by the algorithm unique and the elements beyond the end of the modified sequence are dereferenceable but not specified.

Это про std::unique. А вот про std::list::unique :
Цитата(http://msdn.microsoft.com/en-us/library/thhhbacy%28VS.80%29.aspx)
list::unique 

Removes adjacent duplicate elements or adjacent elements that satisfy some other binary predicate from a list.

Автор: Adre 1.11.2009, 08:55
getline читает всю строку, а автору нужны слова.
 Т.е. если через пробел ввести сразу несколько слов, то это будет считаться одним словом.
Либо через char*, либо разбор строки.
Для исключения повторяющихся слов я бы использовал set.


Хотя если нужно еще и сортировать, то можно использовать map, где ключ - слово, а значение - номер (для распечатки последовательности ввода).

Автор: zim22 1.11.2009, 09:07
Цитата(586 @  31.10.2009,  19:48 Найти цитируемый пост)
Это про std::unique. А вот про std::list::unique :

извиняюсь. глаз замылился.

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