一位网友正在学校做课程设计题目,要求在一个文件中找到给定单词出现的位置并统计出现次数。这是一个比较简单的文本处理问题, 于是, 我给他用 python 写了一个,并打赌在5分钟内用不到30行程序解决问题。 我作到了,下面是程序: if __name__=='__main__': file_name = raw_input('Input the file you want to find in:') try: in_file = open(file_name,'r') lines = in_file.readlines() tag_tok = '' while tag_tok.upper() != 'Q': tag_tok = raw_input('Input the word you want to find(Q for quit):') if tag_tok.upper() != 'Q': count = 0 line_no = 0 for line in lines: line_no = line_no + 1 inline_cnt = line.count(tag_tok) count = count + inline_cnt if inline_cnt > 0: print 'Find %s %d time(s) in line :%d'%(tag_tok,inline_cnt,line_no) print line print '---------------------------------' print 'Total fount %s %d time(s)'%(tag_tok, count) except: print "Can't open file %s"%(file_name) 但是,这个网友还不满足非要一个 C++的程序,理由是他们老师不会python , 正好我也想试试用C++解决和python做下对比: #include <fstream> #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int BruteFind(const char *x, int m, const char *y, int n ,vector<int>& colpos) { int i, j, cnt=0; /* Searching */ for (j = 0; j <= n - m; ++j) { for (i = 0; i < m && x == y[i + j]; ++i); if (i >= m){ colpos[cnt++] = j; if(cnt == colpos.size()) colpos.resize(cnt * 2); } } return cnt; } int count_string(string source, string tag, vector<int>& colpos){ int find_cnt = 0; find_cnt = BruteFind(tag.c_str(), tag.size(), source.c_str(),source.size(),colpos); return find_cnt; } int main(){ string file_name, line; vector<string> lines; lines.resize(10); cout << "Input the file name:"; cin >> file_name;
ifstream in_file; try{ in_file.open(file_name.c_str()); if(!in_file) throw(file_name); } catch(string file_name){ cout << "Fatal error: File not found."<<endl; exit(1); } int line_count = 0;
do{ getline(in_file, lines[line_count]); line_count ++; if(line_count == lines.size()){ lines.resize(line_count * 2); } }while(in_file.eof()==0);
string tag_tok; vector<int> colpos; colpos.resize(10);
do{ cout << "Input the word you want to find(Q for quit):"; cin >> tag_tok; if(tag_tok == "Q"){ break; } int count = 0, line_no = 0 , inline_count; for(line_no = 0 ;line_no < line_count ; line_no++){ inline_count = count_string(lines[line_no], tag_tok, colpos); count += inline_count; if(inline_count > 0){ cout << "Find " << tag_tok << " " << inline_count << " time(s) in line " << line_no ; cout << " , column pos is ( "; for(int i = 0 ;i< inline_count ;i++){ cout << colpos << ' '; } cout << " )" << endl; cout << lines[line_no] << endl; } } cout << "--------------------------------" <<endl; cout << "Total fount " << tag_tok << " " << count << " time(s)" << endl; }while(tag_tok != "Q");
in_file.close(); return 0; } 这个程序用了30分钟。 从程序长度和编程时间上,粗略对比下: Python 5 分钟 22行 C++ 30 分钟 60多行 从这个简单的例子中可以大体看到 脚本语言与C++语言中在开发时的差异了。 
|