Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 07.03.2019
Сообщений: 9
1

Задача Словарик

17.08.2019, 21:16. Показов 914. Ответов 7
Метки нет (Все метки)

подскажите как решается эта задача.

Вася любитель пофантазировать. Но с правописанием у него очень трудно. За содержание по контрольному сочинению Васе ставят хорошие оценки, а вот за грамотность не самые удовлетворительные. Получив очередную двойку за грамотность, учитель языка и литературы Василиса Павловна дала мальчику задание. С виду задание весьма простое, но взявшись за него, Вася понял, что придется сидеть над ним очень долго. Но мальчик очень хочет сходить погулять и потому просит Вас помочь ему. А задание было таким: Васе нужно прочитать текст, выписать из него все слова, и посчитать, сколько разных слов встречается в тексте. Еще Василиса Павловна предупредила, что маленькие и большие буквы равносильны (большая 'А' такая же, как и маленькая 'а'), а значит слова разного регистра могут быть одинаковы ('Привет' тоже самое, что и 'привет' или 'пРиВет')

Ввод

На входе находится строка длиной до 1000 знаков - текст, над которым нужно поработать Васе, состоящий из знаков препинания ",.-:!?" , латинских символов и пробелов.

Вывод

Выведите единственное число - количество различных слов, встречающихся в тексте

Пример ввода:


Hello, my friend. How are you? Do you receive my gift?
Пример вывода:

9

--------------------------------------
вот такое решение у меня - но не верное
C++ (Qt)
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
#include <bits/stdc++.h>
using namespace std;
int main ()
{
string s, s2 = "", s3 = "";
int z = 0; // счётчик букв в слове
getline(cin, s);
int k = 1; // счётчик слов в предложении
int n = s.size();
for (int i = 0; i < n; i ++)
 
    if (s [i] == '.' || s [i] == ',' || s [i] == '!' || s [i] == '?' || s [i] == '-' || s [i] == ':' || s [i] == ';')
        s.erase(i, 1); // удаление всех знаков препинания
 
int b = s.size();
for (int i = 0; i < b; i ++)
{
        if (s [i] != ' ')
{
            z ++; // считаю сколько букв в слове
            s2 = s2 + s [i]; // сохраняю это слово
}
        else
{
            k ++; // считаю слово
            for (int i = b - z; i >= 0; i --)
{
            if (s.substr (i, z) == s2) // удаляю слово в предложение
            s.erase (i, z);
}
}
        z = 0;
        s2 = ""; // обнуление
}
cout << k;
return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2019, 21:16
Ответы с готовыми решениями:

Словарик/Тестер
Добрый день! Необходимость параллельного с си изучения и другого языка - английского навела меня...

написать словарик
у меня есть словарик в текст. файле вида ааа ыыы вввввввв надо написать функцию которая...

Словарик на C#
Задали курсовой! Написать русско - англ словарик! Я сделал базу тхт файлах так как базы данных...

Словарик :)
решил я словарик начать составлять на Сайбере О происхождении слова Пацан Альдас Ачюс ...

7
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
17.08.2019, 21:47 2
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
#include <iostream>
#include <string>
#include <regex>
#include <algorithm>
#include <cctype>
#include <set>
#include <sstream>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    str = std::regex_replace(str, std::regex("[,.-:!?]"), "");
    std::transform(
        str.begin(), str.end(), str.begin(),
        [](unsigned char ch) { return std::tolower(ch); }
    );
    std::set<std::string> set;
    std::stringstream ss(str);
    std::string buff;
    while (ss >> buff) {
        set.insert(buff);
    }
    std::cout << set.size();
 
    return 0;
}
1
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,043
17.08.2019, 21:50 3
nena-ya, привет!

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <string>
#include <list>
#include <unordered_set>
#include <algorithm>
#include <iterator>
 
template<typename InIt, typename OutIt>
void split_mod
(
    InIt it_begin_s,
    InIt it_end_s,
    InIt it_begin_seps,
    InIt it_end_seps,
    OutIt it_out
);
 
