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

Замена char на map/set

16.11.2016, 17:35. Показов 864. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Задача была написать программу, которая выводит слово, которое встречается чаще всего (причем КАПСом)
Имеется следующий код:
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
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <cstdio>
 
using namespace std;
 
void mostRecent(char *text, char *word) // функция поиска часто встречающегося слова
{
    int words_counter = 0; // количество слов в тексте
    char *arrayPtr[1000];  //массив указателей на строки, в которых будут храниться слова из текста
    arrayPtr[0] = strtok(text, " "); // нулевому указателю присваеваем первое слово
    // подсчёт количества слов во введённом тексте
    while (arrayPtr[words_counter] != NULL) // пока в тексте есть слова
    {
        words_counter++; // инкремент счётчика слов
        arrayPtr [words_counter] =  strtok(NULL, " "); // очередное слово сохраняем в массиве
    }
    
    bool first_iter = true, // флаг определяющий этап первой итерации
    go = false;
    int max_number1 = 0; // количество слов
    int max_number2 = 0, // количество слов
    max_word = 0,    // индекс самого часто встречающегося слова
    flag = 0;        // флаг, подсчёта двух итераций
    int index1, index2;
    for (int counter1 = 0; counter1 < (words_counter - 1) ; counter1++) // перебор слов, начиная с первого и заканчивая предпоследним
    {
        flag++; // инкремент итераций
        for (int counter2 = counter1 + 1; counter2 < words_counter; counter2++) // перебор слов, начиная со второго и заканчивая предпоследним
        {
            if (strcmp(arrayPtr [counter1], arrayPtr [counter2] ) == 0) // сравниваем два слова
            {
                if ( first_iter) // если первая итерация (то есть сюда заходим один раз)
                {
                    max_number1++; // инкремент переменной, подсчитывающей количество одинаковых слов
                    first_iter = false; // меняем условие оператора if
                    index1 = counter1;
                }
                else
                {
                    max_number2++; // инкремент переменной, подсчитывающей количество одинаковых слов
                    index2 = counter1;
                }
            }
        }
        if (flag == 2 || go) // если прошли две итерации, или поэлементный проход разрешён
        {
            if (max_number1 >= max_number2) // если количество первого слова больше количества второго слова
            {
                max_word = index1; // присваиваем индекс самого часто повторяющегося слова
            }
            else { max_word = index2; max_number1 = max_number2; } // присваиваем индекс самого часто повторяющегося слова и количество появления второго слова присваиваем переменной max_number1
            flag = 0; // обнуляем счётчик итераций
            go = true; // разрешить поэлементный проход
        }
        max_number2 = 0; // обнуляем накопленное количество появления второго слова
    }
    
    strcpy(word, arrayPtr[max_word]); // возвращаем результат поиска самого часто встречающегося слова
}
 
int main()
{
    int buff_size = 1001;// максимальное количество вводимых символов + позиция под '\0'
    char buff_text[buff_size];  // символьный массив, который хранит введённый текст
    char word[100];             // строка, в которй будет храниться искомое слово
    
    mostRecent(gets(buff_text), word); // вызов функции поиска часто встречающегося слова
    for (int counter = 0; counter < strlen(word); counter++)
    {
        word[counter] = toupper(word[counter]); // преобразование символов слова в верхний регистр
    }
    cout << &word << endl;
    return 0;
}
Но вот есть одно но... Нужно использовать map или set.

Examples программы:
Input: Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
Output: BUFFALO

Input: Can you can the can with can?
Output: CAN
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2016, 17:35
Ответы с готовыми решениями:

Tree, set, map etc.
Решил посмотреть реализацию стандартного мап/сет и вспомогательного класса _Tree (кстати, он только...

map/set iterator not dereferencable
map&lt;string,int&gt; optimized(map&lt;string,int&gt;&amp;dict){ map&lt;string,int&gt;::iterator i=dict.begin();...

Map/set!( iterator not dereferencable)
Есть функция,в которой происходит поиск в map по ключу. Если по данному ключу нет значения, то...

Expression:map/set incompatible
Не могу понять почему возникает ошибка дело в том что данный код работает set&lt;int&gt; Multic;...

16
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
16.11.2016, 17:58 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
 
int main()
{
    std::string str = "Can you can the can with can?";
    str.erase(std::remove_if(str.begin(), str.end(), ispunct));
    std::transform(str.begin(), str.end(), str.begin(), toupper);
    std::istringstream ist(str);
    std::map<std::string, int> m1;
    std::map<int, std::string> m2;
    for (std::string word; ist >> word; ++m1[word], m2[m1[word]] = word);
    std::cout << m2.rbegin()->second;
}
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
16.11.2016, 20:50  [ТС] 3
Спасибо, Xcode компилирует, а вот Contester [онлайн проверка решения] выдает Runtime error.
Нельзя ли как-то поправить?

Добавлено через 2 часа 23 минуты
Ребят, у кого если есть другие варианты - помогите, пожалуйста)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 10:57 4
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
выдает Runtime error.
Мб ограничение по памяти не проходит? Если вы проходите онлайн проверку, зачем обязательное требование с map?
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 15:20  [ТС] 5
Таково задание, мне тоже вот интересно)
По памяти проходит, жалуется на это:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 16:03 6
Добавьте вместо 11 строки
C++
1
2
if (str.erase(std::remove_if(str.begin(), str.end(), ispunct)) == str.begin())
    return 0;
