采用C或C++编程,对出现的单词次数进行统计,并按照出现次数从低到高排序
发布网友
发布时间:2022-05-05 02:24
我来回答
共3个回答
热心网友
时间:2023-10-05 10:24
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "ctype.h"
#include "string.h"
struct abc{
int n;
char w[21];
};
void main(void){
struct abc wn[500],t;
int i,j,k,x;
FILE *fp;
if((fp=fopen("intxt.txt","r"))==NULL){
printf("Failed to open the input file...\n");
exit(0);
}
memset((char *)wn,'\0',sizeof(wn));
i=j=0;
while((wn[i].w[j]=getc(fp))!=EOF){
if(isalpha(wn[i].w[j])) j++;
else{
wn[i].w[j]='\0';
for(k=0;k<i;k++)
if(!strcmp(wn[i].w,wn[k].w)){
wn[k].n++;
break;
}
if(k>=i && j) wn[i++].n++;
j=0;
}
}
fclose(fp);
for(j=0;j<i;j++){
for(x=j,k=j+1;k<i;k++)
if(wn[x].n>wn[k].n) x=k;
if(x!=j){
t=wn[j];
wn[j]=wn[x];
wn[x]=t;
}
}
if((fp=fopen("outtxt.txt","w"))==NULL){
printf("Failed to open the output file...\n");
exit(0);
}
for(i=0;i<j;i++){
fprintf(fp,"%s\t%d\n",wn[i].w,wn[i].n);
printf("%s\t%d\n",wn[i].w,wn[i].n);
}
fclose(fp);
}追问能不能给一些详细的注释啊,还有解题思路,谢谢啦
追答说说思路吧。创建了一个结构体,其中有两个元素,一个是单词数组w,另一个是这个单词出现的次数n。在main中声明了一个结构体数级wn,有500个元素,所以本代码只适合不同单词不超过500的情况。从文件中一个字符一个字符地读,存放到结构体数组中的单词数组w中,当读到空格时,把这个空格变成'\0',表示单词结束了;这时再用这个单词与从0下标开始的结构体数组中的单词数组中的单词一次比较,若相等,则对该结构元素中的n增1,而不对结构体数组下标增1,说明单词重复了,下一个单词会覆盖刚刚读到的这个单词;若没有发现相同的单词,就对结构体数组下标增1,同时给这个元素中的n置1,说明是个新单词。再向后读,凡不是字母的都丢弃而不处理,直到遇到一个字母时作为新单词的开始而进行下一轮处理过程。直到遇到文件结束符时结束读取,关闭文件。然后对结构体数组按照n的大小排序,最后输出。
热心网友
时间:2023-10-05 10:25
#include <map>
#include <fstream>
int main(int, char*[])
{
std::map<std::string, int> words;
std::ifstream in("输入文件");
while (in && !in.eof())
{
std::string word;
in >> word;
++words[word];
}
std::multimap<int, std::string> counts;
for (std::map<std::string, int>::const_iterator i = words.begin(); i != words.end(); ++i)
counts.insert(std::make_pair(i->second, i->first));
std::ofstream out("输出文件");
for (std::multimap<int, std::string>::const_iterator i = counts.begin(); i != counts.end(); ++i)
out << i->second << " " << i->first<< '\n';
return 0;
}
热心网友
时间:2023-10-05 10:25
路过!帮顶!