求助 不能输出预想结果怎么办?

//第二题第一问
#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部分有问题

5个回答

英文文章,命名为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 . . .

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