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

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

Войти
Регистрация
Восстановить пароль
 
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
#1

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

18.09.2013, 02:23. Просмотров 422. Ответов 9
Метки нет (Все метки)

Доброго времени суток! Есть задача : вводятся с клавиатуры фамилии 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]<<" ";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 02:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчитать количество значений (C++):

Подсчитать в одномерном массиве количество нулевых значений - C++
Я находил в шапке форума аналогичные задачи, но они не работают....пожалуйста помогите Дан массив А={а1, а2...а20} Нужно ...

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

Подсчитать количество удвоенных нечетных значений элементов массива - C++
Дан массив, подсчитать количество удвоенных нечетных значений элементов данного массива на языке С++

Файл: Найти наибольшее из значений в файле, если их несколько, то подсчитать количество таких элементов - C++
Дан файл F, компоненты которого являются целыми числами. Найти наибольшее из значений, если их несколько, то подсчитать количество таких...

Вводится предложение. Подсчитать количество слов и подсчитать количество букв в самом длинном слове - C++
Неправильно считает количество букв в наибольшем слове. #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; using...

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

9
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
1
AntonChik
1084 / 582 / 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 можно было вообще не заводить
1
nedsi
2 / 2 / 0
Регистрация: 18.09.2013
Сообщений: 65
18.09.2013, 14:43  [ТС] #4
Большое спасибо, но в следующий раз, будьте добры не писать всю программу, а дать подсказку. Мне вже интересно и в моих целях самому написать ее, если это вас на затруднит конечно.
0
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
18.09.2013, 14:48 #5
Отстаньте от массивов, есть другие структуры данных.

C++
1
2
3
std::unordered_map< std::string, int > votes;
...
++votes[ candidateName ];
0
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 ];
без понятия что за структура...
0
DiffEreD
1431 / 768 / 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;
}
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
Где можно почитать про эту структуру на русском?
0
DiffEreD
1431 / 768 / 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;
}
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
19.09.2013, 05:51 #10
Цитата Сообщение от nedsi Посмотреть сообщение
Мне теперь нужно заводит 2 новых масива (int, string) или можно по другому?
вы были на верном пути когда создали class Kandutat, но потом ушли в сторону строкового массива, хотя следовало завести массив Kandutat-ов.
советую все переписать с нуля, но уже грамотно.
либо писать на контейнерах, как советуют.
0
19.09.2013, 05:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 05:51
Привет! Вот еще темы с ответами:

Подсчитать в строке, содержащей арифметическое выражение, количество используемых цифр и букв, заменить "+" на "-", подсчитать количество действий - C++
Ввести строку А с клавиатуры, содержащую арифметическое выражение. Подсчитать количество используемых цифр и букв. Заменить операцию &quot;+&quot; на...

Подсчитать количество всех строк, а потом - количество слов в каждой строке - C++
Программа считает количество строк в файле add.txt выводит на экран и записывает в новый указанный пользователем файл. #include...

Подсчитать количество положительных и отрицательных чисел и количество нулей в массиве - C++
Имеется массив А из N произвольных чисел. Используя, операторы цикла составить программу.Подсчитать количество положительных и...

Работа с строками: подсчитать количество слов, количество букв - C++
Есть текст. Нужно: 1. Посчитать количество слов в тексте. 2. Посчитать количество букв &quot;а&quot; в последнем слове. 3. Найти количество...


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

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

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