Archive for 6月 2013

使用nitrous在线编译器创建node.js服务

Node.js是一套用来编写高性能网络服务器的JavaScript工具包,为JavaScript搭建服务器提供了可能,不再是C++或其它语言的专利。下面介绍的是一款免费在线IDE,创建简单服务的过程,监听端口接收浏览器发来的数据。

nitrous提供的云编译器,支持多种语言,参考https://www.zoudaokou.com/index.php/archives/227中介绍的编译器注册创建步骤,创建一个Node.js的环境,然后打开界面,创建一个server.js的文件,文件内容如下

[php]
var http = require("http");

http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8080);
[/php]
Continue reading ‘使用nitrous在线编译器创建node.js服务’ »

nitrous在线编译器,支持C、C++、Java、Ruby、Python、Go、Node.js

最近发现一款非常好用的在线编译器,Linux开发环境,支持Linux在线命令执行,支持几种常见的语言在线编译运行。支持git命令,能够从git上下载工程,网址是http://www.nitrous.io/

进入网站后需要注册一个帐号,并使用邮箱激活才能正常使用,注册非常简单,30秒可以搞定,激活邮箱后,登陆到页面,会提示你创建一种编程语言,一个帐号只能免费创建一种,要想创建多个,需要邀请好友获取N2O积分,用积分换语言。

下面图中是我已经创建了一个Go语言编程环境的,点击New Box可以创建一个新的编程环境。


Continue reading ‘nitrous在线编译器,支持C、C++、Java、Ruby、Python、Go、Node.js’ »

vs2005调用ffmpeg库执行av_register_all出错崩溃

今天下载了1.2版本的FFmpeg库,在官方网站有一个链接,可以下载到编译好的windows版本的库。下载下来后,写了一段程序,在main函数中执行到函数av_register_all(),直接崩溃,提示Unhandled exception at 0x00905a51 in main.exe: 0xC000001D: Illegal Instruction,工程是Release版本的,调用代码如下:

[php]
#include <stdio.h>

#include <libavformat/avformat.h>
#include <libavutil/dict.h>

int main (int argc, char **argv)
{
AVFormatContext *fmt_ctx = NULL;
AVDictionaryEntry *tag = NULL;
int ret;

if (argc != 2) {
printf("usage: %s <input_file>\n"
"example program to demonstrate the use of the libavformat metadata API.\n"
"\n", argv[0]);
return 1;
}

av_register_all();
if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
return ret;

while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
printf("%s=%s\n", tag->key, tag->value);

avformat_close_input(&fmt_ctx);
return 0;
}
[/php]
Continue reading ‘vs2005调用ffmpeg库执行av_register_all出错崩溃’ »

循环赛日程安排分治法分析

问题描述:

  • 设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求为比赛安排日程。

编程思想:

假设n位选手被顺序编号为1,2,3,…,n,比赛的日程表是一个n行n-1列的表格,i行j列的表格内容是第i号选手在第j天的比赛对手。根据分而治之的原则,可从其中一半选手(2^(n-1位)的比赛日程,导出全体n位选手的日程,最终细分到只有两位选手的比赛日程出发。可假设只有8位选手参赛,若1至4号选手之间的比赛日程填在日程表的左上角(4行3列),5至8号选手之间的比赛日程填在日程表的左下角(4行3列);那么左下角的内容可由左上角的对应项加上数字4得到。至此,剩余的右上角(4行4列)是为编号小的1至4号选手与编号大的5至8号选手之间的比赛日程安排。例如,在第4天,让1至4号选手分别与5至8号选手比赛,以后各天,依次由前一天的日程安排,让5至8号选手“循环轮转”即可。最后,比赛日程表的右下角的比赛日程表可由,右上角的对应项减去数字4得到。

具体实现:
Continue reading ‘循环赛日程安排分治法分析’ »

最大子段和算法分析

问题:

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为:

Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n 例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为20 下面列出了四种计算方式,时间复杂度各逐渐变小,其中动态规划法时间复杂度最小。 Continue reading ‘最大子段和算法分析’ »

整数取反,颠倒位置

题目很简单,完成函数reverse,要求实现把给定的一个整数取其相反数的功能,举两个例子如下: x = 123, return 321 x = -123, return -321
规则:

1.完成功能函数即可。

下面是我用C写的,用C++其实也一样。
[php]
int reverse(int x) {
int result = 0;
do {
int temp = x % 10;
result = result * 10 + temp;
} while ((x /= 10) != 0);
return result;
}
int main()
{
int num = 0;
scanf("%d", &num);
printf("%d\n", reverse(num));
return 0;
}
[/php]
这个是C++的
Continue reading ‘整数取反,颠倒位置’ »

分治法排序

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
Continue reading ‘分治法排序’ »

explicit防止隐式转换

c++允许隐式转换,没有加入explicit限定符的都看作是能够实现隐式转换的,但有些时候不期望这样做。

例如:
[php]
class CBook
{
public:
CBook(std::string name) : m_name(name), m_width(0), m_height(10) {}
int Compare(CBook& book);
std::string m_name;
int m_width;
int m_height;
};

CBook book1("book1");
book1.m_width = 10;
book1.m_height = 20;
int result = book1.Compare("book2");
[/php]
在这里调用Compare函数时,本来是需要CBook参数的,但由于CBook的构造函数参数是std::string,这里编译器自动使用”book2″临时构造一个CBook对象,同时将这个临时对象传给Compare函数,并在离开Compare函数时自动析构,这就是隐式转换的过程。
Continue reading ‘explicit防止隐式转换’ »

boost的windows编译

boost库一款非常优秀的c++库,文档非常完善,鼓励商业或非商业使用,开源免费,被称为准标准库,下面介绍它在windows下的编译过程。

现在最新的boost库版本是1_53_0,可以在其官方网站下载,解压后,可以打开boost_1_53_0目录下的index.html文件,这里面对boost库进行了详细的说明,包括boost的安装,在文档的Getting Started on Windows中描述了使用MSVC的Command Prompt进行编译的过程。

例如我的机器安装了Visual Studio 2005,在开始菜单中打开Microsoft Visual Studio 2005 > Visual Studio Tools > Visual Studio 2005 Command Prompt。

然后使用命令行进入boost_1_53_0的目录,并执行以下命令
[php]
bootstrap
[/php]
这个步骤是安装boost库编译程序,最后会在boost_1_53_0目录下生成b2.exe程序,生成了b2.exe后,再执行
[php]
b2 –build-type=complete
[/php]
这个步骤就是编译boost库了,编译完成后,会在boost_1_53_0的stage目录中找到生成的lib文件,如boost_date_time-vc80-mt-gd-1_53.lib,其中vc80表示是vs2005版本的。
Continue reading ‘boost的windows编译’ »