43.定义一个字符串类CString,并设计一个算法对该串中各个不同字符出现的频率进行统计。
具体要求如下:
- 私有数据成员
- char *str:指向要统计的字符串。
- char (*p)[2]:动态分配二维空间,用以存放 str 所指字符串中出现的字符及其出现的次数(次数在存放时,用该数字对应的 ASCII 值存放;在输出次数时,输出该 ASCII 字符对应的 ASCII值即可)。
- int size:存放字符串中出现的所有不同的字符的个数。
- 公有成员函数
- 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<iostream>
#include<cstring>
using namespace std;
class CString{
char *str,(*p)[2];
int size;
public:
CString(char *s){
str = new char[strlen(s)+1];
strcpy(str,s);
p = 0;
size = 0;
}
//方法1
void count(){
int len = strlen(str);
p = new char[len][2];
for(int i=0;i<len;i++){
p[i][0]=str[i];
p[i][1]='1';
}
for(int i=0;i<len;i++){
if(p[i][1]>'0'){
size++;
for(int j=i+1;j<len;j++){
if(p[i][0]==p[j][0]){
p[j][1]='0';
p[i][1]++;
}
}
}
}
char t[size][2];
int k=0;
for(int i=0;i<len;i++){
if(p[i][1]>'0'){
t[k][0]=p[i][0];
t[k][1]=p[i][1];
k++;
}
}
p = new char[size][2];
for(int i=0;i<size;i++){
p[i][0]=t[i][0];
p[i][1]=t[i][1];
}
}
/*方法2
void count(){
int len = strlen(str);
p = new char[len][2];
for(int i=0;i<len;i++){
p[i][0]=str[i];
p[i][1]='1';
}
char t[len][2];
for(int i=0;i<len;i++){
int j,flag = 0;
for(j=0;j<size;j++){
if(t[j][0]==p[i][0]){
t[j][1]++;
flag =1;
}
}
if(!flag){
t[j][0]=p[i][0];
t[j][1]='1';
size++;
}
}
delete []p;
p = new char[size][2];
for(int i=0;i<size;i++){
p[i][0]=t[i][0];
p[i][1]=t[i][1];
}
}
*/
void show(){
for(int i=0;i<size;i++){
cout<<p[i][0]<<":"<<p[i][1]<<endl;
}
}
~CString(){
if(str)delete[]str;
if(p)delete[]p;
}
};
int main(){
char s[]="abdabcdesffffd";
CString c(s);
c.count();
c.show();
system("pause");
return 0;
}