数据结构课程设计
第一步:
英文文章的词频统计,按词典顺序排放
原始文章:
代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const char* file = "file.txt";
#define max 5000
int k = 0;
//单词结构
struct f_word
{
string word;
int flag;
};
f_word fword;
//词频结构
struct f_linelist
{
string word;
int frequency;
};
f_linelist linelist[max];
//统计文章词频
int line_word(string word)
{
for (int i = 0; i < max; i++)
{
if (linelist[i].word == word)
{
linelist[i].frequency += 1;
return i;
}
}
linelist[k].word = word;
linelist[k].frequency = 1;
k += 1;
return 0;
}
//大写英语单词转化成小写
string word_transition(string word)
{
for (int i = 0; i < int(word.size()); i++)
{
if (word[i] >= 'A' && word[i] <= 'Z')
word[i] = word[i] + 32;
}
return word;
}
int main()
{
ifstream fin;
fin.open(file);//关联文件file
char ch;//用于获取字符
string word;//用于存放单词
int i, j, m;
for (i = 0; fin.get(ch); i++)
{
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
fword.flag = 1;//是字母标志位设置为1
else
fword.flag = 0;//非字母标志位设置为0
if (fword.flag == 0)//非字母
{
if (fword.word != "\0")//判断之前的word里面是否有单词
{
line_word(fword.word);//存放到数组里面
}
fword.word = "\0";//清空word
}
else if (fword.flag == 1)//字母
{
if (fword.word == "\0")//word为空,放入第一个字母
fword.word = ch;
else
fword.word += ch;//word不为空,拼接字母组成单词
}
else cout << "获取单词时发生未知错误" << endl;
}
//按照词典排序(冒泡排序)
f_linelist temp;
for (i = 0; i < k; i++)
{
m = i;
for (j = i + 1; j < k; j++)
{
if (word_transition(linelist[j].word) < word_transition(linelist[m].word))//将单词转换成小写进行比较
m = j;
}
//交换原始单词
temp = linelist[i];
linelist[i] = linelist[m];
linelist[m] = temp;
}
//输出词频
cout << "all word is " << k << endl;
for (i = 0; i < k; i++)
{
cout << linelist[i].frequency << " " << linelist[i].word << endl;
}
//输出到文件outfile中
ofstream fout;
fout.open("outfile.txt");
for (i = 0; i < k; i++)
{
fout << linelist[i].frequency << " " << linelist[i].word << endl;
}
return 0;
}
输出结果:
如有问题,请在评论区交流。