查看: 3310|回复: 1

Python 与 C++ 程序的简单实例对比

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2006-7-28 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一位网友正在学校做课程设计题目,要求在一个文件中找到给定单词出现的位置并统计出现次数。这是一个比较简单的文本处理问题, 于是, 我给他用 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++语言中在开发时的差异了。
论坛徽章:
47
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010新春纪念徽章
日期:2010-03-01 11:20:512010年世界杯参赛球队:日本
日期:2010-02-26 11:04:222010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:牛
日期:2009-09-10 11:14:59
2#
发表于 2006-7-31 20:37 | 只看该作者
都是count()惹的祸

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表