永发信息网

C++程序题,急!!!

答案:2  悬赏:80  手机版
解决时间 2021-01-26 15:51
定义一个字符类CString,并设计一个算法对该串中各个不同字符出现的频率进行统计。
具体要求如下:
(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 {//将二维数组的第一列赋值为字符,第二列赋值为出现次数,初始值都为1
*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();

}

老是出现访问冲突,实在改不出来
最佳答案
别的还没细看
首先你的这句话
p=(char(*)[2])new char[strlen(s)+1];
是不对的。不管如何强制转换,你申请到的永远是strlen(s)+1个char单位的内存,这明显与你的意图不符,而且访问时也会出现冲突

这个定义 char(*p)[2];
表示 p 是一个指向 char[2] 数组的指针,所以正确的动态分配应该是
p = new char[strlen(s)+1][2];

然后使用
p[index][0] 存放字符
p[index][1] 存放字符出现的次数
全部回答
// 你需要对自己检讨一下 这是最基本的 #include void swap(int &a, int &b) { int t = a; a = b; b = t; } void swap(int c[], int n) { for (int i = 0; i < n/2; ++i) swap(c[i], c[n-i-1]); } int main(void) { int c[10], i; for (i = 0; i < 10; ++i) c[i] = i; swap(c, 10); for (i = 0; i < 10; ++i) printf("%d ", c[i]); getchar(); return 0; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
有报道称window10自带杜比音效,我怎么没看出
小董精艺汽配地址好找么,我有些事要过去
焦作市解放区王褚乡中心小学地址在什么地方,
oppo手机音乐怎样和宝马联结
有一块长4米宽80厘米的长方形红布做成一种等
竖式写26点五乘以六十
your initial point x0 is not between bound
成语镂金错彩的意思是什么啊?有知道释义的请
如果一个和你非常要好的女生说你和她的关系是
超市储备店长与中国移动,那个更有发展?
(1-75%)X=(1-80%)(108-x) 求这个方程怎么解?
洋时尚睡吧我想知道这个在什么地方
为什么我的微博浏览量要刷屏才会涨?
汽车DVD导航是5.1声道的,请问怎么接功放机。
焦作市解放区环城南路第二小学地址好找么,我
推荐资讯
已知线段AB,反向延长AB到点C,使BC=3AB,那么AB
股票软件右下角吸筹怎么看
开守望先锋直播时很卡,是网速问题吗? 问一
刚买了翡翠手镯,上面有黑点和横纹。。用手摸
冷转印和热转印哪个好,请具体说明,
灰原在柯南内裤里放辣椒粉在国语版哪一集
老宋废品回收站地址在什么地方,我要处理点事
成语亲操井臼的意思是什么啊?有知道释义的请
乳山市下初镇下初村幼儿园地址在什么地方,我
本人性别女,若想在鸡鸣寺出家可以吗?
刚换个集成显卡,华硕主板的,但显示器插在集
账面价值,账面余额,账面净额,账面净值,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?