【字符串】
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;
}
运行结果: