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

Подсчитать количество значений - C++

Восстановить пароль Регистрация
 
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
18.09.2013, 02:23     Подсчитать количество значений #1
Доброго времени суток! Есть задача : вводятся с клавиатуры фамилии N кандидатов, подсчитать, сколько раз была введена каждая фамилия.
Есть массив с этими фамилиями, но я не могу придумать как их подсчитать? Сначала думал создать массив типа int и паралельно считать, но было много проблем с индексацией.
Есть 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
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    class Kandutat
    {
    public:
        string name;
        int golos;
    };
 
    Kandutat A;
    int i=0;
    string mas[100];
    bool t=true;
    while (t)
    {
        cin>>A.name;
        if (A.name!="0") { mas[i]=A.name; i++; }
        if (A.name == "0") t=false;
        
    }
    for (int k=0; k<i; k++)
        for (int j=0; j<i; j++)
        {
            if () // не мог придумать условие
        }
    cout<<i<<endl;
    for (int k=0; k<i; k++)
        cout<<mas[k]<<endl;
    system("pause");
    return 0;
}
и второй вариант (кусок кода, не сохранил полную версию)
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
string mas1[100];
    char pre[100];
    int mas2[20], i=0;
    for (int i =0; i<20; i++)
        mas2[i]=0;
    cout<<"Enter the surname : "<<endl;
    while (strcmp(strcpy( pre,mas1[i].c_str() ),"0")!=0)
     
    {
        cin>>mas1[i];
        i++;
    }
    for (int k=0; k<i;k++)
        for (int j=0; j<i; j++)
        {
            if (strcmp(strcpy( pre,mas1[k].c_str() ),mas1[j].c_str())==0)  // это были попытки что-то подсчиать, не обращайте внимания
            {
                mas2[k]++;
            }
        }
    cout<<endl<<endl;
    for (int k=0; k<i; k++)       
    {
        cout<<mas1[k]<<" ";  
    }
    cout<<endl<<endl;
    for (int k=0; k<i; k++)
        cout<<mas2[k]<<" ";
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 02:23     Подсчитать количество значений
Посмотрите здесь:

C++ В последовательности символов подсчитать количество букв и количество цифр
Подсчитать количество положительных и отрицательных чисел и количество нулей в массиве C++
C++ Файл: Найти наибольшее из значений в файле, если их несколько, то подсчитать количество таких элементов
C++ Подсчитать в строке, содержащей арифметическое выражение, количество используемых цифр и букв, заменить "+" на "-", подсчитать количество действий
C++ Подсчитать в одномерном массиве количество нулевых значений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UranFlex
131 / 129 / 21
Регистрация: 25.05.2013
Сообщений: 233
18.09.2013, 03:55     Подсчитать количество значений #2
Цитата Сообщение от nedsi Посмотреть сообщение
Есть задача : вводятся с клавиатуры фамилии N кандидатов, подсчитать, сколько раз была введена каждая фамилия.
Подойдет для небольшого количества кандидатов так как используется метод поиска в векторе - простой перебор элементов вектора.
Если есть вероятность, что кандидатов тысячи и тысячи, то поиск лучше производить в отсортированном векторе.
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
//============================================================================
// Name        : surname_counter.cpp
// Author      : UranFlex
// Version     : 0.1 alpha
// License     : Free
// Description : вводятся с клавиатуры фамилии N кандидатов, подсчитать, сколько раз была введена каждая фамилия
//               C++, Ansi-style
//============================================================================
 
#include <iostream>
#include <vector>
#include <utility>
 
using namespace std;
// объявляем тип пара, которая содержит фамилию и счетчик ввода - т.е. сколько раз вводили фамилию
typedef pair < string, unsigned > Candidate;
 
// функция для вывода вектора
void PrintResults( const vector < Candidate > &);
 
int main() {
    vector < Candidate > candidate; // вектор, в который будем заносить фамилии кандидатов
 
    // рассказываем пользователю как закончить ввод фамилий
    cout << "Для того чтобы закончить ввод фамилий введите quit" << endl;
 
    while ( true ){ // запускаем бесконечный цикл
        string surname; // буфер для вводимой фамилии
        bool flag = true; // думаем, что будет введена новая фамилия
 
        cout << "Введите фамилию кандидата" << endl;
        getline( cin, surname ); // считываем введенную фамилию
 
        if( surname == "quit" ) // проверяем вдруг ввели quit
            break; // если так, то обрываем бесконечный цикл
 
        // а если ввели не quit, то далее в цикле перебираем все введенные фамилии
        for( vector< Candidate >::iterator it = candidate.begin(); it != candidate.end(); ++it )
            if( it->first == surname ){ // и сравниваем каждую фамилию с той, которую ввели только что
                ++it->second; // если такая фамилия уже вводилась ранее увеличиваем счетчик ввода
                flag = false; // и запоминаем это
                break; // обрываем цикл перебора фамилий
            }
 
        if ( !flag ) // если только что введенная фамилия не является новой, то ее не нужно добавлять в вектор
            continue; // потому возвращаемся в начало бесконечного цикла для ввода еще одной фамилии
 
        // а если только что введенная фамилия - новая, то добавляем ее в вектор.
        candidate.push_back( Candidate( surname, 1 ) );
 
    }
 
    PrintResults( candidate ); // выводим результаты
 
    return 0;
}
 
 
void PrintResults( const vector < Candidate > &vec ){
    for( vector< Candidate >::const_iterator it = vec.begin(); it != vec.end(); ++it )
        cout << it->first << "  " << it->second << endl;
}
Кликните здесь для просмотра всего текста
Для того чтобы закончить ввод фамилий введите quit
Введите фамилию кандидата
Иванов
Введите фамилию кандидата
Петров
Введите фамилию кандидата
Иванов
Введите фамилию кандидата
Петров
Введите фамилию кандидата
Сидоров
Введите фамилию кандидата
Петров
Введите фамилию кандидата
Плюшкин
Введите фамилию кандидата
Кошкин
Введите фамилию кандидата
Петров
Введите фамилию кандидата
quit
Иванов 2
Петров 4
Сидоров 1
Плюшкин 1
Кошкин 1
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
18.09.2013, 07:03     Подсчитать количество значений #3
C++
1
2
3
4
5
    for (int k=0; k<i; k++)
        for (int j=0; j<i; j++)
        {
            if () // не мог придумать условие
        }
