标题:求最佳旅行路线(IOI题)
只看楼主
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
马甲也跑出来流汗,kao……
2004-12-08 21:33
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
论坛的钱不值钱,有机会一定报答(能力之内),说实话,你和knocker之前写的代码的我都随便看,没敢细看,因为看不懂,思路(文字)我是看了,代码没看,难为knocker写了N行注释,sorry to you both...
2004-12-08 21:35
风中涟漪
Rank: 1
等 级:新手上路
帖 子:234
专家分:0
注 册:2004-8-9
得分:0 
以下是引用live41在2004-12-08 21:33:07的发言: 马甲也跑出来流汗,kao……

kao,马甲也有汗腺。。。

ps: 固顶两周以作纪念。。。


2004-12-08 21:38
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

最后,拍马屁的话就不多说了,反正在下作为小版主,一直答问题(虽然不是什么难题),现在终于被答,感觉超爽,论坛温暖啊!

感谢kai版主不厌其烦,同样感谢knocker从C语言版老远窜过来这里帮小弟忙。

2004-12-08 21:50
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

现在论坛有问题,经常让我重新登录,否则回不了贴,我发现最近帖子数有下降,另外登录的会员很少,客人倒是很多,有时C++ 板块客人30多个,会员才一两个,当然帖子数就少的可怜了。

严重希望静坛主尽快解决这个问题。一个健康的论坛必须是一个稳定的论坛,不然会严重打击他人积极性的。任何对论坛的改动都不能牺牲论坛的稳定性。那些金币,道具在我看来完全是一些花俏的装饰,有和没有没有区别。另外论坛的速度也慢了下来。是不是大家也发现了这些问题。还是我这边的单方面的问题?

这道题目之后,我将精力全部集中到 Windows Programming 上来。在我的那个看图软件的基础上,继续发展。

当然,如果有问题,我还是会参与的。

我看的书不多,我感觉很多书是从技术的角度来阐述C++ ,这当然没错,对于一本介绍C++ 的书,它必须告诉人们C++ 的技术细节,但是读者读完一本C++ 的书后,却往往有这种感觉,他看到了很多技术细节,但却不知道如何编程,或者说不知道如何对象化编程。对于对象化编程必须设计 class 吗? 回答当然是肯定的。但是怎么去设计?很多书没有讲,甚至一个字都没有提。现在我就将这个问题摆在大家面前。

当你要编写C++ 程序时,如何去编写? 注意我这里指的是纯粹的C++ 风格的程序,而不是在过程化编程中使用一些C++ 术语,如cin, cout, vector 等等。一个没有class 的程序不称之为C++ 程序。也就是说一个无对象化概念的程序,称不上C++ 程序。当然我承认C++ 是包容C 的。但是作为一个C++ 程序员,以过程化编程作为其编程的思想模式,这是一个非常不好的习惯。对于先学C语言,然后再转到C++ 的程序员来讲,这是一个普遍现象,而且很难转变到C++ 思想上来。这样一个转变过程很有可能需要1到2年。甚至始终都转不过来也有可能。但是我相信一个从C到C++ 的程序员应该比一个C++ 程序员更有潜力,更优秀。C犹如一把明器,使用它,套路不多,但经典到位。我认为用C编程要比用C++ 编程更难。而C++ 将C这把明器收于其中,C++ 认为明器是通过物体的作用而发挥作用的。也就是对象的概念。

对于杀人,C认为我的刀砍了你,所以杀人了。而C++ 认为杀手使用刀砍了人,所以杀人了。也就是说刀本身不会伤人,是因为杀手使用了刀,并砍了人。在整个观察问题的过程中,始终将对象贯穿于其中。没有对象的出现,便谈不上C++ 程序了。这些比较抽象的概念很多书上也会提到,但忽略了一个问题,那就是沟通脱节。对于那些抽象的理解必须具备一个前提,什么前提? 那就是你已经有了对象化C++ 编程的基础。对于那些正在学C++,而还没有建立对象这个概念的朋友,上面那个关于杀人的例子毫无意义,只能让听众越听越糊涂。而那些书本并没有意识到这个问题。

那么现在就来讲讲怎么对象化编程,当然首先是要将什么是对象。这个是一般的套路,效果并不是很好。很多朋友往往站在对象化编程的对立面,觉得对象化编程哗众取宠,你C++ 实现的,我C一样能实现。于是带着对立情绪来学C++,效果是可想而知的。我就是这样过来的。所以我能完全体会这种感觉。虽然在学一门对象化编程语言,却以有色的眼光来看待这门语言,学到的只是一些枝末细节,毫无大体感。直到接触了Java,忽然感悟什么是对象化编程。我现在不打算来讲解什么是对象化编程。对字面理解,我相信大部分人不会有困难。但是不会有太大的用处,如果你没有真正感悟。

我们来谈如何对象化编程,我相信这是每一个学习C++ 语言感兴趣的问题。

这个问题是我在学习中始终思考的问题。我开始总是试图县设计相关的class , 但是要将class 设计地非常贴切,我发现这是一个非常困难的问题,尤其在面对一个比较庞大的题目时。我个人认为这种设计过程是错误的,只有大师级才能办到,事实上高手也不会这样去做。这好比让你画一幅画,你上来就从人的眼睛,鼻子画起。当然这种画法是可以的,不过这个人不是高手,就是一个不会画画的人。所以当你看到一个画画时,不是总体结构画起,而是从局部画起,那你已经可以断定,这个人不会画画。当然也有可能这个人是奇才。同样的,如果你在编C++ 程序时,能一眼洞穿问题的本质,落笔马上写class 并非常到位,程序一气呵成。也就是你说,如果你的编程方式为 先设计 class ,然后写 main ,并且成功率极高,也就是说,你的class 不需要做什么改动,那么你千万保留你的设计方式,因为这是天才级的设计方式,你一定是一个天才。而我在不知情的情况下尝试了这种方式,屡试屡败,感觉很苦恼。那么该怎么写程序呢?

程序就是将你的逻辑思维过程写下来。设想一下,如果有一门语言,或者有一种方法,它不需要你去学习什么编程术语,你只要将你的逻辑思维过程用大白话的形式表达出来,你甚至不需要写一行代码,编译器能听懂你的阐述,并且与你沟通,也就是说,它告诉你,你的解题过程有没有逻辑矛盾,你需要完善的是你的逻辑过程,代码将由编译器自动帮你生成。那么这门语言便是绝对的高级编程语言, 程序员所要做的便是高效合理化的逻辑思维。写具体代码不再是程序员的任务。但是,这只是我们的一个设想,我相信,未来语言的发展方向必然是这个方向。不过,我们目前还没有这门语言。我们还脱离不了语言细节。那我阐述这段话的意义何在呢?

我阐述上面这段话的意义在于,我们可以将这种思维方式运用于C++ 编程中。怎么来理解这句话?我们下面举例来讲。

比如我们有这样一个问题:你有很多数,你要从中找出最大的数。现在你要写程序了,怎么写?现在设计一个class 来解决这个问题? 不!!!不要去管它什么class 不 class ,我们直接写我们的 main 函数。class 是因为问题的需要而产生的。有人到这里看不懂了,连class 都没有怎么去写main 函数?这个问题提的好,我必须指出一下,我们这时写的所谓的main 函数,是逻辑代码,或称为逻辑描述,是根本不能运行的。这样写的目的是帮助你设计出切合问题需要的class

我们就具体通过求最大数这个例子,来看一下这个方法。

int main()

{

// 1. 对于我们的数据 首先得到数据,没有数据解决问题根本无从谈起;

// 2. 对于我们的数据 需要数据处理,或者说找出最大数;

// 3.对于我们的数据 我们也非常想看到结果,那么就输出结果,大家都可以看一下;

return 0;

}

大家看到了,上面只是人在想,如何解决问题,具体的代码还没有。

但是这三步,便是具体代码要实现的。对于第一步,很清楚,应该有个内存空间用于存储待处理的信息。那么这就是一个问题,也就是我们需要怎样的数据类型来接受这些待处理的数据。这个试问题而定。其次我们还需要一个方法用于实现接受数据这么一个过程。比如 给这个方法起个名字 getData ;

好了如果第一步实现了,我们在那个存储空间下便有了我们的数据,接下来便是第二步,数据处理,在这个问题中便是找到最大数。那么看来是要通过一个方法来找到最大数,我们给这个方法起个名字 findMax ; 如果这个方法工作正常,应该可以找到最大数。我们是不是要记录这个最大数呢?那么我们同样需要一个存储空间用于存放这个 结果。当然我们可以在找到结果后,直接输出结果,这样就不需要这个结果存储空间。但是往往问题不是孤立的,一个搜寻结果,可能会在未来的某一时刻被访问,被调用。所以这样看来,开设这个存储空间用于存放搜寻结果是有必要的。

现在到了问题的第三步了。我们已经解决了问题,我们现在想看看问题的结果。这其实是访问搜寻结果。那么为了看到结果,我们通过一个方法,这个方法给他起个名字为 display ;

到这里我们可以改写以上逻辑代码了。不过还是毛胚

int main()

{

// 1. 对于我们的数据 getData;

// 2. 对于我们的数据 findMax;

// 3. 对于我们的数据 display;

return 0;

}

这些方法并不会自己起作用,这些方法从属于他的主人,只有他的主人才能支配这些方法,这个主人,便是一个具体的物体。就好像刀不会自己杀人一样。人操作了刀,使刀发挥了作用。在这个问题中,便是我们所研究的数据。也就是说我们现在有这样一个物体。他包含了反映他自身的信息,他同样包含了他自身具备的方法,或者说它有某些能力。通过使用这些能力,或者说通过对方法的使用,使他与外界沟通。 所以我们进一步,将上面代码改写为:

int main()

{

// myData.getData;

// myData.findMax;

// myData.display;

return 0;

}

在这里myData 就是一个 object 了,紧跟的那个小点,表示 object 调用它的方法。通过对他的3个方法的调用,将整个问题解决。

我们到目前为止,还是没有写出 那个抽象的 class . class 的作用是什么呢? class 的作用是对一类物体的抽象描述。也就是说,那类物体统统具有那些特性。那些特性是指同一类物体具有相同的存储数据方式,具有相同的处理数据的方法。

对于上面这个问题,我们现在可以写class 了。

这个class 包含了存储数据的一块,和处理数据的一块。我这个假设数据类型为 int 。( 当然可以通过 template 来处理,在这个问题中不对技术细节展开讨论。template 是用来使得数据不做事先定型的处理,在问题具体处理中,加以定型,使得代码的书写得以大大减少。)

那么这个class 看来是这样的。

class DataDemo

{

private:

enum{ MAX = 10};

int data_to_process[MAX];

int max;

public:

void getData();

void findMax();

void display();

};

好了我们现在有了这个class 了的定义,完整他。用一个具体的对象来调用它的方法就可以了。

现在问题来了。我们的对象在哪里? 当然要建立。怎么建立? 在C++ 中我们使用构造方法。顾名思义,通过调用构造方法,我们将构造一个对象。讲到这里,讲开去,我看了 live41 的一个关于template 的讨论的帖子。那位总坛主的观点我个人认为不对。在你个人没有写一个构造方法时(一个也没有写)系统将调用一个构造方法用于为创建的对象开设空间,仅此而已,任何被处理的数据都不是虚幻的,都有一个客观存在的物理空间,这就是构造方法要做的事情,当然如果你自己写了 默认构造方法,程序将只认得你的默认构造方法。我这里对构造方法的说明仅从C++ 语言出发解释,而那位总版主是从编译器的具体实现来解释,从而否定这一机制,是不对的。

所以可以看到,我这里没有提供构造方法,是可以的。

对于这3个方法的具体定义,会C语言的朋友,都可以写出来,我这里点到为止了。

那么如果我们现在class 具体写好了。main 函数里面怎么写呢? 很简单。通过class 生成 object. 然后通过生成的object 来调用其可用的方法来完成任务。我们认为是这个 object 在面对一个问题,这个object 通过使用其自身具有的方法来处理问题,最终解决问题。

这样 main 看起来是这样的。

int main() { DataDemo myData; myData.getData(); myData.findMax(); myData.display(); return 0; }

而比较C , C 写的程序是就问题而解决问题,他与具体的对象没有关系。这是不是本质上的区别.

以上个解,如有不同意见,可讨论。

// 如果大家感兴趣,我可以运用这样的解题方法,作具体来讲。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-12-09 09:11
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

啊,kai,你楼上的帖子很有教育意义,建议另开一帖。

你的建议这么深,管理员未必会看得到,建议去版务区发。

2004-12-09 10:04
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

C++其实更多的体现的是一种优良的编程思想,而不是一种语言。kai版主,不知我说得对不对?


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-12-09 10:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-7960-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.367690 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved