《用C++进行汉语编程》

《用C++进行汉语编程》
《用C++进行汉语编程》

《用C++进行汉语编程》

说明:学习本教材必须安装Visual C++ 2005以上版本编程环境。

原文地址:https://www.360docs.net/doc/172453703.html,/easyblog/diary.aspx?diaryid=5736

https://www.360docs.net/doc/172453703.html,/DanceFire/archive/2005/11/11/527736.aspx

或曰:“欲连神功,必先自宫,若不自宫,也可成功!”

吾曰:“欲用中文,必先汉化,若不汉化,也可编程!”

前言

随着2005年11月7日,微软Visual C++ 2005的发布,我们关注到,VC8.0中增加了大量新的特性,包括最重要的,引入了C++/CLI,可以说是给C/C++语言历史上掀起了新的一页。作为一个方言的出现C++/CLI会有什么样的作为,却是值得大家拭目以待,是功是过,由历史来评说。但是我们也注意到,VC8.0引入了一个非常有趣的支持,VC8.0开始支持Unicode的源代码了。如同C#和Java一样。如今,我们要写C++程序,已经完全允许在代码中出现Unicode编码的变量名、函数名、类名等等,并且#define也支持Unicode替换了。

虽然是个小变化,但是,我们现在也可以用中文进行C++的编程了,世界变得更加美好了。这种“伪中文”编程基本原理就是将英文关键字替换成为了中文,用一个中英文替换的头文件就够了。

关键字使用中文,很简单的技术,实现一个别人已经发明的语言的汉化,也不是什么太复杂的事情(当然如果做一个100%兼容的C++这样的复杂语言的编译器还是具有相当的难度的)。真正难的应该是理解这种语言的创新思想,发现或者创造一种方法,以解决现有语言在程序设计上的存在的种种问题,这样更新或者创造出来的才是真正有用的经典之作。不用细说,大家都知道,C、C++、Java、C#、Ruby、Python的诞生都分别解决了什么难题。他们用漂亮的办法解决了一直困扰程序员的问题,他们就成为了经典。本文就是解决了各国语言本土化的问题。

第一课没有什么不可以

在细说之前,需要说一下编译器的事情。

目前我不知道还有哪个编译器能够对Unicode有良好的支持,所以,目前只有Visual C++ 2005才能够编译下面的代码,但是很幸运,原本打算卖US$49的Visual C++ 2005 Express,从现在开始,一年内是免费的,而且微软没有一年以后的收费计划,所以也许我们可以一直合法的用下去,呵呵。大家可以从微软网站直接下载,需要下载的访问下面的连接:

https://www.360docs.net/doc/172453703.html,/vstudio/express/visualc/

下面的代码都可以在Visual C++ 2005 Express 版上编译通过。

1.宏替换

好了,真的言归正传了。我用了一系列的#define宏和typedef,作了中文和英文关键字的替换。比如:

typedef int 整数型;

typedef char 字符型;

#define 如果 if

#define 否则 else

#define 返回 return

#define 常量 const

#define 标准输出 std::cout

#define 行结束 std::endl

#define 标准输入 std::cin

#define 字符串 std::string

#define 主程序 main

2.第一个中文程序

经过这样处理后我们就可以写出一个最简单的中文程序:

整型主程序( 整型参数数量, 常量字符型** 参数列表 )

{

字符串某人姓名;

整数型年龄;

标准输出 << "请输入姓名:" << 行结束;

标准输入 >> 某人姓名;

标准输出 << "请输入年龄:" << 行结束;

标准输入 >> 年龄;

如果(年龄 > 18)

{

标准输出 << 某人姓名 << "先生/女士,您好!祝您今天工作愉快哦。" << 行结束;

}

否则

{

标准输出 << 某人姓名 << "小朋友,您好!祝你今天玩得开心。" << 行结束;

}

返回 0;

}

程序很简单,执行后,询问你的姓名和年龄,如果你大于18岁呢,它就要对你说“Dancefire先生/女士,您好!祝您今天工作愉快哦。”,如果还不到18岁呢,就会说“Dancefire 小朋友,您好!祝你今天玩得开心。”

这个程序似乎不够有趣。那么我再来一个有趣一些的,用到了面向对象的继承的概念,新瓶装旧酒了,前一篇文章中提到的,生物圈的例子,(既然是中文嘛,就来点中国文化特色,呵呵)。

哦,多说一句,下面的程序一共由3个文件组成,其中2个是头文件,另外一个是源文件。三个文件都可以从我的网站下载:

https://www.360docs.net/doc/172453703.html,/Project/SinoProgram/Sino.h

https://www.360docs.net/doc/172453703.html,/Project/SinoProgram/SinoTest.h

https://www.360docs.net/doc/172453703.html,/Project/SinoProgram/SinoTest.cpp

3.实现中文类

如果大家想自己写个中文的类玩玩,只需要#include第一个Sino.h就可以了。我已经在里面替换了大量的关键字,玩玩够了,如果还想替换其他关键字,你们自己加进去就行了,需要注意的是,这几个文件都是受GPL协议保护的,简单而言就是,大家可以随便改,只要继续保持开放就行了。

下面的是主程序:()

//

// 作者: Dancefire (Dancefire [at] gmail)

// 日期: 公历二零零五年十一月十一日

// 农历乙酉年丁亥月己亥日巳时

// 宜解除修饰垣墙冠笄出行馀事勿取

// 忌开市动土破土嫁娶安葬

// 项目: 中文C++编程测试

// 版本: 甲子

//

#include

#include

#include

#include "sino.h"

#include "SinoTest.h"

使用名字空间标准库;

整数型主程序( 整数型参数数量, 常量字符型** 参数列表)

{

标准输出<< "世界你好!" << 行结束<< 行结束;

使用名字空间中文编程;

矢量<生物*> 动物们;

动物们.排到后面( 新建鸟());

动物们.排到后面( 新建鱼());

动物们.排到后面( 新建马());

动物们.排到后面( 新建动物());

动物们.排到后面( 新建生物());

循环(无符号整型甲= 0 ; 甲< 动物们.多少() ; ++甲)

{

生物* 小家伙= 动物们[甲];

小家伙->自我介绍();

动物* 小动物= 动态转型<动物*>(小家伙);

如果( 小动物)

{

小动物->移动();

}

标准输出<< 行结束;

}

返回0;

}

主程序很简单,先建立了一个动物们的容器,然后一个一个新的动物加入到这个容器(队列)中了。(当然严格来说,应该是生物们,但是听起来好怪,就叫动物们好了。)这些动物们排好队后,开始一个接着一个的自我介绍,如果是动物呢,就动一动,如果不是动物就算了。

执行的结果是这样的:

世界你好!

我属于动物, 我是一只可爱的鸟

这只鸟在自由自在的飞翔

我属于动物, 我是一条可爱的鱼

这条鱼在自由自在的游来游去

我属于动物, 我是一匹可爱的马

这匹马在自由自在的奔跑

我属于生物, 我是一只可爱的动物

这只动物在自由自在的移动

我是...咦?我是什么?我也不知道我是什么,难道我是一个外星的生物

大家可以在程序中感受到C++的OO的概念。这里面有5个类,动物类继承了生物类能够自我介绍的能力,鸟、鱼、马继承了动物类能够移动的能力,而他们在继承自我介绍的时候,用自己的方式替代(重写)了原始生物的自我介绍方式,此处自然用到了虚函数,既然是表现继承,怎么能没了虚函数呢,是吧。在判断是否是动物的时候,用到了C++标准的动态转型,这是在运行期,而不是编译期,进行转型的。

类的定义在头文件SinoTest.h中,完整的这个头文件如下:(SinoTest.h)

//

// 作者: Dancefire (Dancefire [at] gmail)

// 日期: 公历二零零五年十一月十一日

// 农历乙酉年丁亥月己亥日巳时

// 宜解除修饰垣墙冠笄出行馀事勿取

// 忌开市动土破土嫁娶安葬

// 项目: 中文C++编程测试

// 版本: 甲子

//

名字空间中文编程

{

// 生物类

类生物

{

公有:

生物()

{

类别= "生物";

祖先的类别= "游离态";

}

虚~生物(){}

虚字符串我的类别()

{

返回类别;

}

虚字符串我祖先的类别()

{

返回祖先的类别;

}

虚无值自我介绍()

{

标准输出<< "我是...咦?我是什么?我也不知道我是什么,难道我是一个

外星的" << 我的类别() << 行结束;

}

受保护的:

字符串类别;

字符串祖先的类别;

};

// 动物类,动物当然是生物啦

类动物: 公有生物

{

公有:

动物()

{

移动方式= "移动";

量词= "只";

类别= "动物";

祖先的类别= "生物";

}

虚无值移动()

{

标准输出<< "这" << 量词<< 我的类别() << "在自由自在的" << 移动方

式<< 行结束;

}

虚无值自我介绍()

{

标准输出<< "我属于" << 我祖先的类别() << ", 我是一" << 量词<< "

可爱的" << 我的类别() << 行结束;

}

受保护的:

字符串移动方式;

字符串量词;

};

// 鸟类,鸟是动物咯。

类鸟: 公有动物

{

公有:

鸟()

{

移动方式= "飞翔";

量词= "只";

类别= "鸟";

祖先的类别= "动物";

}

};

// 鱼也是动物咯

类鱼: 公有动物

{

公有:

鱼()

{

移动方式= "游来游去";

量词= "条";

类别= "鱼";

祖先的类别= "动物";

}

};

// 马也是动物

类马: 公有动物

{

公有:

马()

{

移动方式= "奔跑";

量词= "匹";

类别= "马";

祖先的类别= "动物";

}

};

}

至于Sino.h的内容,我就只列一部分好了,大家需要的,直接从上面的连接下载吧,因为太长了,而且都是一样的宏定义,非常简单,没有什么有趣的事情。

// 作者: Dancefire (Dancefire [at] gmail)

// 日期: 公历二零零五年十一月十一日

// 农历乙酉年丁亥月己亥日巳时

// 宜解除修饰垣墙冠笄出行馀事勿取

// 忌开市动土破土嫁娶安葬

// 项目: 中文C++编程头文件

// 版本: 甲子

// 变量

typedef bool 逻辑型;

typedef char 字符型;

typedef short 短整型;

typedef int 整数型;

typedef unsigned char 无符号字符型;

typedef unsigned short 无符号短整型;

typedef unsigned int 无符号整型;

typedef unsigned long 无符号长整型;

typedef long 长整型;

typedef float 浮点型;

typedef double 双精度型;

typedef std::string 字符串;

// 常量

const bool 真 = true;

const bool 假 = false;

// 关键字

#define 抽象 abstract

#define 内嵌汇编 __asm

#define 中断 break

#define 得 case // ???

#define 捕获 catch

#define 类 class

#define 常量 const

#define 常量转型 const_cast

#define 继续 continue

#define 默认 default

#define 委托 delegate

#define 删除 delete

#define 不推荐 deprecated

#define 动态链接库导出 dllexport

#define 动态链接库导入 dllimport

#define 做 do

#define 动态转型 dynamic_cast

#define 否则 else

哦,唯一的问题是,我不知道switch和case如何翻译。目前我的翻译是,判断和得。所以,如果用到switch的话,代码看起来可能比较奇怪:

case也可以#define为“情况”

判断( 甲吃的饺子盘数 )...{

得 1:

标准输出 << "竟然甲才吃了1盘饺子,不正常" << 行结束;

中断;

得 2:

标准输出 << "甲一个人就吃了2盘饺子,够实力" << 行结束;

中断;

得 3:

标准输出 << "没搞错吧?甲吃了3盘饺子,不会一天没吃饭,就等这顿了吧??" << 行结束;

中断;

默认:

标准输出 << "无语了~~,我都不知道甲他吃了几盘了" << 行结束;

中断;

}

第二课自己做一个中文编程语言,你也行

自己做一个中文编程语言?没有开玩笑吧?是的,是没有开玩笑。那些大公司所谓的什么汉语编程语言,相当一部分,就是对某种语言的模拟,只不过关键字用中文替代了而已,有模拟VB的,有模拟C的,还有模拟Forth的。既然是这样也叫“中文编程语言”的话,呵呵,那好,我们也做一个好了,比他们更省人力,更简单。

1.自己改头文件

通过刚才的例子,大家已经看到了,我基本上使用纯中文写了一个程序,我相信有C++为依托,这个肯定是最强大的,能够用中文写程序的语言了,哈哈~~(牛什么牛,那些强大的功能是C++给你提供的,你可啥都没做,就是换了换关键字而已嘛。汗~~~)。

想自己创造一个有自己个性的“中文编程语言”,大家从我的网站下载Sino.h这个文件:

https://www.360docs.net/doc/172453703.html,/Project/SinoProgram/Sino.h

大家可以根据自己的想法,随意的改动关键字的中文,有什么好的想法,也可以给我回复在这里。给大家举几个简单的例子。大家可以把Sino.h中的public对应的中文,替换成“大家的”,private对应成“我的”,protected对应成“我们家的”,friend可以对应成“哥们儿”,int可以对应成“小样儿”,std::string对应成“条幅”,std::cout对应成“嚷嚷”,std::cin 对应成“告诉”。std::endl对应成“行了您呐”,main对应成“龙门客栈”,if对应成“若”,else对应成“否”,return对应成“回报”等等。

哈哈,结果这个设计的“中文编程语言”可能就变成下面的样子了:

小样儿龙门客栈()

{

条幅英雄;

小样儿年方几何;

嚷嚷 << "客官贵姓啊?";

告诉 >> 英雄;

嚷嚷 << "哦,兄台,年方几何啊?";

告诉 >> 年方几何;

若(年方几何 > 16){

嚷嚷 << 英雄 << ",大英雄,久仰久仰,您请楼上落座。" << 行了您呐;

}否{

嚷嚷 << 英雄 << "小英雄,早有所闻,今日得见果然气度不凡,里面请。" << 行了您呐;

}

回报 0;

}

2.运行自己的程序

这段程序和第一个程序的意思,实际上是一样的,但是显得更有趣味,输出大体如下:

客官贵姓啊?乔峰

哦,兄台,年方几何啊?28

乔峰,大英雄,久仰久仰,您请楼上落座。

客官贵姓啊?杨过

哦,兄台,年方几何啊?14

杨过,小英雄,早有所闻,今日得见果然气度不凡,里面请。

第三课C++基本面向对象概念

当然了,作为一个中文编程的拥护者来说,我整理与写本文的目的是为了让你能用C++开发易语言支持库,为易语言服务的,当然,如果从中你自己学会了C++,那就更好了。

相关主题
相关文档
最新文档