Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

Прочитать последовательность слов из потока ввода.

10.05.2009, 23:58. Показов 2401. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прочитать последовательность слов из потока ввода.Пусть слово Quit будет означать конец ввода.Я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    istream_iterator<string>eos;  // Это лишняя строка?
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.resize(strings_vector.size()+1);
        else break;
        ++my_iterator;
    }
}
Не додумался,как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?Как определить свой страж ввода,отличный от
C++
1
 istream_iterator<string>eos;
?
*Важно* Нужна ли строка
C++
1
 istream_iterator<string>eos;
в этом коде вообще?
P.S.Странно,но по-моему этот код читает в одну строку?...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2009, 23:58
Ответы с готовыми решениями:

Прочитать последовательность слов в список. Если количество слов четно, то тогда создать список из 2-го, 4-го и т.д. слов
Вот условие задачи(В файл занести последовательность слов. Прочитать последовательность слов в...

Clojure Прочитать список CDR-записей из стандартного потока ввода и определить, суммарная длительность всех исходящих
Дана информация о телефонных разговорах сотрудников некоторой компании в виде списка CDR-записей...

VC++6.0, как из порожденного потока прочитать переменную главного потока?
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на...

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

7
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
12.05.2009, 14:53 2
Цитата Сообщение от #pragma Посмотреть сообщение
Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?
Нет.
Цитата Сообщение от #pragma Посмотреть сообщение
*Важно* Нужна ли строка
В твоем коде не нужна.

И не делай каждый раз resize контейнеру. Просто добавляй в конец контейнера строку(push_back).
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
13.05.2009, 23:30  [ТС] 3
Необходимо удалить повторяющиеся элементы и вывести получившуюся последовательность в порядке ввода.Не нашёл подходящего алгоритма в библиотеке.Попробовал сделать через итераторы,но что-то не идёт,получается обращение к несуществующему элементу и Segmentation fault.Как правильно сделать?Не соображаю уже
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
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector[i].erase();
            break;
        }
        ++my_iterator;
    }
    vector<string>::iterator a=strings_vector.begin();
    vector<string>::iterator b=strings_vector.begin()+1;
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (*a==*b) strings_vector.erase(b);
             ++b;
           }
         ++a;
       }
 //   sort(strings_vector.begin(),strings_vector.end());// sort не подходит!
 //   vector<string>::iterator p=unique(strings_vector.begin(),strings_vector.end());
 //   strings_vector.erase(--p,strings_vector.end());
    cout<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
 
}
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
14.05.2009, 09:58 4
Работай либо через итераторы ,либо через индексы...не надо все смешивать.
Замени for на while.
Да и после каждого удаления из контейнера,все итераторы связанные с ним надо инициализировать заново, иначе UB.
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
14.05.2009, 22:59  [ТС] 5
А элементы вектора как вообще сравнивать?
C++
1
strings_vector[i]==strings_vector[j]
Что-то не работает,может,строки не сравниваются и всё удаляется?Я уже итераторы убрал,это должно работать,но нет
C++
1
2
3
4
5
6
7
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (strings_vector[i]==strings_vector[j]) strings_vector[j].erase();
           }
       }
Само по себе использование цикла for не является ошибкой,по крайней мере грубой.В чём ошибка?А функция erase заботится о перемещении(уплотнении) последовательности в памяти после удаления элемента?

Добавлено через 1 час 43 минуты 56 секунд
Ура! Наконец-то дошло,где была ошибка!В цикле я ограничивал индексы элементов i и j размерностью вектора,а она начинается с 1,а не с нуля.Решено!
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
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector.pop_back();
            break;
        }
        ++my_iterator;
    }
   /********************* TEST BEGIN ***********************/
    cout<<"Before modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
    for (unsigned int i=0;i<strings_vector.size()-1;++i)
       {
         for (unsigned int j=strings_vector.size()-1;j>i;--j)
             {
                if (strings_vector.at(i)==strings_vector.at(j))
                   strings_vector.at(j).erase();
             }
       }
   /********************* TEST BEGIN ***********************/
    cout<<"After modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
}
А почему while предпочтительнее?И ещё меня смущает,что размерность вектора не меняется после удаления элементов,образуются "дыры"!
0
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 3
28.03.2013, 21:06 6
Скажите, пожалуйста, а вы какие include использовали в начале своей программы?
А то у меня проблема с vector<string> ...(size). Пишет undeclared identifier
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
30.03.2013, 23:27  [ТС] 7
Ну Вы даёте, теме 4 года ..
Очевидно, нужно написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
   using std::vector;
 
#include <string>
   using std::string;
 
#include <iterator>
   using std::iterator;
 
#include <iostream>
   using std::cout;
   using std::cin;
   using std::endl;
Вроде всё
0
0 / 0 / 1
Регистрация: 16.03.2013
Сообщений: 6
30.03.2013, 23:58 8
Цитата Сообщение от #pragma Посмотреть сообщение
как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.
пробывали использовать функцию get или getline?
0
30.03.2013, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2013, 23:58
Помогаю со студенческими работами здесь

Прочитать все из входного потока
Начал учиться программировать на c#, решая задачки на сайте олимпиадного программирования. Сразу же...

Вводится последовательность натуральных чисел. Признак конца ввода – 0. определить является ли последовательность геометрической прогрессией
Помогите пожалуйста написать программу на языке Паскаль, без использования массива.

Как прочитать данные из потока вывода другого процесса
Как получить то, что выводит командная строка (прочитать выводной поток другого процесса)

Задана последовательность слов. Определить частоту вхождения каждого слова в последовательность.
Доделать программу, чтобы работала как надо Задана последовательность слов. Определить частоту...


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

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

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