Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
1

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

05.06.2013, 23:11. Показов 3374. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ввести строку. Учитывая что строка может содержать слова которые повторяются, вывести в столбец все слова без повторений и количеством использования каждого слова. Регистр букв можно не учитывать если так будет легче написать программу.

Например строка:
Hello, World! This is the test program. Bye World.

Должно вывести:
Hello 1
World 2
This 1
is 1
the 1
test 1
program 1
Bye 1



уже третий день мучаюсь, помогите пожалуйста..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2013, 23:11
Ответы с готовыми решениями:

Напечатать все различные слова и для каждого слова указать количество повторений
Дан текст. Напечатать все различные слова и для каждого слова указать количество повторений....

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

Вывести слова в столбец с указанием длины каждого слова
var s:string; i,k,m:byte; begin writeln('Vvedit PIB : '); readln(s); s:=s+' ';...

Вывести в консоль все слова из текста (без повторений) в алфавитном порядке и с заглавной буквы
object prg1 extends App{ val text = "я узнал что у меня есть огромная семья и тропинка и лесок я...

11
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.06.2013, 23:15 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
 
typedef std::unordered_map<std::string, int> umap;
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    umap m;
    std::string str;
    while(!ifs.eof() && ifs >> str)
        ++m[str];
    for (auto &word : m)
        std::cout << word.first << ' ' << word.second << std::endl;
}
1
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.06.2013, 23:36  [ТС] 3
MrGluck, не работает. vs2010 выдает 6 ошибок...
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.06.2013, 23:45 4
gorus95, выкиньте vs2010
У меня все работает, просто код написан с использованием стандарта С++11 и требует компилятора поновее.

Добавлено через 2 минуты
Замените for-цикл по коллекции на обычный std::for_each и замените обычный ассоциативный массив (unordered_map) на отсортированный (map), иначе доступа к элементу по ключу, а не индексу не получите.

Не по теме:

Эх, в С++ бы ассоциат. массивы из PHP (как элемент ситаксиса)...

0
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.06.2013, 23:46  [ТС] 5
MrGluck, я бы с радостью, но сдавать мне это нужно будет вообще на vs2008.
да и тем более с такого кода я понимаю смысл всего нескольких строк, а мне еще нужно будет объяснить как оно работает..(
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2013, 00:02 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
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <algorithm>
 
typedef std::map<std::string, int> mymap; // создаем синоним для map
 
void foo(const mymap::value_type &vt)
{
    std::cout << vt.first << ' ' << vt.second << std::endl;
}
 
int main()
{
    std::ifstream ifs("input.txt"); // открываем поток для считывания с файла
    if (!ifs) // если создать не удалось - возвращаем ошибку
        return 1;
    mymap m;
    std::string str;
    while(!ifs.eof() && ifs >> str) // пока не конец файла и считали строку
        ++m[str]; // инкремируем её счетчик в множестве m (второе число по ключу str)
    std::for_each(m.begin(), m.end(), foo); // для каждого элемента множества m вызываем функцию foo
}
Добавлено через 22 секунды
http://www.cplusplus.com/reference/map/map/
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
06.06.2013, 00:45 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;
 
int main()
{
    string str="Hello, World! This is the test program. Bye World.";
    cout <<"vvedite ctroky... "<<endl;
    getline(cin,str);
    int pos=0;
    string s;
 
    //удаляем символы ,.! со строки
    s=",.!";
    pos=str.find_first_of(s);
    while(pos!=string::npos)
    {
        str.replace(pos,1,0,'!');
        pos=str.find_first_of(s);
    }
 
    //ищем слова и подсчитываем количество
    int count(0);
    pos=0;
    while(pos!=string::npos)
    {
        count=1;
        int pos2=str.find(' ',pos);
        if(pos2!=string::npos)
        {
            s=str.substr(pos,pos2-pos);
            int p=str.find(s,pos+1);
            while(p!=string::npos)
            {
                str.replace(p,s.length(),0,'1');
                count++;
                p=str.find(s,pos+1);
            }
            cout <<s<<" - "<<count<<endl;
            pos=pos2+1;
        }
        else
        {
            if(pos+1>=str.length())
                break;
            else
            {
                s=str.substr(pos);
                cout <<s<<" - "<<count<<endl;
                break;
            }
        }
    }
 
    return 0;
}
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2013, 00:55 8
Цитата Сообщение от ninja2 Посмотреть сообщение
//удаляем символы ,.! со строки
erase нам не подходит?
0
MrGluck
06.06.2013, 01:21
  #9

Не по теме:

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

2
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
06.06.2013, 12:52  [ТС] 10
ninja2, спасибо большое!

Добавлено через 14 минут
ninja2, можете еще немного объяснить этот кусок кода?
Кликните здесь для просмотра всего текста
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
while(pos != string::npos)
    {
        count = 1;
        int pos2 = str.find(' ', pos);
        if(pos2 != string::npos)
        {
            s = str.substr(pos, pos2-pos);
            int p = str.find(s, pos+1);
            while(p != string::npos)
            {
                str.replace(p, s.length(), 0, '1');
                count++;
                p = str.find(s, pos+1);
            }
            cout << s << " - " << count << endl;
            pos = pos2+1;
        }
        else
        {
            if(pos+1 >= str.length())
                break;
            else
            {
                s = str.substr(pos);
                cout << s << " - " << count << endl;
                break;
            }
        }
    }


Добавлено через 8 минут
если ввести 3 и больше одинаковых слов подряд, оно выводит информацию и зависает в бесконечном цикле...
например, попробуйте ввести
hello hello hello
результат будет
hello - 3
но программа не закончится...
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
06.06.2013, 15:27 11
Отак от будет нормально работать
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>
using std::cout;
using std::endl;
using std::cin;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;
 
int main()
{
    string str="Hello, World! This is the test program. Bye World.";
    cout <<"vvedite ctroky... "<<endl;
    getline(cin,str);
    int pos=0;
    string s;
 
    //удаляем символы ,.! со строки
    s=",.!";
    pos=str.find_first_of(s);
    while(pos!=string::npos)
    {
        str.replace(pos,1,0,'!');
        pos=str.find_first_of(s);
    }
 
    //ищем слова и подсчитываем количество
    int count(0);
    pos=0;
    while(pos!=string::npos)
    {
        count=1;
        int pos2=str.find(' ',pos);
        if(pos2!=string::npos)
        {
            s=str.substr(pos,pos2-pos);
            int p=str.find(s,pos+1);
            while(p!=string::npos)
            {
                str.replace(p,s.length(),0,'1');
                count++;
                if(count==100) break;
                p=str.find(s,pos+1);
            }
            if(count==100) break;
            cout <<s<<" - "<<count<<endl;
            pos=pos2+1;
        }
        else
        {
            if(pos+1>=str.length())
                break;
            else
            {
                s=str.substr(pos);
                cout <<s<<" - "<<count<<endl;
                break;
            }
        }
    }
 
    return 0;
}
Добавлено через 2 минуты
Это так гамнокодец, лучше конечно строку разбить на слова записать в массив, потом подсчитать количество слов и записать в другой массив их количество, затем ужи вывесит. Так лучше б было б.
0
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
06.06.2013, 22:39  [ТС] 12
ninja2, я как раз и пытался так сделать, но потратил кучу времени, и ничего толкового не получилось(
спасибо еще раз, так даже лучше)
0
06.06.2013, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2013, 22:39
Помогаю со студенческими работами здесь

Считать с консоли имя файла и вывести на экран все слова из него без повторений
Помогите, очень срочно! Необходимо считать с командной строки имя файла и вывести на экран все...

Вывести слова текста с количеством повторений в данном тексте
Дан текст. Вывести слова текста с количеством повторений в данном тексте.

Вывести каждое слово из строки с количеством повторений слова в строке
Доброго времени суток.Объясните пожалуйста как работает прога. Ввести строку. Вывести каждое слово...

Программа должна в заданном тексте найти каждое слово и вывести все слова в столбец (слова разделяются разделителями)
Ваша программа должна в заданном тексте найти каждое слово и вывести все слова в столбец (слова...


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

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