//第二题第一问
#include
#include
#include
#include
using namespace std;
int arr[27];
int order[27];
int ar[27];
int ord[27];
int cmp(const void a, const void *b)
{
return arr[(int )a] - arr[(int *)b];
}
void qso(int a[],int o[], int l, int r)//a[]个数,o[]字母
{
if (l< r)
{
int i = l, j = r;
int x = a[l];
int y = o[l];
while (i < j)
{
while(i < j && a[j]>= x)
j--;
{
a[i] = a[j];
o[i] = o[j];
}
while(i < j && a[i]<= x)
i++;
{
a[j] = a[i];
o[j] = o[i];
}
}
a[i] = x;
o[i] = y;
qso(a,o, l, i - 1);
qso(a,o, i + 1, r);
}
}
void part1()
{
int i;
memset(arr, 0, sizeof(int) * 27);//memset char型初始化函数
ifstream in;
in.open("E:\data.txt",ios::in|ios::beg);//打开文件
int all = 0;
for (string s; getline(in,s); )
{
const char * pchar = s.c_str();
int len = strlen(pchar);
for (int i = 0; i < len; i++)
{
all++;
if (pchar[i] >= 'a' && pchar[i] <= 'z')
{
arr[pchar[i] - 'a']++;
}
if (pchar[i] >= 'A' && pchar[i] <= 'Z')
{
arr[pchar[i] - 'A']++;
continue;
}
arr[26]++;
}
}
//第一,三部分输出排序
for (int i = 0; i < 27; i++)
{
order[i] = i;
};
cout<<"字母总数为:"<<all<< endl;
qsort(order, 27, sizeof(int), cmp);//频率从小到大排序,在头文件stdlib.h中
for(i = 0;i < 26;i++)
{
cout<<"排名"<<26-i<<'\t'<<(char)(65 + order[i])<<"字母数目为:"<<(double)arr[order[i]]<<"\t"<<"字母频率为:"<<(double)arr[order[i]] * 100.0/(double)all<<"%"<<endl;
}
//cout << "other\t" <<"数目为:" <<(double)arr[order[27]]<<'\t'<< (double)arr[27] * 100.0 / (double)all << "%" << endl;
in.close();
ofstream out("E:\\result.txt",ios::out);//以输出方式打开文件 result.dat接收从内存输出的数据
if(!out)
{
cerr<<"很抱歉,资料读取错误!"<<endl;
}
out<<"字母总数为:"<<all<< endl;
for(i = 0;i < 26;i++)
{
out<<"排名:"<<26 - i<<'\t'<<(char)(65 + order[i])<<'\t'<<"字母数目为:"<<(double)arr[order[i]]<<"\t"<<"字母频率为:"<<(double)arr[order[i]] * 100.0/(double)all<<"%"<<endl;
}
//out << "other\t" <<'\t'<<"数目为:" <<(double)arr[order[26]]<<'\t'<<'\t'<<(double)arr[26] * 100.0 / (double)all << "%" << endl;
out.close();
}
//第二部分:找出一起出现的频率最高的三个字母
void part2()
{
int j;
char x,y,z,ch;//y当前读入的字符,z下一个字符,x输入的想要寻找的字符
cout<<"请输入您想查询亲密关系的字母:"<
cin>>x;
for(j=0;j
ifstream in;
in.open("E:\\data.txt",ios::in|ios::beg);//打开文件
for (string s; getline(in,s);)
{
const char * pchar = s.c_str();//临时指针 ,内容不可变更
int len = strlen(pchar);
in.get(ch);
z = in.peek();
y = ch;
for (int j = 0; j
{
if ( x == y )
{
if(z>='a'&&z<='z') ar[z - 'a']++;//如果查询字符为当前字符,那么n的个数加1
if(z>='A'&&z<='Z') ar[z - 'A']++;
else continue;//结束本次循环,执行下次循环
}
if ( x == z )
{
if(y>='a'&&y<='z') ar[y-'a']++;//如果查询字符为当前字符的下一个字符,那么当前字符的个数加1
if(y>='A'&&y<='Z') ar[y-'A']++;
else continue;
}
}
}
qso(ar,ord,0,25);
for(j = 0;j < 26;j++)
{
cout<<"排名"<<26-j<<'\t'<<(char)(97 + ord[j])<<'\t'<<(double)ar[ord[j]]<<' '<<endl;//continue;
}
ofstream out;
out.open("E:\result.txt",ios::out|ios::app);
for(j = 0;j < 26;j++)
{
out<<"排名"<<26-j<<'\t'<<(char)(97 + ord[j])<<'\t'<<(double)ar[ord[j]]<<' '<<endl;//continue;
}
out.close();
}
int main()
{
part1();
part2();
return 0;
}
题目是:在网上下载英文文章,要求字母个数在1万以上,如果不到1万,请下载多篇合并,命名为data.txt。
输入一个字母,找出和它最亲密的三个字母(最亲密的意思是:和它一起相邻出现的次数最多)。//比较难
我是在part2部分有问题