С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157

Вектор, состоящий из слов строки в том порядке, в каком они были записаны в исходной строке

19.12.2013, 16:11. Показов 6768. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу советов как работать со строками и вектором.

1) Написать функцию, которая принимает строку и возвращает вектор, состоящий из слов строки в том порядке, в каком они были записаны в исходной строке.

Не могу понять как присвоить вектору строку.


Написать функцию, принимающую вектор и слово. Функция должна возвращать номер позиции (не индекс!!!), на которой расположен элемент вектора, содержащий указанное слово (например, слово «вол» содержится в словах «вол», «невольно», «волк» и «символы») или ноль – при его отсутствии. Если таких элементов несколько – сообщить позицию первого из них.

И не совсем понимаю как сделать возвращение позиции? т.е. это свое рода сортировка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2013, 16:11
Ответы с готовыми решениями:

Считать элементы в том порядке в котором были записаны в HashSet
Привет всем. Подскажите можно ли считать элементы в том порядке в котором были записаны в HashSet? Даже если это очень долгий способ. Если...

CoreData: данные выводятся не в том порядке, в котором они были сохранены
Здравствуйте! Недавно в iOS, пытаюсь разобраться с coredata, вопрос в том, что, сохраняю данные в coredata и когда делаю fetch и вывожу в...

Вывести уникальные символы в том порядке в котором они были ведены первоначально
Задание, при вводе символьной строки, вывести на экран веденную строку и вывести уникальные символы в том порядке в котором они были...

12
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
19.12.2013, 21:47
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Не могу понять как присвоить вектору строку.
Тут, ИМХО, лучше класс string использовать, для выделения подстроки использовать метод substr, для поиска подстроки или использовать метод find_first_of, или ручками перебирать всю строку. Для добавления элемента в вектор у последнего есть метод push_back.

Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
номер позиции (не индекс!!!)
В данном случае, мне кажется, это одно и тоже.
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
22.12.2013, 21:39  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Тут, ИМХО, лучше класс string использовать, для выделения подстроки использовать метод substr, для поиска подстроки или использовать метод find_first_of, или ручками перебирать всю строку. Для добавления элемента в вектор у последнего есть метод push_back.


В данном случае, мне кажется, это одно и тоже.
Спасибо за совет. На днях попробую воплотить все, если будут вопросы напишу.
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
25.12.2013, 23:00  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Тут, ИМХО, лучше класс string использовать, для выделения подстроки использовать метод substr, для поиска подстроки или использовать метод find_first_of, или ручками перебирать всю строку. Для добавления элемента в вектор у последнего есть метод push_back.


В данном случае, мне кажется, это одно и тоже.
Доброй ночи! ЧТо-то пытаюсь сделать, но пока не особо получается.

Буду рад за помощь и хорошие советы. Я прочитал немного немало литературы про векторы, ввод-вывод, структуры, а так же классы стринг. Но пока еще не вникаю в суть.
ВОт что я смог сделать пока что, читая и смотря на примеры:
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
#include <iostream>
#include <ostream>
#include <string>
#include <math.h>
#include <windows.h> 
#include <vector> 
#include <iterator>
#include <algorithm>
#include <conio.h>
using namespace std;
 
class String //класс стринг
{      
private:
char *str; 
 int _size;
public:
// Конструктор
String (char *s1 = "\0") 
    {           
        str = new char [strlen(s1)+1];   
        strcpy(str,s1);          
    }
// Деструктор
~ String () 
{delete str; }
//Печать
void Print(char *s1)
{cout<<str;}
void Set ()//заполнение строки
    {
        const int MAX = 80;  //ограничение символа              
        cout<<"Введите строку:"<<endl;
        char str2[MAX]; //строка с макс эл
        cin.get(str2,MAX);
        system("cls");
        cout<<" "<< endl;
        cout<<" Строка заполнена: "<<str2<<"\n"<<"\n"<<" Кол-во символов: "<<strlen(str2)<<endl;
        
    }
};
 
void vec(string s) //попытки взять строку а получить вектор
{
      typedef string::const_iterator iter;
   for( iter i = s.begin();i!=s.end();i++);
  vector<string> v1;
  v1.push_back(s);
   
    return ;
}
 
void show_vector( vector<string>v1) //вывод вектора
{
    vector<string>::iterator it; //Объявляем итератор
   for (it=v1.begin();it!=v1.end();it++) cout<<*it<<" "; //с помощью итератора выводим элементы вектора на экран
   
   cout<<endl;
   return;
    }
int main()
{ 
SetConsoleCP(1251);
SetConsoleOutputCP(1251); //для ввода и вывода русских слов. другого способа не нашел.
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
    cout<<" Задание по варианту:"<< endl;
    cout<<" "<< endl;
    cout<<" Занести в новый вектор слова, в которых гласных и согласных поровну. "<< endl;
    cout<<" "<< endl;
    cout<<" "<< endl;
String s1; //создали строку
s1.Set(); //заполнение строки
vec(s1);//пытаюсь понять как дать заполненную строку, а получить заполненный вектор
 
cout<<" "<<endl;
        
getch();
system("PAUSE"); 
return 0;
}

Т.е. по заданию я делаю следующее:
1) Получаю с клавиатуры строку с пробелами.
2)Вывожу строку и считаю кол-во символов.
3)написать функцию, которая принимает строку и возвращает вектор, состоящий из слов строки в том порядке, в каком они были записаны в исходной строке.
4) функцию для вывода вектора есть.
5) Написать функцию, принимающую вектор и слово. Функция должна возвращать номер позиции (не индекс!!!), на которой расположен элемент вектора, содержащий указанное слово (например, слово «вол» содержится в словах «вол», «невольно», «волк» и «символы») или ноль – при его отсутствии. Если таких элементов несколько – сообщить позицию первого из них. вот это не понимаю, зачем это задание. Типо поиска тоже.
6) т.к. по заданию я должен Занести в новый вектор слова, в которых гласных и согласных поровну.
7) Вывести полученный вектор на экран и сообщить количество элементов в нём.

критерии:
Кликните здесь для просмотра всего текста
Объявлены и определены функции
 Функция, принимающая в качестве параметра «нормальную» строку с пробелами и возвращающая вектор из слов
 Функция, принимающая в качестве параметра произвольную строку и приводящую её к «нормальному» виду
 Функция, принимающая в качестве параметра вектор и выводящая его на экран.
 Функция, принимающая в качестве параметра вектор и слово, возвращающая порядковый номер элемента вектора при условии, что слово присутствует в качестве подстроки в данном элементе вектора и ноль – в противном случае
 Логическая функция, принимающая в качестве параметра строку (одну или несколько, а также, возможно, символ) и возвращающую значение «истина» в соответствии с заданием варианта
 Функция, принимающая в качестве параметра исходный вектор, подлежащий обработке и возвращающая вектор, состоящий слов, отвечающих некоторому условию
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
26.12.2013, 21:18
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
void vec(string s) //попытки взять строку а получить вектор
{
* * * typedef string::const_iterator iter;
* *for( iter i = s.begin();i!=s.end();i++);
* vector<string> v1;
* v1.push_back(s);
return ;
}
Не проверял, но приблизительно так. Функция исходит из расчета, что слова разделены одним пробелом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
vector<string> StrToWords(string str)
{
   vector<string> vec;
   std::size_t fBeg = 0;
   std::size_t fEnd = str.find_first_of(' ');
   while (fEnd != std::string::npos)
   {
      vec.push_back(str.substr(fBeg, fEnd-1);
      fBeg = fEnd+1;
      fEnd = str.find_first_of(' ', fEnd+1);
   }
   return vec;
}
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
12.01.2014, 15:45  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Не проверял, но приблизительно так.
Благодарю, с этим разобрался.
Но не пойму как реализовать:
Кликните здесь для просмотра всего текста
Написать функцию, принимающую вектор и слово. Функция должна возвращать номер позиции (не индекс!!!), на которой расположен элемент вектора, содержащий указанное слово (например, слово «вол» содержится в словах «вол», «невольно», «волк» и «символы») или ноль – при его отсутствии. Если таких элементов несколько – сообщить позицию первого из них.


Пытался найти через find не получается.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2014, 17:00
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
 
typedef std::vector<std::string> v_str;
 
v_str makeWords(const std::string &str)
{
    typedef std::istream_iterator<std::string> input_str;
    v_str result;
    std::istringstream ist(str);
    std::copy(input_str(ist), input_str(), std::back_inserter(result));
 
    return result;
}
 
int countNumber(const v_str& words, const std::string& word)
{
    v_str::const_iterator pos = std::find(words.begin(), words.end(), word);
    return pos == words.end() ? -1 : std::distance(words.begin(), pos) + 1;
}
 
 
int main()
{
    std::string str, key;
    std::cout << "Enter string: ";
    std::getline(std::cin, str);
    std::cout << "Enter word to search: ";
    std::cin >> key;
 
    const v_str& words = makeWords(str);
    int pos = countNumber(words, key);
    if (pos == -1)
        std::cout << "No such word in string" << std::endl;
    else
        std::cout << "Word finded in number " << pos << std::endl;
}
Добавлено через 49 минут
Только у меня ищет точное соответствие, необходимо использовать find_if и написать свой предикат
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
12.01.2014, 20:30  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
3
4
5
int countNumber(const v_str& words, const std::string& word)
{
    v_str::const_iterator pos = std::find(words.begin(), words.end(), word);
    return pos == words.end() ? -1 : std::distance(words.begin(), pos) + 1;
}
Добавлено через 49 минут
Только у меня ищет точное соответствие, необходимо использовать find_if и написать свой предикат
Спасибо за ответ.
Твой пример работает, насчет find_if я понял и пробовал его использовать до этого. Не понимаю как его реализовать. Читал литературу, видел простейшие примеры и набивал их смотрел.
Но толку не вижу...

Пробовал изменить чуть-чуть допустим твой код:

C++
1
2
//к примеру что-то типо
   v_str::const_iterator it = std::find_if (words.begin(), words.end(), word)
тогда сразу выходят ошибки:
Кликните здесь для просмотра всего текста
Error 4 error C2064: term does not evaluate to a function taking 1 arguments c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 83

и ссылается на предикат...
C++
1
2
3
4
5
6
7
8
9
10
    // TEMPLATE FUNCTION find_if
template<class _InIt,
    class _Pr> inline
    _InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {   // find first satisfying _Pred
    for (; _First != _Last; ++_First)
        if (_Pred(*_First)) //сюда...
            break;
    return (_First);
    }



Смотрел на такие примеры как:

1)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
find_if(names.begin(),names.end(), [SearchName](const std::string& s)->bool
 {
     if (s.size() != SearchName.size()) return false;
     std::string comp = SearchName;
     for (unsigned i = 0; i<s.size(); ++i)
     {
         if (toupper(s[i]) != toupper(comp[i])) return false;
     }
     return true;
 });

2)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
template <typename T>
Iter ComputerModel<T>::Find(Iter begin, Iter end, bool comparer)
{
   it = find_if(begin, end, comparer);
   return it;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2014, 20:38
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
 
typedef std::vector<std::string> v_str;
 
struct isIn
{
    isIn(const std::string &s) : str(s) {}
    bool operator()(const std::string &s)
    {
        return s.find(str) != std::string::npos;
    }
 
    std::string str;
};
 
v_str makeWords(const std::string &str)
{
    typedef std::istream_iterator<std::string> input_str;
    v_str result;
    std::istringstream ist(str);
    std::copy(input_str(ist), input_str(), std::back_inserter(result));
 
    return result;
}
 
int countNumber(const v_str& words, const std::string& word)
{
    v_str::const_iterator pos = std::find_if(words.begin(), words.end(), isIn(word));
    return pos == words.end() ? -1 : std::distance(words.begin(), pos) + 1;
}
 
 
int main()
{
    std::string str, key;
    std::cout << "Enter string: ";
    std::getline(std::cin, str);
    std::cout << "Enter word to search: ";
    std::cin >> key;
 
    const v_str& words = makeWords(str);
    int pos = countNumber(words, key);
    if (pos == -1)
        std::cout << "No such word in string" << std::endl;
    else
        std::cout << "Word finded in number " << pos << std::endl;
}
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
12.01.2014, 20:49  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
[CPP]#include <algorithm>
Да, невнимательность моя))
С предикатом, только только начал о нем размышлять. И понял в чем моя проблема.
Ты развеял мои запутанные мысли.
Спасибо, что помогаете и не забиваете на людей которым дается данное дело нелегко.
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
27.01.2014, 23:11  [ТС]
В свободное время немного разобрался, но все же не получается последнее задание.

Занести в новый вектор слова, в которых гласных и согласных поровну.
Написать функцию (при необходимости функций может быть несколько) для обработки вектора в соответствии с заданием.

т.е. Нужно сравнивать буквы слов в векторе с переменными содержащие согласные и гласные буквы.
Если в слове есть гласная, то в переменной N+1 и так до конца вектора плюсуется в перемененную N.
Если в слове есть согласная, то в переменной M+1 и так до конца вектора плюсуется в перемененную M.
После M и N сравнивают и если букв поровну, слово вставляем\копируем в новый вектор, и так каждое слово в векторе.
Пытался что-то сделать из примера ниже, взятого из темы:
Строки. Сравнить количество гласных и согласных
Но ничего не вышло, не знаю куда дальше двигаться, что применить?!

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
tring sort (v_str Vec)
{
int i=0, j=0;
  char key[] ="ауоыиэяюёе";
  char sog[]="бвгджзйклмнпрстфхцчшщ";
 
   for (int k=0; k<=strlen(str); k++)
    str[k]=tolower(str[k]);
 
  char *pch = strpbrk (str, key);
  char *qch = strpbrk (str, sog);                          // первый поиск
 
  while (qch!= NULL)                                       // пока есть согласные буквы в строке
  {                                                         
    qch = strpbrk (qch+1,sog);                             // поиск cогласных букв
    i++;                                                    
  }
 
  while (pch!= NULL)                                       // пока есть гласные буквы в строке
  {                                                         
    pch = strpbrk (pch+1,key);                             // поиск гласных букв
    j++;                                                    
  }
   if (i == j)
        cout << "Гласных и согласных поровну\n";
    else
        cout << (j < i ? "Согласных" : "Гласных") << " больше\n"; 
 
return str;
}
Хелп...
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
28.01.2014, 21:33
На использовании чего в своих лабах Вы остановились? Сишные чаровские строки или класс String?
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Если в слове есть гласная, то в переменной N+1 и так до конца вектора плюсуется в перемененную N.
Если в слове есть согласная, то в переменной M+1 и так до конца вектора плюсуется в перемененную M.
После M и N сравнивают и если букв поровну, слово вставляем\копируем в новый вектор,
Тут достаточно одной переменной, для каждого нового слова обнуляем счетчик, перебираем все буквы в слове, если гласная прибавляем к счетчику один, если согласная вычитаем из счетчика один. В конце если счетчик равняется нулю, значит гласных и согласных поровну.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.01.2014, 21:37
о_О_Кто_здесь, смотрите примеры здесь:
Строки. Сравнить количество гласных и согласных
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2014, 21:37
Помогаю со студенческими работами здесь

Используя стек создать другой файл в котором строки были бы записаны в обратном порядке
создать текстовый файл содержащий некоторую информацию . Используя стек создать другой файл в котором строки были бы записаны в обратном...

Используя стек создать другой файл в котором строки были бы записаны в обратном порядке
создать текстовый файл содержащий некоторую информацию . Используя стек создать другой файл в котором строки были бы записаны в обратном...

Из заданной символьной строки выбрать те символы ,которык встречаются в ней только один раз,в том порядке, в котором они встречаются в тексте и в том
Из заданной символьной строки выбрать те символы ,которык встречаются в ней только один раз,в том порядке, в котором они встречаются в...

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

Перестроить строки матрицы так, чтобы они были расположены по возрастанию в лексикографическом порядке
Дана матрица А из целых чисел размером MxN. Перестроить строки матрицы так, чтобы они были расположены по возрастанию в лексикографическом...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru