2016-07-23 231 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 ::地圖<整型,無符號>',而不是數組。對於每個輸入,將相應映射條目的計數增加。完成輸入後,用'crbegin'枚舉map到'crend'迭代器並轉儲結果。它實際上大約有14行代碼,包括'#include'列表,以及用於可讀性的空格。而且,在沒有人的情況下,在現實世界中使用交換來執行這樣一項微不足道的任務。 – 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 :錯誤:請求'對'中的成員'first',它是非類類型'const int' std :: cout << pair.first <<「」<< pair.second <<「\ n」 ; ^ 主。cpp:53:44:error:請求成對''中的'second',它是非類型'const int' std :: cout << pair.first <<「」<< pair.second < < 「\ n」 個 –

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; 
}