//第二题第一问
#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部分有问题
英文文章,命名为data.txt。
输入一个字母,找出和它最亲密的三个字母(最亲密的意思是:和它一起相邻出现的次数最多)。//比较难
题目是这个
mark下,帮你看看。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static int TransChar(char c)
{
if (c >= 'a' && c <= 'z')
return c - 'a';
if (c >= 'A' && c <= 'Z')
return c - 'A';
return 26;
}
static void Main(string[] args)
{
int[,] arr = new int[27, 27];
string s = File.ReadAllText(@"c:\1.txt").ToLower();
for (int i = 0; i < s.Length - 1; i++)
{
if (i != 0) arr[TransChar(s[i]), TransChar(s[i - 1])]++;
if (i != s.Length) arr[TransChar(s[i]), TransChar(s[i + 1])]++;
}
char c = Console.ReadLine()[0];
List<Tuple<char, int>> result = new List<Tuple<char,int>>();
for (int i = 0; i < 26; i++)
result.Add(new Tuple<char, int>((char)(i + 'a'), arr[TransChar(c), i]));
foreach (var item in result.OrderByDescending(x => x.Item2).Take(3))
Console.WriteLine(string.Concat(item.Item1, ":", item.Item2));
}
}
}
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int arr[27][27];
int result[26];
char c;
int TransChar(char c)
{
if (c >= 'a' && c <= 'z')
return c - 'a';
if (c >= 'A' && c <= 'Z')
return c - 'A';
return 26;
}
string ReadAllText(string path)
{
ifstream in(path);
istreambuf_iterator<char> beg(in), end;
string str(beg, end);
return str;
}
int cmp(const void* a, const void* b)
{
return arr[TransChar(c)][*(int *)b] - arr[TransChar(c)][*(int *)a];
}
int _tmain(int argc, _TCHAR* argv[])
{
memset(arr, 0, 27 * 27 * sizeof(int));
string s = ReadAllText("c:\\1.txt");
for (int i = 0; i < s.length() - 1; i++)
{
if (i != 0) arr[TransChar(s[i])][TransChar(s[i - 1])]++;
if (i != s.length()) arr[TransChar(s[i])][TransChar(s[i + 1])]++;
}
cin >> c;
for (int i = 0; i < 26; i++)
{
result[i] = i;
}
qsort(result, 26, sizeof(int), cmp);
for (int i = 0; i < 3; i++)
{
cout << (char)(result[i] + 'a') << ":" << arr[TransChar(c)][result[i]] << endl;
}
return 0;
}
a
n:3891
t:3163
s:2719
Press any key to continue . . .