Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 5.00
makasin773
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 27
#1

Подсчитать, сколько раз в строке встречаются одинаковые слова - C++

21.12.2011, 00:59. Просмотров 4563. Ответов 11
Метки нет (Все метки)

Дана строка символов, состоящая из букв английского алфавита и пробелов. Напишите программу, которая подсчитывает, сколько раз в строке встречаются одинаковые слова (словом будем называть любую последовательность символов за исключением пробелов, слова разделяются одним пробелом)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2011, 00:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчитать, сколько раз в строке встречаются одинаковые слова (C++):

Определить сколько раз слова встречаются в тексте и сколько непосредственно друг за другом. - C++
Дан файл, содержащий текст на русском языке, в котором встречаются некоторые 2 слова. определить сколько раз эти слова встречаются в тексте...

Определить, сколько раз заданные слова встречаются в тексте и сколько из них - непосредственно друг за другом - C++
Не знаю как его делать( П.5.18.Правил Запрещено размещать задания и решения в виде картинок и других файлов с их текстом. ...

Определить, имеются ли в заданном массиве одинаковые числа и сколько раз они встречаются; удалить дубли - C++
2. Дан одномерный массив, заполненный случайными числами. Найти, есть ли одинаковые числа и сколько раз встречаются. уплотнить массив,...

Сформировать строку, в которую попадут только те слова, где одинаковые буквы встречаются более 2 раз - C++
Дан текст состоящий не менее чем из 5 слов,сформировать строку,в которую попадут только те слова где одинаковые буквы встречаются более 2...

Сформировать строку, в которую попадут только те слова, где одинаковые буквы встречаются более двух раз - C++
Ребят помогите сро4но, 2 задачи не полу4аются, буду признателен если поможете!!! 1.Дан текст, состоящий не менее чем из пяти слов....

Определить сколько раз встречаются слова в тексте - C++
Дано файл содержащий текст и некоторые два слова. Определить сколько раз встречаются эти слова в тексте и сколько из них непосредственно...

11
easybudda
Модератор
Эксперт CЭксперт С++
9680 / 5630 / 954
Регистрация: 25.07.2009
Сообщений: 10,807
21.12.2011, 01:11 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <sstream>
#include <map>
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::map<std::string, int> map;
        
        while ( ist >> str )
            map[str]++;
        
        for ( std::map<std::string, int>::const_iterator i = map.begin(); i != map.end(); ++i )
            std::cout << i->first << "\t" << i->second << std::endl;
    }
    
    return 0;
}
1
Bumerang
19 / 19 / 3
Регистрация: 05.12.2008
Сообщений: 158
21.12.2011, 01:31 #3
easybudda, замечательный код. А можно его усовершенствовать, что бы слова с разным регистром букв, но с одинаковым смыслом считались как одна группа?
к примеру используя strlwr(); в процессе подсчёта? Самому, что-то не получилось прилепить
0
easybudda
Модератор
Эксперт CЭксперт С++
9680 / 5630 / 954
Регистрация: 25.07.2009
Сообщений: 10,807
21.12.2011, 01:39 #4
Bumerang, можно. Обратите внимание на объявление класса map:
C++
1
2
template < class Key, class T, class Compare = less<Key>,
           class Allocator = allocator<pair<const Key,T> > > class map;
Нужно написать свой класс-функтор, в котором строки будут сравниваться так, как Вам нужно, и указывать его в шаблоне при объявлении объекта map вместо дефолтного less.
1
makasin773
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 27
21.12.2011, 02:01  [ТС] #5
Чё та в TURBO C не работает кучу ошибок выкидывает!
0
Bumerang
19 / 19 / 3
Регистрация: 05.12.2008
Сообщений: 158
21.12.2011, 02:06 #6
Дело в компиляторе или в "коппирляторе"
Я делал в DEV-C++. Почитайте/Опубликуйте ошибки, может ясней причина будет?
0
easybudda
Модератор
Эксперт CЭксперт С++
9680 / 5630 / 954
Регистрация: 25.07.2009
Сообщений: 10,807
21.12.2011, 02:37 #7
Цитата Сообщение от makasin773 Посмотреть сообщение
Чё та в TURBO C не работает
И не будет. Три варианта: а - качать, устанавливать компилятор С++, выпущенный хтябы в этом веке и поддерживающий библиотеку STL; б - ждать альтруистов, может кто и возьмётся; в - искать на форуме. Точно знаю, что есть - сам когда-то делал, да и было много раз уже...


Цитата Сообщение от Bumerang Посмотреть сообщение
А можно его усовершенствовать, что бы слова с разным регистром букв, но с одинаковым смыслом считались как одна группа?
Кстати, в этом случае логичнее слова в верхний регистр переводить (ну или в нижний, без разницы), а то и работать неправильно будет, и с выводом не всё так гладко...
пример
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
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <map>
 
std::string strtoupper(std::string s){
    for ( std::string::iterator i = s.begin(); i != s.end(); ++i )
        *i = toupper(*i);
    return s;
}
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::map<std::string, int> map;
        
        while ( ist >> str )
            map[strtoupper(str)]++;
        
        for ( std::map<std::string, int>::const_iterator i = map.begin(); i != map.end(); ++i )
            std::cout << i->first << "\t" << i->second << std::endl;
    }
    
    return 0;
}
1
Bumerang
19 / 19 / 3
Регистрация: 05.12.2008
Сообщений: 158
21.12.2011, 03:20 #8
Да, верно в верхний или наоборот. Все Чётко считает...
Тут еще, чисто академический интерес: что нужно применить, что бы Русские слова тоже считались с разными регистрами? ) С одинаковым размером русские считаются хорошо.
0
ProNoooob
74 / 74 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.12.2011, 21:06 #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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
int main()
{
    char string[200];
    char *words[101];
    int i = 0, k = 0, n = 0;
 
    memset(words, 0, 100 * sizeof(void *)); //Обнуляем массив слов.
 
    printf("Enter string\n");
    gets(string);
 
    words[i++] = strtok(string, " ");        // Разделяем строку на слова
    while(words[i++] = strtok(NULL, " "));
 
    for(i = 0; i < 100; i++)
    {
        if(!words[i])                        // Ужасно написано, но оно работает!
            continue;
 
        for(k = i + 1, n = 1; k < 100; k++)
        {
            if(!words[k])
                continue;
 
            if(strcmp(words[i], words[k]) == 0)//Если такое слово уже есть
            {
                n++;                           //То запоминаем этот факт
                words[k] = 0;                  //И вычеркиваем это слово навсегда.
            }
        }
        
        printf("%s - %i\n", words[i], n);      //Печатаем красивый результат
    }
 
    system("pause");                           //можно удалить
 
    return 0;
}
Решение не очень прямое, но работает и выводит хорошо понятные результаты.
^_^
1
makasin773
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 27
27.12.2011, 22:26  [ТС] #10
Цитата Сообщение от ProNoooob Посмотреть сообщение
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
int main()
{
    char string[200];
    char *words[101];
    int i = 0, k = 0, n = 0;
 
    memset(words, 0, 100 * sizeof(void *)); //Обнуляем массив слов.
 
    printf("Enter string\n");
    gets(string);
 
    words[i++] = strtok(string, " ");        // Разделяем строку на слова
    while(words[i++] = strtok(NULL, " "));
 
    for(i = 0; i < 100; i++)
    {
        if(!words[i])                        // Ужасно написано, но оно работает!
            continue;
 
        for(k = i + 1, n = 1; k < 100; k++)
        {
            if(!words[k])
                continue;
 
            if(strcmp(words[i], words[k]) == 0)//Если такое слово уже есть
            {
                n++;                           //То запоминаем этот факт
                words[k] = 0;                  //И вычеркиваем это слово навсегда.
            }
        }
        
        printf("%s - %i\n", words[i], n);      //Печатаем красивый результат
    }
 
    system("pause");                           //можно удалить
 
    return 0;
}
Решение не очень прямое, но работает и выводит хорошо понятные результаты.
^_^

В турбо си ругается на модуль Windows.h

Добавлено через 8 минут
А не модуль закаментил и задержку гетчем сделал всё работает БОльшое спасибо за помощь,ВЫРУЧИЛ!
0
ProNoooob
74 / 74 / 6
Регистрация: 14.10.2009
Сообщений: 121
27.12.2011, 22:33 #11
Цитата Сообщение от makasin773 Посмотреть сообщение
В турбо си ругается на модуль Windows.h
Так сотрите его. И сотрите строчку system("pause");
Такой трюк применяется для того, чтобы консоль сразу не закрывалась и можно было увидеть результат.
0
nexus_one
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 20
30.11.2015, 23:58 #12
Подскажите, пожалуйста, как в приведённом коде указать, чтобы подсчитывало только те слова, которые состоят из одной буквы?
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
int main()
{
    char string[200];
    char *words[101];
    int i = 0, k = 0, n = 0;
 
    memset(words, 0, 100 * sizeof(void *)); //Обнуляем массив слов.
 
    printf("Enter string\n");
    gets(string);
 
    words[i++] = strtok(string, " ");        // Разделяем строку на слова
    while(words[i++] = strtok(NULL, " "));
 
    for(i = 0; i < 100; i++)
    {
        if(!words[i])                        // Ужасно написано, но оно работает!
            continue;
 
        for(k = i + 1, n = 1; k < 100; k++)
        {
            if(!words[k])
                continue;
 
            if(strcmp(words[i], words[k]) == 0)//Если такое слово уже есть
            {
                n++;                           //То запоминаем этот факт
                words[k] = 0;                  //И вычеркиваем это слово навсегда.
            }
        }
        
        printf("%s - %i\n", words[i], n);      //Печатаем красивый результат
    }
 
    system("pause");                           //можно удалить
 
    return 0;
}
0
30.11.2015, 23:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2015, 23:58
Привет! Вот еще темы с ответами:

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

Определить сколько раз в заданной строке встречаются указанные символы - C++
Дана строка символов S. Определить сколько раз в ней встречается символ + и сколько раз символ *. Задачу реализовать двумя способами: с...

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

Ввести строку и слово. Определить и вывести, сколько раз встречаются в строке буквы, перечисленные в слове. - C++
Ввести строку и слово. Определить и вывести, сколько раз встречаются в строке буквы, перечисленные в слове. Заранее спасибо


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

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

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