int main()
{
    std::string seps(" ,.-:!?");
    auto string_down = [](std::string in)
    {
        std::transform(std::begin(in), std::end(in), std::begin(in), ::towlower);
        return in;
    };
 
    std::string line;
    std::getline(std::cin, line);
    std::list<std::string> words;
    split_mod(std::begin(line), std::end(line), std::begin(seps), std::end(seps), std::back_inserter(words));
    std::transform(std::begin(words), std::end(words), std::begin(words), string_down);
    std::unordered_set<std::string> unique_words;
    std::copy(std::begin(words), std::end(words), std::inserter(unique_words, std::end(unique_words)));
    std::cout << unique_words.size() << "\n";
 
    return 0;
}
 
template<typename InIt, typename OutIt>
void split_mod
(
    InIt it_begin_s,
    InIt it_end_s,
    InIt it_begin_seps,
    InIt it_end_seps,
    OutIt it_out
)
{
    if (!is_sorted(it_begin_seps, it_end_seps))
        sort(it_begin_seps, it_end_seps);
    using S = typename std::basic_string<std::iterator_traits<InIt>::value_type>;
    InIt it_old = it_begin_s;
    for (InIt it = it_begin_s; it != it_end_s; ++it)
        if (std::binary_search(it_begin_seps, it_end_seps, *it))
        {
            if (it_old != it)
                * it_out++ = S(it_old, it);
            it_old = it;
            std::advance(it_old, 1u);
        }
    if (it_old != it_end_s)
        * it_out++ = S(it_old, it_end_s);
}
1
1 / 1 / 0
Регистрация: 07.03.2019
Сообщений: 9
17.08.2019, 22:34  [ТС] 4
спасибо большое за решение

спрошу по другому - посоветуйте где почитать про строки. так как их только начала изучать и знаю только те функции, что в моем коде
0
3 / 3 / 0
Регистрация: 25.03.2018
Сообщений: 9
18.08.2019, 02:24 5
Поправил ваш код, разбирайтесь
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
#include <iostream>
#include <string>
#include <cctype> // Ради tolower()
 
using namespace std;
 
int main ()
{
    string s, s2;
    int z = 0; // счётчик букв в слове
    getline(cin, s);
    int k = 1; // счётчик слов в предложении
    int n = s.size();
    for (int i = 0; i < n; i ++)
        if (s [i] == '.' || s [i] == ',' || s [i] == '!' || s [i] == '?' || s [i] == '-' || s [i] == ':' || s [i] == ';')
            s.erase(i--, 1); // удаление всех знаков препинания
                             // декремент на случай встречи с последовательностью знаков препинания
 
    int b = s.size(); //включая симвлоы whitespace
    /* Трансформируем строку в нижний регистр */
    for(int i = 0; i < b; i++)
        s[i] = tolower(s[i]);
    /* Уничтожаем все совпадающие слова в s */
    for (int i = 0; i < b; i ++)
    {
        if (s [i] != ' ')
        {
            z ++; // считаю сколько букв в слове
            s2 = s2 + s[i];
        }
        else
        {
            /* А встречается ли найденное слово еще? */
            for(int j = i; j < b; j++)
            {
                /* Пробегаем по оставшейся части строки s */
                if(s[j] == s2[0]) //Совпадение первой буквы
                {
                    if(j+(z-1) < b && s.substr(j,z) == s2)
                    {
                        if(j+z < b && s[j+z] != ' ')
                            break;
                        s.erase(j,z);
                        b = s.size();
                        j -= z;
                    }
                }
            }
            z = 0;
            s2 = ""; // обнуление
        }
    }
    /* Считаем количество слов */
    for(int i = 0; i < b; i++)
        if(s[i] == ' ' && (i+1 < b && s[i+1] != ' '))
            k++;
    cout << "Answer: " << k;
    return 0;
}
Инфу о строках можно здесь найти
Кликните здесь для просмотра всего текста
http://www.cplusplus.com/reference/string/string/
1
Комп_Оратор)
Эксперт по математике/физике
8719 / 4425 / 598
Регистрация: 04.12.2011
Сообщений: 13,256
Записей в блоге: 16
18.08.2019, 23:46 6
Этот Вася большой затейник.
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
#include<iostream>
#include<string>
#include<set>
#include <algorithm>
 
