- 一个数列中出现次数最多的数值称为众数。例如,数列2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据的众数。试定义一个类NUM,求一维数组个元素中的众数。
具体要求如下:
(1)私有数据成员l int a[10],m; 有m个数的原始数组。l int b[10], n; 数组b中依次存放数组a的n个众数。
(2)公有成员函数l NUM(int a1[],int m);
构造函数,用数组a1的前m个元素初始化数组a和m,同时将n置0。
l void fun(); 按给定的算法从数组a中找出众数。
l void print(); 输出数组a中的元素及已找出的众数。
求众数的算法提示:
- 定义一个临时数组t,在t[i]中存放a[i]在数组中重复出现的次数。例如,当数组a为{2,3,-1,2,1,3}时,经计算后数组t应为{2,2,1,2,1,2};
- 找出数组t中最大元素的下标j(可能有多个值)。在该例中,j=0,1,3,5;
- 对步骤 2中求得的每个j,如果a[j]在数组b中不存在,则将a[j]存入数组b中,同时众数个数n加1。在该例中,数组b中保存的最终结果为2,3;n为2。
(3)在主函数中对该类进行测试。
输出示例:
数组:2,3,-1,2,1,3
众数个数:2
众数:2,3
#include<iostream>
using namespace std;
class NUM{
int a[10],m;//有m个数的原始数组。
int b[10],n;//数组b中依次存放数组a的n个众数。
public:
NUM(int a1[],int m)//构造函数,用数组a1的前m个元素初始化数组a和m,同时将n置0。
{for(int i=0;i<=m;i++)
a[i]=a1[i];
this->m=m;
n=0;}
void fun()// 按给定的算法从数组a中找出众数
{int t[m];
for(int i=0;i<=m;i++){
int count=0;
for(int j=0;j<=m;j++)
if(a[i]==a[j]) count++;
for(int k=0;k<=m;k++)
if(a[i]==a[k]) t[k]=count;}
int j[m];
int h=0;
int max=t[0];
for(int d=1;d<=m;d++)
if(t[d]>max) max=t[d];
for(int z=0;z<=m;z++)
if(t[z]==max)
{j[h]=z;h++;}
b[0]=a[j[0]];n++;
int c=1,x=1,l=1;
while(c<h){
int tmp=0;
for(int i=0;i<x;i++)
if(b[i]==a[j[x]]) tmp++;
if(tmp==0) {b[l]=a[j[x]];l++;n++;}
c++;x++; } }
void print()
{ cout<<"array:";
for(int i=0;i<=m;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"Mode numer:"<<n<<endl;
cout<<"Mode:";
for(int i=0;i<n;i++)
cout<<b[i]<<" ";}
};
int main()
{ int all;
cout<<"please input how many number you want input:";
cin>>all;
int ts[all-1];
cout<<"please input numbers:";
for(int i=0;i<all;i++)
cin>>ts[i];
NUM num(ts,all-1);
num.fun();
num.print();
return 0; }