Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти количество повторений в массиве? 
:(
    Опции темы
Ascold2015
Дата 24.11.2015, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.10.2015

Репутация: нет
Всего: нет



Доброго времени суток!
Пробую найти количество повторений каждого слова в массиве слов. Нужно вывести количество каждого слова в строке. При этом нужно, чтобы одинаковые слова не повторялись (не проводилось подсчитывание несколько раз). У меня этот код правильно не работает:
Код

void FindRepeat(char** words) {
    int cnt = 0; char* find;
    bool checked =false;
    for (int i = 0; i < Count; i++)
    {
        find = words[i];
        for (int h = i; h > 0; h--)
            if (words[h] == find) {
                checked = true; 
            }

            for (int j = 0; j < Count; j++)
                if (strcmp(find, words[j]) == 0)
                    cnt++;

            if (!checked)
                cout << find << " -> " << cnt << endl;
            
            cnt = 0; checked = false;
        }
    }

http://firepic.org/?v=5.2015-11-24_jvektvsa3tez.jpg
PM MAIL   Вверх
a0730
Дата 25.11.2015, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Используй list и map:

Код

#include <iostream>
#include <list>
#include <map>
#include <string>
using namespace std;
class Problem
{
    public:
        Problem();
        ~Problem();
        void solve(int, char **);
};
Problem::Problem(){}
Problem::~Problem(){}
void Problem::solve(int cnt, char** argv)
{
    map<string, int> wordMap;
    list<string> wordList;
    while( cnt-- )
    {
        string s(*argv++);
        map<string,int>::iterator it = wordMap.find(s);
        if( it != wordMap.end() )
        {
            wordMap[s]++;
        }
        else
        {
            wordList.push_back(s);
            wordMap[s]=1;
        }
    }
    for(list<string>::iterator its = wordList.begin(); its!=wordList.end();its++)
    {
        string s = *its;
        cout << s << " -> " << wordMap[s] << endl;
    }
}
int main(int argc, char **argv)
{
    Problem p;
    p.solve(--argc, ++argv);
}



результат:

Код


$ g++ -o x main.cpp
$ ./x aab aab abc abc abc xyz
aab -> 2
abc -> 3
xyz -> 1



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
math64
Дата 25.11.2015, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно отсортировать массив - после этого повторы будут рядом.
Тогда слова будут напечатаны в алфвитном порядке.
В примере a0730 слова печатаются в порядке появления. Но и у него сортировка в скрытом виде присутствует - при добавлении нового слова в map.
PM   Вверх
volatile
Дата 25.11.2015, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(a0730 @  25.11.2015,  07:37 Найти цитируемый пост)
Используй list и map:

list не нужен.
у map так же есть begin(), end(), и его можно обойти по-порядку.


PM MAIL   Вверх
math64
Дата 25.11.2015, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(volatile @  25.11.2015,  12:25 Найти цитируемый пост)
list не нужен.

list нужен, чтобы сохранить порядок слов.
Цитата(math64 @  25.11.2015,  08:17 Найти цитируемый пост)
В примере a0730 слова печатаются в порядке появления.


PM   Вверх
volatile
Дата 25.11.2015, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(math64 @  25.11.2015,  13:52 Найти цитируемый пост)
list нужен, чтобы сохранить порядок слов.

А где было в задании это условие?
Цитата(Ascold2015 @  24.11.2015,  18:37 Найти цитируемый пост)
Нужно вывести количество каждого слова в строке. При этом нужно, чтобы одинаковые слова не повторялись (не проводилось подсчитывание несколько раз). 



PM MAIL   Вверх
feodorv
Дата 26.11.2015, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Ascold2015 @  24.11.2015,  18:37 Найти цитируемый пост)
У меня этот код правильно не работает


Цитата(Ascold2015 @  24.11.2015,  18:37 Найти цитируемый пост)
        for (int h = i; h > 0; h--)
            if (words[h] == find) {
            if (strcmp(find, words[h-1]) == 0) {
                checked = true;
                break; 
            }



Это сообщение отредактировал(а) feodorv - 26.11.2015, 09:34


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.