using namespace std;
struct strCompare
{
    bool operator()(string a, string b)const
    {       
        std::transform(a.begin(), a.end(), a.begin(),
            [](unsigned char c) { return std::tolower(c); });
        std::transform(b.begin(), b.end(), b.begin(),
            [](unsigned char c) { return std::tolower(c); });
        return a < b;
    }
    
};
 
int main()
{
    const char* str = "Position of the first character in the string to be considered in the search.\
        If this is greater than the string length, the function never finds matches.\
        Note: The first character is denoted by a value of 0 (not 1) : A value of 0 means that the entire string is searched.\
        String string sTring stRINg";
 
    string source_str(str), word ;
 
    string delims = " .,?!:\"\n\t<>(){}^&-_+=/\\$%#@*;";//скорректируйте по желанию
 
        set < string, strCompare > words;
        size_t start = 0, fin = 0;
 
        while ((fin = source_str.find_first_of(delims, start)) != string::npos)
        {
            word = source_str.substr(start, fin-start);
            //cout << word << ' ' << word.size() << endl;
            start = fin+1;          
            while (delims.find(source_str[start]) != string::npos)++start;
            words.insert(word);     
        }
 
        cout << "\nfound " << words.size();
    return 0;
}
0
595 / 448 / 264
Регистрация: 24.02.2017
Сообщений: 1,607
19.08.2019, 09:29 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
#include <iostream>
#include <sstream>
#include <cctype>
using namespace std;
 
void f(string s,string word,int &b){
   stringstream t;
   string WORD;
   int c=0;
 
   t<<s;
   while(t>>WORD)
      if(word==WORD)c++;
   if(c>1)b=c--;
}
 
int main() {
 string s="Hello, my friend. How are you? Do you receive my gift?";
 string word;
 stringstream str;
 int i=0,a=0,b=0;
 
  while(s[i]!='\0'){
      if(ispunct(s[i]))
          s[i]=' ';
      s[i++] = tolower(s[i]);
   }
  str<<s;
  while(str>>word){
     a++;
     f(s,word,b);
  }
   cout<<"total words "<<a-b;
 
 system("pause");
 return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4425 / 598
Регистрация: 04.12.2011
Сообщений: 13,256
Записей в блоге: 16
19.08.2019, 09:56 8
Можно отказаться от хранения "верблюжьих" оригиналов, тем более, что их "разногорбые" близнецы всё равно будут потеряны. Тогда ещё проще:
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
#include<iostream>
#include<string>
#include<set>
#include <algorithm>
 
using namespace std;
 
int main()
{
    const char* str = "Position of the first character in the string to be considered in the search.\
        If this is greater than the string length, the function never finds matches.\
        Note: The first character is denoted by a value of 0 (not 1) : A value of 0 means that the entire string is searched.\
        String string sTring stRINg";
 
    string source_str(str), word;
 
    string delims = " .,?!:\"\n\t<>(){}^&-_+=/\\$%#@*;";//скорректируйте по желанию
 
    set < string > words;
    size_t start = 0, fin = 0;
 
    while ((fin = source_str.find_first_of(delims, start)) != string::npos)
    {
        word = source_str.substr(start, fin - start);
        cout << word << ' ' << word.size() << endl;
        start = fin + 1;
        while (delims.find(source_str[start]) != string::npos)++start;
        std::transform(word.begin(), word.end(), word.begin(),
            [](unsigned char c) { return std::tolower(c); });
        words.insert(word);
    }
 
    cout << "\nfound " << words.size();
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2019, 09:56

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Словарик
Составить программу простейшего автоматизированного англо-немецко-русского словаря, данные словаря...

Простой словарик
Помогите с задачей,что я делаю не так.... вот код: a=input(str(&quot;Введи слово &quot;)) if...

Словарик для чайника :)
Большой трям уважаемому сообществу. Дорогие админы раздела, а не сделать ли Вам здесь некий...

Мини-интернет словарик
3.14 — «пи» (применяется для замены слога в матерных выражениях) 14AA41 — (англ. One for All and...


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

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

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