| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 587 人关注过本帖
标题:如何数据结构
只看楼主 加入收藏
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
 问题点数:0 回复次数:0 
如何数据结构
仅仅依赖C的基础,来啃这本数据结构教程是有一定难度的。教材中涉及到的面向对象概念(如类,对象,友元等),以及C中没有的的陌生C++语法(如引用,运算符重载,模板等),确实非常打击初学者的积极性。在这个过程中,学生如果闭门造车,很容易陷入各种概念和C++语法的泥潭。我将力图使大家少走弯路,把握主流,把初学者不应care的先扔一边,做到有的放矢的学习。
根据你们中绝大多数同学学过C而不了解C++的客观情况,将尽可能用C程序员容易理解的方式表述各种概念,而故意忽略其与C++的一些细微差别。等你们入门以后,区分这些概念应该不会很难。
首先,要理解什么是面向对象和C++。面向对象和面向过程是一种程序设计方法,C++,java,C#等语言都支持面向对象编程;而C++是一套语法规则,具体开发时常用的Microsoft的Visual C++,被成为集成开发环境(IDE)。C++不但支持面向对象,也支持面向过程。这里,有几个要点需要解释一下。

(1)什么是面向过程?你们现在使用的C编程方式就是面向过程,所以这应该很容易理解。通俗地讲,面向过程就是在编程之前必须先搞清楚一步一步怎么做,然后实现每个步骤(函数)。下面的例子具有典型的面向过程的特点。先定义数组,再初始化,最后排序。编程时,可以先搭好框架,再具体实现。(具体实现过程略)

/* 在 main() 函数里编写好总体步骤,在 main()函数外具体实现每个步骤(略)。 */
main()
{
int array[10];
init(array, 10); /* 初始化数组 array */
sort(array, 10); /* 对数组 array 进行排序 */
}


面向过程是是很自然的思维过程,可是面向韵缶托枰?欢ㄊ奔淙ヌ寤崃恕K?堑那?鹪谀睦锬兀客?驴础?BR>
(2)什么是面向对象?面向对象就不需要一步一步做了吗?
这个问题确实值得思考。首先,任何编译型语言(如C,C++),不管用什么思考方法编程(面向过程或面向对象),编译链接后的可执行文件在执行时,必然是一步一步有过程的。那么在程序设计时,程序员是否可以不需要指定每一步的先后步骤呢?以我目前的理解,面向对象编程时还是需要一步一步来,那这不就是“面向过程”吗?一定有人会跳起来反问。
如果一开始便试图用文字来解释清楚这个问题,给初学者的感觉往往是在玩文字游戏。好吧,我们先来看个类似于C的伪程序,它用面向对象的方法实现了刚才那个数组排序问题。说它是伪程序,是因为它无法实际编译通过,只是表达了设计思想而已。

/* 面向对象的一个类C伪程序,实现了数组排序*/
main()
{
int array[10];
array.init(); /* 这个 array 真厉害,自己会初始化 */
array.sort(); /* 嘿,还能自己排序啊 */
}

让我们对比一下这两个程序。同样定义了一个int array[10],面向过程的方法在编写时采用了"强制"手段。想初始化变量array?简单,编个函数,把array放进去。想对array排序啊?简单,还是编个函数,把array放进去。嘿,想怎么着,就怎么着,一点反抗都没有。

再来看面向对象的那个类C伪程序,先定义了变量array,它可不像刚才的array。你想使用 init(array, 10)来初始化我啊?不行。我只有自己的初始化方法init(),使用方式是我的大名加上init(),中间用.隔开,你要不要使用?于是你只好凑活着用了。你想调用sort(array, 10)让我排序啊?不行,我有自己的排序方式,要用就用我的。这个array真是有个性啊,什么事情都自己干。程序员可以指定执行过程,却无法强制让它“怎么做”(当然,最终“怎么做”还是由程序员实现,但可能不是同一个程序员)。

所以,面向对象的特点就是“主动性”。具有主动行为(体现在它自带的函数)的变量我们给它一个新的名字,就叫“对象”。如何让一个变量具有主动的行为(这里的变量现在应该改称“对象”了)?可以用C++的struct结构体来实现。

struct Array
{
int arry[10];

void init()
{
for(int i=0; i<10; i++)
arry[i] = i;
};

void sort()
{
;/* 略 */
}
}array;

what?结构体里可以定义函数?C编译器的确不可以,但可以使用函数指针来达到同样功能。在C++中,这样做是允许的。所以想让这段程序在VC中编译通过,必须保证文件后缀名是.cpp(使用C++编译器),而不能是.c(使用C编译器)。

好了,我们定义了一个结构体Array,以及一个结构体对象array(小写的a)。 这样,我们可以在main()函数中这样使用array:

void main()
{
array.init();
array.sort();
}

这个程序就是刚才那个面向对象的类C伪程序的具体实现。(未完待续)

那些写的迷糊的地方大家提出来啊。

搜索更多相关主题的帖子: 数据结构 面向对象 语法 概念 
2006-06-09 16:07
快速回复:如何数据结构
数据加载中...
 
   



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

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