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

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

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

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

18.09.2013, 02:23. Просмотров 407. Ответов 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]<<" ";
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 02:23     Подсчитать количество значений
Посмотрите здесь:

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

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

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

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

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

Дан текст, в котором слова разделены одним пробелом. а) Подсчитать количество слов в данной строке. б) Подсчитать количество букв а в последнем слове - 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
1429 / 766 / 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
1429 / 766 / 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++
Ввести строку А с клавиатуры, содержащую арифметическое выражение. Подсчитать количество используемых цифр и букв. Заменить операцию &quot;+&quot; на...

Подсчитать среднее геометрическое трех значений - C++
начал изучение с++ довольно недавно вот стоит задача написать ф-ию, которая выводит ср геом 3 значений (типа float) float sr_geom(float...

Дана матрица целых чисел. Подсчитать количество элементов, предшествующих максимуму и количество элементов, следующих за минимумом - C++
#include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; //#include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main() { int i,j; srand(7); const...

Строки. Подсчитать количество заглавных букв в тексте; вывести на экран слова, имеющие наименьшее количество букв... (подправить) - 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     Подсчитать количество значений
Ответ Создать тему
Опции темы

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