悬赏100分!做一个C/C++编程题!在线等!
有一个英文文本文件存于a.txt,编个程序输入若干个单词,统计他们出现的次数!要求:语句一定要简单,一定要尽可能用基本语句做,尽量短,要注释,好的追加!...
有一个英文文本文件存于a.txt,编个程序输入若干个单词,统计他们出现的次数!
要求:语句一定要简单,一定要尽可能用基本语句做,尽量短,要注释,好的追加! 展开
要求:语句一定要简单,一定要尽可能用基本语句做,尽量短,要注释,好的追加! 展开
4个回答
展开全部
//这是我以前做的,你看一下是不是符合要求~~
/*所调用文本文件结尾应键入回车,否则会发生错误*/
#include<iostream>
#include<assert.h>
#include<string>
#include<queue>
#include<fstream>
using std::queue;
using std::string;
using namespace std;
int * Next(string p)
{
int m=p.length();
assert(m>0);
int *N=new int[m];
assert(N!=0);
N[0]=0;
for(int i=1;i<m;i++)
{
int k=N[i-1];
while(k>0&&p[i]!=p[k])
k=N[k-1];
if(p[i]==p[k])
N[i]=k+1;
else
N[i]=0;
}
return N;
}
int KMP_FindPat(string s,string p,int *N,int startindex)//返回为出现次数
{
int sum=0;
int LastIndex=s.length()-p.length();
if((LastIndex-startindex)<0)
return sum;//匹配失败
int i;
int j=0;
for(i=startindex;i<s.length();i++)
{
while(p[j]!=s[i]&&j>0)
j=N[j-1];
if(p[j]==s[i])
j++;
if(j==p.length())
{
sum++;//计数
j=0;
}
}
return sum;//
}
int Filematch(string p,queue<int>& q)
{
int count=0,i=0,row=0,sum=0;
string str;
char t;
ifstream fin("a.txt",ios::in);
if(!fin)
cout<<"打开文件失败!!!"<<endl;
else
{
do{
fin.get(t);
if(t!='\n')
str+=t;
else
{
row++;
i=KMP_FindPat(str,p,Next(p),0);//与在当前行str中查找
sum+=i;
if(i!=0)
{
q.push(row);
count++;
}
str.erase();
}
}while(!fin.eof());//如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false
fin.close();
}
return sum;
}
void search()
{
queue<int>q; //队列存储所在行
string s;
cout<<"请输入你在ceshi.txt中要查询的字符串:"<<endl;
cin>>s;
cout<<endl;
int sum=Filematch(s, q); //统计出现次数
if(!q.empty())
{
cout<<"该单词在本文件中共出现了"<<sum<<"次."<<endl;
cout<<"分别出现在以下行中:"<<endl;
while(!q.empty())
{
cout<<q.front()<<endl;
q.pop();
}
}
else
cout<<"该单词在本文件中没有出现"<<endl;
}
void main()
{
search();
}
/*所调用文本文件结尾应键入回车,否则会发生错误*/
#include<iostream>
#include<assert.h>
#include<string>
#include<queue>
#include<fstream>
using std::queue;
using std::string;
using namespace std;
int * Next(string p)
{
int m=p.length();
assert(m>0);
int *N=new int[m];
assert(N!=0);
N[0]=0;
for(int i=1;i<m;i++)
{
int k=N[i-1];
while(k>0&&p[i]!=p[k])
k=N[k-1];
if(p[i]==p[k])
N[i]=k+1;
else
N[i]=0;
}
return N;
}
int KMP_FindPat(string s,string p,int *N,int startindex)//返回为出现次数
{
int sum=0;
int LastIndex=s.length()-p.length();
if((LastIndex-startindex)<0)
return sum;//匹配失败
int i;
int j=0;
for(i=startindex;i<s.length();i++)
{
while(p[j]!=s[i]&&j>0)
j=N[j-1];
if(p[j]==s[i])
j++;
if(j==p.length())
{
sum++;//计数
j=0;
}
}
return sum;//
}
int Filematch(string p,queue<int>& q)
{
int count=0,i=0,row=0,sum=0;
string str;
char t;
ifstream fin("a.txt",ios::in);
if(!fin)
cout<<"打开文件失败!!!"<<endl;
else
{
do{
fin.get(t);
if(t!='\n')
str+=t;
else
{
row++;
i=KMP_FindPat(str,p,Next(p),0);//与在当前行str中查找
sum+=i;
if(i!=0)
{
q.push(row);
count++;
}
str.erase();
}
}while(!fin.eof());//如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false
fin.close();
}
return sum;
}
void search()
{
queue<int>q; //队列存储所在行
string s;
cout<<"请输入你在ceshi.txt中要查询的字符串:"<<endl;
cin>>s;
cout<<endl;
int sum=Filematch(s, q); //统计出现次数
if(!q.empty())
{
cout<<"该单词在本文件中共出现了"<<sum<<"次."<<endl;
cout<<"分别出现在以下行中:"<<endl;
while(!q.empty())
{
cout<<q.front()<<endl;
q.pop();
}
}
else
cout<<"该单词在本文件中没有出现"<<endl;
}
void main()
{
search();
}
展开全部
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include<sstream>
#include <map>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifile("a.txt");
string str;
string filter;
string word;
map<string, int> result;
getline(ifile, str);
if (!ifile)
cerr << "Open error!" << endl; //打开文件
if (!filter.size())
filter.insert( 0, "\".," );
string::size_type pos = 0;
while (( pos = str.find_first_of( filter, pos ))!= string::npos )
str.erase(pos,1); //去除标点
istringstream sstream(str);
while(sstream>>word){
++result[word];
} //单词导入map,并统计次数
for (map<string,int>::iterator it = result.begin(); it != result.end(); ++it)
{
cout << it -> first << "\t" << it -> second << endl;
} //输出
return 0;
}
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include<sstream>
#include <map>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifile("a.txt");
string str;
string filter;
string word;
map<string, int> result;
getline(ifile, str);
if (!ifile)
cerr << "Open error!" << endl; //打开文件
if (!filter.size())
filter.insert( 0, "\".," );
string::size_type pos = 0;
while (( pos = str.find_first_of( filter, pos ))!= string::npos )
str.erase(pos,1); //去除标点
istringstream sstream(str);
while(sstream>>word){
++result[word];
} //单词导入map,并统计次数
for (map<string,int>::iterator it = result.begin(); it != result.end(); ++it)
{
cout << it -> first << "\t" << it -> second << endl;
} //输出
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*
最基本的代码,只用了基本输入输出库
输入统计以#over结束,或最大数目5个结束
最大数目可修改COUNT的定义
*/
//定义单词最大长度
#define LENGTH 30
//定义最多统计单词数目
#define COUNT 5
#include "stdio.h"
int main()
{
//保存要统计的字符串数组
char string[COUNT][LENGTH];
//临时的字符串
char temp[LENGTH],t;
//统计结果
int count[COUNT]={0};
int n,i;
FILE* fp;
int status = 0;
//打开文件
fp = fopen("a.txt","r");
if(!fp) printf("文件打开文件!");
//循环输入,统计单词。
for(n=0;n<COUNT;n++){
printf("请输入你要统计的单词:");
scanf("%s",string[n]);
//如果输入#over就结束输入
if(strcmp("#over",string[n])==0)
break;
printf("您输入了:%s\n",string[n]);
}
while( !feof(fp) )
{
//读取一个字符
t = fgetc(fp);
if(status==0){
//status==0 时为读取间隔符号状态
if(t ==' ' || t == '\t' || t=='\n')
{ //nothing
//读到间隔符不做处理
}else
{
//在读取间隔符号状态读到了字母,就转化为读取单词状态
i = 0;
status=1;
}
}
if(status==1){
//status==1 时为读取单词状态
if(t !=' ' && t != '\t' && t!='\n')
{
//读到了字母
//将读取保存字母到临时单词
temp[i++] = t;
}else{
//在读单词状态读到了间隔符
//单词结束
temp[i] = 0;
//将临时单词与要统计单词逐个比较,并统计
for(i=0;i<n;i++)
if(strcmp(string[i],temp)==0)
count[i]++;
//改变为读间隔符状态
status = 0;
}
}
}
//关比文件
fclose(fp);
//输出统计结果
for(i=0;i<n;i++)
{
printf("单词%s出现了%d次\n",string[i],count[i]);
}
//暂停以查看结果
system("pause");
}
最基本的代码,只用了基本输入输出库
输入统计以#over结束,或最大数目5个结束
最大数目可修改COUNT的定义
*/
//定义单词最大长度
#define LENGTH 30
//定义最多统计单词数目
#define COUNT 5
#include "stdio.h"
int main()
{
//保存要统计的字符串数组
char string[COUNT][LENGTH];
//临时的字符串
char temp[LENGTH],t;
//统计结果
int count[COUNT]={0};
int n,i;
FILE* fp;
int status = 0;
//打开文件
fp = fopen("a.txt","r");
if(!fp) printf("文件打开文件!");
//循环输入,统计单词。
for(n=0;n<COUNT;n++){
printf("请输入你要统计的单词:");
scanf("%s",string[n]);
//如果输入#over就结束输入
if(strcmp("#over",string[n])==0)
break;
printf("您输入了:%s\n",string[n]);
}
while( !feof(fp) )
{
//读取一个字符
t = fgetc(fp);
if(status==0){
//status==0 时为读取间隔符号状态
if(t ==' ' || t == '\t' || t=='\n')
{ //nothing
//读到间隔符不做处理
}else
{
//在读取间隔符号状态读到了字母,就转化为读取单词状态
i = 0;
status=1;
}
}
if(status==1){
//status==1 时为读取单词状态
if(t !=' ' && t != '\t' && t!='\n')
{
//读到了字母
//将读取保存字母到临时单词
temp[i++] = t;
}else{
//在读单词状态读到了间隔符
//单词结束
temp[i] = 0;
//将临时单词与要统计单词逐个比较,并统计
for(i=0;i<n;i++)
if(strcmp(string[i],temp)==0)
count[i]++;
//改变为读间隔符状态
status = 0;
}
}
}
//关比文件
fclose(fp);
//输出统计结果
for(i=0;i<n;i++)
{
printf("单词%s出现了%d次\n",string[i],count[i]);
}
//暂停以查看结果
system("pause");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-01-07
展开全部
语句一定要简单,一定要尽可能用基本语句做,尽量短,要注释,好的追加!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询