C++面向对象编程题 第43题

43.定义一个字符串类CString,并设计一个算法对该串中各个不同字符出现的频率进行统计。

具体要求如下:

  1. 私有数据成员
  • char *str:指向要统计的字符串。
  • char (*p)[2]:动态分配二维空间,用以存放 str 所指字符串中出现的字符及其出现的次数(次数在存放时,用该数字对应的 ASCII 值存放;在输出次数时,输出该 ASCII 字符对应的 ASCII值即可)。
  • int size:存放字符串中出现的所有不同的字符的个数。
  1. 公有成员函数
  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值