Это проверка на случай, если после удаления знаков препинания у нас строка станет пустой.

Добавлено через 1 минуту
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
Таково задание, мне тоже вот интересно)
Озвучьте полный текст задания, мб что-то недопонимаете.
Для онлайн проверки тут скорее подошёл бы вариант с двумя массивами т.к. работал бы быстрее.
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 16:23  [ТС] 7
Та же ошибка
Задание вот:
Написать программу, которая выводит самое частое слово в строке.
Чувствительность к регистру должна отсутствовать (Can & CAN - одно и тоже слово).
Словом считается последовательность букв до пробела.
NOTE. Use <map> or <set>

Examples программы:
Input: Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
Output: BUFFALO

Input: Can you can the can with can?
Output: CAN

Input: What you want to what what?
Output: WHAT
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 16:40 8
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
Задание вот:
И где здесь про map?
Как я понял, знаки препинания могут встречаться только на конце слова?

Добавлено через 31 секунду
Дайте лучше ссылку на этот "проверяльщик", попробую сам в него потыкаться.
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 16:53  [ТС] 9
На счет знаков препинания ничего не могу сказать, там не уточнено, но, думаю, подразумевается, что могут быть где угодно и разделять слова.
NOTE. Use <map> or <set> - вот строка из задания.
Компилятор работает в проверяльщике на основе "Code::Blocks C++98"
К сожалению, аккаунты там выдает университет и без него невозможно проверить задание.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 17:13 10
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
Данный эксепшн возникает при попытке создать строку больше максимального размера.
Вы, наверное, мой код недостаточно адаптировали для решения. Я то подаю строку на вход и использую std::istringstream только потому что мне впадлу каждый раз ручками вводить данные. Вам надо считывать и сразу обрабатывать по словам.
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 17:15  [ТС] 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
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
using namespace std;
int main()
{
    string str;
    cin >> str;
    if(str.length() <= 1000)
    {
        if (str.erase(remove_if(str.begin(), str.end(), ::ispunct)) == str.begin())
            return 0;
        transform(str.begin(), str.end(), str.begin(), ::toupper);
        istringstream ist(str);
        map<string, int> m1;
        map<int,string> m2;
        for (string word; ist >> word; ++m1[word])
        {
            m2[m1[word]] = word;
        }
        cout << m2.rbegin()->second;
    }
    return 0;
}
Вот моя адаптация, опять же только XCode компилирует, все остальные выдают ошибку выше.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 17:23 12
А такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> m1;
    std::map<int, std::string> m2;
    for (std::string word; std::cin >> word; ++m1[word], m2[m1[word]] = word)
    {
        if (ispunct(*word.rbegin()))
            word.erase(word.length()-1);
        std::transform(word.begin(), word.end(), word.begin(), toupper);
    }
    std::cout << m2.rbegin()->second;
}
Добавлено через 1 минуту
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
cin >> str;
У вас так только одно слово считается
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 17:27  [ТС] 13
По последнему варианту Ввод будет бесконечный(
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 17:30 14
Тогда только через std::getline.
Попробуйте вот так, с обработкой уже отдельных слов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    std::map<std::string, int> m1;
    std::map<int, std::string> m2;
    for (std::string word; ist >> word; ++m1[word], m2[m1[word]] = word)
    {
        if (ispunct(*word.rbegin()))
            word.erase(word.length()-1);
        std::transform(word.begin(), word.end(), word.begin(), toupper);
    }
    std::cout << m2.rbegin()->second;
}
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 17:35  [ТС] 15
Огромное спасибо, использовал последний и добавил return 0, все чики-пуки!
От души еще раз!
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 17:39 16
Цитата Сообщение от Sultik_Zaka Посмотреть сообщение
добавил return 0
Это не обязательно, по стандарту итак добавится
3.6.1 Main function
A return statement in main has the effect of leaving the main function (destroying any objects with automatic
storage duration) and calling std::exit with the return value as the argument. If control reaches the end
of main without encountering a return statement, the effect is that of executing
return 0;
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
17.11.2016, 17:40  [ТС] 17
Но не в нашем "проверяльщике"
0
17.11.2016, 17:40
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2016, 17:40
Помогаю со студенческими работами здесь

Expression:map/set incompatible
Подскажите пожалуйста почему происходит ошибка в этом коде: set&lt;int&gt; S;...

Map/set iterators are incompatible
void Delete(int a , int b) { multiset &lt;double&gt; ::iterator First, Last; multiset &lt;double&gt;...

Map/set iterator not dereferencable
Есть два класса, первый: class AnimationManager { public: String currentAim;...

Map/set iterator not dereferencable
Всем доброго времени суток. Суть задания в том, чтобы удалить повторы комбинаций чисел в...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru