/*********************************************
*
* c++程序设计实践指导
*
* 1.1删除序列中相同的数
*
**********************************************/
#include <iostream>
using namespace std;
class ARR
{
int m; //数组实际元素个数
int *p; //存放原始数组及结果数组
int *c; //存放记录数据重复次数的数组
public:
ARR (int x[],int size) //构造函数,用size初始化m,用参数x初始化p
{
m = size;
p = new int[size];
c = new int[size](); //数组每个元素初始化为0
for (int i = 0; i < m; i++)
{
p[i] = x[i];
}
}
void delsame(); //完成删除相同数据的功能
void show() //输出到屏幕显示
{
for (int i = 0; i < m; i++)
{
cout << p[i] << "\t";
}
cout << endl;
}
void count(); //完成统计每个数据重复此处并输出到屏幕的功能
};
void ARR::delsame() //删除相同数据
{
int i,j;
for(i = 0; i < m-1; i++)
{
if(p[i] == p[i + 1]) //若存在相同数据,则之后数据向前覆盖
{
for(j = i+1; j < m-1;j++)
p[j] = p[j+1];
m--;
i--; //存在覆盖后仍然有重复数据的可能,故要从当前i继续判定
}
}
cout << endl;
}
void ARR::count() //统计每个数据的重复次数
{
int i,j;
int k = 0;
for(i = 0; i < m; i++)
{
if(p[i] == p[i+1]) //若存在相同数据,则之后数据向前覆盖
{
c[k] += 1;
for(j = i+1; j < m; j++)
p[j] = p[j+1];
m--;
i--; //存在覆盖后仍然有重复数据的可能,故要从当前i继续判定
}
else
{
c[k] += 1; //按照日常计数习惯,为每个元素值加1
cout << c[k] << "\t";
k++;
}
}
cout << endl;
}
int main()
{
int b[16] = {1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10};
ARR v(b, sizeof(b)/sizeof(b[0]));
v.show(); //显示原数组
v.delsame();
v.show(); //显示结果数组
ARR w(b,sizeof(b)/sizeof(b[0]));
w.count(); //显示统计数组
system("pause");
return 0;
}
转载于:https://my.oschina.net/u/862938/blog/110414