замените на
C++
1
2
3
4
5
6
7
8
9
10
11
12
int n;
for (int k=0; k<i; k++)
   if(mas[k]!="")
        {
        cout<<mas[i]<<endl;
        n=0;
        for (int j=k+1; j<i; j++)
           {
            if(mas[k] == mas[j]){n++; mas[j] = "";}
           }
        cout<<n<<endl;        
        }
но тогда class Kandutat можно было вообще не заводить
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
18.09.2013, 14:43  [ТС]     Подсчитать количество значений #4
Большое спасибо, но в следующий раз, будьте добры не писать всю программу, а дать подсказку. Мне вже интересно и в моих целях самому написать ее, если это вас на затруднит конечно.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
18.09.2013, 14:48     Подсчитать количество значений #5
Отстаньте от массивов, есть другие структуры данных.

C++
1
2
3
std::unordered_map< std::string, int > votes;
...
++votes[ candidateName ];
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
18.09.2013, 14:52  [ТС]     Подсчитать количество значений #6
Цитата Сообщение от AntonChik Посмотреть сообщение
C++
1
2
3
4
5
    for (int k=0; k<i; k++)
        for (int j=0; j<i; j++)
        {
            if () // не мог придумать условие
        }
замените на
C++
1
2
3
4
5
6
7
8
9
10
11
12
int n;
for (int k=0; k<i; k++)
   if(mas[k]!="")
        {
        cout<<mas[i]<<endl;
        n=0;
        for (int j=k+1; j<i; j++)
           {
            if(mas[k] == mas[j]){n++; mas[j] = "";}
           }
        cout<<n<<endl;        
        }
но тогда class Kandutat можно было вообще не заводить
Воот, большое спасибо, не пойму почему я сам не догадался. Только вот n должно равнятся 1, так как это же подсчет фамилий, а не индексов которые с 0-я начинаются) Еще вопрос, мне теперь нужно все это отсортировать по упаданию. Мне теперь нужно заводит 2 новых масива (int, string) или можно по другому?

Добавлено через 1 минуту
Цитата Сообщение от Fyret Посмотреть сообщение
Отстаньте от массивов, есть другие структуры данных.

C++
1
2
3
std::unordered_map< std::string, int > votes;
...
++votes[ candidateName ];
без понятия что за структура...
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.09.2013, 15:18     Подсчитать количество значений #7
nedsi, с unordered_map просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <unordered_map>
#include <windows.h>
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   std::string name;
   std::cout << "Введите фамилию кандидата (q для выхода):" << std::endl;
   std::unordered_map<std::string, unsigned int> votes;
 
   while(std::getline(std::cin, name) && name != "q")
      ++votes[name];
 
   for(auto p : votes) std::cout << p.first << ": " << p.second << std::endl;
 
   return 0;
}
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
18.09.2013, 15:26  [ТС]     Подсчитать количество значений #8
Цитата Сообщение от DiffEreD Посмотреть сообщение
nedsi, с unordered_map просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <unordered_map>
#include <windows.h>
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   std::string name;
   std::cout << "Введите фамилию кандидата (q для выхода):" << std::endl;
   std::unordered_map<std::string, unsigned int> votes;
 
   while(std::getline(std::cin, name) && name != "q")
      ++votes[name];
 
   for(auto p : votes) std::cout << p.first << ": " << p.second << std::endl;
 
   return 0;
}
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие "," перед ":" e:\птаро\лаба 1\prog2\prog2\prog2.cpp 18 1 prog2
Ошибка 2 error C3531: p: символ, тип которого содержит спецификатор "auto" должен иметь инициализатор e:\птаро\лаба 1\prog2\prog2\prog2.cpp 18 1 prog2
Где можно почитать про эту структуру на русском?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.09.2013, 15:58     Подсчитать количество значений #9
Эта структура появилась в С++11 стандарте, компилятор должен быть соответствующий. Можете воспользоваться просто map-ом. Описания разных структур можно тут просмотреть: cppreference.com

Добавлено через 11 минут
Вот этот код должен бы скомпилироваться на 10 студии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <windows.h>
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
    std::string name;
    std::cout << "Введите фамилию кандидата (q для выхода):" << std::endl;
    std::map<std::string, unsigned> votes;
 
    while(std::getline(std::cin, name) && name != "q")
        ++votes[name];
 
    for(std::map<std::string, unsigned>::const_iterator it = votes.begin(); it != votes.end(); ++it)
        std::cout << (*it).first << ": " << (*it).second << std::endl;
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 05:51     Подсчитать количество значений
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
19.09.2013, 05:51     Подсчитать количество значений #10
Цитата Сообщение от nedsi Посмотреть сообщение
Мне теперь нужно заводит 2 новых масива (int, string) или можно по другому?
вы были на верном пути когда создали class Kandutat, но потом ушли в сторону строкового массива, хотя следовало завести массив Kandutat-ов.
советую все переписать с нуля, но уже грамотно.
либо писать на контейнерах, как советуют.
Yandex
Объявления
19.09.2013, 05:51     Подсчитать количество значений
Ответ Создать тему
Опции темы

Текущее время: 02:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru