Archive for March 2006

医院八楼(2)   2 comments

九楼

我跟着护士小姐径直走到了九楼楼梯口。

平时这里的门一直是锁着的。我唯一看到它打开的那次是我得知“耗子”是什么的那次。今天我要亲眼看到它被打开了。

我神奇地发现我竟然很平静。

不过我的小强就很急躁了,在我的口袋里爬来爬去,弄得我心口直痒。

门被打开了。

护士让到一边,给我打了个手势。显然,她并不打算跟我一起上去。

于是我对护士笑了一下,就跨过了门往九楼去了。

来到九楼,原本我还在担心怎么去找医生,后来发现这个担心是多余的。

通往九楼的楼梯出口处,有两扇门。一扇上面写着“医生办公室”,一扇上面什么都没写。

我要找的是医生,自然去医生办公室了。

就在我正打算敲门的时候,门自己开了。

我看到里面一个医生模样的人正做了一个仿佛拉开什么东西的动作。

之后的过程极其无聊。医生问了我一些平时经常问的问题。像什么有没有觉得哪里不舒服之类的问题。

就在我对这样的问题感到厌烦的时候,医生突然问道:“最近你有没有看到什么奇怪的东西?”

很奇怪,但是我立刻就认为他的意思是问我有没有看到那些“镜子里不存在的人”。

我不知应该怎么回答。我的确看到了,而且看到很多次,但是我的直觉或者已经遗失的记忆告诉我,不能如实回答。

医生看我的眼神变了。

这时,小强又开始不安分了。它在我的口袋里很猛烈地扭动着它的身体。我相信,我衣服上如此剧烈的起伏一定吸引了医生的注意力,因为他的确很认真地盯着我的衣服口袋看。

我感到小强竟然挣脱了口袋上钮扣的束缚,从旁边的缝隙里钻了出来。

我看到小强从我的口袋里飞了出来。

对这一变化我突然变得很窘迫起来。

一个蟑螂在医生的办公室乱飞,而刚才柳飘絮才说过蟑螂不卫生。

于是我突然脸红了起来。

“你怎么了?哪里不舒服吗?”医生盯着我问道。

我愣愣地看着医生。

难道在办公室里飞蟑螂也很正常吗?

小强飞到了办公室的一面镜子上,但镜子里却没它的像。

我明白了,小强也是镜子里不存在的存在,而医生是看不到它的,因为“这里没有任何一个人和另一个人患同样的病”。

而柳飘絮能看到的理由是:她能接触我的精神世界,而我能看到小强。

医生对我迟迟没回应感到不解,于是拿出了一台仪器在我的脑袋上一照。我还没反应过来是怎么回事,医生手上的仪器就显示了一串数字和几张曲线图。显然,他在用这仪器检查我的脑子。

之后医生没说什么,就把我带到了一个房间里。

小强跟着一起飞了进来。

这房间和我下面住的房间一模一样。

以后的几天,我就住在这里。

每天,医生都会带着一台类似小型电视机一样的东西到我房间里来,让我看电视里面的人们在干什么,然后汇报给他。也有的时候,他会把我带到一个地方,让我和一些人聊天,当然事先给了我聊天的主题和内容方向。我都照做了。

我发觉我开始喜欢这样的生活了,因为每天都和昨天不同。

但是,我又感到有点失落。

晚上的时候,医生会给我吃药。

我能感觉出这药不是我在八楼吃的药。而且吃完以后我会感到头很晕,直到小强重又钻回我的口袋睡觉,我才会感到有一些清醒。

就这样过了大约半个月,我又回到了八楼。

蟑螂小强

我又看到了柳飘絮。

还是在交谊厅,她依然在看电视。

我在她身边坐下,拿出了小强在手上把玩。

她很惊奇地看着我。

我很惊讶地看着她看着我。

“有什么问题吗?”我先开口。

“不。我只是感到惊讶。”

我很好奇她也会有表情,也会有不平静的时候。

小强飞走了,我没理它。反正晚上它会回来的,因为过去半个月一直如此。

“惊讶什么?”

“没什么。”她又转回头去看电视了。

“哎,你这样我们怎么聊天啊?”我突然感到很不满。

为什么每次都是我挑起话头,然后由她来结束呢?我感觉我很被动,或者说很无奈。

“一定要聊天吗?”她的声音和我第一次听到时完全一样。

我感到很愤怒。

她能读我的心,而我却不能。

这是不公平的信息战——我突然很诧异我竟然想到了“信息战”这么高深的词。

“那我不用我的能力好了。”她似乎开始赌气了。

“哎,我说,别生气嘛。你得了神病也不是你想的啊。”我软了下来。我发觉过去的我一定是一个很懦弱的人,或者就是非常非常善良的敏感生物。

“我说过……”

“我知道我知道,是神通者。”我第一次打断了她。我发觉和她聊天就像和图灵机聊天一样——我再次很神奇地诧异自己竟然知道什么是“图灵机”。

她似乎更生气了。

我不知道她为什么生气。

“这段时间我一直在九楼陪人聊天。一直在聊一些很无聊的内容,就是问问题之类的。话题和内容都是医生定的,我甚至感觉我只是医生和那些人聊天的中介工具。”我认为再怎么哄她也没用了,干脆自顾自地开始说话。这也是是聊了半个月天的后遗症吧——上帝啊,我竟然知道什么是“后遗症”!

“你没回家?”她诧异地问我。

“没啊。我和你一样去九楼了。”我也很诧异地回答。

“没理由啊……你还记得当时的情景?”她用很好奇地声音问我。

这是我第二次听到她话里带语气,让我心狂跳了好一阵子。

“是啊。”我兴奋地回答,企盼着她能把话题继续。如果她真的把话题继续了,那真是我从入院到现在的头一遭了,绝对值得纪念的一天。

“医生没给你吃什么药吗?”她看着我问道。

看来今天果然值得纪念的,因为话题继续了!

“有啊。每天晚上的时候医生都给我吃药的。”

“你没感到头晕之类的吗?”她似乎更急了。

我反而犯迷糊了。她为什么对我的事这么着急?难道她喜欢我?

这个问题第一次在我心中出现,结果让我的心更加猛烈地狂跳了起来。

“厄,有……有啊。”我开始紧张了。我开始思考,我是不是也喜欢她呢?毕竟她是我在医院八楼唯一认识的年轻女病人。护士和镜子里不存在的老太太虽然也是女的,但是感觉就是不一样。而除了这两类人,别的女性就只有柳飘絮了。这点我以前也一直感到很奇怪的。以前也的确有几个女病人,但是后来都先后步入了“第五次出院”的行列了。其中包括给我咖啡的那位。

“那你怎么还记得?”她这次似乎除了着急,还有惊讶的感觉。

“因为小强啊。”

“小强?”她皱了下眉头。

“就是那只蟑螂啊。前面还在这里飞呢。”我兴奋地回答道。今天的聊天长度已经超过过去的所有次了。

“我没看到……”她的眉头皱得更深了。

“啊,对了,它也是镜子里不存在的。”我想起来半个月前我的一个结论。

“哦,这样啊……”她若有所思地看着地板,然后又一幅若有所悟的样子,接着继续若有所思。

话题结束了。

我突然感到很空虚很寂寞。

我感到很难过。

我和她继续并肩坐着看电视,但我知道她绝对没在看电视,虽然动作好像在看电视。

而我也知道,我也绝对没在看电视,虽然动作好像也的确在看电视的样子。

我在看她,而她在想它。

我有把握她在想我的小强,所以我突然开始吃小强的醋了——厄,我怎么又知道“吃醋”的含义了?

一直到护士过来“护送”我们回自己的房间,我和她一直保持这样的动作,而小强一直没回来。

回到寝室后,我开始担心我的小强了。

因为我记得仿佛在我刚意识到我在医院后不久,我看到护士们在护士长的率领下在追杀一只蟑螂。如果镜子里不存在的存在的确是鬼的话,我便要开始担心那些护士们了,因为很可能我的小强就是当初的那只蟑螂的鬼,而我的记忆告诉我,鬼会害人的。

不对不对,我的记忆怎么可能告诉我?它不是已经被我遗失了吗?

但刚才的确是我的记忆。

我开始混乱了。

今天好多事情都不同了。

柳飘絮开始关心我,或者我的小强,了起来;

我开始记得很多我原本遗忘了的东西;

小强突然不回来了;

还有,今天的护士好像不是当初我上九楼时的护士……

我想打开门出去看看。即使不去找小强,我也想泡杯咖啡喝。在九楼的半个月我一滴咖啡都没喝过。

但是,我发现门无论我怎么努力都打不开。

What a damn house!”我脱口而出。

回忆记忆

瞬间,我自己都惊讶了。

这是英语,而我以前根本不懂!

对了,还有,是“house”不是“耗子”,当初那人叫的是“house”!

所有的一切我都明白了。

包括我是谁。

我是一名程序设计师,编写过许多大型网络游戏。而最近我在网络世界中漫游的时候,发现我具有能很自由地和那些经过特殊加壳的网络ID联络的能力。

对了,网络世界!

现在人人都能通过脑关和网络世界相连,而相连之后人的思维则通过特殊的加密程序调制成网络世界的客体而出现在其上。不同的组织其加密程序是不同的,而大家却存活在同一个网络世界中。

我的工作就是编写那些公用的网络世界模块,比如这所医院就是以我的一个设计为蓝本而开发的。公共模块对大家都是有效的,不存在任何一个超级权限者能修改它,除非是直接在本机修改。

而有一些东西,是只对特定的加密模式有效的。比如军方的网络程序只有军方的加密模式才能启用。也正因为如此,近几年加密算法的发展成了最赚钱的行当。

而我的出现,打破了这一切。

虽然我为网络世界贡献了很多有用的公用模块,并且也为警方和军方,以及一些商业团体开发过一些私有模块,但是我的出现本身完全颠覆了加密。

因为,我可以任意和任意的加密模式的人物进行交流,而这一能力完全可以拓展,拓展为对任意私有模块进行入侵。

加密的意义将不复存在。

我就是丹·布朗笔下的“万能解密机”。

所以,我被FBI从中国捉拿到了这里。

我的身体现在不知道在哪里,但是我的精神在这里。

想想也对,我的存在危害了整个网络世界,乃至商界、军界和政界。所以他们要关住我也是应该的。

这么想来,这个医院的所有人都是如此。

比如柳飘絮。她的存在也是一个威胁,因为她能进入任何人的大脑去窃取情报,当然她的行为受到加密的限制。

还有人可以任意得到他想得到的(且能得到的)东西,而又的人能使他人产生强烈的幽闭恐惧症,而这种心理疾病在网络世界中是致命的,因为网络世界虚拟得再真实,也还是虚拟的,自然会给人一种幽闭的感觉。

其他人也是如此。

这个医院八楼就是对所有这种人的一个监狱!而他们为了避免我们得知真相,就在药中给我们吃阻塞记忆的药物!当然,它仅仅是一种针对大脑记忆体的电脑程序而已。

等等,有些事情不对。

对了,那医生,和我的蟑螂小强!

医生一定是FBI或者军方的!他们在关押我们的同时也在利用我们的能力!那半个月,我其实是在不停地帮他监视和审问犯人!可恶的医生!

而小强,则是FBI对头释放进来的一个破坏程序。

它通过躲进我的口袋的方法,融合我的加密特征躲过了探查程序——那道门——的拦截,然后又破坏医生给我的药——每天晚上它就是这么做的——并且不停地探查FBI的这个网络基地。

对,一定是这样,因为就是从我收小强做宠物开始,我的记忆开始逐渐恢复!

我终于想通了所有的事情!

我欢呼了。

“可惜,你的生命也到尽头了。”一个声音突然在我背后想了起来。

反捉拿

是柳飘絮。

虽然我没回头,但我知道是她。

“你是FBI的人。”我很冷静地说道。

“对。”她的声音更冷。

我转过了身,第一次认真打量站着的柳飘絮。

她的确很美。

我沉默了。因为有事不对。

“怎么了?”她问道。

“你不是柳飘絮。”我很肯定地回答。

“嗯?”她惊讶了。

“你没读我的心思,因为你根本不能读。你不是柳飘絮。”我很肯定地说,“你只是调用了她的外貌和情绪资料而已。如果我没看错的话,你是程序体。”

柳飘絮外貌的神秘女子很惊讶地看着我。

“我编写过太多这样的程序了。图灵机和本体还是很有差异的。”我更加自信了,因为她吃惊的表情给我以“假”的信号。

“你果然不是普通的人。还好现在药物的影响还没完全消失,不然再要控制你就麻烦了。”柳飘絮模样的神秘女子身体一抖,以焕然一新的语调说道。现在是本体,但不能肯定是不是柳飘絮。

“如果我没理解错的话,我的本体应该还在中国。”

“你怎么知道?”她的眉头一挑。

“因为,如果我的本体在你们控制范围内的话,你们何苦这么辛苦地关我在这个虚拟世界中?”我慢慢地说着,因为从她前面的话中我感觉到,只要等能力都恢复了,这个改编自我所写的囚牢程序的程序是绝对无法阻拦我的。

“的确,你的身体还在中国。而你的思想却在日内瓦的服务器里。”她笑了。

我一下子没反应过来她这句话的意思。

“你应该和她一样多看看新闻的。这里的新闻可都是真的。”她笑得更欢了,“我当初就很反对为什么要播放真的新闻,而不像那景色一样用虚拟的。”

我明白了——今天有一条新闻:美国总统正在日内瓦作短期访问。

这条新闻的意义就是:美国特工完全可能已经在那存放了我和广大神秘能力者的服务器的旁边。而一旦他们拔掉插头,那么我就会像《黑客帝国I》中的那些人一样软倒在地,然后从此从这个网络世界中消失,伴随着肉体的死亡。

我感到很害怕,因为现在所有神秘能力者的生命就在我的手中。其中最珍贵的是柳飘絮的命。我突然很奇怪,我是不是真的喜欢上柳飘絮了?

事情还是有转机的,因为我突然感觉我能感觉到眼前所有程序的代码了。

我能轻易破解任何加密程序,这是我的能力。而我的工作是编写代码,自然也会涉及到反编译代码。我有一套这方面最棒的工具,就放在我中国公司的服务器里。如果现在能连上线的话,一定很容易就能搞定眼前的这个FBI的。当然,如果我能破解这里的防护程序连接公司的服务器的话。

现在的我甚至能感受到眼前这个女子情绪信息在内存空间中的流动和改变。因为她已经被我“看”穿了。

她发觉了我的鬼主意。

她开枪了。

但是,她失误了。

因为,这把枪的程序也是我以前写的程序的改变体。

我甚至不需要反编译工具就能改变枪的一切,因为我都“看”穿了。

我改了几个内存地址。

子弹穿过了她的肩膀。

我很惋惜,因为柳飘絮的身体被我亲手弄伤了,虽然我肯定她只是借用了柳飘絮的外貌资料。

她倒了下去,身体在房间中消失为了一串零散的字符。

显然这个FBI放弃了以现在的身份和我对抗的幼稚打算。

我环顾了一下整个医院,完全肯定了它就是以我编写的医院程序为基础而改编的,还另外加了个壳。

不过这难不倒我,因为我能看穿一切加密手段,而我一生都在和代码打交道。

我修改了门的一个内存地址。这个地址记录的是开门的密码。门很容易地就开了。

我突然发觉我成了Neo

不,我甚至超越了Neo,因为只要我愿意,我可以把他的程序改写,而他不能改写我的,因为我就是“建筑师”。

我感到有N股数据洪流在向我涌来。

他们来了。

我突然玩心大起。

我改了整个医院八楼的结构。

因为它是以我设计的医院为蓝本的,所以修改非常迅速,迅速地让他们一头冲入的是一个厕所,而不是预料中的我的房间。

继续回忆

“你玩够了吗?”一个很熟悉的声音在我身后响起。

我讨厌这种“一个XXXX的声音从身后响起”的感觉,所以我修改了次程序,让她出现在了我的面前,而不是我转身去看她。

“很好玩是吗?”是那个给我蟑螂的老太太。

“难道你是先知?”我半开玩笑地说。

一切都太像《黑客帝国》了。

我甚至怀疑是不是进了某个以《黑客帝国》为蓝本开发的网络游戏当测试员——这样的工作我不是没做过。著名的网络游戏《玉溪天梦》就是我测试的,一共发现了两千多个Bug,这才保证了她成为中国第一个世界顶尖网络游戏。

“你还没有完成你的使命。”她真的以为她是先知了。

我发觉自从我重拾自我以后我开始变得狂傲了。

因为我发现在网络世界中我就是王者。因为我能“看”穿一切。

“我的使命?”我问道。

“对。你的使命。难道你忘了当初为什么主动被他们抓住了吗?”

“什么?”我愣住了。

新来的记忆告诉我,我的确是自己主动被他们抓住的,因为,我要实现一个目的——亲手抓住并毁了柳飘絮!

因为,她是我写的一个程序!一个具有自我意识,并能学习他人能力的电脑程序!

当初完成这个程序的时候并没给予她学习神秘能力的能力,但是就好像自然人的神秘能力是自发产生的一样,柳飘絮这个新一代的AI也自发诞生了这种神秘能力,而她的神秘能力就是——学习他人的神秘能力。而当一次柳飘絮在网络上被一个网络激进组织的思想污染以后,她就一直设法学习我“看”穿一切加密手段的技能,因为她想净化人类的思想——这是那个激进组织的激进思想。而她那能读取任何人思维的能力是我赋予她的,因为我找到了所有思维体的一个后门,只要能破解对方的加密程序就能利用这个后门。我为了躲避她的“学习”,更主要是为了亲手抓住他,所以特地选择了这个以我的囚牢程序为蓝本的程序作为捕捉地点。在这里,很多技能都受到了限制,所以柳飘絮的行动很有限,而我则由于可以“看”穿一切,同时这里的程序是我开发的,因而仍能自由行动。

想到这点,我突然很悲哀,因为我发现我竟然喜欢上了自己写的人工智能程序。

而我眼前的这个老太太,其实就是协助我完成这项任务的我的妻子。

这让我更加悲哀了,因为我竟然当着我妻子的面喜欢别的女人……

突然,一个庞大的数据洪流穿过了我的身体。

我已经拿到了服务器上的工具,因而现在做一些事情更方便了。而方才我为了玩那些FBI,特地用我的工具把这里的一些限制关闭了。

显然,在我的记忆全部恢复以前就行动太冒失了,因为柳飘絮已经学会了我的能力……

就在我为了我喜欢上我自己的程序,而且是当着我妻子的面,而感到悲哀时,她学会了我的技能。

捉拿

我看着我正喜欢着的柳飘絮,突然不知道应该怎么办了。

按理说,她是程序我是人,不管在思想方面我把她做得多完美,但程序终归是程序,我怎么能喜欢一个程序呢?何况还是我自己写的程序,那让我更多了层乱伦的痛苦。

她显然读取了我的思想,因为她说:“这有什么不好呢?为什么不和我一起净化人类呢?这是很崇高的事业啊!”

我妻子看着我。现在的她已经放弃了老太太的形象了,而改用她从大学时代就很喜欢的“怪盗基德”的形象。

我感到很滑稽——一个破碎的意愿,两个穿着病服的人,和一个怪盗。这样的场景很不合时宜。

我必须做出决定。

现在的柳飘絮具有一项我没有的技能,那就是她能看透别人的思想。虽然这功能是我赋予的,但是我自己却没有。我还没开发这样的工具给自然人用……真后悔当初没开发。

突然,我想到了一件事。

我以前为了和她聊天,训练过思考的同时行动。

现在,总算可以用上了。

虽然我很不舍得柳飘絮,但我还是行动了。

我佯装要修改她的程序,其实用我的工具写了一堆宏,在我佯装进攻的时候修改了医院八楼的结构,增加了不少限制。这一工作几乎是构思和行动同时完成的,因而虽然柳飘絮可以提前零点零几秒知道我行动的目的,但是依然无法阻止我的行动。因为我的经验比她丰富,而她作为程序体,不得不受到记忆分散的困扰,因而还是我占优势。

限制程序并不能起到太大的作用,因为她和我一样能看穿它们。但是我的优势在于,我熟悉我的能力,而她还需要磨合期。这段时间就是我能控制的一切。

我精心构造了一个程序环,利用她忙于调用分散在各个服务器上的记忆和熟悉我的能力的这个精力空隙,让她逐步入侵她自己的记忆体。

一个人工智能的记忆体是非常庞大的,因而不可能像人脑一样存放在单一的服务器上。战斗中她肯定会忽略一些服务器,而这些就是我的攻击目标。

我从公司服务器上下载的工具很方便地帮我找到了那些她需要的但暂时无法顾及到的服务器,利用她自己的能力对其进行了破坏。

她发出了痛苦的哀号,用不可思议的眼神看着我。

我流下了眼泪。

这不是演戏,是真的眼泪,因为我的皮肤感觉到了,而不是我的触觉程序感觉到了。

瞬间,就在她认为她已经掌握了网络世界中最强大的能力的瞬间,她被我彻底肢解了。

之后

之后,我小小地教训了一下FBI,因为他们竟然擅自动用我的能力。

在网络世界,没人敢违抗我,即使是FBI,或者五角大楼。而他们也无法拿我的本体怎么样,因为我的本体藏在一个他们绝对想不到的地方。别指望用逆向追查,因为这样的程序我要修改太容易了。

而即使我不在线,我也一样对我的本体很放心,因为柳飘絮不是第一个真正的AI

有很多个她的先辈在保护我的本体。

柳飘絮也不是最后一个AI

因为,有一天,我发现我能读取别人的思想了。

我发誓我没给自己写过什么程序。

我发觉我说话的声调和语气越来越机械化了,让我想到了“录音机”。

我发觉我开始打算净化人类了。

我发觉,原来我和她的战斗我输了,因为她把她的程序很巧妙地嵌入到了我的思维中。

这是病毒的手段,而她学会了。

我发觉,我逐步成了“柳飘絮”,一个我自己创造的人工智能。

她不是图灵机,她是人。

Posted March 31, 2006 by LostAbaddon in 微说

医院八楼(1)   Leave a comment

序幕

我也不知道自己是什么时候出现在这里的。

事实上,如果不是手腕上的纪录带,我可能连自己是谁都不知道。

叶枫,男,21岁,AB型血,病号3329

这是我对我自己所知道的所有一切。

一个医生模样的人告诉我我得了绝症,在这里接受治疗。

然后,一个护士模样的人每天都给我量血压,测心跳,并且给我各种各样的药吃。

我不知道我得的是什么病,当然,后来我知道即使知道了也没用,因为我隔壁病房的一个病友——那是我认识的第一个不是医生或者护士的人——在通过千方百计得知自己是什么病后,跳楼自杀了——从那以后我们每个人的窗子连原本的一分米宽度都拉不开了。

我不知道我是不是真的生病了,因为我从来都没感觉到自己哪里不舒服,除了完全无法回忆起过去的事以外。

我每天都去活动室锻炼身体,每天都去交谊厅看电视,有的时候也和护士小姐们一起打牌,而且每天都去洗澡——在这里能每天洗澡不是任何人都能享有的,因为很多人据说都被医生明令禁止洗澡,比如那些肠胃插导管的,或者每天都需要洗肾的。这让我有一种我和这里的人格格不入的感觉。

这里有些病人每天晚上都会发出哀号,有些则一看就觉得是没有明天的人,还有一些能在和你聊天的时候突然就再也不说话了。

但是,我从来不这样。

总之,我并没觉得自己有什么病,虽然医生对此显然不这么认为。

直到有一天,我终于知道自己为什么会在这所医院了为止。

录音机与惯例

今天是我有记忆以来的第七天。

过去的一个星期让我逐渐习惯了这里。我习惯了这里的所有周期,并且也开始习惯那让人想吐的药。

今天一大早,我就来到了交谊厅。坐在靠窗的一张躺椅上看着无聊的电视。

最近几天的生活让我体会到了医院八楼的单调。唯一算得上是变化的,就是今天我这么早起来的时候竟然发现护士长正带领着一群人追杀一个后来我得知叫做“蟑螂”的东西。

外面的世界似乎也是一成不变的。昨天看到一群大雁在天上飞过,算得上是这一个礼拜窗外景色的唯一不同了。

这里周围似乎是一个居住区,但很奇怪地从来没看到有什么公交车在街道上来往——我之所以知道“公交车”这么一个东西,主要是因为一次在看电视的时候看到了,然后从护士小姐那了解到了到底什么是“公交车”。我一直认为公交车可能并不属于这里,或者说公交车仅是电视和那些所谓的“闹市”中的产物。但是今天前面看电视的时候发觉新闻里说一辆公交车在郊外撞死了人。这让我很不解:连郊外都有公交车撞死人,为什么我们这里我所放眼能望到的区域中连一辆公交车都没有?

我独自盯着远方的太阳想着这个问题,没发觉一名女子已经站在了我的旁边。

“这是我的位子。”一个声音在我耳边响起。

我拉回了自己的思绪,转头看着这名女子。

“这是我的位子。”声调、语气都和刚才一样,让我脑海中突然想起了一个单词:“录音机”。我不知道“录音机”是什么东西,但似乎和这女子说话的方式有些相似的地方。

我边思考着“录音机”是什么,便站了起来,把位子让给了她。

我也不知道我为什么要让,因为似乎是我先来的,那么按理说这位子也是我的,虽然我不知道按的是什么理。

女子慢慢地坐了下来,开始看那无聊的电视。而我则坐在了她的旁边,继续思考什么是录音机。

“录音机是人类发明来记录声音的一种早期工具。”女子依然看着电视,说了一句和正在播送的新闻完全无关的话。

“哎?”

“录音机是人类发明来记录声音的一种早期工具。”完全一样的声调和语气,女子把话重复了边。

“哦,谢谢。”我很莫名地道了谢,虽然脑子还一时无法反应过来我为什么要谢她。

一分钟后,我突然很吃惊地看着那名女子:“你怎么知道我在想什么的?”因为我突然想到了,我根本没问过这女子什么是录音机。我只是在很用力地自己想着这问题而已。

“你是刚来的吧。”女子还是看着电视,语气和声调一点变化都没有。

“哎?”我又重复了次这个象声词。

“你是刚来的吧。”她也重复了次。

我突然感觉如果我再“哎”一下的话,我们俩人会一直反复“哎”和“你是刚来的吧”这个过程。

我突然想笑。

“没什么好笑的。你是刚来的。”女子似乎回答了自己的问题。

我又“哎”了次,这次疑问的语气更重了。

“既然你是刚来的,那我有义务告诉你一些事。”女子还是看着电视,还是那语气和音调,仿佛她存在的唯一理由就是像这样地说话一般。“你可以称这些是惯例,这是你的个人喜好。”她继续说道,完全没考虑我是不是想听,“这里是重症病患者隔离区,我们不能从这层楼离开,包括到上面去。我们会在这里度过我们余下的生活和生命,途中可能会由于病情好转而离开这里回家,但这样的次数不可能超过4次。也就是说,当你第五次回到这里的时候,就是你能永远离开这里的时候。”

“为什么告诉我这个?”我很好奇。她说我中途能回家4次,但是我根本不知道我家在哪里。而且,这叫什么惯例呢?告诉我我可以从现在开始为自己的死亡倒计时?这倒的确是一个不错的惯例。不知道住我隔壁的那位兄弟是第几次回来。

“因为这是惯例。”女子如是回答。

哦,原来所谓的惯例不是很惯例地让你知道,是他们很惯例地逼迫你知道。我释然。

然后,我和她开始看电视,不再说过一句话——虽然我一开始很想问她怎么会知道我在想什么的,但是后来当我在一旁的躺椅上睡着的时候,就把什么都忘了。

蟑螂与老太

我对医院八楼的格局一直很好奇。

虽然我一直能很自由地在八楼乱逛,但是我始终发现有很多病人他们的病房我一直找不到。

我曾经怀疑是不是七楼或者九楼的病人到我们八楼来串门的,但是自从那天那神秘的女人告诉我八楼是隔离区以后,我就放弃了这种念头——毕竟什么是“隔离”我还是知道的,即使不知道也有办法知道的——俗话说得好,“没知识也要有常识,没常识就去多看电视。”当然,我也不知道这句俗话是怎么出现在我脑海中的。

我经常能在交谊厅和活动室看到许多面容枯槁的老头老太在聊天,或者在打乒乓——关于这点我一直很好奇,因为那些老头老太的动作竟然很明显地比我要迅速。但是,他们虽然经常和我聊天,但是却从来不肯跟我打乒乓。

这天,我在交谊厅里坐在属于我自己的位子上思考一个突然闯进我大脑的词:“蟑螂”。

这里要说一下,那就是关于我的位子。自从那天那神秘女人的事情后,我特意留意了一下,原来这里每个人都有他们各自特属的位子。这个位子一经坐定,就属于他或她了。这也是这里的一个惯例,当然,是另一个邻居告诉我的。

我一边思考着什么是“蟑螂”,一边为我昨天想明白什么是“耗子”感到自豪。

当时我在走廊里散步,突然一群医生拖着一个狂笑的人从九楼的楼梯下来,把他送进了一间空病房。当时那人指着他正要被塞进去的房间的门大声叫道:“耗子,耗子,爱泥得阿牛耗子!(House, house, I need a new house!)”虽然我不知道他到底喊了些什么,但是他指着门大声喊“耗子”的意思还是很明显的:原来门就是“耗子”。

回忆到这里,我突然感慨我自己果然是一名智者啊。

电视里一天不停地放着的都是新闻。我不知道哪有那么多新闻能播。但是我更好奇的事,我周围什么时候坐满了老头老太们。

看来他们是在我专心感慨自己是一名智者的时候进来的。

一位老太太和和蔼地和我打了个招呼。

我曾和她下过整整一天的国际象棋——如果我没记错这个名字的话。

当时我就感到很惊讶,因为我在这一天中有护士给我送饭过来,而她则几乎一天什么都没吃。但是医院八楼神奇的事很多,相比之下这也就没什么神奇的了。比如一次我看到一位老伯在半空中飞,而周围的人则好像都习以为常的一样忙着各自的事;还有一次我在和一位老伯下围棋的时候,他凭空变出只烤鸭给我。毕竟我只在这里呆了一个星期多一点,而且关于那些有关这个世界的知识我现在几乎都不知道,所以还是放聪明点别像个傻冒一样到处乱问比较好。毕竟,我们都是绅士嘛,虽然都是生病的绅士。

那位老太太看我一脸严肃的表情,便很温和地问道:“又在想什么问题哪?”

“我在想,什么是‘蟑螂’。”我把我的疑问告诉了这个我在医院八楼认识的第八个人。

“哦,蟑螂啊。”说着,老太太从身后拿出一只长了六条细细枝条和两根更细长条的扁平的会动的东西出来,放在了我的大腿上。

那个小家伙瞬间就在我的腿上乱窜,还跑到了我身上。

我感到很痒。这是我在这里第一次感觉到除冷、热、痛以外的肢体感觉信息。

小家伙跑啊跑地,就跑到了我的脸上。

一瞬间,我感觉我应该尖叫的。但是,我不知道我为什么要尖叫。不过,为了尊重我的感觉,我还是叫了一声。

这一声似乎吓到那个小家伙了,它突然长出了两张薄片从我的身上离开,像上次那位老头一样飞了起来。

它飞得很快,一下就消失在了茫茫老头老太中。

老太太哈哈地笑了。

我也呵呵地笑了。

周围的老头老太转头过来看着我们,和那只应该已经彻底消失了的小东西,哈哈地笑了。

突然,心中又没来由地紧了一下。

我不知道为什么,但心中有一个感觉让我赶快离开。

这是自从那应该就是“蟑螂”的东西爬上我的脸后第二次有这样强烈的感觉。我开始讨厌这种感觉了。但我还是尊重我的感觉,向那位老太太道了声谢和别,离开了。

走在空荡荡的走廊上,我突然感到很冷。

我一直在思考我什么会突然感到要离开。

我路过了我每天晚上都来泡咖啡的热水机——哦,关于我泡咖啡这点你可千万别告诉别人哦,因为医生禁止我喝咖啡的。但我还是从我的一个邻居那拿了不少咖啡过来。不知道为什么,你总是能从他那里拿到很多医院里没有的东西。我一直怀疑他是不是经常没事就偷跑出去买东西了。

我每天晚上十二点的时候就出来泡咖啡。因为这个时候一般八楼只有两名护士,其中一名正在准备换班,而另一个一般出去查房了。我很惊讶我会想到钻那些可爱大姐姐的这个空子去做一件有违医生嘱咐的事。

我一般都是在杯子里倒好咖啡的粉末,然后一路小跑来到热水机这,倒好热水冲泡好咖啡,再慢慢地惬意地走回去。我邻居一直对我说为什么不早点时候用热水瓶来装热水,这样就不用冒险了。我则告诉他这才叫刺激,虽然我对刺激的含义还比较模糊。

我走向热水机,看着它笑了。

最近天气转冷,而且一转就很冷。这点新闻里也说了。昨天我出来泡咖啡的时候热水机正好热水用完了,在烧。我没想到会有这种情况发生,所以衣服穿得很少,又不高兴就这么回去,就在这里一边等烧水一边跳一边对手哈气来暖和暖和我的手——厄,等等,我想到了什么。

啊,对了,是热气。

最近天气很冷,所以昨天我哈气的时候看到嘴巴里冒出了很多白色的雾气。当时我还感到很神奇,还一个劲地哈气出来,直到我上气不接下气为止。

前面我笑的时候,嘴巴里也冒出了气。

但那些老头老太没有。

一个都没有。

我的背突然又冷了一下。

一个字出现在了我的脑海:“鬼”。

对这个字我还没什么特殊的概念,但就在它出现的瞬间,一种后来得知叫做“恐惧”的感觉侵袭了我的全身。

我立刻跑回了我的房间,把门紧锁了起来。

静里镜外

我一直呆在我的房间里没出来。

我很好奇我为什么要怕那些叫做“鬼”的东西。

我没理由怕那些哈气不会起白色雾气的东西的。

但是,来自已经被我遗忘了的记忆的一个声音则告诉我:我应该怕鬼。

于是,我开始怀疑过去的我是不是一个胆小鬼。

甚至我在想,是不是就是由于太过胆小了,所以得了个什么胆小综合症或者之类的东西,结果得着得着就成了重病患者,被送到这里来了。

这不是没可能的,因为一次我路过一个遥远的邻居的病房的时候,正好他的医生和几名看上去像医生但明显感觉不是医生的人出来,并在讨论什么东西。其间我就隐约听到医生说道:“……幽闭恐惧症很严重……可能有生命危险……”既然幽闭都能有恐惧症,那为什么胆小就不能有综合症呢?

第二天,我还是和往常一样地出现在了交谊厅和活动室,依然和那些老头老太聊天和下棋。

不过这次我多了个心眼。

我在注意这些所谓的可能是“鬼”的东西,除了哈气没白雾以外,和我还有什么不同。

到了下午的时候,我欣喜地发现,原来那些“鬼”在镜子里是没像的。这成了我以后特爱找镜子的原因,因为这样就不用等人在大冷天说话来判断他是不是鬼人了。

第三天早上,我很神奇地又碰到了那神秘女人。

细想起来,自从上次见到她到现在,似乎中间一直没看到过她。她是不是回家过一次了?

“没有。”还是上次的语气和声调,依然在我开口以前就回答了我的问题。只是,这次她的声音比上次更轻了。

从上次到现在,我已经对许多事情见怪不怪了,所以对她的这项对我而言很神奇的技能我也就不再感到大惊小怪了。不能老是像刘姥姥逛大观园一样的呀——这句话是我上一任邻居说的,他已经是第五次从医院八楼离开了,按照惯例是永远不可能回来了。

“那你去哪里了?”为了在和她聊天时能有“聊”的感觉,最近我一直在训练自己说话和思考同步——虽然训练的时候我从没想到过我还能见到她,更没想到是今天。

“九楼。”女子还是看着那24小时不间断的新闻。

“不是说我们在隔离区,不能去九楼的吗?”我很好奇。

“对。除非是医生要你去。”

“九楼好玩吗?”我很兴奋。

女子第一次转头过来看我。

她的眼神中没有一丝情绪,脸上也没有任何表情。看着她的眼睛仿佛在看两个黑洞——又是一个新词眼——但是我还是看得脸红了。

我可以用我的病号手环打赌以前的我一定是胆小鬼,因为我之所以脸红我可以很肯定是来自过去的记忆在作祟。

“黑洞是宇宙中最致密的星体,能吸收任何物质,包括光。它是时空奇异性的宏观体现。”女子还是老样子地回答着我脑海中的问题。

“哦,谢谢。”我也一样很机械地道谢。

“你会去九楼的,因为你能看到镜子里不存在的东西。到时候你就知道是不是好玩了,如果你还记得的话。”说完,她回头过去继续看新闻。

“那,你不能看到那些东西吗?”我突然对九楼好不好玩不感兴趣了,因为她提到了那些“镜子里不存在的东西”。

“不能。这里没有任何一个人和另一个人患同样的病。”这次女子的语气有了很小的变化。我不敢肯定是不是真的发生了变化,总之我感觉是由了一定的小变化。

我突然感到很沮丧。

“对了,你叫什么?”我曾想看看她的病号手环,但始终没有得逞。

“你看不到的。我根本没带在身上。”又恢复了平静。

“那,你叫什么?”我感觉又要陷入循环了。

“柳飘絮。”很简短。

“为什么不带手环?”另一个让我好奇地问题。

“让我想吐。”很明了。

“哦。”最简短。

这天余下的时间,我一直在想两个问题。一个是为什么只有我能看到“镜子里不存在的东西”?另一个问题是为什么这里没有两个人患同样的病?穿插着想的还有一个问题是:到底什么是“病”?

柳飘絮

我也不知道又过了多久。

日子一天天过去,但又总觉得似乎一天都没过去。

时间的流逝似乎已经不再重要了。或者,可以说对我们医院八楼的人来说,时间已经不再流逝了,除了那些开始倒计时的朋友们。

我还是和往常一样,和那些只有我能看到的老朋友们聊天打牌。

中午,我一个人在交谊厅吃着护士小姐送来的咖喱牛肉拉面。

对于这点我一直很想不通。

虽然我还是不知道我到底得的是什么病——据神秘女子所说,那就应该叫做“镜子中不存在者唯一可见症”了——但一个患了绝症重病的人毫无禁忌地吃着咖喱牛肉拉面,怎么都给人一种不合时宜的感觉。

最近,那只蟑螂时常出现在我的视野中。

我不知道是不是过去那位让我尖叫的兄弟,或者真的是它兄弟,反正在我的知识范围中,它长得很像我当初看到的那只。不过考虑到我以前从来没在医院八楼看到过依然活着的蟑螂,所以我相信就是那只。

当我嚼着牛肉块的时候,这位小兄弟“璞曾”一下飞到了我的碗延。

它抬起了身体,或者,我更认为是它抬起了头,向我挥舞了一下它的触角——这个专业术语是我向那位变出它的老太太问来的。

它的意思我认为是询问我是否能吃这碗面条,或者就是能否进到这咖喱澡堂中洗个澡。对于这个询问我自然很乐意给与邀请的,所以我点了下头。

于是,蟑螂一头钻到了面条里,奋力地往一块很大的牛肉划动着它的脚丫子——这个专业词汇是我的一个邻居告诉我的。当时他指着电视中的一个叫做“鸭子”的东西下面两个不断挥动着的肢体告诉我那是鸭子的脚丫子。我想这个称呼对蟑螂应该也是合适的。

我饶有兴趣地看着蟑螂在咖喱汤中的活动,感觉比看电视新闻有意思多了。

这时,神秘的女人又出现了。

距离第二次看到她,我也不知道又过了多少天。总之时日不短。

我在脑海中构思了句“你好”,结果不出我所料,她回了句:“你好。”

附带地,她还说了句:“你最终还是认为这样最方便。”

的确,经过我N天的思考,我发觉与其思考和说话同步,还不如不说话光思考来得方便。

我想了句“又去九楼了?”

她点了下头,仿佛很疲惫的样子。仿佛前面说了句太长的话了,这里要把字数节约回来。

我不再说话,或者说想话,继续观察我的蟑螂。它现在已经爬上了牛肉,正在贪婪地,厄,难道是在咬牛肉?

“这样不卫生的。”女子没看过我的碗,更没看过我的蟑螂,但她还是知道发生的一切。

有的时候我真的怀疑她得的是不是神病——一种让人成为神的病。我感觉如果你突然让我变成神我也一定会挺不住生病的,至少绝对不比我现在好多少,而我现在已经属于重病患者了。

“我得的不是神病。我是神通者。”她今天似乎很多话。

我没理她。因为我感觉像她这样的神病患者一定能知道我的感受的,既然如此她自然应该知道我会说什么。既然已经知道我会说什么了,那干脆直接就我的感受回答我未来可能问的问题好了。

“我得的不是神病。我是神通者。”她又重复了次。这次我明显感觉出了她的语气变化——她强调了“灵通者”三个字。

我依然没回答。因为,不管是神通者还是神病患者,在我的概念中都一样。

她又说了次“我得的不是神病。我是神通者。”这次比刚才更激动了。

我突然感到这样很好玩。一方面这是她第一次重复一句话三遍,我在考虑是不是让她就这样循环下去;另一方面,这是她第一次有感情色彩地回答我的问题,而我希望她的感情色彩更浓烈一点。

她不再说话了。

似乎生气了呢。

我依然拿着一根香菜在调戏我的蟑螂,她依然看着无聊的新闻。

“我决定把它当我的宠物。”我突然开口了。“宠物”一词是电视新闻里学来的。

她什么都没说。

我有点慌了。

“我打算叫它‘小强’。”我为我能取这么一个好名字感到自豪。

她还是什么都没说。

我更慌了。

我坐了下来,把小强收到了衣服口袋中。

我无聊地也开始看新闻了。至于那碗咖喱牛肉面,由于光顾着调戏蟑螂了,面凉了也没在意,现在让护士收拾掉了。

“你是灵媒。”她突然幽幽地开口了。

“哎?”我又发出了这个象声词。

“我是神通者,你是灵媒。”她还是那么机械地发出着声音。

“哎?”我再次发出了这个声音。

“所谓灵媒,就是那些能和不属于同一个世界的人联系的人。”

“比如,那些‘镜子里不存在的人’?”我总算发了句完整的音。

“对。而神通者,则是那些能直接接触别人精神世界的人。”

“原来如此。”我释然。

我突然想到了另外一个问题的解答,而且越想越有道理。

“对的。”看来她已经知道我想了些什么了。

我在想,她的那些知识是不是就是通过她的能力从别人的记忆中调用来的。

这时,护士小姐过来叫我了。

这很神奇。因为自从我入院到现在,还没哪次护士是在这个时候来叫我的。现在又不是检查时间。

不过,我还是很听话地站了起来。

离开交谊厅前,我回头对那神秘女子说到:“你叫柳飘絮是吧?”

她点了点头。

“很好的名字啊。”说完我就跟着护士小姐走了。

她微微叹了口气,幽幽地说了句“你要回家了。”但我并没察觉到。

Posted March 31, 2006 by LostAbaddon in 微说

我是BT我怕谁   Leave a comment

能在今天的这个时候,从我现在所在的地方发这篇帖子,说实话,是我事先根本没想到的。
因为,今天我们这通网了。
这个上帝的恩惠来得很意外。其令人惊讶的程度不下于小龙借给我一根256的内存条(关于这点稍后细表)。
现在先来回答回答SLOW和YCX提出的两个,或者,其实就是一个问题。
说某人对我的影响很大,其实很正常。因为,事实上SLOW对我的影响也很大,别的不说,就说我在南京路上经常迷路好了,这个问题影响了我整整半年多了。至于在买书方面,我发觉自从那次去了书城以后我买书的品位下降了……这个应该怪谁呢?
一般情况下,只要是我所熟识的人就必然能对我产生影响的,因为我感觉我是那种能很自然地被人影响的人。比如上学期经常和JASK、CLUBACAS混的时候就被影响得不行了。标准师范类猥琐笑“HIAHIAHIA”就是从CLUBACAS那学来的,还从JASK那学来了一些鄙视人的法门(两位在天之灵表打我哦~~)。
所以嘛,你们仅仅是注意到了你们想注意的内容而已,多注意注意那些不怎么注意的内容是有帮助的。不过话说回来了,想必你们对J和C一定也不了解,那么看到了那些应该能吸引人的东西而没被吸引就不奇怪了。比如我这次做的现代物理英语演讲的PPT一样,里面《馒头》的内容对那些没品尝过《馒头》滋味的人自然是一点吸引力都没有的了。
废话到此为止,下面转入正式的废话。
上个礼拜,我老妈一个人随队出去旅游玩了(上次出去旅游是去年年底,目的地是香港。结果是两万八的名表她用六千买了回来给我当礼物,让我崇拜了我妈一个月,直到我发觉那名表现在仅仅是橱窗里的又一点缀物品为止),而我爸到我舅舅家去,因为那天正好是我外婆祭日。我本来也打算去的,但是考虑到一个比较实际的问题:从我舅舅那到学校不是简单的一句“横穿上海”能概括和形容的,以及另外一个很实际的问题:事实上就我去了也没事做。所以,我就留在了学校没去。
这不是说我不在意外婆的祭日。事实上,以前她老人家还在的时候就一直对我很好。这可以追溯到我刚有记忆的时候,我外婆和我外公对我都很好,甚至比我哥,他们二老的孙子,还要好。
只是,我对于祭奠这种事情实在是一点都不在行。许多规矩我都不清楚,所以只能和我哥两人躲在他房间里看动画片。这样的事情多发生几次就反而把祭奠的意味给冲淡了。也因此,我和我妈都认为既然不想参加,那就不参加好了。
就着这样的原因,我留在了学校。
其实,在学校感觉挺好的,所以在上个星期的时候我就在想我这个星期是不是回家。不过,同样考虑到很实际的问题,我决定还是回家一次比较好。必然,半个月不回家似乎说不过去,而且也还有很多东西要拿,回家也有很多事要处理。
至此,我发觉我这人很适合出去流浪,因为对自己的窝竟然一点留恋的感情都没有。就好比我现在并不怎么为过去高中的离去而神伤,初中和小学的消逝对我的触动也不是很大,只有在见到那些相关的人和事的时候,才能唤醒部分封存的感伤。
上个星期到目前还能让我有记忆的,应该是他们卡拉OK海选第一场。能记住的原因是我竟然花了一个小时坐在那里听他们唱歌,虽然的确唱得很好。
我去那里的一个主要目的,是我曾答应要给SLOW两本侦探小说的,而我又风闻她们WXY组合要上台参加比赛,因而特地带好了书和MP3前去守株,结果待兔大业未遂。之后从某人口中得知她们已经直接飞升为了嘉宾,顿时为当时竟然在那里浪费一个小时而惋惜不已。去的另外一个目的,是曾答应某人要去听她们唱歌的。虽然只是口头协定(单方面),但我竟然在当时认为还是遵守这个可能被遗忘的协定比较好。毕竟我这人难得认真的,那么既然很难得的认真了,就不应该被自己的懒惰给放逐掉。结果,一失足成千古恨,回去的时候发现出来的时候挂着的ZOMBIEVITAL中的人物死掉了……
说到ZOMBIEVITAL,其实我感到很诧异的,因为它是单机游戏,而且是文字版的RPG。虽然我这人想象力一向很是旺盛,但是竟然能对着这么一个无聊的家伙连续通宵两天,就连SAGE都感到异常地诧异,仿佛感觉魔龙王加步在游说别人放下屠刀立地成佛一样。
继续卡拉OK的话题。
那天,其实我感觉他们组织得很失败……首先,作为部长在组织策划活动的时候连选手的上课时间都没弄清楚,让我感到非常失败(当然,当时没提出,因为不能当时就打击手下的积极性,而且,也要给手下在手下的手下面前一点面子)。然后吧,现场气氛的控制也不如人意。虽说是海选吧,也不能海了去了,不然你怎么收回来?而且大一的WCJ一副大一王者的气势,让人看了着实不爽。说你流氓吧,怎么看怎么感觉不如我们级ZN的小指头;而说你牛氓吧,我们四班随便拉一个人出来(特别是以前409的)就能把你给彻底比下去,一点抬头的余地都没有;说你牛吧,大二的90男和我们级非师范的人随便搞一个就能摆平你;最后只能说你BT了,但是我放眼全物理系,还没看到一个能BT B过我的……你说你作为一个BOSS的四大准则没有一个具备的,拽什么拽?搞小党派我不反对,但别拿出来和大龙对着干,不然早晚废了你,就好比当初我废掉大一的一个号称能力爆强的党员一样。最离谱的是一天晚上我CS正高兴,突然听到一群大一的男生狂喊“WCJ物理系第一大帅哥”的口号,顿时感到无语。你如果真长得帅也就算了,但是和我们级第一帅哥UKI比起来实在是差海了去了,小龙、元帅在他面前一站我都感觉是鲸鱼和灰尘的差距;再不然我拉太君、色狼上,感觉胜面也颇高。看他的脸只能感觉到所谓的“沧桑感”和“冷”,但就这两点就让那帮男生这么鬼哭狼嚎,甚至吼得比看见他们的青春偶像还要野兽,直让我感叹现在的年轻人果然是幼稚。
席间发生的最失败的一件事情,就是先来的选手歌都唱好了,而剩下的选手还没下课,于是就只能打发部长亲自上去唱歌,以及大一著名主持人上去脱口秀(感觉他的脱口秀实在不行,和我还是有差距啊。毕竟我比他多磨了两年的嘴皮子,不快也厚嘛)。他们又拉我上去,但我秉持着绝不K歌绝不演出的原则,宁死不屈。
上个礼拜另一件让我有影响的事情,就是卡拉OK前一天的所谓的“参议会”。我感觉就是给人一个正常发牢骚的场所,因为他们提的意见许多的确属于“牢骚”,因为压根就不可能实现。还有一些所谓的意见纯属瞎掰。我很莫名那些班委在想什么。不过到了会议的后期,一些意见还是很有建设性的。最有建设性的一个意见竟然都为小偷考虑好了:直接告诉小偷哪些屋子没人可以下手。
之前发生的很恶搞的事是我让GJ通知三班的班委,结果她很可爱地看着我说:你不是就让我通知我自己吗?我庐山瀑布汗。然后她说她以为我是群发两个年级所有人的的,我尼亚加拉瀑布汗。
会议的内容,对我们团学联的人是工作、学习和生活,而对于班委就是学习和生活。学习是想谈也不能谈的,所以对班委内容就是生活。因而我对我们班的人传达说会议主题就是“马导谈生活”。结果被XM抓住不放,做了他没准备过的挡箭牌,我欲哭无泪。
之后那天我和TSS、CFP等人打羽毛球从五点打到晚上十点,感觉总算彻底放松了——肯定很松,因为已经完全没力气了。我感到神奇的是我是场上唯一始终没休息过的人。我的体力果然是充沛的,这要感谢我爸和我以前初中的死党。
周六出去买了个电热锅,作为夜宵的有力工具,这也是值得记录的。
然后,这个礼拜就GAME OVER了。
周日XM买了电脑,于是本周第一天的第一个小时和第二个小时就是在3C中度过的。
这个礼拜需要记录的事其实也不多。
我参加了数学建模大赛,同组队员是两个统计系的。
我再一次去听了卡拉OK大赛,但是在开唱以前就离开了,因为竟然比通知的时间晚了一个小时还没开唱,让我失望到了极点。LTJ也不知道吸取上次的教训,让我差点喷血。
我打了2006年第一场篮球赛,而且手感是场上最好的,命中率几乎是50%,成了对手的重点看防对象。难得能让我这么开心的。这场篮球赛从一点打到四点半,我还感觉不过瘾。看来我的体力果然是突飞猛进了,因为这个礼拜一开始我就很有预感地开始锻炼我的腿部和手臂力量。这完全是无心的,但是却在那天派到了用场。
我和ZLQ、HANSCH玩CS从七点半到凌晨一点。期间的“拼刀”事件使得这个词组成了我们的又一个专有名词。
我借了HARRY POTTER AND THE HALFBLOOD PRINCE看。我发觉我有冲动买全套了。
我写了本年度第一部科幻小说《医院八楼》,元帅看了感觉很不错(特别是对前面设谜的部分,这也是我第一次尝试用这种风格写小说)。
这礼拜最值得书写的,有两件事情。
一个,是小龙给了我一根256的内存条。
其实事情本身并不复杂,但是我却感到我千小龙的太多了。
我和小龙是好朋友,但我感觉我千他的太多了。我也不知道为什么,反正就是有这么一种感觉。我感觉他帮了我很多忙,但我能帮他的却不多,或者说我能帮而没帮的太多了。同样的感觉以前也发生在好友周和徐身上。也许是我不懂珍惜朋友。其实我也不知道我每天在忙什么。除了忙一点工作方面的事情,别的时候似乎一直都在混。我的性格决定了我一定是经常在混的,但是一直这么混下去可不行啊。
第二,就是近代物理的演讲。
我们这组完全秉持了我的一贯作风,不到最后一天坚决不开始工作的。结果最后一天我通宵了一晚把东西都搞定了。我做的PPT以压倒的优势成为了最优PPT。其实这是废话。技术方面我超越对手太多了,而创意方面嘛,我都说了放眼物理系就没一个人能BT过我的,创意方面自然完全不在话下了。我的PPT绝对是巨搞笑的,在做的时候把我自己和CFJ都笑趴下不知多少次了——特别是我,做了一个通宵就笑了一个通宵。我发觉我以后不去当广告设计真的很浪费的。在完成这个任务前的一天,我帮四班的YM做了他们创业大赛的产品广告,完全可以成为现代商业广告的一个典范了,据说效果和笑果都很理想。不过,我还是觉得我退步了,因为以前高中的时候在老师面前不动声色地撒谎想一个绝妙的理由只要5秒就OK了,而且这个理由天衣无缝;而现在我想一个广告创意竟然需要一个通宵。
果然是人老了呀。
 
好了,废了这么多话,也该收一下了。

Posted March 31, 2006 by LostAbaddon in 世界叶

天弦乱颤之木可篇   2 comments

周一在外面晃悠的时候,突然不知为什么想到了CONAN。
现在细想起来,可能是因为之前半个小时的时候正好买了本CONAN。对于这本CONAN,其实我一直存在一个错觉。因为我感觉我是新的CONAN都买了的(自从能下它的论坛其下载速度变得难以忍受以后,我就开始买书了),而这第51本实在算不上新。但是,后来当我在福州路动漫店看到那只可爱的“俄罗斯蓝猫”的时候,我竟然傻傻地营业员:这是52本?结果遭人白眼。还有,当时我还不知道它是位俄罗斯姑娘,直到之后4个半小时的时候某人才告诉我它就是故事中的“三色猫”。之所以我能清楚地知道是4个半小时,是因为我从一出门就开始计算时间了。按照我的时间表,我应该是一点从家门出来,十五分上车,两点到达,十五处理好相机的事情,半从书城出来,三刻上地铁(这里安排十五分钟是因为,从地铁出来去书城我一直没问题,但是其逆过程一直被我弄错的。自从和SLOW逛了南京路以后就出现了这种灵异现象)。结果当年这部分的行程是:一点五分从家门出来,因为前一次出来的时候发觉忘带钱了……十三分上了车,两点整下车,八分钟后搞定相机问题,因为我证件什么都没带,所以爆快。三十二分从书城出来,正打算去地铁站的时候我突然想去买CONAN,但还是在三刻上了地铁,因为我突然想到莱福士下面也有地铁站的(以前够笨的)。上地铁以后的安排和我出门时的安排不同,因为当我看到徐家汇的时候我突然想去买DVD ROM。然后我安排三点一刻搞定DVD ROM,半上车。结果和我安排的非常吻合。因此,这后来的整个一天我都在试图安排我的行程,然后看看我在不关注时间流逝的情况下能否完成我的安排。最后的结果是:基本吻合。这显然表明我对我自己行动的时间控制又精进了。另一方面,这表明我更无聊了。
现在话题转回来,还是说CONAN。
我在申闵上想CONAN,是在想73的剧场版。到现在剧场版已经出了9部了,特别版7部,OVA也有4部了(这都托了以前某人给我CONAN纪念珍藏版BT种子的福),当我在申闵上晃颠的时候突然想到了要给剧场版来一个分类。事后发现这个想法非常弱智,因为9部剧场版被我分了8类……
第一部,《引爆摩天楼》。印入我脑海的是一个单词和一个名字:恐吓,《虎胆龙威》。它和《通往天国的倒记时》还不同,因为后者让我想到的是灾难片和9·11,后者则更类似《生死时速》。
第二部,《第十四个目标》。这被我归到了“侦探片”一类。虽然广大Cfans认为这部片子不怎么样,特别是和其后的《世纪末的魔术师》相比,但我还是很喜欢这一部的。它让我想到的词汇是:侦探,《无人生还》。同样的感觉还出现在特别版的《名侦探的聚会》,以及金田一的一个故事中(名字忘了……)。算是CONAN系列中比较侦探的一部。
第三部,《世纪末的魔术师》。是到目前为止最喜欢的一部。让我想到的词汇是:冒险,《印地安那·琼斯》系列。还好当时没想到《KINGKONG》,不然就吐倒一片了。整部影片一直给我“梦幻”的感觉,我也说不清为什么。可能是DORAAEMON的《大雄的云之王国》看多了——这是弱关联。
第四部,《瞳孔中的谋杀者》。第一次看的时候,特别是看到我们的小C同学在过山车上飙滑板的时候,我第一个想到的是“007”。这是一部动作片。让我想到的词汇是:动作,《007》。说它是动作片的另一个证据,就是小兰同学那能剁掉钢刀的空手道。自此以后我爸再说现代的古装电视剧多么无聊我都没感觉了。
第五部,《通往天国的倒记时》。其实我当初在车上的时候有过一次想把它和《引爆摩天楼》归在一起的,因为这两部的传承性实在太强了,连最后建筑物的结局都一样。当然,我个人觉得《引爆摩天楼》更好一点。不过,恐吓和恐怖袭击到底是不一样的,就好比悬疑和侦探是两个不同的通俗小说类别一样。想到的词汇:恐怖袭击。暂时想不出相似的电影……
第六部,《贝克街的亡灵》。这是到目前第二喜欢的电影。可能仅仅是因为其背景是HOLMES的LONDON,以及出现了AI泽田弘树的缘故吧。整体上说,这更像是解谜游戏,介于《世纪末的魔术师》和《第十四个目标》之间的类型。和电视剧版的《太阳、星星和月亮的故事》(不是意大利人强盗那集)一样。这种类型在C的漫画中也出现了很多次,比如《草箕之剑》(肯定不是这个“箕”)。想到的词汇:解谜,《网络惊魂》。
第七部,《迷的十字路口》。这是一部武打片,真的。不看推理部分而只看动作部分的话,绝对经典。《浪花剑士》那集则正好相反。在我后来复习漫画以前,还一直不知道C的足球是从哪来的,神奇了一个礼拜。想到的词汇:武打,任何一部古装电影。
第八部,《银翼的魔术师》。其实这部我很失望的。一直以为它能继承《世纪末的魔术师》的精彩的,结果,实在太失望了……想到的词汇:《紧急迫降》。
第九部,《水平线上的阴谋》。这部被我和《第十四个目标》一起归到了“侦探”类中。的确很侦探的一部 。最让我欣赏的是里面小五朗总算英雄了次。是到目前第三喜欢的,不知道多看两遍以后会不会更喜欢呢?想到的词汇:侦探,《双谋》,《TITANIC》。
据说第十部《名侦探们的安魂曲》是部集大成之作,所以异常期盼中。还有就是昨天在TENCENT论坛看到的长春要出新版的CONAN了(其实之前某人SPACE上说过了,后来去查了查),更加期盼ing。
今天一早起来发现我妈在做鸡蛋饼,很专业的水准呢~~以前初中的时候我妈也自己做过烧卖等东西,都是粉经典牛好吃的。可惜早上我没什么胃口,不然一定大吃一顿的。
然后又看了第三遍《三个受伤的警察》,还是感到很经典。其实当官的都是很阴险不要脸还假装很正直的,不然也当不了官只能当拼死拼活当垫脚石的。

Posted March 19, 2006 by LostAbaddon in 思维测地线

啦啦啦,又一个礼拜啦~~   4 comments

看名字,好象这个礼拜过得很开心一样。
当然,也不能说这个礼拜就很不愉快,因为愉快的时候的确有,比如看电影的时候。
客观地说的话,应该说这个礼拜是喜忧参半。
周一由于没有课,所以是在家呆到中午才出发去学校的。一大早看某人的SPACE的时候还在惊讶她怎么起床那么早,后来收到KXL的消息才发觉原来她都已经到学校了。这让我很惊讶,因为前一天她还在说今天不用上课,可以偷懒了,结果今天她却一大早就到学校去了。当然,事实上也不早了,只不过相对我来说是很早的。
睡到11点起床的一个结果是,早饭被我忽略了。然后我在忙着电脑方面的事情,并且一心想着尽早赶去南京路人民广场那,所以午饭也就被我忽略了。因而,当下午在南京路人民广场那混的时候的确感到很飘,有一种云里舞里的感觉。去人民广场的原始目的是去拿记者团的相机。但是,很无奈,搬家的时候把拿相机的单子给弄没了,因而整整五分钟的时间是被人当小偷看的。所以当我从CANON出来的时候,为了一扫郁闷之情就去了书城。当然,去书城本来就是我的目标之一。
在书城逛了半个小时,其实一直在思考这么一个问题:我是要买什么书的?本打算买《伤心至死·轮回》的,但是把书城翻了个个才发现,它还没被鬼古女夫妇写完,因而只能进行BROWN运动了。看到了《日本沉没》和《光晕》,以及《沙丘》,这都让我很有冲动买的,所以在那里晃悠对我绝对是一种勾引。
看了一阵子以后,就从小说区出来,然后我竟然走到了英语区。老实说,只是我第一次自己一个人在没有老爸老妈压迫下往英语区走。让我有这种想法的一个根源是我突然想学英语了,另一个想法是前一天某人告诉我说她想周游欧洲所以要去德国,这给了我一个学英语的冲动(两者的关联性似乎很弱哦)。但是,有这种冲动归有这种冲动,能不能把冲动化成行动是另一回事。最终我环顾了一下周围,决定还是去看电脑书籍比较好,反正那里也有英语。就好比我当初说我要学日语的,结果学了C#。说到这个想到了一件事。N个月前(大约是半年多以前……)和某人聊天的时候,她说“c pp”,我以为她说的是“cpp”,也就是“c++”,所以就说:“你要学c++?还不如学csharp呢!”后来才知道她的意思是:“see picture”。这是在昨天深夜翻MSN聊天记录的时候看到的。
之后,我看了看电脑书,突然感到一阵反胃,因为发觉太多电脑方面的书是垃圾了,所以最后还是走到了卖数学、物理书的地方去了。
在那里的一个重要任务,是寻找上次(N个月以前)来的时候看到的本关于分形和其上动力学的书,结果遍历群书发觉已经没了。但我又不高兴这么回去,就买了一本《泛函分析》一本《数学建模》一共80走了。这两本书我也比较想要的。如果有群论或者微分几何的就更好了。可惜,书城在这方面的书还不是一般的少。
之后在地铁上构思怎么回学校,突然看到了徐家汇的牌子。这在一瞬间让我想起来,我可以去买个DVD ROM的。这个想法在脑海中迅速膨胀,最后化成了行动。整个过程也就几秒中而已,于是我就在地铁门要关闭的最后一瞬间走出了地铁,前往太平洋电脑广场,买了一个LITEON的DVD ROM,180元。这个举动在这个星期看来是很英明的,因为我看了一星期电影(其中《龙少爷》竟然看了三遍,因为有三批人马在我寝室要求看这片子)。之后在拥挤的申闵上挤了一个小时来到学校。在SAGE的虎视耽耽下装好了DVD ROM,正打算看电影呢,某人就发来了短消息。于是那天剩下的时间是在短消息中度过的。
这天我最大的发现是:我对时间的控制果然精进了。我在出门的时候预期了一下我大约什么时候到人民广场,什么时候到CANON店,什么时候能从书城出来,以及什么时候能到学校。而在进行这些活动的时候我并没看过时间,最后竟然很精确地在我预期的时间完成了预期要完成的事。这点让我自己感到很惊讶。
另外,这天我买了CONAN的第51本。本来以为某人会想要的,结果发现我已经落伍了,她都已经看了N长时间了。想想也对,从我知道51本到我买下它,中间已经过了N个月了,而那某人是一个CONAN迷,自然早就买了的。
第二天,也就是周二,我翘掉了上午的课,因为我知道下午我还是要去人民广场的,那么上午总归要准备准备的。在老师办公室又接到了一些任务,比如去找指导老师,去修打印机,最重要的是去拿相机的凭证。这些东西都要在本部办理,所以我12点半的时候上了回本校的校车。这个错误的举动让我花了1个半小时在那辆高级牢房里,而价格却比我自己去本校还贵了2元。再次肯定了学校是剥削机构这个观点。
这次去本校,碰到了以前的辅导员于老,又去联系了教务处的老师确认了实验课的情况,所有应该联系的老师都联系了。我很吃惊我能在3点前完成这些工作。之后我又去了次人民广场,去拿相机。然后,又去了书城……在本校的时候,我在以前经常去的那家书店里买了本《星云III》,一本《无人生还》(阿婆的),30元。而在书城,我在一个新的日本本格推理大家的系列侦探小说、梦日貘除了《阴阳师》外的另一个著名系列《大唐鬼宴》、《达尔文阴谋》、《法老的诅咒》以及《爱伦·坡奖最精彩推理集》和《最恐怖惊悚集》中进行了相当痛苦的挣扎。还不算《1、2、3》系列、《伦敦桥》等N早以前就动心的小说呢。最后考虑了半个小时,买了那两本《集》。
这天下午在外的游荡倒没有前一天那么寂寞,因为很神奇地某人陪我在手机上聊了一下午的天。至此,我对最近和某人的聊天情况感到相当的诧异,因为之前的半年几乎都没怎么聊过,而自从她生日以后就又开始聊天了。
从徐家汇回来以后,唯一感到郁闷的是,由于走的时候是坐校车的,所以我的自行车还在校车那。我不得不步行到那里,然后才能骑车回来。
周三要献血。本来在和某人聊天的时候我就强调过这天要献血的,所以,老实说我还很期盼去献的。但是由于身份证复印件在前一天那相机的时候被扣留了,因为作为无证人员的我就丧失了献血的资格。不过我也没闲着,和由于身体问题而没献的KXL、B等人一同组成了后勤工作组,购买和搬运给献血者的奖励物资,并且四处奔波来核实运送献血者的车辆是否到位等问题。感觉我还是很适合做领导的。特别是早上在等老师的时候遇到XYF,和他就学习部的若干问题进行了讨论。我发觉这一年我的眼光已经和他们不同了。XYF要估计学习部和辩论队的事情,而我现在考虑问题则是从整个团学联来考虑的。越来越发觉其实我还是很能领导别人的。自我陶醉中……
这天晚些时候把两本《集》给了某人,因为她说她要看。后来她竟然责怪我说没告诉她那两本都是短篇集而她喜欢看长篇的。我感到很无奈,因为我明显说过的。
这天做的最伟大的事,是终于说服老师把大夏杯作品的上交日期拖延到了周五。其实,这是周二的工作,只不过这天向马导和NSW传达一下而已。然后深夜的时候把所有的参赛选手都核实了一遍。
这天中午在车库遇到了YK和某人。当时竟然激动地都没和某人打招呼。而当时YK看我的眼神则充满了惊讶,仿佛我出现在车库就好比炸弹出现在火柴店一样……
周四例行公事,把教育学给翘了。反正它对我是一门选修课,而且那老太婆上课极其无聊。但是,中午出去上课的时候(那是我这天第一次出寝室),却被别人给撞了。
当时我看到那人往他的左面转,自然我就往我的左面转,但是谁知道他突然又往我的右面我的左面转了过来。这一下让我淬不及防,见红了。右手右面的三个手指都废了。小指一块皮带肉翻了出来,另外两个手指基本不能弯曲。不过很神奇地,我竟然没感到痛。后来匆匆吃了午饭就去校医院,红药水一涂绑迪一贴就去上课了。手指们到现在还没复原。小指那块肉还是游离于本体外存在,拉开一看还能看到里面的内容。中指和无名指上的迂青还在,让我看了只想到一个词:尸斑。特别是中指,到现在还不能合拳,突在外面构成一个很嚣张的手势。
对于这个事件,除了当时在场的人以外,我立即告诉了两个人,一个是KXL,一个是某人。KXL立刻回了条短消息,祝我“天天‘鸿’运当头”,而某人则直到我上课时看到她下课并且估计她已经走到车库的时候才回过来消息,说她第一想到的是我骑呀骑呀就这么倒了,然后总结了“保重”两字,从此再无消息。
我对这件事的看法是:由于昨天没献出血来,所以今天飙红作为补偿。
周五又睡了一上午,下午浑浑噩噩地上了一堂郁闷的现代物理课,然后看了一晚上的电影,接着写了写《通稿2005》的补遗,就这么完了。中间的一个插曲是:现代物理上听一段英语广播。一开始的几分钟我都听懂了。但是后来我记一个东西的时候思想开了个小差,再收回来的时候就发现已经不知所云了。我当时想,我同组的人一定很认真地在听(看他们的样子的确很认真),所以我继续开小差也没什么大碍。可后来,谁知道,他们的想法和我是一样的!而我是组长哎~~于是,就这么中招了。另一个插曲是,晚上十一点将至的时候某人很兴奋地发消息告诉我:“由于抵制住了你的威逼利诱,昨天一天我只发了两条短消息。”让我感到我在她心中就是一代表了威逼利诱的恶魔……
今天回来以后,很难得地在MSN上看到SLOW还在,就和她聊了会天。发觉她很自卑,因为她一直说她很可能去不了德国……然后,我很惊讶地知道原来她也在朝南的那面,也就是说理论上从我这应该也能看到她的。这让我觉得我更应该保留拉窗帘的好习惯了,不然又要多一个人认为我是色狼了。

Posted March 18, 2006 by LostAbaddon in 世界叶

MBTI职业倾向测试   2 comments

今天在“宇宙之蓝”的SPACE上看到了传说中的MBTI职业倾向测试,就抱着一定要测出个变态的心理去了。结果如下:
 
您的人格类型是: ENTP(外向,直觉,思维,知觉)

您的工作中的优势:
  ◆ 出色的交际才能,能使别人对自己的观点感到兴奋
  ◆ 急切地“想知道盒子外面的世界”,能想出一些新的可能性
  ◆ 具有杰出的创造性地解决问题的技能
  ◆ 探索精神,创新意识,以及克服困难的勇气
  ◆ 兴趣爱好广泛,易于接受新的事物
  ◆ 有“走自己的路,让别人说去吧”的乐观主义激情
  ◆ 学习新知识的信心和动力都很强大
  ◆ 天生好奇心理,快速地搜集所需信息的技能
  ◆ 能够把握事情的全局,弄清思想和行为的长远影响
  ◆ 同时处理多个问题的能力
  ◆ 对别人的需要和意图的知觉
  ◆ 能灵活地适应新情况,有熟练的变换能力
  ◆ 在社交生活中不会感到拘谨,能舒适地适应大多数社交场合

您工作中可能存在的不足:
  ◆ 难于让自己有条不紊和富有条理性
  ◆ 经常不能区分事情的优先秩序
  ◆ 过于自信,可能会不恰当地运用自己的能力和社交经历
  ◆ 倾向于用“是不是有可能”来看待问题,而不是可能性的大小来衡量问题
  ◆ 很可能不切实际地许诺
  ◆ 对思维狭窄和思想顽固的人缺乏耐心
  ◆ 问题一旦解决,兴趣便不复存在
  ◆ 不喜欢按照传统的公式化的方式办事
  ◆ 对待细节和后续工作可能缺乏耐心,对自己要求不严
  ◆ 对事物容易感到厌倦,并且可能在不恰当的时候把注意力转向别的地方
  ◆ 不喜欢重复性的工作
  ◆ 对自己不信任的人耐心不够

 

测试地址:http://www.chinahrd.net/renliziyuan_yjh/qu_MBTI.asp

Posted March 12, 2006 by LostAbaddon in 世界叶

Maths Calculate 2.00 (Part IV)   Leave a comment

续PART III,在同一个文件内。
 
Public Function ComplexDeal(ByVal Inputs As String) As ComplexNumber  ‘复数与四元数内核基本运算计算模块
Dim Tmp As Integer ‘记录括号层次
Tmp = 0
Dim Funs As Integer ‘记录算符数目
Dim FunF() As String ‘记录算符性质
Dim FunP() As Integer ‘记录算符位置
Dim Nums() As ComplexNumber   ‘记录运算数据
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
Dim Tp As String
Dim Temp As ComplexNumber
Dim J As Integer
For I = 1 To Lens ‘算符和数据提取部分
    Tp = Mid(Inputs, I, 1)
    If Tp = "(" Then
        Tmp = Tmp + 1
    End If
    If Tp = ")" Then
        Tmp = Tmp – 1
    End If
    If CheckFun(Tp) And Tmp = 0 Then
        Funs = Funs + 1
        ReDim Preserve FunF(Funs)
        FunF(Funs) = Tp
        ReDim Preserve FunP(Funs)
        FunP(Funs) = I
        If Tp = "E" Then I = I + 1
    End If
Next I
If Tmp > 0 Or Tmp < -1 Then
    MsgBox "您输入的计算式括号组不封闭,请重新输入!", vbOKOnly, "ZL计算系统"
   Exit Function
End If
ReDim Nums(Funs + 1)
Set Nums(Funs + 1) = New ComplexNumber
ReDim Preserve FunP(Funs + 1)
FunP(Funs + 1) = Len(Inputs) + 1
If Funs > 0 Then
    For I = 1 To Funs + 1
        If FunP(I) = FunP(I – 1) + 1 And Not (I = 1 And FunF(1) = "-") Then
            MsgBox "您输入的计算式不正确,请重新输入!", vbOKOnly, "ZL计算系统"
            Exit For
        End If
        Tp = Trim(Mid(Inputs, FunP(I – 1) + 1, FunP(I) – FunP(I – 1) – 1))
        If Mid(Tp, 1, 1) = "(" Then
            Set Nums(I) = ComplexDeal(Mid(Tp, 2, Len(Tp) – 2))
        ElseIf Left(Tp, 1) = "+" Then
            Set Nums(I) = ComplexCalculate(Right(Tp, Len(Tp) – 1))
        ElseIf Left(Tp, 1) = "-" Then
            Set Nums(I) = ComplexCalculate(Right(Tp, Len(Tp) – 1))
            Nums(I).ePart = -Nums(I).ePart
            Nums(I).iPart = -Nums(I).iPart
            Nums(I).jPart = -Nums(I).jPart
            Nums(I).kPart = -Nums(I).kPart
        Else
            Set Nums(I) = ComplexCalculate(Tp)
        End If
    Next I
Else
    Set Nums(1) = ComplexCalculate(Trim(Inputs))
End If
‘运算部分
‘科学计数法
I = 1
Do While I <= Funs
    If FunF(I) = "E" Then ‘对于科学计数法计数的数后对复数的乘法需要显标乘号
        If Nums(I + 1).Modulus = 0 Then
            Set Temp = New ComplexNumber
        Else
            If Nums(I + 1).ePart <> 0 Then
                Set Temp = New ComplexNumber
                Temp.ePart = 10 ^ Nums(I + 1).ePart
                Set Temp = CMultiply(Nums(I), Temp)
            ElseIf Nums(I + 1).iPart <> 0 Then
                Set Temp = New ComplexNumber
                Temp.iPart = 10 ^ Nums(I + 1).iPart
                Set Temp = CMultiply(Nums(I), Temp)
            ElseIf Nums(I + 1).iPart <> 0 Then
                Set Temp = New ComplexNumber
                Temp.jPart = 10 ^ Nums(I + 1).jPart
                Set Temp = CMultiply(Nums(I), Temp)
            Else
                Set Temp = New ComplexNumber
                Temp.kPart = 10 ^ Nums(I + 1).kPart
                Set Temp = CMultiply(Nums(I), Temp)
            End If
        End If
    End If
    If FunF(I) = "E" Then
        Set Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Set Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘与、或、异或的运算
I = 1
Do While I <= Funs
    If FunF(I) = "&" Then
        Set Temp = ComplexMaths.CAnd(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "|" Then
        Set Temp = ComplexMaths.COr(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "#" Then
        Set Temp = ComplexMaths.CXOr(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "&" Or FunF(I) = "|" Or FunF(I) = "#" Then
        Set Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Set Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘开方和乘方运算
I = 1
Do While I <= Funs
    If FunF(I) = "^" Then
        Set Temp = ComplexMaths.CPower(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "" Then
        Set Temp = ComplexMaths.CRoot(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "^" Or FunF(I) = "" Then
        Set Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Set Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘乘法和除法运算
I = 1
Do While I <= Funs
    If FunF(I) = "*" Then
        Set Temp = ComplexMaths.CMultiply(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "/" Then
        If Nums(I + 1).Modulus = 0 Then
            MsgBox "计算中出现0除数!请检查方程!", vbOKOnly, "ZL计算系统"
            Exit Function
        End If
        Set Temp = ComplexMaths.CDivision(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "*" Or FunF(I) = "/" Then
        Set Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Set Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘加法和减法运算
I = 1
Do While I <= Funs
    If FunF(I) = "+" Then
        Set Temp = ComplexMaths.CPlus(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "-" Then
        Set Temp = ComplexMaths.CMute(Nums(I), Nums(I + 1))
    End If
    If FunF(I) = "+" Or FunF(I) = "-" Then
        Set Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Set Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
Set ComplexDeal = Nums(1)
End Function
Public Function Calculate(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant ‘内核单元算符计算模块总入口
If MathsState = Algebra And CalState = Algebra Then
    Calculate = AlgebraCalculate(Inputs)
ElseIf MathsState = complex Or CalState = complex Then
    Set Calculate = ComplexCalculate(Inputs)
End If
End Function
Private Function AlgebraCalculate(ByVal Inputs As String) As Double ‘实数运算内核单元算符计算模块
Dim Tmp As String
Tmp = Left(Inputs, 1)
Dim I As Integer
Dim Tp As String
Dim Tm As Double
Dim Temp As Double
Dim TT As String
If Val(Tmp) = 0 And Tmp <> "0" And Tmp <> "" And Tmp <> "+" And Tmp <> "-" Then ‘判断开头字母是否是数字
    If Tmp = "(" Then ‘判断是否是括号运算
        Tp = Mid(Inputs, 2, FindLast(Inputs, ")") – 2)
        If Len(Tp) = Len(Inputs) – 2 Then ‘判断是否仅是括号运算
            AlgebraCalculate = AlgebraDeal(Tp)
        ElseIf Right(Inputs, 1) = "!" Then
            AlgebraCalculate = CalClass(AlgebraDeal(Tp), Len(Inputs) – Len(Tp) – 2)
        End If
    Else
        I = InStr(Inputs, "(")
        If I > 0 Then
            TT = LCase(Left(Inputs, I – 1))
            Tp = Mid(Inputs, I + 1, Len(Inputs) – I – 1)
            If InStr(Inputs, ",") = 0 Then Tm = AlgebraDeal(Tp)
            Select Case TT
                Case "lg"
                    Temp = Log(Tm) / Log(10)
                Case "ln"
                    Temp = Log(Tm)
                Case "log"
                    I = InStr(Tp, ",")
                    If I > 0 Then
                        Temp = Log(Deal(Left(Tp, I – 1))) / Log(Deal(Right(Tp, Len(Tp) – I)))
                    End If
                Case "mod"
                    I = InStr(Tp, ",")
                    Tm = AlgebraDeal(Left(Tp, I – 1))
                    Temp = AlgebraDeal(Right(Tp, Len(Tp) – I))
                    If Temp <> 0 Then
                        Temp = Tm – Int(Tm / Temp) * Temp
                    End If
                Case "abs"
                    Temp = Abs(Tm)
                Case "dtr" ‘角度到弧度
                    Temp = Tm / 180 * Atn(1) * 4
                Case "rtd" ‘弧度到角度
                    Temp = Tm / Atn(1) / 4 * 180
                Case "exp"
                    Temp = Exp(Tm)
                Case "sin"
                    Temp = Sin(Tm)
                Case "cos"
                    Temp = Cos(Tm)
                Case "tan"
                    Temp = Tan(Tm)
                Case "ctg"
                    If Tan(Tm) <> 0 Then Temp = 1 / Tan(Tm)
                Case "arcsin"
                    If Tm ^ 2 < 1 Then Temp = Atn(Tm / Sqr(1 – Tm ^ 2))
                Case "arccos"
                    If Tm <> 0 Then Temp = Atn(Sqr(1 – Tm ^ 2) / Tm)
                Case "arctan"
                    Temp = Atn(Tm)
                Case "arcctg"
                    If Tm <> 0 Then Temp = Atn(1 / Tm)
                Case "sinh"
                    Temp = (Exp(Tm) – Exp(-Tm)) / 2
                Case "cosh"
                    Temp = (Exp(Tm) + Exp(-Tm)) / 2
                Case "tanh"
                    Temp = (Exp(Tm) – Exp(-Tm)) / (Exp(Tm) + Exp(-Tm))
                Case "cp" ‘连加
                    Temp = CPInterface(Tp)
                Case "ct" ‘连乘
                    Temp = CTInterface(Tp)
                Case "itg" ‘积分:函数,参数,开始,结束
                    Temp = IntegralInterface(Tp)
                Case "dft" ‘微分
                    Temp = DiffInterface(Tp)
                Case "rnd" ‘随机数
                    Temp = Rnd() * Tm
                Case "max" ‘数列中最大值
                    Temp = Max(Tp)
                Case "min" ‘数列中最小值
                    Temp = Min(Tp)
                Case "is", "?" ‘判断比较
                    If Realation(Tp) Then
                        Temp = 1
                    Else
                        Temp = 0
                    End If
                Case "sqr", "sqrt"
                    Temp = Sqr(Tm)
                Case Else ‘自定义函数处理入口
                    Temp = AlgebraFormulaCalculate(Inputs)
            End Select
        Else
            Temp = AlgebraFormulaCalculate(Inputs)
        End If
        AlgebraCalculate = Temp
    End If
Else
    Tmp = Right(Inputs, 1)
    If Tmp = "!" Then
        AlgebraCalculate = CalClass(Val(Inputs), CheckClass(Inputs))
    Else
        AlgebraCalculate = Val(Inputs)
    End If
End If
GoTo OUT:
ERR:
MsgBox "您输入的函数的参数有问题!", vbOKOnly, "ZL计算系统"
OUT:
End Function
Private Function ComplexCalculate(ByVal Inputs As String) As ComplexNumber  ‘复数与四元数运算内核单元算符计算模块
Dim Tmp As String
Dim I As Integer
Dim Tp As String
Dim Tm As ComplexNumber
Dim Temp As ComplexNumber
Dim TT As String
Tmp = Left(Inputs, 1)
TT = Mid(Inputs, 2, 1)
If TT = "" Then TT = "+"
If Val(Tmp) = 0 And Tmp <> "[" And Tmp <> "." And Tmp <> "0" And Tmp <> "" And Not (Tmp = "i" And CheckFun(TT)) And Not (Tmp = "j" And CheckFun(TT)) And Not (Tmp = "k" And CheckFun(TT)) Then ‘判断开头字母是否是数字
    If Tmp = "(" Then ‘判断是否是括号运算
        Tp = Mid(Inputs, 2, FindLast(Inputs, ")") – 2)
        If Len(Tp) = Len(Inputs) – 2 Then ‘判断是否仅是括号运算
            Set ComplexCalculate = Deal(Tp)
        End If
    Else
        I = InStr(Inputs, "(")
        If I > 0 Then
            TT = LCase(Left(Inputs, I – 1))
            Tp = Mid(Inputs, I + 1, Len(Inputs) – I – 1)
            Set Tm = ComplexDeal(Tp)
            Select Case TT
                Case "lg"
                    Set Temp = CDivision(CLog(Tm), NewCNum(CStr(Log(10)) & ",0,0,0"))
                Case "ln"
                    Set Temp = CLog(Tm)
                Case "log"
                    I = InStr(Tp, ",")
                    If I > 0 Then
                        Set Temp = CDivision(CLog(ComplexDeal(Left(Tp, I – 1))), CLog(ComplexDeal(Right(Tp, Len(Tp) – I))))
                    End If
                Case "abs"
                    Set Temp = New ComplexNumber
                    Temp.ePart = Tm.Modulus
                Case "exp"
                    Set Temp = CExp(Tm)
                Case "sin"
                    Set Temp = CSin(Tm)
                Case "cos"
                    Set Temp = CCos(Tm)
                Case "tan"
                    Set Temp = CDivision(CSin(Tm), CCos(Tm))
                Case "ctg"
                    Set Temp = CDivision(CCos(Tm), CSin(Tm))
                Case "sinh"
                    Set Temp = CSinh(Tm)
                Case "cosh"
                    Set Temp = CCosh(Tm)
                Case "tanh"
                    Set Temp = CDivision(CSinh(Tm), CCosh(Tm))
                Case "cp" ‘连加
                    Set Temp = CPInterface(Tp)
                Case "ct" ‘连乘
                    Set Temp = CTInterface(Tp)
                Case "itg" ‘积分:函数,参数,开始,结束
                    Set Temp = IntegralInterface(Tp)
                Case "dft" ‘微分:函数,变量,位置[,方向]
                    Set Temp = CDiffInterface(Tp)
                Case "rnd" ‘随机数
                    Set Temp = New ComplexNumber
                    Temp.ePart = Rnd() * Tm.ePart
                    Temp.iPart = Rnd() * Tm.iPart
                    Temp.jPart = Rnd() * Tm.jPart
                    Temp.kPart = Rnd() * Tm.kPart
                Case "sqr", "sqrt"
                    Set Temp = CRoot(Tm, NewCNum("2"))
                Case "ang" ‘复数的辐角主值
                    Set Temp = New ComplexNumber
                    Temp.ePart = Tm.Angle
                Case "rec" ‘复数的倒数
                    Set Temp = Tm.Reciprocal
                Case "con" ‘复数的共轭
                    Set Temp = Tm.Conjugate
                Case "rea" ‘复数的标量部分
                    Set Temp = NewCNum(Tm.ePart)
                Case "img" ‘复数的矢量部分
                    Set Temp = Tm
                    Temp.ePart = 0
                Case "ipt" ‘复数的i部分量
                    Set Temp = New ComplexNumber
                    Temp.iPart = Tm.iPart
                Case "jpt" ‘复数的j部分量
                    Set Temp = New ComplexNumber
                    Temp.jPart = Tm.jPart
                Case "kpt" ‘复数的k部分量
                    Set Temp = New ComplexNumber
                    Temp.kPart = Tm.kPart
                Case Else ‘自定义函数处理入口
                    Set Temp = ComplexFormulaCalculate(Inputs)
            End Select
        Else
            Set Temp = ComplexFormulaCalculate(Inputs)
        End If
        Set ComplexCalculate = Temp
    End If
Else
    Set ComplexCalculate = NewCNum(Inputs)
End If
GoTo OUT:
ERR:
MsgBox "您输入的函数的参数有问题!", vbOKOnly, "ZL计算系统"
OUT:
End Function
Public Function Formula(ByVal Formu As String, ByVal Param As String, Optional ByVal CalState As State = Algebra) As Variant  ‘处理具有未知数的代数式总入口
If MathsState = Algebra And CalState = Algebra Then
    Formula = AlgebraFormula(Formu, Param)
ElseIf MathsState = complex Or CalState = complex Then
    Set Formula = ComplexFormula(Formu, Param)
End If
End Function
Private Function AlgebraFormula(ByVal Formu As String, ByVal Param As String) As Double ‘处理具有实数未知数的代数式
‘参数之间以分号分隔,参数的未知数部分和数值部分由等号分开
Dim Num As Integer
Dim UnKnows() As String
Dim Numbers() As Double
Dim I As Integer
Dim J As Integer
Dim Tmp As Integer
Dim Lens As Integer
Dim Posi As Integer ‘等号分隔符位置
Dim Loca As Integer ‘分号分隔符位置
If Right(Param, 1) <> ";" Then Param = Param & ";" ‘规范输入的参数
Lens = Len(Param)
For I = 1 To Lens ‘提取参数中的未知数列表和数值列表
    If Mid(Param, I, 1) = "=" Then Posi = I
    If Mid(Param, I, 1) = ";" Then
        If Posi <= Loca + 1 Then
            MsgBox "您输入的参数错误!", vbOKOnly, "ZL计算系统"
            Exit Function
        End If
        Num = Num + 1
        ReDim Preserve UnKnows(Num)
        ReDim Preserve Numbers(Num)
        UnKnows(Num) = Mid(Param, Loca + 1, Posi – Loca – 1)
        Numbers(Num) = MathsCalculate(Mid(Param, Posi + 1, I – Posi – 1))
        Loca = I
    End If
Next I
‘开始替换输入的数学式中的未知数为所给数值
For I = 1 To Num
    Tmp = Len(UnKnows(I))
    If Mid(Formu, 1, Tmp) = UnKnows(I) And (CheckFun(Mid(Formu, Tmp + 1, 1)) Or Mid(Formu, Tmp + 1, 1) = "!") Then
        Lens = Len(Formu)
        Formu = Str(Numbers(I)) & Right(Formu, Lens – Tmp)
    End If
    Lens = Len(Formu)
    J = 2
    Do While J <= Lens – Tmp
        If Mid(Formu, J, Tmp) = UnKnows(I) And (CheckFun(Mid(Formu, J + Tmp, 1)) Or Mid(Formu, J + Tmp, 1) = ")" Or Mid(Formu, J + Tmp, 1) = "!") And (CheckFun(Mid(Formu, J – 1, 1)) Or Mid(Formu, J – 1, 1) = "(" Or Mid(Formu, J – 1, 1) = ",") Then
            Formu = Mid(Formu, 1, J – 1) & Str(Numbers(I)) & Mid(Formu, J + Tmp, Lens – Tmp – J + 1)
        End If
        Lens = Len(Formu)
        J = J + 1
    Loop
    If Lens > Tmp Then
        If Right(Formu, Tmp) = UnKnows(I) And CheckFun(Mid(Formu, Lens – Tmp, 1)) Then
            Formu = Left(Formu, Lens – Tmp) & Str(Numbers(I))
        End If
    Else
        If Right(Formu, Tmp) = UnKnows(I) Then
            Formu = Str(Numbers(I))
        End If
    End If
    Lens = Len(Formu)
Next I
‘开始运算
AlgebraFormula = Deal(Formu)
End Function
Private Function ComplexFormula(ByVal Formu As String, ByVal Param As String) As ComplexNumber  ‘处理具有复数未知数的代数式
‘参数之间以分号分隔,参数的未知数部分和数值部分由等号分开
Dim Parts() As String
Dim I As Integer
Dim Num As Integer
Dim UnKnows() As String
Dim Numbers() As ComplexNumber
Dim J As Integer
Dim Tmp As Integer
Dim Lens As Integer
Dim Posi As Integer ‘等号分隔符位置
Dim Loca As Integer ‘分号分隔符位置
Check: ‘规范输入函数
If Right(Param, 1) = ";" Then Param = Left(Param, Len(Param) – 1): GoTo Check
Parts = Split(Param, ";")
For I = 0 To UBound(Parts) ‘组合参数
    Formu = AdReplace(Formu, Left(Parts(I), InStr(Parts(I), "=") – 1), Right(Parts(I), Len(Parts(I)) – InStr(Parts(I), "=")))
Next I
‘开始运算
Set ComplexFormula = ComplexDeal(Formu)
End Function
‘系统辅助函数系统模块
Public Function FindLast(ByVal Inputs As String, ByVal Strs As String) As Integer  ‘检测STRS在INPUTS中出现的最后位置
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
For I = Lens To 1 Step -1
    If Mid(Inputs, I, 1) = Strs Then Exit For
Next I
FindLast = I
End Function
Public Function CheckEquation(ByVal Inputs As String) As Boolean ‘检测是否是内核算符
CheckEquation = False
Select Case LCase(Inputs)
    Case "ln", "lg", "log", "exp", "mod", "abs", "dtr", "rtd", "sin", "cos", "tan", "ctg", "sinh", "cosh", "tanh", "arcsin", "arccos", "arctan", "arcctg", "cp", "ct", "i", "d", "rnd", "max", "min", "is", "?"
        CheckEquation = True
End Select
End Function
Public Function CheckClass(ByVal Inputs As String) As Integer ‘检测是几阶阶乘
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
For I = 0 To Lens – 1
    If Mid(Inputs, Lens – I, 1) <> "!" Then Exit For ‘检测是否是阶乘符号
Next I
CheckClass = I
End Function
Public Function CalClass(ByVal Num As Double, ByVal Index As Integer) As Double ‘计算INDEX阶阶乘
Dim I As Integer
CalClass = 1
If Num > Index Then
    For I = 0 To Int((Num – 1) / Index)
        CalClass = CalClass * (Num – I * Index)
    Next I
End If
End Function
Public Function CheckFun(ByVal Inputs As String) As Boolean ‘检测是否是合法算符,可自由添加
CheckFun = False
Select Case Inputs
    Case "+", "-", "*", "/", "^", "", "&", "|", "#", "E"
        CheckFun = True
End Select
End Function
‘辅助函数系统模块结束
Private Function AdReplace(ByVal Inputs As String, ByVal ChaA As String, ByVal ChaB As String) As String ‘对单独变量的替代
Dim Lens As Integer
Lens = Len(Inputs)
Dim LenA As Integer
LenA = Len(ChaA)
Dim I As Integer
Dim Tmp As String
AdReplace = Inputs
If Lens < LenA Then Exit Function
If Lens = LenA Then
    If Inputs = ChaA Then
        AdReplace = ChaB
    End If
    Exit Function
End If
If Left(Inputs, LenA) = ChaA Then
    Tmp = Mid(Inputs, LenA + 1, 1)
    If CheckFun(Tmp) Or Tmp = " " Or Tmp = "!" Or Asc(Tmp) = 13 Then
        Inputs = ChaB & Right(Inputs, Lens – LenA)
        Lens = Len(Inputs)
    End If
End If
I = 2
Do While I <= Lens – LenA
    If Mid(Inputs, I, LenA) = ChaA Then
        Tmp = Mid(Inputs, LenA + I, 1)
        If CheckFun(Tmp) Or Tmp = " " Or Tmp = "!" Or Asc(Tmp) = 13 Or Tmp = ")" Or Tmp = "," Then
            Tmp = Mid(Inputs, I – 1, 1)
            If CheckFun(Tmp) Or Tmp = " " Or Asc(Tmp) = 10 Or Tmp = "(" Or Tmp = "," Or CStr(Val(Tmp)) = Tmp Then
                Inputs = Left(Inputs, I – 1) & ChaB & Right(Inputs, Lens – LenA – I + 1)
                Lens = Len(Inputs)
            End If
        End If
    End If
    I = I + 1
Loop
If Right(Inputs, LenA) = ChaA Then
    Tmp = Left(Right(Inputs, LenA + 1), 1)
    If CheckFun(Tmp) Or Tmp = " " Or Tmp = "," Or Asc(Tmp) = 10 Or CStr(Val(Tmp)) = Tmp Then
        Inputs = Left(Inputs, Lens – LenA) & ChaB
    End If
End If
AdReplace = Inputs
End Function

Posted March 12, 2006 by LostAbaddon in 赛伯铁客

Maths Calculate 2.00 (Part III)   Leave a comment

Public Enum State ‘记录计算程序所在的计算状态
    Algebra = 0 ‘实数计算
    complex ‘复数、四元数计算
End Enum

Public Gap As Single ‘定义积分微分步长
Dim Total As Integer
Dim Formulae() As String
Dim FormulaNames() As String
Dim MathsState As State

‘总体计算控制模块
Public Function MathsCompute(ByVal Inputs As String) As String ‘所有运算的总入口,负责数学式的规范化
Dim Lens As Integer
Dim I As Integer
Dim TempFormula As String
Dim CalculateFormula() As Integer ‘记录要计算的数学式的编号
Dim T As Integer
Dim J As Integer
Dim strTmpA As String, strTmpB As String

MathsState = Algebra ‘计算状态初始化
J = 0 ‘函数记录初始化
Total = 0
ReDim Formulae(0)
ReDim FormulaNames(0)

If Len(Trim(Inputs)) = 0 Then Exit Function ‘判断输入是否为空
If Asc(Right(Inputs, 2)) <> 13 And Asc(Right(Inputs, 1)) <> 10 Then Inputs = Inputs & Chr(13) & Chr(10) ‘规范输入的数学式组
Inputs = Replace(Inputs, ")(", ")*(") ‘缩写规范化
Inputs = Replace(Inputs, "][", "]*[")
Inputs = Replace(Inputs, "()", "(0)") ‘检测空括号
Inputs = Replace(Inputs, "[]", "[0]")
Lens = Len(Inputs)
If InStr(Inputs, "[") > 0 Then
    If InStr(Inputs, "]") > 0 Then
        MathsState = complex
    Else
        MsgBox "您输入的复数有问题,请检查您的输入!", vbOKOnly, "ZL计算系统"
    End If
End If
For I = 1 To Lens – 1 ‘提取每组数学式信息
    strTmpA = Mid(Inputs, I, 1)
    If MathsState = Algebra Then ‘判断是否是复数运算
        If strTmpA = "i" Or strTmpA = "j" Or strTmpA = "k" Then
            If I = 1 Then
                strTmpB = Mid(Inputs, 2, 1)
                If CheckFun(strTmpB) Or strTmpB = " " Or Asc(strTmpB) = 13 Or Tmp = "!" Then MathsState = complex
            Else
                strTmpB = Mid(Inputs, I – 1, 1)
                If CheckFun(strTmpB) Or strTmpB = " " Or Asc(strTmpB) = 10 Or strTmpB = "(" Or strTmpB = CStr(Val(strTmpB)) Or strTmpB = "," Then
                    strTmpB = Mid(Inputs, I + 1, 1)
                    If CheckFun(strTmpB) Or strTmpB = " " Or Asc(strTmpB) = 13 Or strTmpB = ")" Or strTmpB = "," Or strTmpB = "!" Then MathsState = complex
                End If
            End If
        End If
    End If
    If Asc(Mid(Inputs, I, 1)) = 13 Then
        If Asc(Mid(Inputs, I + 1, 1)) = 10 Then
            Total = Total + 1
            ReDim Preserve Formulae(Total)
            ReDim Preserve FormulaNames(Total)
            TempFormula = Mid(Inputs, J + 1, I – J – 1)
            For T = 2 To Len(TempFormula)
                If Mid(TempFormula, T – 1, 2) = ")=" Or Mid(TempFormula, T, 1) = ":" Then Exit For
            Next T
            If T < Len(TempFormula) Then
                FormulaNames(Total) = Trim(Left(TempFormula, T – 1))
                Formulae(Total) = Trim(Right(TempFormula, Len(TempFormula) – T))
            Else
                FormulaNames(Total) = "CALCULATE"
                Formulae(Total) = Trim(TempFormula)
            End If
            J = I + 1
        End If
    End If
Next I

If InStr(LCase(Inputs), "complex:") > 0 Then MathsState = complex
‘把定义式和要计算的式分开
T = 0
For I = 1 To Total ‘检查有多少需要计算的式子
    Select Case LCase(FormulaNames(I))
        Case "calculate", "complex" ‘计算
            T = T + 1
            ReDim Preserve CalculateFormula(T)
            CalculateFormula(T) = I
            MathsCompute = MathsCompute & Formulae(I) & "=" & Trim(CStr(MathsCalculate(Formulae(I)))) & ";" ‘开始计算
        Case "gap" ‘设置积分间隔
            Gap = Val(Formulae(I))
    End Select
Next I

‘状态还原
MathsState = Algebra
Gap = 0.0002
End Function
Public Function FormulaCalculate(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant ‘转换函数为MATHSCALCULATE可读方式和自定义常数处理
If MathsState = Algebra And CalState = Algebra Then
    FormulaCalculate = AlgebraFormulaCalculate(Inputs)
ElseIf MathsState = complex Or CalState = complex Then
    Set FormulaCalculate = ComplexFormulaCalculate(Inputs)
End If
End Function
Private Function AlgebraFormulaCalculate(ByVal Inputs As String) As Double ‘实数用转换函数为MATHSCALCULATE可读方式和自定义常数处理
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
Dim J As Integer
Dim T As Integer
Dim Tmp As String
Dim Params As String ‘记录自定义函数参数序列
Dim Numbers As String ‘记录输入数值序列
Dim TmpParam() As String
For I = 1 To Lens
    If Mid(Inputs, I, 1) = "(" Then Exit For
Next I
If I < Lens – 1 Then
    Tmp = Left(Inputs, I – 1)
    Numbers = Mid(Inputs, Len(Tmp) + 2, Len(Inputs) – Len(Tmp) – 2)
    If Right(Numbers, 1) <> "," Then Numbers = Numbers & ","
    For J = 1 To Total
        If LCase(Left(FormulaNames(J), 1 + Len(Tmp))) = LCase(Tmp) & "(" Then ‘和自定义函数进行比较
            Params = Mid(FormulaNames(J), Len(Tmp) + 2, Len(FormulaNames(J)) – Len(Tmp) – 2)
            Tmp = Formulae(J) & "@"
            If Right(Params, 1) <> "," Then Params = Params & "," ‘规范化参数
            Exit For
        End If
    Next J
    ‘开始检测自定义函数的参数序列和所给的数值序列是否匹配
    J = 0
    T = 0
    For I = 1 To Len(Numbers)
        If Mid(Numbers, I, 1) = "," Then
            J = J + 1
            ReDim Preserve TmpParam(J)
            TmpParam(J) = "=" & Mid(Numbers, T + 1, I – T – 1) & ";"
            T = I
        End If
    Next I
    For I = 1 To Len(Params)
        If Mid(Params, I, 1) = "," Then J = J – 1
    Next I
    ‘开始组合参数
    T = 0
    For I = 1 To Len(Params)
        If Mid(Params, I, 1) = "," Then
            J = J + 1
            TmpParam(J) = Mid(Params, T + 1, I – T – 1) & TmpParam(J)
            T = I
        End If
    Next I
    For I = 1 To J
        Tmp = Tmp & TmpParam(I)
    Next I
    AlgebraFormulaCalculate = MathsCalculate(Tmp)
Else ‘常数处理模块
    AlgebraFormulaCalculate = innerConst(Inputs)
    For I = 1 To Total ‘检测用户自定义常数表,可覆盖预定义常数
        If FormulaNames(I) = Inputs Then
            AlgebraFormulaCalculate = Val(Deal(Formulae(I)))
            Exit For
        End If
    Next I
End If
End Function
Private Function ComplexFormulaCalculate(ByVal Inputs As String) As ComplexNumber  ‘复数用转换函数为MATHSCALCULATE可读方式和自定义常数处理
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
Dim J As Integer
Dim T As Integer
Dim Tmp As String
Dim Params As String ‘记录自定义函数参数序列
Dim Numbers As String ‘记录输入数值序列
Dim TmpParam() As String
For I = 1 To Lens
    If Mid(Inputs, I, 1) = "(" Then Exit For
Next I
If I < Lens – 1 Then
    Tmp = Left(Inputs, I – 1)
    Numbers = Mid(Inputs, Len(Tmp) + 2, Len(Inputs) – Len(Tmp) – 2)
    If Right(Numbers, 1) <> "," Then Numbers = Numbers & ","
    For J = 1 To Total
        If LCase(Left(FormulaNames(J), 1 + Len(Tmp))) = LCase(Tmp) & "(" Then ‘和自定义函数进行比较
            Params = Mid(FormulaNames(J), Len(Tmp) + 2, Len(FormulaNames(J)) – Len(Tmp) – 2)
            Tmp = Formulae(J) & "@"
            If Right(Params, 1) <> "," Then Params = Params & "," ‘规范化参数
            Exit For
        End If
    Next J
    ‘开始检测自定义函数的参数序列和所给的数值序列是否匹配
    J = 0
    T = 0
    For I = 1 To Len(Numbers)
        If Mid(Numbers, I, 1) = "," Then
            J = J + 1
            ReDim Preserve TmpParam(J)
            TmpParam(J) = "=" & Mid(Numbers, T + 1, I – T – 1) & ";"
            T = I
        End If
    Next I
    For I = 1 To Len(Params)
        If Mid(Params, I, 1) = "," Then J = J – 1
    Next I
    ‘开始组合参数
    T = 0
    For I = 1 To Len(Params)
        If Mid(Params, I, 1) = "," Then
            J = J + 1
            TmpParam(J) = Mid(Params, T + 1, I – T – 1) & TmpParam(J)
            T = I
        End If
    Next I
    For I = 1 To J
        Tmp = Tmp & TmpParam(I)
    Next I
    Set ComplexFormulaCalculate = MathsCalculate(Tmp)
Else ‘常数处理模块
    Set ComplexFormulaCalculate = New ComplexNumber
    ComplexFormulaCalculate.ePart = innerConst(Inputs)
    For I = 1 To Total ‘检测用户自定义常数表,可覆盖预定义常数
        If FormulaNames(I) = Inputs Then
            Set ComplexFormulaCalculate = ComplexDeal(Formulae(I))
            Exit For
        End If
    Next I
End If
End Function
Public Function MathsCalculate(ByVal Inputs As String) As Variant   ‘代数式和函数的计算入口
Dim I As Integer
Dim J As Integer
Dim T As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
If InStr(Inputs, "@") > 0 Then
    For I = 1 To Lens
        If Mid(Inputs, I, 1) = "@" Then J = J + 1: T = I
    Next I
End If
If J = 0 Then
    If MathsState = Algebra Then
        MathsCalculate = Deal(Inputs)
    ElseIf MathsState = complex Then
        Set MathsCalculate = Deal(Inputs)
    End If
ElseIf J = 1 Then
    If MathsState = Algebra Then
        MathsCalculate = Formula(Trim(Left(Inputs, T – 1)), Trim(Right(Inputs, Lens – T)))
    ElseIf MathsState = complex Then
        Set MathsCalculate = Formula(Trim(Left(Inputs, T – 1)), Trim(Right(Inputs, Lens – T)))
    End If
Else
    MsgBox "您输入的数学公式错误!", vbOKOnly, "ZL计算系统"
End If
End Function
‘总体控制模块结束

‘内置常数模块
Public Function innerConst(ByVal Inputs As String) As Double ‘为公开模块
Select Case Inputs
    Case "pi", "math.pi", "Math.pi"
        innerConst = Atn(1) * 4
    Case "E", "math.e", "Math.e"
        innerConst = Exp(1)
    Case "c", "phy.c", "Phy.c"
        innerConst = 299792458#
    Case "G", "phy.G", "Phy.G"
        innerConst = 0.00000000006672
    Case "g", "phy.g", "Phy.g"
        innerConst = 9.807
    Case "h", "phy.h", "Phy.h"
        innerConst = 6.626176E-34
    Case "hb", "phy.hb", "Phy.hb"
        innerConst = 6.626176E-34 / (Atn(1) * 8)
    Case "Na", "Che.Na", "cha.Na", "Phy.Na", "phy.Na"
        innerConst = 6.022142E+23
    Case "K", "phy.K", "Phy.K"
        innerConst = 1.3806503E-23
    Case "R", "phy.R", "Phy.R"
        innerConst = 8.31447
    Case "e", "phy.e", "Phy.e"
        innerConst = 1.602176E-19
    Case "me", "phy.me", "Phy.me"
        innerConst = 9.10938189E-31
    Case "mp", "phy.mp", "Phy.mp"
        innerConst = 1.67262158E-27
    Case "mn", "phy.mn", "Phy.mn"
        innerConst = 1.6749286E-27
    Case Else
        innerConst = 0
End Select
End Function
‘内置常数模块结束

‘连续运算模块
Public Function ContinumCalculate(ByVal Inputs As String, ByVal Var As String, ByVal Start As Double, ByVal Finish As Double, ByVal Kind As Boolean, ByVal Integral As Boolean) As Double
‘连续运算总入口,负责各种连续运算的分类
‘KIND真为连乘,KIND假为连加;INTEGRAL真为积分,假为普通连加
Dim I As Double, J As Integer
Dim Lens As Integer
Lens = Len(Var)
Dim Lengs As Integer
Dim TmpA As String, TmpB As String
Dim Tmp As String
Dim Answer As Double
Dim Result As Double
Answer = 0
If Kind Then Answer = 1
Dim STP As Single
STP = 1
If Integral Then STP = Gap
If STP = 0 Then STP = 0.0002
Tmp = Inputs
For I = Start To Finish Step STP
    Inputs = Tmp
    Lengs = Len(Inputs)
    If Lengs > Lens Then
        TmpA = Mid(Inputs, Lens + 1, 1)
        If LCase(Left(Inputs, Lens)) = LCase(Var) And (CheckFun(TmpA) Or TmpA = "!") Then
            Inputs = Str(I) & Right(Inputs, Lengs – Lens)
        End If
        Lengs = Len(Inputs)
        J = 2
        Do While J < Lengs
            TmpA = Mid(Inputs, Lens + J, 1)
            TmpB = Mid(Inputs, J – 1, 1)
            If LCase(Mid(Inputs, J, Lens)) = LCase(Var) And (CheckFun(TmpA) Or TmpA = "!" Or TmpA = ")") And (CheckFun(TmpB) Or TmpB = "(") Then
                Inputs = Left(Inputs, J – 1) & Str(I) & Right(Inputs, Lengs – Lens – J + 1)
                Lengs = Len(Inputs)
            End If
            J = J + 1
        Loop
        TmpB = Mid(Inputs, Lengs – Lens, 1)
        If LCase(Right(Inputs, Lens)) = LCase(Var) And CheckFun(TmpB) Then
            Inputs = Left(Inputs, Lengs – Lens) & Str(I)
        End If
        Lengs = Len(Inputs)
    ElseIf Lengs = Lens Then
        Inputs = Str(I)
    End If
    Result = MathsCalculate(Inputs)
    If Kind Then
        Answer = Answer * (Result ^ STP)
    Else
        Answer = Answer + Result * STP
    End If
Next I
ContinumCalculate = Answer
End Function
Public Function CContinumCalculate(ByVal Inputs As String, ByVal Var As String, ByVal Start As ComplexNumber, ByVal Finish As ComplexNumber, ByVal Kind As Boolean, ByVal Integral As Boolean) As ComplexNumber
‘复数与四元数连续运算总入口,负责各种连续运算的分类
‘KIND真为连乘,KIND假为连加;INTEGRAL真为积分,假为普通连加
Dim STP As Single
STP = 1
If Integral Then STP = Gap
If STP = 0 Then STP = 0.0002
Dim Direction As ComplexNumber
Set Direction = CMute(Finish, Start)
Dim Tmp As Double
Tmp = Direction.Modulus
If Tmp = 0 Then Set CContinumCalculate = Direction: Exit Function
Direction.ePart = Direction.ePart / Tmp * STP
Direction.iPart = Direction.iPart / Tmp * STP
Direction.jPart = Direction.jPart / Tmp * STP
Direction.kPart = Direction.kPart / Tmp * STP
Dim I As Double
Dim Result As New ComplexNumber, Answer As New ComplexNumber
If Kind Then Answer.ePart = 1
Dim Temp As New ComplexNumber
Temp.ePart = Start.ePart
Temp.iPart = Start.iPart
Temp.jPart = Start.jPart
Temp.kPart = Start.kPart
Dim Forum As String
For I = 0 To Tmp Step STP
    Forum = AdReplace(Inputs, Var, Temp)
    Set Result = Deal(Forum)
    If Integral Then
        Set Answer = CPlus(Answer, CMultiply(Result, Direction))
    Else
        If Kind Then
            Set Answer = CMultiply(Answer, Result)
        Else
            Set Answer = CPlus(Answer, Result)
        End If
    End If
    Temp.ePart = Temp.ePart + Direction.ePart
    Temp.iPart = Temp.iPart + Direction.iPart
    Temp.jPart = Temp.jPart + Direction.jPart
    Temp.kPart = Temp.kPart + Direction.kPart
Next I

Set CContinumCalculate = Answer
End Function
Public Function DiffInterface(ByVal Inputs As String) As Double ‘微分计算入口
Dim A(1) As Integer
Dim I As Integer, J As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
For I = 1 To Lens
    If J = 2 Then Exit For
    If Mid(Inputs, I, 1) = "," Then
        A(J) = I
        J = J + 1
    End If
Next I
DiffInterface = Differential(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), Deal(Right(Inputs, Lens – A(1))))
End Function
Public Function CDiffInterface(ByVal Inputs As String) As ComplexNumber ‘复数微分计算入口
Dim A(2) As Integer
Dim I As Integer, J As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
For I = 1 To Lens
    If J = 3 Then Exit For
    If Mid(Inputs, I, 1) = "," Then
        A(J) = I
        J = J + 1
    End If
Next I
If A(2) = 0 Then
    Set CDiffInterface = CDifferential(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), Deal(Right(Inputs, Lens – A(1))))
Else
    Set CDiffInterface = CDifferential(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), Deal(Mid(Inputs, A(1) + 1, A(2) – A(1) – 1)), Deal(Right(Inputs, Lens – A(2))))
End If
End Function
Public Function Differential(ByVal Inputs As String, ByVal Var As String, ByVal Values As Single) As Double ‘微分运算
Dim I As Double, J As Integer
Dim Lens As Integer
Lens = Len(Var)
Dim Lengs As Integer
Dim TmpA As String, TmpB As String
Dim Tmp As String
Dim Answer As Double
Answer = 0
Dim Result As Double
Dim IsFirst As Boolean
IsFirst = True
Dim STP As Single
STP = Gap
If STP = 0 Then STP = 0.0002
Tmp = Inputs
For I = Values To Values + STP Step STP
    Inputs = Tmp
    Lengs = Len(Inputs)
    If Lengs > Lens Then
        TmpA = Mid(Inputs, Lens + 1, 1)
        If LCase(Left(Inputs, Lens)) = LCase(Var) And (CheckFun(TmpA) Or TmpA = "!") Then
            Inputs = Str(I) & Right(Inputs, Lengs – Lens)
        End If
        Lengs = Len(Inputs)
        J = 2
        Do While J < Lengs
            TmpA = Mid(Inputs, Lens + J, 1)
            TmpB = Mid(Inputs, J – 1, 1)
            If LCase(Mid(Inputs, J, Lens)) = LCase(Var) And (CheckFun(TmpA) Or TmpA = "!" Or TmpA = ")") And (CheckFun(TmpB) Or TmpB = "(") Then
                Inputs = Left(Inputs, J – 1) & Str(I) & Right(Inputs, Lengs – Lens – J + 1)
                Lengs = Len(Inputs)
            End If
            J = J + 1
        Loop
        TmpB = Mid(Inputs, Lengs – Lens, 1)
        If LCase(Right(Inputs, Lens)) = LCase(Var) And CheckFun(TmpB) Then
            Inputs = Left(Inputs, Lengs – Lens) & Str(I)
        End If
        Lengs = Len(Inputs)
    ElseIf Lengs = Lens Then
        Inputs = Str(I)
    End If
    Result = MathsCalculate(Inputs)
    If IsFirst Then
        Answer = Result
        IsFirst = False
    Else
        Answer = (Result – Answer) / STP
    End If
Next I
Differential = Answer
End Function
Public Function CDifferential(ByVal Inputs As String, ByVal Var As String, ByVal Values As ComplexNumber, Optional ByVal Direction As ComplexNumber) As ComplexNumber   ‘复数微分运算
Dim TmpA As String, TmpB As String
Dim Tmp As String
Dim Answer As New ComplexNumber
Dim Result As New ComplexNumber
Dim STP As Single

If Direction Is Nothing Then Set Direction = New ComplexNumber
If Direction.Modulus = 0 Then Set Direction = NewCNum("1")
STP = Gap
If STP = 0 Then STP = 0.0002
If Direction.Modulus <> 1 Then
    Set Direction = CDivision(Direction, NewCNum(CStr(Direction.Modulus)))
End If
Set Direction = CMultiply(Direction, NewCNum(CStr(STP)))
TmpA = AdReplace(Inputs, Var, Values)
TmpB = AdReplace(Inputs, Var, CPlus(Values, Direction))
Set Answer = ComplexDeal(TmpA)
Set Result = ComplexDeal(TmpB)
Set CDifferential = CMute(Result, Answer)
Set CDifferential = CDivision(CDifferential, Direction)
End Function
Public Function CPInterface(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant ‘连加入口
Dim A(2) As Integer
Dim I As Integer, J As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
For I = 1 To Lens
    If J = 3 Then Exit For
    If Mid(Inputs, I, 1) = "," Then
        A(J) = I
        J = J + 1
    End If
Next I
If MathsState = Algebra And CalState = Algebra Then
    CPInterface = ContinumCalculate(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), Deal(Mid(Inputs, A(1) + 1, A(2) – A(1) – 1)), Deal(Right(Inputs, Lens – A(2))), False, False)
ElseIf MathsState = complex Or CalState = complex Then
    Set CPInterface = CContinumCalculate(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), NewCNum(Deal(Mid(Inputs, A(1) + 1, A(2) – A(1) – 1))), NewCNum(Deal(Right(Inputs, Lens – A(2)))), False, False)
End If
End Function
Public Function CTInterface(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant ‘连乘入口
Dim A(2) As Integer
Dim I As Integer, J As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
For I = 1 To Lens
    If J = 3 Then Exit For
    If Mid(Inputs, I, 1) = "," Then
        A(J) = I
        J = J + 1
    End If
Next I
If MathsState = Algebra And CalState = Algebra Then
    CTInterface = ContinumCalculate(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), Deal(Mid(Inputs, A(1) + 1, A(2) – A(1) – 1)), Deal(Right(Inputs, Lens – A(2))), True, False)
ElseIf MathsState = complex Or CalState = complex Then
    Set CTInterface = CContinumCalculate(Left(Inputs, A(0) – 1), Mid(Inputs, A(0) + 1, A(1) – A(0) – 1), NewCNum(Deal(Mid(Inputs, A(1) + 1, A(2) – A(1) – 1))), NewCNum(Deal(Right(Inputs, Lens – A(2)))), True, False)
End If
End Function
Public Function IntegralInterface(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant  ‘积分入口
Dim A(2) As Integer
Dim B(3) As String
Dim I As Integer, J As Integer
Dim Lens As Integer
Lens = Len(Inputs)
J = 0
For I = 1 To Lens
    If J = 3 Then Exit For
    If Mid(Inputs, I, 1) = "," Then
        A(J) = I
        J = J + 1
    End If
Next I
B(0) = Left(Inputs, A(0) – 1)
B(1) = Mid(Inputs, A(0) + 1, A(1) – A(0) – 1)
B(2) = Mid(Inputs, A(1) + 1, A(2) – A(1) – 1)
B(3) = Right(Inputs, Lens – A(2))
If MathsState = Algebra And CalState = Algebra Then
    IntegralInterface = ContinumCalculate(B(0), B(1), Deal(B(2)), Deal(B(3)), False, True)
ElseIf MathsState = complex Or CalState = complex Then
    Set IntegralInterface = CContinumCalculate(B(0), B(1), NewCNum(Deal(B(2))), NewCNum(Deal(B(3))), False, True)
End If
End Function
‘连续运算模块结束

‘比较计算模块
Public Function Realation(ByVal Inputs As String) As Boolean ‘为二元运算项,公开模块
Dim I As Integer, J As Integer
Dim PartA As String, PartB As String ‘记录判断双方
Dim AnsA As Double, AnsB As Double ‘记录双方结果
Dim isBio As Boolean ‘记录是否是双符号
Dim isOpe As Boolean ‘记录是否是判断符号

isBio = False
isOpe = False

For I = 1 To Len(Inputs) – 1 ‘将判断双方分离
    Select Case Mid(Inputs, I, 2)
        Case "<>"
            PartA = Trim(Left(Inputs, I – 1))
            PartB = Trim(Right(Inputs, Len(Inputs) – I – 1))
            J = 1
            isBio = True
            isOpe = True
        Case ">=", "=>"
            PartA = Trim(Left(Inputs, I – 1))
            PartB = Trim(Right(Inputs, Len(Inputs) – I – 1))
            J = 2
            isOpe = True
            isBio = True
        Case "<=", "=<"
            PartA = Trim(Left(Inputs, I – 1))
            PartB = Trim(Right(Inputs, Len(Inputs) – I – 1))
            J = 3
            isOpe = True
            isBio = True
    End Select
    If Not isBio Then
        Select Case Mid(Inputs, I, 1)
            Case "="
                PartA = Trim(Left(Inputs, I – 1))
                PartB = Trim(Right(Inputs, Len(Inputs) – I))
                J = 4
                isOpe = True
            Case "<"
                PartA = Trim(Left(Inputs, I – 1))
                PartB = Trim(Right(Inputs, Len(Inputs) – I))
                J = 5
                isOpe = True
            Case ">"
                PartA = Trim(Left(Inputs, I – 1))
                PartB = Trim(Right(Inputs, Len(Inputs) – I))
                J = 6
                isOpe = True
        End Select
        If isOpe Then Exit For
    End If
Next I
AnsA = Deal(PartA)
AnsB = Deal(PartB)
Realation = False
Select Case J
    Case 1
        If AnsA <> AnsB Then Realation = True
    Case 2
        If AnsA >= AnsB Then Realation = True
    Case 3
        If AnsA <= AnsB Then Realation = True
    Case 4
        If AnsA = AnsB Then Realation = True
    Case 5
        If AnsA < AnsB Then Realation = True
    Case 6
        If AnsA > AnsB Then Realation = True
    Case Else
End Select
End Function
‘比较模块结束

‘最值计算模块
Public Function Max(ByVal Inputs As String) As Double ‘计算最大值
Dim TmpA() As String
Dim TmpB As Double
Dim I As Integer
Dim Checked As Boolean
Checked = False
Inputs = Trim(Inputs)
If Right(Inputs, 1) = ";" Then Inputs = Left(Inputs, Len(Inputs) – 1)
TmpA = Split(Inputs, ";")
For I = 0 To UBound(TmpA)
    TmpB = Deal(TmpA(I))
    If Checked = False Then Max = TmpB: Checked = True
    If TmpB > Max Then Max = TmpB
Next I
End Function
Public Function Min(ByVal Inputs As String) As Double  ‘计算最小值
Dim TmpA() As String
Dim TmpB As Double
Dim I As Integer
Dim Checked As Boolean
Checked = False
Inputs = Trim(Inputs)
If Right(Inputs, 1) = ";" Then Inputs = Left(Inputs, Len(Inputs) – 1)
TmpA = Split(Inputs, ";")
For I = 0 To UBound(TmpA)
    TmpB = Deal(TmpA(I))
    If Checked = False Then Min = TmpB: Checked = True
    If TmpB < Min Then Min = TmpB
Next I
End Function
‘最值计算模块结束

‘运算核心模块
Public Function Deal(ByVal Inputs As String, Optional ByVal CalState As State = Algebra) As Variant ‘内核基本运算计算模块总入口
If MathsState = Algebra And CalState = Algebra Then
    Deal = AlgebraDeal(Inputs)
ElseIf MathsState = complex Or CalState = complex Then
    Set Deal = ComplexDeal(Inputs)
End If
End Function
Public Function AlgebraDeal(ByVal Inputs As String) As Double ‘实数内核基本运算计算模块
Dim Tmp As Integer ‘记录括号层次
Tmp = 0
Dim Funs As Integer ‘记录算符数目
Dim FunF() As String ‘记录算符性质
Dim FunP() As Integer ‘记录算符位置
Dim Nums() As Double ‘记录运算数据
Dim Lens As Integer
Lens = Len(Inputs)
Dim I As Integer
Dim Tp As String
Dim Temp As Double
Dim J As Integer
For I = 1 To Lens ‘算符和数据提取部分
    Tp = Mid(Inputs, I, 1)
    If Tp = "(" Then
        Tmp = Tmp + 1
    End If
    If Tp = ")" Then
        Tmp = Tmp – 1
    End If
    If CheckFun(Tp) And Tmp = 0 Then
        Funs = Funs + 1
        ReDim Preserve FunF(Funs)
        FunF(Funs) = Tp
        ReDim Preserve FunP(Funs)
        FunP(Funs) = I
        If Tp = "E" Then I = I + 1
    End If
Next I
If Tmp > 0 Or Tmp < -1 Then ‘对函数嵌套会有-1的差距
    MsgBox "您输入的计算式括号组不封闭,请重新输入!", vbOKOnly, "ZL计算系统"
    Exit Function
End If
ReDim Nums(Funs + 1)
ReDim Preserve FunP(Funs + 1)
FunP(Funs + 1) = Len(Inputs) + 1
ReDim Preserve FunF(Funs + 1)
FunF(Funs + 1) = ""
If Funs > 0 Then
    For I = 1 To Funs + 1
        If FunP(I) = FunP(I – 1) + 1 And Not (I = 1 And (FunF(1) = "-" Or FunF(1) = "+")) And Not ((FunF(I) = "-" Or FunF(I) = "+") And FunF(I – 1) = "E") Then
            MsgBox "您输入的计算式不正确,请重新输入!", vbOKOnly, "ZL计算系统"
            Exit For
        End If
        Tp = Trim(Mid(Inputs, FunP(I – 1) + 1, FunP(I) – FunP(I – 1) – 1))
        If Mid(Tp, 1, 1) = "(" Then
            Nums(I) = AlgebraDeal(Mid(Tp, 2, Len(Tp) – 2))
        Else
            Nums(I) = AlgebraCalculate(Tp)
        End If
    Next I
Else
    Nums(1) = AlgebraCalculate(Trim(Inputs))
End If
‘运算部分
‘科学计数法
I = 1
Do While I <= Funs
    If FunF(I) = "E" Then
        Temp = Nums(I) * (10 ^ Nums(I + 1))
    End If
    If FunF(I) = "E" Then
        Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘与、或、异或的运算
I = 1
Do While I <= Funs
    If FunF(I) = "&" Then
        Temp = Nums(I) And Nums(I + 1)
    End If
    If FunF(I) = "|" Then
        Temp = Nums(I) Or Nums(I + 1)
    End If
    If FunF(I) = "#" Then
        Temp = Nums(I) Xor Nums(I + 1)
    End If
    If FunF(I) = "&" Or FunF(I) = "|" Or FunF(I) = "#" Then
        Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘开方和乘方运算
I = 1
Do While I <= Funs
    If FunF(I) = "^" Then
        Temp = Nums(I) ^ Nums(I + 1)
    End If
    If FunF(I) = "" Then
        Temp = Nums(I) ^ (1 / Nums(I + 1))
    End If
    If FunF(I) = "^" Or FunF(I) = "" Then
        Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘乘法和除法运算
I = 1
Do While I <= Funs
    If FunF(I) = "*" Then
        Temp = Nums(I) * Nums(I + 1)
    End If
    If FunF(I) = "/" Then
        If Nums(I + 1) = 0 Then
            MsgBox "计算中出现0除数!请检查方程!", vbOKOnly, "ZL计算系统"
            Exit Function
        End If
        Temp = Nums(I) / Nums(I + 1)
    End If
    If FunF(I) = "*" Or FunF(I) = "/" Then
        Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
‘加法和减法运算
I = 1
Do While I <= Funs
    If FunF(I) = "+" Then
        Temp = Nums(I) + Nums(I + 1)
    End If
    If FunF(I) = "-" Then
        Temp = Nums(I) – Nums(I + 1)
    End If
    If FunF(I) = "+" Or FunF(I) = "-" Then
        Nums(I) = Temp
        For J = I + 1 To Funs ‘把计算完的部分剔除
            FunF(J – 1) = FunF(J)
            Nums(J) = Nums(J + 1)
        Next J
        Funs = Funs – 1
    Else
        I = I + 1
    End If
Loop
AlgebraDeal = Nums(1)
End Function

Posted March 12, 2006 by LostAbaddon in 赛伯铁客

Maths Calculate 2.00 (Part II)   Leave a comment

ComplexNumber.cls:
Option Explicit
‘四元复数由中括号组[a,b,c,d]或a+bi+cj+dk来标记
Public Enum DisplayStyle
    Scalar = 0
    Vector = 1
End Enum
Public ePart As Double ‘记录复数e部
Public iPart As Double ‘记录复数i部
Public jPart As Double ‘记录复数j部
Public kPart As Double ‘记录复数k部
‘复数的创建部分
Public Sub NewValue(ByVal Inputs As String) ‘从a+bi+cj+dk创建复数
Dim Parts() As String
Dim I As Integer
Dim Tmp As String, Tm As String
Inputs = Trim(Inputs)
If Inputs = "" Then Inputs = "0"
If Left(Inputs, 1) = "[" And Right(Inputs, 1) = "]" Then
    Inputs = Mid(Inputs, 2, Len(Inputs) – 2)
    Parts = Split(Inputs, ",")
    If UBound(Parts) = 0 Then
        ePart = Val(Parts(0))
    ElseIf UBound(Parts) = 1 Then
        ePart = Val(Parts(0))
        iPart = Val(Parts(1))
    ElseIf UBound(Parts) = 2 Then
        ePart = Val(Parts(0))
        iPart = Val(Parts(1))
        jPart = Val(Parts(2))
    ElseIf UBound(Parts) = 3 Then
        ePart = Val(Parts(0))
        iPart = Val(Parts(1))
        jPart = Val(Parts(2))
        kPart = Val(Parts(3))
    End If
Else
    Parts = Split(Inputs, "-")
    Inputs = ""
    For I = 0 To UBound(Parts) – 1
        Inputs = Inputs & Trim(Parts(I)) & "+-"
    Next I
    Inputs = Inputs & Trim(Parts(I))
    Parts = Split(Inputs, "+")
    For I = 0 To UBound(Parts)
        Tmp = Trim(Parts(I))
        Tm = Right(Tmp, 1)
        If Trim(CStr(Val(Tm))) = Trim(Tm) Then
            ePart = Val(Tmp)
        Else
            Select Case LCase(Tm)
                Case "i"
                    If Len(Tmp) = 1 Then
                        iPart = 1
                    ElseIf Left(Tmp, 1) = "-" And Len(Tmp) = 2 Then
                        iPart = -1
                    Else
                        iPart = Val(Tmp)
                    End If
                Case "j"
                    If Len(Tmp) = 1 Then
                        jPart = 1
                    ElseIf Left(Tmp, 1) = "-" And Len(Tmp) = 2 Then
                        jPart = -1
                    Else
                        jPart = Val(Tmp)
                    End If
                Case "k"
                    If Len(Tmp) = 1 Then
                        kPart = 1
                    ElseIf Left(Tmp, 1) = "-" And Len(Tmp) = 2 Then
                        kPart = -1
                    Else
                        kPart = Val(Tmp)
                    End If
            End Select
        End If
    Next I
End If
End Sub
‘创建部分结束
‘复数表示部分
Public Property Get ToString(Optional ByVal Style As DisplayStyle = Scalar) As String
If Style = Scalar Then
    If ePart <> 0 Then
        ToString = CStr(ePart)
    End If
    If iPart <> 0 Then
        If iPart = 1 Then
            ToString = ToString & "+i"
        ElseIf iPart = -1 Then
            ToString = ToString & "-i"
        ElseIf iPart > 0 Then
                ToString = ToString & "+" & CStr(iPart) & "i"
        Else
                ToString = ToString & CStr(iPart) & "i"
        End If
    End If
    If jPart <> 0 Then
        If jPart = 1 Then
            ToString = ToString & "+j"
        ElseIf jPart = -1 Then
            ToString = ToString & "-j"
        ElseIf jPart > 0 Then
            ToString = ToString & "+" & CStr(jPart) & "j"
        Else
            ToString = ToString & CStr(jPart) & "j"
        End If
    End If
    If kPart <> 0 Then
        If kPart = 1 Then
            ToString = ToString & "+k"
        ElseIf kPart = -1 Then
            ToString = ToString & "-k"
        ElseIf kPart > 0 Then
            ToString = ToString & "+" & CStr(kPart) & "k"
        Else
            ToString = ToString & CStr(kPart) & "k"
        End If
    End If
    If Left(ToString, 1) = "+" Then ToString = Right(ToString, Len(ToString) – 1)
    If Trim(ToString) = "" Then ToString = "0"
ElseIf Style = Vector Then
    ToString = "[" & CStr(ePart) & ","
    ToString = ToString & CStr(iPart) & ","
    ToString = ToString & CStr(jPart) & ","
    ToString = ToString & CStr(kPart) & "]"
End If
End Property
‘复数表示部分结束
Public Property Get Modulus() As Double ‘一个复数的模
Modulus = Sqr(ePart ^ 2 + iPart ^ 2 + jPart ^ 2 + kPart ^ 2)
End Property
Public Property Get Angle() As Angle  ‘复数的辐角主值
Dim Tmp As Double
Dim Tp As Double
Set Angle = New Angle
Tp = ePart ^ 2 + iPart ^ 2 + jPart ^ 2 + kPart ^ 2
If Tp > 0 Then
    Tmp = Sqr(iPart ^ 2 + jPart ^ 2 + kPart ^ 2)
    If ePart = 0 Then
        Angle.NewAngle 90
    Else
        Angle.NewRadian Atn(Tmp / ePart)
    End If
End If
End Property
Public Property Get UnitVector() As ComplexNumber ‘复数向量部分的单位向量
Dim Tmp As Double
Tmp = Sqr(iPart ^ 2 + jPart ^ 2 + kPart ^ 2)
Set UnitVector = New ComplexNumber
UnitVector.ePart = 0
UnitVector.iPart = iPart / Tmp
UnitVector.jPart = jPart / Tmp
UnitVector.kPart = kPart / Tmp
End Property
Public Property Get VectorModulus() As Double ‘复数向量部分长
VectorModulus = Sqr(iPart ^ 2 + jPart ^ 2 + kPart ^ 2)
End Property
Public Property Get Conjugate() As ComplexNumber ‘复数的共轭
Set Conjugate = New ComplexNumber
Conjugate.ePart = ePart
Conjugate.iPart = -iPart
Conjugate.jPart = -jPart
Conjugate.kPart = -kPart
End Property
Public Property Get Reciprocal() As ComplexNumber ‘复数的倒数
Dim Tmp As Double
Tmp = ePart ^ 2 + iPart ^ 2 + jPart ^ 2 + kPart ^ 2
Set Reciprocal = New ComplexNumber
Reciprocal.ePart = ePart / Tmp
Reciprocal.iPart = -iPart / Tmp
Reciprocal.jPart = -jPart / Tmp
Reciprocal.kPart = -kPart / Tmp
End Property
Public Property Get IsReal() As Boolean ‘判断复数是否是实数
IsReal = False
If iPart = 0 And jPart = 0 And kPart = 0 Then IsReal = True
End Property
MathsMatics.cls:
Option Explicit
‘模块作用:提供DLL入口,以及对进入MATHS MODULE数据的验证
Public Property Get Gap() As Single ‘步长值读取
Gap = Maths.Gap
End Property
Public Property Let Gap(ByVal NewValue As Single) ‘设置步长值
If NewValue > 0 Then
    Maths.Gap = NewValue
End If
End Property
Public Function MathsCompute(ByVal Inputs As String) As String ‘所有运算的总入口
MathsCompute = Maths.MathsCompute(Inputs)
End Function
Public Function innerConst(ByVal Inputs As String) As Double ‘内置常数读取模块
innerConst = Maths.innerConst(Inputs)
End Function
Public Function Realation(ByVal Inputs As String) As Boolean ‘比较模块
Realation = Maths.Realation(Inputs)
End Function
‘对外MATH函数
Public Function MaxNumber(ParamArray Inputs()) As Double ‘计算最大值
Dim Checked As Boolean
Checked = False
Dim I As Integer
Dim Tmp As Double
For I = 0 To UBound(Inputs)
    Tmp = Val(Inputs(I))
    If Checked Then
        If Tmp > MaxNumber Then MaxNumber = Tmp
    Else
        MaxNumber = Tmp
    End If
Next I
End Function
Public Function MinNumber(ParamArray Inputs()) As Double  ‘计算最小值
Dim Checked As Boolean
Checked = False
Dim I As Integer
Dim Tmp As Double
For I = 0 To UBound(Inputs)
    Tmp = Val(Inputs(I))
    If Checked Then
        If Tmp < MinNumber Then MinNumber = Tmp
    Else
        MinNumber = Tmp
    End If
Next I
End Function
Public Function IsOperation(ByVal Emblem As String) As Boolean ‘判断一个符号是否是数学算符
IsOperation = False
IsOperation = CheckFun(Emblem)
If Not IsOperation Then IsOperation = IsOperation Or CheckEquation(Emblem)
End Function
Public Function IsFunction(ByVal Inputs As String) As Boolean ‘判断一个表达式是否是数学表达式
Dim I As Integer
Dim J As Integer
IsFunction = (Trim(CStr(Val(Inputs))) = Trim(Inputs)) ‘判断是否是纯数字函数
For I = 1 To MinNumber(4, Len(Inputs) – 1) ‘判断是否含有运算符
    For J = 1 To Len(Inputs) – I
        If IsOperation(Mid(Inputs, J, I)) Then IsFunction = True: GoTo OUT:
    Next J
Next I
OUT:
End Function
‘对外MATH函数结束
Private Sub Class_Initialize()
Maths.Gap = 0.0002
End Sub

Posted March 12, 2006 by LostAbaddon in 赛伯铁客

Maths Calculate 2.00 (Part I)   Leave a comment

这次的版本中修改了几个比较严重的BUG,然后增加了四元数体的运算。而且,这次的版本是生成为DLL的,更方便大家使用和二次开发。
下面的运算的核心部分。
 
ComplexMaths.bas:
Option Explicit
Public Function NewCNum(ByVal Inputs As String) As ComplexNumber ‘直接创建复数
Set NewCNum = New ComplexNumber
NewCNum.NewValue (Inputs)
End Function
‘复数的基本运算规则
Public Function CPlus(ByVal CNumA As ComplexNumber, CNumB As ComplexNumber) As ComplexNumber ‘复数加法
Set CPlus = New ComplexNumber
CPlus.ePart = CNumA.ePart + CNumB.ePart
CPlus.iPart = CNumA.iPart + CNumB.iPart
CPlus.jPart = CNumA.jPart + CNumB.jPart
CPlus.kPart = CNumA.kPart + CNumB.kPart
End Function
Public Function CMute(ByVal CNumA As ComplexNumber, CNumB As ComplexNumber) As ComplexNumber ‘复数减法
Set CMute = New ComplexNumber
CMute.ePart = CNumA.ePart – CNumB.ePart
CMute.iPart = CNumA.iPart – CNumB.iPart
CMute.jPart = CNumA.jPart – CNumB.jPart
CMute.kPart = CNumA.kPart – CNumB.kPart
End Function
Public Function CMultiply(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber ‘复数乘法
Set CMultiply = New ComplexNumber
CMultiply.ePart = CNumA.ePart * CNumB.ePart – CNumA.iPart * CNumB.iPart – CNumA.jPart * CNumB.jPart – CNumA.kPart * CNumB.kPart
CMultiply.iPart = CNumA.ePart * CNumB.iPart + CNumA.iPart * CNumB.ePart + CNumA.jPart * CNumB.kPart – CNumA.kPart * CNumB.jPart
CMultiply.jPart = CNumA.ePart * CNumB.jPart – CNumA.iPart * CNumB.kPart + CNumA.jPart * CNumB.ePart + CNumA.kPart * CNumB.iPart
CMultiply.kPart = CNumA.ePart * CNumB.kPart + CNumA.iPart * CNumB.jPart – CNumA.jPart * CNumB.iPart + CNumA.kPart * CNumB.ePart
End Function
Public Function CDivision(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber ‘复数除法
If CNumB.Modulus > 0 Then
    Set CDivision = New ComplexNumber
    Set CDivision = CMultiply(CNumA, CNumB.Reciprocal)
End If
End Function
Public Function CExp(ByVal CNum As ComplexNumber) As ComplexNumber ‘复数幂
Dim Fir As Double
Dim Vec As Double
Dim CTmp As ComplexNumber
Set CExp = New ComplexNumber
If CNum.IsReal = True Then
    CExp.ePart = Exp(CNum.ePart)
Else
    Fir = Exp(CNum.ePart)
    Vec = Sqr(CNum.iPart ^ 2 + CNum.jPart ^ 2 + CNum.kPart ^ 2)
    Set CTmp = CNum.UnitVector
    CExp.ePart = Fir * Cos(Vec)
    CExp.iPart = Fir * Sin(Vec) * CTmp.iPart
    CExp.jPart = Fir * Sin(Vec) * CTmp.jPart
    CExp.kPart = Fir * Sin(Vec) * CTmp.kPart
End If
End Function
Public Function CLog(ByVal CNum As ComplexNumber, Optional ByVal Index As Integer = 0) As ComplexNumber ‘复数对数
Dim CTmp As ComplexNumber
Dim Vec As Double
If CNum.IsReal Then
    If CNum.ePart > 0 Then
        Set CLog = New ComplexNumber
        CLog.ePart = Log(CNum.ePart)
        CLog.iPart = Index * Atn(1) * 8
    ElseIf CNum.ePart < 0 Then
        Set CLog = New ComplexNumber
        CLog.ePart = Log(-CNum.ePart)
        CLog.iPart = Index * Atn(1) * 8 + Atn(1) * 4
    End If
Else
Vec = CNum.Angle
    Set CTmp = CNum.UnitVector
    Set CLog = New ComplexNumber
    CLog.ePart = Log(CNum.Modulus)
    CLog.iPart = (Vec + Index * Atn(1) * 8) * CTmp.iPart
    CLog.jPart = (Vec + Index * Atn(1) * 8) * CTmp.jPart
    CLog.kPart = (Vec + Index * Atn(1) * 8) * CTmp.kPart
End If
End Function
Private Function Power(ByVal CNum As ComplexNumber, ByVal Num As Double) As ComplexNumber ‘复数的实数乘方
Dim Fir As Double
Dim Vec As Double
Dim CTmp As ComplexNumber
Set Power = New ComplexNumber
If CNum.IsReal Then
    If CNum.ePart <> 0 Then
        Power.ePart = CNum.ePart ^ Num
    End If
Else
    Fir = CNum.Modulus ^ Num
    Vec = CNum.Angle * Num
    Set CTmp = CNum.UnitVector
    Power.ePart = Fir * Cos(Vec)
    Power.iPart = Fir * Sin(Vec) * CTmp.iPart
    Power.jPart = Fir * Sin(Vec) * CTmp.jPart
    Power.kPart = Fir * Sin(Vec) * CTmp.kPart
End If
End Function
Public Function CPower(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber ‘复数的复数乘方
Dim CTmp As ComplexNumber
Dim CTp As ComplexNumber
Dim Vec As Double
Dim Fir As Double
Dim Tmp As Double
Dim TpA As Double, TpB As Double
If CNumB.IsReal Then
    Set CPower = Power(CNumA, CNumB.ePart)
ElseIf CNumA.IsReal And CNumA.ePart <> 0 Then
    Fir = Log(CNumA.Modulus)
    Vec = CNumB.Angle
    Tmp = CNumB.Modulus
    Set CTmp = CNumB.UnitVector
    If CNumA.ePart < 0 Then
        TpA = Tmp * (Fir * Cos(Vec) – Atn(1) * 4 * Sin(Vec))
        TpB = Tmp * (Atn(1) * 4 * Cos(Vec) + Fir * Sin(Vec))
    ElseIf CNumA.ePart > 0 Then
        TpA = Tmp * Fir * Cos(Vec)
        TpB = Tmp * Fir * Sin(Vec)
    End If
    TpA = Exp(TpA)
    Set CPower = New ComplexNumber
    CPower.ePart = TpA * Cos(TpB)
    CPower.iPart = TpA * Sin(TpB) * CTmp.iPart
    CPower.jPart = TpA * Sin(TpB) * CTmp.jPart
    CPower.kPart = TpA * Sin(TpB) * CTmp.kPart
ElseIf CNumA.Modulus > 0 Then
    Set CTmp = New ComplexNumber
    Set CTp = CNumA.UnitVector
    Vec = CNumA.Angle
    CTmp.ePart = Log(CNumA.Modulus)
    CTmp.iPart = Vec * CTp.iPart
    CTmp.jPart = Vec * CTp.jPart
    CTmp.kPart = Vec * CTp.kPart
    Set CPower = CExp(CMultiply(CTmp, CNumB))
End If
End Function
Private Function Root(ByVal CNum As ComplexNumber, ByVal Num As Double, Optional ByVal Index As Integer = 0) As ComplexNumber ‘复数的实数次根
Dim Fir As Double
Dim Vec As Double
Dim CTmp As ComplexNumber
If Num = 0 Then
    Set Root = CNum
ElseIf CNum.IsReal Then
    Set Root = New ComplexNumber
    If CNum.ePart > 0 Then
        Root.ePart = CNum.ePart ^ (1 / Num)
    ElseIf CNum.ePart < 0 Then
        Root.iPart = (-CNum.ePart) ^ (1 / Num)
    End If
Else
    Set Root = New ComplexNumber
    Set CTmp = CNum.UnitVector
    Vec = (CNum.Angle + Index * Atn(1) * 8) / Num
    Fir = CNum.Modulus ^ (1 / Num)
    Root.ePart = Fir * Cos(Vec)
    Root.iPart = Fir * Sin(Vec) * CTmp.iPart
    Root.jPart = Fir * Sin(Vec) * CTmp.jPart
    Root.kPart = Fir * Sin(Vec) * CTmp.kPart
End If
End Function
Public Function CRoot(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber, Optional ByVal Index As Integer = 0) As ComplexNumber ‘复数的复数次根
Dim CTmp As ComplexNumber
Dim CTp As ComplexNumber
Dim Vec As Double
Dim Fir As Double
If CNumB.IsReal Then
    Set CRoot = Root(CNumA, CNumB.ePart)
ElseIf CNumA.IsReal And CNumA.ePart <> 0 Then
    Set CRoot = CPower(CNumA, CNumB.Reciprocal)
ElseIf CNumA.Modulus > 0 Then
    Set CTp = CNumA.UnitVector
    Set CTmp = New ComplexNumber
    Vec = CNumA.Angle + 8 * Atn(1) * Index
    Fir = CNumA.Modulus
    CTmp.ePart = Log(Fir)
    CTmp.iPart = CTp.iPart * Vec
    CTmp.jPart = CTp.jPart * Vec
    CTmp.kPart = CTp.kPart * Vec
    Set CRoot = CExp(CDivision(CTmp, CNumB))
End If
End Function
Public Function CAnd(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber  ‘复数与运算
Set CAnd = New ComplexNumber
CAnd.ePart = CNumA.ePart And CNumB.ePart
CAnd.iPart = CNumA.iPart And CNumB.iPart
CAnd.jPart = CNumA.jPart And CNumB.jPart
CAnd.kPart = CNumA.kPart And CNumB.kPart
End Function
Public Function COr(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber  ‘复数或运算
Set COr = New ComplexNumber
COr.ePart = CNumA.ePart Or CNumB.ePart
COr.iPart = CNumA.iPart Or CNumB.iPart
COr.jPart = CNumA.jPart Or CNumB.jPart
COr.kPart = CNumA.kPart Or CNumB.kPart
End Function
Public Function CXOr(ByVal CNumA As ComplexNumber, ByVal CNumB As ComplexNumber) As ComplexNumber  ‘复数异或运算
Set CXOr = New ComplexNumber
CXOr.ePart = CNumA.ePart Xor CNumB.ePart
CXOr.iPart = CNumA.iPart Xor CNumB.iPart
CXOr.jPart = CNumA.jPart Xor CNumB.jPart
CXOr.kPart = CNumA.kPart Xor CNumB.kPart
End Function
Public Function CSin(ByVal CNum As ComplexNumber) As ComplexNumber  ‘复数正弦运算
Dim Tmp As New ComplexNumber
Dim Fir As Double
Dim Vec As Double
Set CSin = New ComplexNumber
If CNum.IsReal Then
    CSin.ePart = Sin(CNum.ePart)
Else
    Set Tmp = CNum.UnitVector
    Fir = CNum.VectorModulus
    Vec = CNum.ePart
    CSin.ePart = (Exp(Fir) + Exp(-Fir)) * Sin(Vec) / 2
    CSin.iPart = (Exp(Fir) – Exp(-Fir)) * Cos(Vec) / 2 * Tmp.iPart
    CSin.jPart = (Exp(Fir) – Exp(-Fir)) * Cos(Vec) / 2 * Tmp.jPart
    CSin.kPart = (Exp(Fir) – Exp(-Fir)) * Cos(Vec) / 2 * Tmp.kPart
End If
End Function
Public Function CCos(ByVal CNum As ComplexNumber) As ComplexNumber  ‘复数余弦运算
Dim Tmp As New ComplexNumber
Dim Fir As Double
Dim Vec As Double
Set CCos = New ComplexNumber
If CNum.IsReal Then
    CCos.ePart = Cos(CNum.ePart)
Else
    Set Tmp = CNum.UnitVector
    Fir = CNum.VectorModulus
    Vec = CNum.ePart
    CCos.ePart = (Exp(Fir) + Exp(-Fir)) * Cos(Vec) / 2
    CCos.iPart = (Exp(-Fir) – Exp(Fir)) * Sin(Vec) / 2 * Tmp.iPart
    CCos.jPart = (Exp(-Fir) – Exp(Fir)) * Sin(Vec) / 2 * Tmp.jPart
    CCos.kPart = (Exp(-Fir) – Exp(Fir)) * Sin(Vec) / 2 * Tmp.kPart
End If
End Function
Public Function CSinh(ByVal CNum As ComplexNumber) As ComplexNumber  ‘复数正弦运算
Dim Tmp As New ComplexNumber
Dim Fir As Double
Dim Vec As Double
Set CSinh = New ComplexNumber
If CNum.IsReal Then
    CSinh.ePart = Sin(CNum.ePart)
Else
    Set Tmp = CNum.UnitVector
    Fir = CNum.VectorModulus
    Vec = CNum.Angle
    CSinh.ePart = (Exp(Vec) – Exp(-Vec)) * Cos(Fir) / 2
    CSinh.iPart = (Exp(Vec) + Exp(-Vec)) * Sin(Fir) / 2 * Tmp.iPart
    CSinh.jPart = (Exp(Vec) + Exp(-Vec)) * Sin(Fir) / 2 * Tmp.jPart
    CSinh.kPart = (Exp(Vec) + Exp(-Vec)) * Sin(Fir) / 2 * Tmp.kPart
End If
End Function
Public Function CCosh(ByVal CNum As ComplexNumber) As ComplexNumber  ‘复数余弦运算
Dim Tmp As New ComplexNumber
Dim Fir As Double
Dim Vec As Double
Set CCosh = New ComplexNumber
If CNum.IsReal Then
    CCosh.ePart = Cos(CNum.ePart)
Else
    Set Tmp = CNum.UnitVector
    Fir = CNum.VectorModulus
    Vec = CNum.Angle
    CCosh.ePart = (Exp(Vec) + Exp(-Vec)) * Cos(Fir) / 2
    CCosh.iPart = (Exp(Vec) – Exp(-Vec)) * Sin(Fir) / 2 * Tmp.iPart
    CCosh.jPart = (Exp(Vec) – Exp(-Vec)) * Sin(Fir) / 2 * Tmp.jPart
    CCosh.kPart = (Exp(Vec) – Exp(-Vec)) * Sin(Fir) / 2 * Tmp.kPart
End If
End Function
Angle.cls:
Option Explicit
Dim AngleValue As Double
Public Sub NewAngle(ByVal NewValue As Single)
AngleValue = NewValue / 45 * Atn(1)
End Sub
Public Sub NewRadian(ByVal NewRadian As Double)
AngleValue = NewRadian
End Sub
Public Sub NewFromString(ByVal Inputs As String)
Dim Tmp As String
Dim LA As Integer, LB As Integer
Dim PA As Integer, PB As Integer, PC As Single
Tmp = Right(Inputs, 1)
Select Case Tmp ‘将输入的角度信息格式化
    Case "`"
        Inputs = Inputs & "0’0" & Chr(34)
    Case "’"
        Inputs = Inputs & "0" & Chr(34)
    Case Chr(34)
    Case Else
        Exit Sub
End Select
LA = InStr(Inputs, "`")
LB = InStr(Inputs, "’")
If LB = 0 And LA > 0 Then
    Inputs = Left(Inputs, LA) & "0’" & Right(Inputs, Len(Inputs) – LA)
End If
If LA = 0 And LB = 0 Then
    Inputs = "0`0’" & Inputs
End If
If LA = 0 And LB > 0 Then
    Inputs = "0`" & Inputs
End If
LA = InStr(Inputs, "`")
LB = InStr(Inputs, "’")
Tmp = Left(Inputs, LA – 1)
PA = Val(Tmp)
Tmp = Mid(Inputs, LA + 1, LB – LA – 1)
PB = Val(Tmp)
Tmp = Mid(Inputs, LB + 1, Len(Inputs) – LB – 1)
PC = Val(Tmp)
AngleValue = PA + PB / 60 + PC / 3600
End Sub
Public Property Get Angle() As Double
Angle = AngleValue / Atn(1) * 45
End Property
Public Property Get Radian() As Double
Radian = AngleValue
End Property
Public Property Get FormattedAngle() As String
Dim Tmp As Double
Dim Tp As Integer
Tp = Int(Angle)
FormattedAngle = Trim(CStr(Tp))
If FormattedAngle = "" Then FormattedAngle = "0"
FormattedAngle = FormattedAngle & "`"
Tmp = (Angle – Tp) * 60
Tp = Int(Tmp)
If Tp > 0 Then
    FormattedAngle = FormattedAngle & Trim(CStr(Tp)) & "’"
End If
Tmp = (Tmp – Tp) * 60
If Tp > 0 Then
    FormattedAngle = FormattedAngle & Trim(CStr(Tmp)) & Chr(34)
End If
End Property

Posted March 12, 2006 by LostAbaddon in 赛伯铁客