С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
#1

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

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

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

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

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


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

И не совсем понимаю как сделать возвращение позиции? т.е. это свое рода сортировка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 16:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вектор, состоящий из слов строки в том порядке, в каком они были записаны в исходной строке (C++):

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

Сформировать строку из слов исходной строки в порядке уменьшения количества символов в слове - C++
Всем привет. Всем неравнодушным прошу, помочь. Сделать блок-схему, согласно по данному коду. #include <stdio.h> #include <conio.h> ...

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

Напишите номера людей в том порядке, в котором они будут пить - C++
Задано количество людей у фонтанчика и их возрасты.Люди пронумерованы от 1 до N. Сначала задается возраст человека с номером 1, затем 2, и...

Считалка: вывести номера детей в том порядке, в котором они изымаются из круга - C++
N детей располагаются по кругу. Каждый из них имеет свой порядковый номер. Начав отсчет от первого, изымают каждого К-го, сужая круг после...

Дана строка из 20 слов. Сформировать строку, составленную из последних букв всех слов исходной строки - C++
Задача: дана строка из 20 слов (или любого другого числа). Сформировать строку, составленную из последних букв всех слов исходной строки.

12
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
19.12.2013, 21:47 #2
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Не могу понять как присвоить вектору строку.
Тут, ИМХО, лучше класс string использовать, для выделения подстроки использовать метод substr, для поиска подстроки или использовать метод find_first_of, или ручками перебирать всю строку. Для добавления элемента в вектор у последнего есть метод push_back.

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


В данном случае, мне кажется, это одно и тоже.
Спасибо за совет. На днях попробую воплотить все, если будут вопросы напишу.
0
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
25.12.2013, 23:00  [ТС] #4
Цитата Сообщение от 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
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
26.12.2013, 21:18 #5
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
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
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
12.01.2014, 15:45  [ТС] #6
Цитата Сообщение от kazak Посмотреть сообщение
Не проверял, но приблизительно так.
Благодарю, с этим разобрался.
Но не пойму как реализовать:
Кликните здесь для просмотра всего текста
Написать функцию, принимающую вектор и слово. Функция должна возвращать номер позиции (не индекс!!!), на которой расположен элемент вектора, содержащий указанное слово (например, слово «вол» содержится в словах «вол», «невольно», «волк» и «символы») или ноль – при его отсутствии. Если таких элементов несколько – сообщить позицию первого из них.


Пытался найти через find не получается.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
12.01.2014, 17:00 #7
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
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
12.01.2014, 20:30  [ТС] #8
Цитата Сообщение от 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
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
12.01.2014, 20:38 #9
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
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
12.01.2014, 20:49  [ТС] #10
Цитата Сообщение от MrGluck Посмотреть сообщение
[CPP]#include <algorithm>
Да, невнимательность моя))
С предикатом, только только начал о нем размышлять. И понял в чем моя проблема.
Ты развеял мои запутанные мысли.
Спасибо, что помогаете и не забиваете на людей которым дается данное дело нелегко.
0
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
27.01.2014, 23:11  [ТС] #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
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
28.01.2014, 21:33 #12
На использовании чего в своих лабах Вы остановились? Сишные чаровские строки или класс String?
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Если в слове есть гласная, то в переменной N+1 и так до конца вектора плюсуется в перемененную N.
Если в слове есть согласная, то в переменной M+1 и так до конца вектора плюсуется в перемененную M.
После M и N сравнивают и если букв поровну, слово вставляем\копируем в новый вектор,
Тут достаточно одной переменной, для каждого нового слова обнуляем счетчик, перебираем все буквы в слове, если гласная прибавляем к счетчику один, если согласная вычитаем из счетчика один. В конце если счетчик равняется нулю, значит гласных и согласных поровну.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
28.01.2014, 21:37 #13
о_О_Кто_здесь, смотрите примеры здесь:
Строки. Сравнить количество гласных и согласных
1
28.01.2014, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 21:37
Привет! Вот еще темы с ответами:

Упорядочить символы в исходной строке в алфавитном порядке - C++
Написать программу, которая: -получает из стандартного потока ввода фамилию студента; -упорядочивает символы в исходной строке в...

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

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

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


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

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

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