用c++语言解答,方便的话给一下解题思路

【字符串】
16.*【题目】定义字符串(String)类,完成对字符串的操作。具体要求如下:
(1)私有数据成员
char str[80]; 存放字符串
int count[26]; 各字符出现的频率
(2)公有成员函数
构造函数String (char *s) : 初始化成员字符串数据str。
void process():统计字符串各字符的出现频率。
void print ( ) :输出各字符及出现频率。(思考:如何按字符出现频率降序输出)
(3)编写一个程序测试该类。
例:字符串为:abathiyttaftdabahjhj
按字符顺序输出字符(出现频率) :a(5) b(2) d(1) f(1) h(5) i(1) j(2) t(4) y(1)
按字符出现频率降序输出字符(出现频率) :a(5) h(5) t(4) b(2) j(2) i(1) y(1) f(1) d(1)

代码如下:

#include <iostream>
using namespace std;
class String
{
private:
    char str[80];
    int count[26];
public:
    String(char* s);
    void process();
    void print();
};

String::String(char* s)
{
    int i = 0;
    for(i=0;i<26;i++)
        count[i] = 0;
    i = 0;
    while(s[i] != '\0')
    {
        str[i] = s[i];
        i++;
    }
    str[i] = 0;
}

void String::process()
{
    int i=0;
    int tt = 0;
    while(str[i] != '\0')
    {
        tt = str[i]- 'a';
        count[tt]++;
        i++;
    }
}

void String::print()
{
    //按照字符顺序输出
    cout << "按照字符顺序输出:"<<endl;
    for(int i = 0;i<26;i++)
    {
        if(count[i] == 0)
            continue; //跳过出现0次的
        char ch = 'a' + i;
        cout << ch << "(" << count[i] << ")" ;
    }
    cout << endl;
    //按照出现频率输出
    cout << "按照出现频率输出:" << endl;
    int ab[26];
    for(int i = 0;i<26;i++)
        ab[i] = i;
    //按照出现频率排序
    for (int i = 0;i<25;i++)
    {
        for (int j = 0;j<25-i;j++)
        {
            if(count[j] < count[j+1])
            {
                int tmp = count[j];
                count[j] = count[j+1];
                count[j+1] = tmp;

                tmp = ab[j];
                ab[j] = ab[j+1];
                ab[j+1] = tmp;
            }
        }
    }
    for (int i = 0;i<26;i++)
    {
        if(count[i] == 0)
            continue; //跳过出现0次的
        char ch = 'a' + ab[i];
        cout<< ch << "(" << count[i] << ")";
    }
    
}

int main()
{
    char* p = "abathiyttaftdabahjhj";
    String ss(p);
    ss.process();
    ss.print();
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
struct Sort{//用于排序,a代表字符,b代表出现次数
    int a=0;
    int b=0;
};
bool cmp(Sort a,Sort b)
{
    if(a.b!=b.b) return a.b>=b.b;//先按照出现频率排序
    return a.a>b.a;//如果出现频率相同,就按照字典序排序,不需要的话可以删了

}
class String
{
public:
    String(char *s)
    {
        strcpy(str,s);//将输入的字符串赋值到成员函数

    }
    void process()//计算字符串出现频率
    {
        if(str == nullptr) return;
        for(int i=0;i<strlen(str);i++)
        {
            //利用字符的ASCII码进行计算,65~90为26个大写英文字母,97~122号为26个小写英文字母
            if(str[i]<='Z')//如果为大写字符,加上32变为小写字符
            {
                str[i]+=32;

            }

            Count[str[i]-97]++;//0-26对应a-z,++表示每出现一次,频率加1

        }
    }
    void print()
    {
        Sort sss[26];
        cout<<"按字符顺序输出字符(出现频率) :";
        for(int i=0;i<=25;i++)
        {
            if(Count[i]!=0)     //表示字符出现过
            {
               char  s=('a'+i);
               cout<<s<<"("<<Count[i]<<") ";

            }
            sss[i].a=i;
            sss[i].b=Count[i];
        }
        sort(sss,sss+26,cmp);//进行sort排序,不懂可以去看看sort
        cout<<endl<<"按字符出现频率降序输出字符(出现频率) :";
        for(int i=0;i<26;i++)
        {
            if(sss[i].b!=0)
            {
               char  s=sss[i].a+'a';
               cout<<s<<"("<<sss[i].b<<") ";
            }
        }
    }
private:
    char str[80];
    int Count[26]={0};//我用的是codeblock编辑器,count与预留的标识符冲突,这里就大写C了
};
int main()
{
    char str[80];
    cin>>str;
    //cout<<str;
    String s(str);
    s.process();
    s.print();
    return 0;
}

运行结果:

img