2016-07-23 3 views
0

Здравствуйте, я сейчас застрял в проблеме домашних заданий, так как я понятия не имею, как точно подойти к проблеме.Подсчет частоты элементов в массиве

Напишите программу, которая читает в списке целых чисел в массив с базовым типом int. Предоставьте возможность либо считывать этот массив с клавиатуры, либо из файла по выбору пользователя. Если пользователь выбирает ввод файла, программа должна запрашивать имя файла. Вы можете предположить, что в массиве содержится менее 50 записей. Ваша программа определяет количество записей. Вывод должен состоять из двух столбцов. Первый столбец представляет собой список отдельных элементов массива ; второй столбец - это счетчик числа вхождений каждого элемента. Список следует сортировать по записям в первом столбце , от самого большого до наименьшего.

Так что я войду: 1, 2, 1, 10, 15, 12, 2, 10, 10 Программа должна вывести что-то вроде:

Список частот

1 ---- -2

2 ----- 2

10 ---- 3

15 ---- 1

Я могу сортировать числа, но не знаю, как бы я хотел сравнивать числа в массиве.

#include <iostream>//Input/Output Library 
#include <cstdlib> 
#include <iomanip> 
using namespace std;//Namespace of the System Libraries 

//Global Constants 
const int MAX = 10; 

//Function Prototypes 
void input(int array[], int size); 
void sort(int array[],int size); 

int main(int argc, char** argv){ 
    //Declare Variable 
    int array[MAX]; 
    int size = MAX; 

    //Input Data 
    input(array, size); 
    sort(array, size); 

    cout<<"\nSort Frequency\n"; 
    for(int i = 0; i<size; i++){ 
     cout<<array[i]<<endl; 
    } 

    return 0; 
} 

void input(int a[], int size){ 
    cout<<"Enter "<<size<<" numbers for the array: \n"; 
    for(int i=0; i<size; i++){ 
     cin>>a[i]; 
    } 
} 
void sort(int a[],int n){ 
    for(int i=0;i<n-1;i++){ 
     for(int j=i+1;j<n;j++){ 
      if(a[i]>a[j]){ 
       a[i]=a[i]^a[j]; 
       a[j]=a[i]^a[j]; 
       a[i]=a[i]^a[j]; 
      } 
     } 
    } 
} 
+2

Я бы использовал 'std :: map ', а не массив. Для каждого входа наберите счетчик для соответствующей записи карты. Когда закончите с вводом, перечислите карту с помощью 'crbegin', чтобы« crend ​​»iterator и сбросить результаты. Это буквально около 14 строк кода, включая список «# include» и пробелы для чтения. И fyi, * никто * не использует xor-swapping в реальном мире для такой тривиальной задачи. – WhozCraig

+0

Знаете ли вы, какой диапазон номеров? Потому что, если это (например) цифры от 0 до 1000, есть простой ответ: просто используйте https://en.wikipedia.org/wiki/Counting_sort и замените их обратно, распечатав их. Но если это может быть любое число, которое можно сохранить, то это сложнее: вам нужно использовать карту, но карта на самом деле не массив, поэтому она не может быть разрешена. –

ответ

1

Здесь вы идете (:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <map> 

int main() { 
    std::vector<int> v; 
    std::map<int, size_t> counts; 

    std::copy(std::istream_iterator<int>(std::cin), 
       std::istream_iterator<int>(), 
       std::back_inserter(v)); 

    for(const auto &number : v) 
     ++counts[number]; 

    for(const auto &pair : counts) 
     std::cout<<pair.first <<" "<< pair.second<<"\n"; 

    return 0; 
} 

Я думаю, что ваш учитель будет удивлен, если бы вы объяснить ему

+0

Можно также использовать 'std :: count' /' std :: count_if', чтобы получить подсчеты - может быть немного понятнее. http://en.cppreference.com/w/cpp/algorithm/count –

+0

Если вы хотите быть симпатичным, вы можете сэкономить себе 'std :: copy' и использовать конструктор диапазона std :: vector'. – Xarn

+0

Я пытаюсь реализовать это в своем коде, но я получаю предупреждение: диапазоны «for» на основе диапазона доступны только с -std = C++ 11 или -std = gnu ++ 11 main.cpp: 53: 25 : error: запрос для члена 'first' in 'pair', который имеет тип non-class 'const int' std :: cout << пара.first << "" << пара.секунда << "\ n" ; ^ главный.cpp: 53: 44: error: запрос для члена «второй» в «паре», который относится к классу non-type «const int» std :: cout << пара.first << "" << пара.секунда < < "\ п" –

2

В дополнение к @ stryku отвечают, так как вы только хотите напечатать частоты , вам даже не нужно создавать вектор v:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <map> 

int main() { 

    std::map<int, size_t> counts; 

    std::for_each(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), [&counts](int k) { 
     ++counts[k]; 
    }); 

    for(const auto &pair : counts) 
     std::cout<<pair.first <<" "<< pair.second<<"\n"; 

    return 0; 
} 
Смежные вопросы