【C++】词频排序

来源:互联网 发布:1962年印度战争 知乎 编辑:程序博客网 时间:2024/06/08 19:48
功能要求:
1. 设计一个统计英文文章词频的程序。该程序能够从一个输入文件(文本文件)读取一篇英文文章的内容,并统计每个单词出现的次数。程序在读取单词时应当将标点符号排除在外,且不区分英文字母的大小写(例如:China 与china 视为同一个单词)。此外,在统计词频时,有些英文单词(例如a、an、the、of)需要排除在外,由另一个输入文件定。该程序能够将统计后的词频列表输出到两个文件,一个按照词典顺序排序,另一个按照词频排序(倒序)。该程序应当使用C++标准库提供的容器。

2. 设计一个能够按照自定义的方式比较两个字符串大小的函数对象,比较规则:给定两个字符串a 与b,若a 的长度小于b 的长度,则a < b(例如pig < mouse);若a 的长度大于b 的长度,则a > b(例如mouse > pig);若a 的长度等于b 的长度,则它们之间的大小关系由词典顺序决定,例如(cat < pig)。将上述英文文章里出现的单词放置到一个vector 容器中,并调用C++标准库提供的泛型算法对其中的string 元素进行排序(排序基于上面描述的自定义字符串大小关系),将排序后的字符串列表输出到另一个文件。

输入文件:
C:\1_in_1.txt:英文文章。
C:\1_in_2.txt:统计词频时需排除的词汇列表(每行一个单词)。

输出文件:
C:\1_out_1.txt:以词典顺序排序的词频列表(每行一个单词及其词频,以空格隔开)。
C:\1_out_2.txt:以词频排序(倒序)的词频列表(每行一个单词及其词频,以空格隔开)。
C:\1_out_3.txt:按照自定义方式排序的字符串列表(每行一个单词)。

#include <iostream>#include <fstream>#include <cstdlib>#include <map>#include <string>#include <vector>#include <algorithm>#include <cctype>using namespace std;bool sm(const pair<string,int>& x,const pair<string,int>& y);void sortm(map<string,int>& tm,vector<pair<string,int>>& tv);void sorts(vector<string>&t,map<string,int>&tm);bool com(string &s1,string &s2);int sest(int a,int b);string disti(string &origi);string ignore(string &origi);//若同时出现除首字母大小写之外其余均相同的单词,则按小写排序int main(){ifstream inFile;inFile.open("C:\\1_in_1.txt");if(!inFile.is_open()){cout <<"Could not open the file."<<endl;exit(EXIT_FAILURE);}string r;map<string, int> word;map<string, int>::iterator j;vector<pair<string,int>> tv; vector<string>ts;if(inFile.good()){while(inFile>>r){r = disti(r);r = ignore(r);word[r]++;}inFile.close();}ofstream outFile,outfile,Outfile;outFile.open("C:\\1_out_1.txt");outfile.open("C:\\1_out_2.txt");Outfile.open("C:\\1_out_3.txt");ifstream infile;infile.open("C:\\1_in_2.txt");if(!infile.is_open()){cout <<"Could not open the file."<<endl;exit(EXIT_FAILURE);}if(infile.good()){while(infile>>r){r = disti(r);r = ignore(r);word.erase(r);}infile.close();}sortm(word,tv); for(j=word.begin();j!=word.end();j++)outFile << j->first << "" << j->second << endl;int n = tv.size();for(int i=n-1;i>0;i--)  {  outfile<<tv[i].first<<""<<tv[i].second<<endl;  } sorts(ts,word);int u = ts.size();for(int k=0;k<u;k++){Outfile<<ts[k]<<endl;}outFile.close();    outfile.close();Outfile.close();return 0;}string ignore(string &origi){   origi[0]=tolower(origi[0]);   return origi;}string disti(string &origi)//防止有单词中间有分隔符的情况{int a = origi.length();string s1,s2,s3;int b = (int)(origi[0]);if(b<65||(b>=91&&b<=96)||b>122){   for(int i = 0;i<a-1;i++)    origi[i] = origi[i+1];}int c = (int)(origi[a-1]);if(c<65||(c>=91&&c<=96)||c>122){origi[a-1] = '\0';}return origi;}bool sm(const pair<string,int>& x,const pair<string,int>& y)  {  return x.second < y.second;  }  void sortm(map<string,int>& tm,vector<pair<string,int>>& tv)  {  for(map<string,int>::iterator it=tm.begin();it!=tm.end();it++)  {  tv.push_back(make_pair(it->first,it->second));  }  sort(tv.begin(),tv.end(),sm);  }int sest(int a,int b){if(a<b)return a;else    return b;}bool com(string &s1,string &s2){int c = s1.length();int d = s2.length();if(c>d)return true;else if(c==d){for(int i = 0;i<sest(c,d);i++){if(s1[i]>s2[i])return false;else if(s1[i]<s2[i])return true;}}else return false;}  void sorts(vector<string>&t,map<string,int>&tc){for(map<string,int>::iterator ot=tc.begin();ot!=tc.end();ot++){t.push_back(ot->first);}sort(t.begin(),t.end(),com);}


0 0
原创粉丝点击