c++编程总结

开始做毕业设计了,题目是基于统计的自动文摘系统。

语言要求是vs08以上的c++,对于我这c#javapython的代码经验比较足的人,觉得脑袋发蒙。

当然,导师的要求,就得遵从。当年做嵌入式,c++的代码经验也是有的,不过是在linux下的qt

 

自动文摘的步骤:

1)计算词的权值;

2)计算句子的权值;

3)将原文中的所有句子按权值高低降序排列,权值最高的若干句子被确定为文摘句;

4)将所有文摘句按照它们在原文中的出现顺序输出。

在自动文摘中,计算词权、句权、选择文摘句的依据是文本的6种形式特征:词频、标题、位置、句法结构、线索词和指示性短语。

 

当然,分词不是我的重点,所以我使用了一个第三方的分词库。

 

中科院的NLPIR ICTCLAS分词工具包

 

下面是当时使用NLPIR库开发的步骤,中间遇到的问题都记录了下来。

 

 ____________________________________________________________

|                                                            |

| NLPIR ICTCLAS分词工具包                                    |

| 官方地址:http://ictclas.nlpir.org                         |

| 自然语言处理与信息检索共享平台   http://www.nlpir.org      |

|                                                            |

|                       中科院计算所                         |

|                                                            |

|____________________________________________________________|

 

 

1.获取官方开发包(c++版)

开发包的相关信息参照官方给的readme

 

2.demo开发

  1> Data文件夹

    2>  bin目录下的NLPIR.dll 动态库文件

    3> include文件下的 NLPIR.h 文件

    4> lib目录下的NLPIR.lib 文件

全部拷贝到自己的工程目录下。

 

需要使用库的地方或头文件,添加如下代码:

——————————————————————————————————

 

#include "NLPIR.h"

#pragma comment(lib,"NLPIR.lib")   //没有分号哦,这是包含库文件

 

——————————————————————————————————

 

Demo code vs 2010 控制台项目):

 

——————————————————————————————————

#include "stdafx.h"

#include <iostream>

#include <fstream>

#include <string>

 

#include "NLPIR.h"

#pragma comment(lib,"NLPIR.lib")   //没有分号哦,这是包含库文件

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

         ifstream fin("test.txt",ios::in);

         if(!fin){cout<<"test.txt file read error!"<<endl; return -1;}

         string text,tempstr;

         while (!fin.eof())

         {

         getline(fin,tempstr);

         text += tempstr+"\r\n";

         }

         //cout<<text<<endl;

         if (!NLPIR_Init())

         {

         cout<<"NLPIR_Init() error!"<<endl;

         return -1;

         }

         string resulttext = NLPIR_ParagraphProcess(text.c_str(),1);

         cout<<resulttext<<endl;

         NLPIR_Exit();

         return 0;

}

 

—————————————————————————————————————

 

编译如果出现如下错误:

LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

 

解决方法如下:

项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。

 

然后再次编译就应该可以运行了,之外的其他问题,自行google解决之吧。

 

 

==========================================================================================

关于c++编程的一些小的要点:

1.使用    #pragma once   可以使多次被引用的头文件只被引用一次

2.出现类似于如下错误的时候:

-------------------------------------------------------------------------------------------------------------------------------------------------------------

错误         2       error LNK2019: 无法解析的外部符号 "enum CommonStatus __cdecl GetKeyWords(class std::

basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct KeyWord

 *)" (?GetKeyWords@@YA?AW4CommonStatus@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator

@D@2@@std@@PAUKeyWord@@@Z),该符号在函数 _wmain 中被引用         E:\作业\毕业设计\分词器测试

&入门帮助文档\分词器\分词器.obj     分词器测试

-------------------------------------------------------------------------------------------------------------------------------------------------------------

GetKeyWords这个函数可能你只是声明了而没有实现,尤其是存在同名的重载的时候,一定要仔细检查每

重载是否在声明后实现了。3.c++编程的时候尽量不要使用很多c语言的东西,混用可能会在一定程度上

提高程序的性能,但是也会带来很多数据在格式化,内存对齐的时候出现意外的错误,而且让你找不到北。

4.c++编程中,最担心的就是内存相关的操作了,为了避免内存操作出问题,在你没有理解静态数据区,堆

的具体作用前,就避免使用任何指针相关的操作,同时,所有的数据操作要利用函数进行封装,要作

为参数的变量(尤其是指针)要判断需不需要加引用。尽量避免在局部作用域创建变量和申请内存。

 

 

整理:2013 12 29   如有疑问,请联系我:[email protected]

你可能感兴趣的:(C++)