具体要求如下:
(1)私有数据成员
char *str:指向要统计的字符串
char (*p)[2]:动态分配二维空间,用以存放str所指字符串中出现的字符及其出现的
次数(次数在存放时,用该数字对应的ASCII值存放;在输出次数时,输出该ASCII
字符对应的ASCII值即可)。
int size:存放字符串中出现的所有不同的字符的个数。
(2)公有成员函数
CString(char*s):根据s的参数初始化数据成员str;p和size初始值为0。
void Count():p根据s 所指字符串长度分配空间。然后把str所指字符串中的每个字
符放入p数组中,设置每个字符的出现次数为1。根据p数组统计不同字符出现的频率
,并求的size的实际大小。最后根据size的实际大小,重新分配p所指空间,并把不
同字符及其出现出现次数重新放回p数组(提示:可以借助临时数组或指针来实现)。
void Show():屏幕显示字符串、字符串的每个字符和与之对应的次数。
~CString():释放动态分配的空间。
(3)在主程序中定义字符串char s[]=“abdabcdesffffd”。定义一个CString类对象test
,用s初始化test,完成对该类的测试。
#include
#include
class CString
{
private:
char *str;//字符串
char(*p)[2];//二维数组
int size;//频率
public:
CString(char*s)
{//构造函数
str=new char[strlen(s)+1];
strcpy(str,s);
p=(char(*)[2])new char[strlen(s)+1];
p=0;
size=0;
}
void Count()
{
int len=strlen(str);
for(int i=0;i
*p[i]=str[i];
*(p[i]+1)=1;
}
*p[len]='\0';
*(p[len]+1)='\0';
i=0;
while(*p[i]!='\0')
{//遍历二维数组,计算字符出现的频率,并将重复字符数值赋为F
for(int j=1;j
if(*p[i]==*p[j])
{
*(p[i]+1)=(*(p[i]+1))+1;
*p[j]='F';
}
}
i++;
}
char (*p1)[2];//定义一个临时二维数组,用以存放不重复的字符及其频率
for(i=0;*p[i]!='\0';i++)
{//计算数组中的不同字符数
if(*p[i]!='F')
size++;
}
p1=(char(*)[2])new char[size];//根据频率为临时数组分配内存空间
for(i=0;*p[i]!='\0';i++)
{//将数组中不重复的字符及其次数放入临时数组中
for(int j=0;j
if(*p[i]!='F')
{
*p1[j]=*p[i];
*(p1[j]+1)=*(p[i]+1);
}
}
}
*p1[size-1]='\0';
*(p1[size-1]+1)='\0';
p=(char(*)[2])new char[size];
for(i=0;i
*p[i]=*p1[i];
*(p[i]+1)=*(p1[i]+1);
}
if(p1)delete[]p1;//为临时数组释放内存空间
}
void Show()
{//输出原字符串及结果
cout<
for(int i=0;i
cout<<*p[i]<<'\t';
cout<<*(p[i]+1)<<'\n';
}
}
~CString()
{//析构函数
if(str)delete[]str;
if(p)delete[]p;
}
};
void main()
{//主函数
char s[]="abdabcdesffffd";
CString test(s);
test.Count();
test.Show();
}
老是出现访问冲突,实在改不出来