作者简介
内容简介
第3部分面向对象语言实现数据结构
本部分实验指导是为已经学习过C++语言的学生而编写。编写实验指导的目的是为了配合理论教学。程序要求在Visual C++或者C++ Builder开发环境之下调试运行,采用面向对象方法进行设计。典型的数据结构被设计成为类(class),典型算法设计成为类的函数成员,然后在主函数中声明创建类对象,根据实际需要调用重要的算法。
由于C++的使用具有一定的难度,为了更好地学习数据结构自身的知识内容,克服描述工具所带来的困难,这里针对数据结构上机实验所必需的C++基本知识(结构体、类等等)做补充介绍。
1. 源程序组成
这部分内容参见本指导书的程序实例。
2. 结构体及运用
数据结构课程所研究的问题均运用到“结构体”和“类”。在C++语言中,结构体和函数又是理解和掌握“类”的语法基础。定义结构体的一般格式: struct 结构体类型名
{类型名1 变量名1;//数据子域
类型名2 变量名2;
类型名n 变量名n;
}其中,struct是保留字。结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量,声明创建一个结构体变量的方法是: 结构体类型名结构体变量名;一个结构体中可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等),也可以是已经定义的另一结构体名。数据子域变量名可以是简单变量,也可以是数组。它们也可以称为结构体的数据成员,其访问控制具有“公有”属性。
(1) 通过“结构体变量名.数据子域” 可以访问数据子域。// 设计Student结构体,在主程序中运用。
#include
#include
#include
struct Student//定义结构体Student
{longnum; //学号
int x;//成绩
charname\\[10\\]; //姓名
}
int main( )
{ Student s1;//声明创建一个结构体变量s1
//为s1的数据子域提供数据
s1.num=1001 ;
s1. x=83;
strcpy( s1.name, \" 李明\");
//输出结构体变量s1 的内容
cout<< \"姓名: \"<< s1.name <>a\\[i\\].num;//输入数组元素a\\[i\\]的学号域
cout<<\"姓名:\"; cin>> a\\[i\\].name;//输入数组元素a\\[i\\]的姓名域
cout<<\"成绩:\"; cin>>a\\[i\\].x;//输入数组元素a\\[i\\]的成绩域
}以上是关于结构体的基本概念和简单运用。
数组a有5个数组元素,每个数组元素都是Student结构体类型。数组a的存储结构如下:
3. 类的基本概念及运用
类是面向对象程序的基本单位。类由数据成员和相关的函数成员组成。从面向对象的角度考虑“学生”这个类,它不仅包括“学生”的一般属性(学号、姓名、成绩等),还应包括对于这些属性的操作(输入输出、听课、实验等)。
类定义的一般格式: class类名
{若干数据成员;
若干函数成员;
};类的数据成员和函数成员均存在访问控制权限问题。访问控制分为3种: 公有(public)、私有(private)和受保护(protected)。
数据成员的定义和结构体中的数据域定义是相似的。不同的是,它们必须明确访问控制。而公有数据成员,可以认为与结构体的数据域的访问权限相同。
成员函数的定义与一般函数的定义基本相同。不同的是,类中成员函数也必须明确访问控制权限。如果在类之中定义成员函数带函数体,并没有什么特殊之处。如果在类之中仅有成员函数的原型声明,那么当在类定义之外定义函数体时,需要加上类限定标识“类名: : ”。下面是“学生”类的定义: class Students//定义类结构体Students
{private: //私有数据成员
longnum;//学号
int x; //成绩
charname\\[10\\];//姓名
public: //公有成员函数
Students( );
Students ( long n, int x0, char na0 )
{ num=n;x=x0;strcpy( name,na0);}
~Students( ) { };
void SetDat( long n, int x0, char na0 )
{ num=n;x=x0;strcpy( name,na0);
}
void PrintOut( );//输出函数的原型声明
//其他函数…;
};
voidStudents::PrintOut( )//输出函数前加Students::
{cout<< \" 姓名: \"<< name <>m>>y>>xname;
s. SetDat( m, y, xname ) ;//修改对象s的数据
s. PrintOut( );//输出改变后s的内容
Studentsw(1002, 85, \"LiHua\") s; //声明创建一个类对象w,调用有参构造函数
w. PrintOut( ); //输出对象w的内容
_getch( ); return 0;
}运行结果: 姓名:O
学号:0
成绩:0
输入学号,成绩,姓名: 1001 90 WangMing
姓名:WangMing
学号:1001
成绩:90
姓名:LiHua
学号:1002
成绩:85通过上面两个类对象的图示,可以了解它们的内部数据情况。
对象s的数据是通过键盘输入,再经由s. SetDat( m, y, xname ) 这个公有函数的运行,提供给对象s的私有数据成员。
而对象w的数据是通过Studentsw(1002, 85, \"LiHua\") s;声明创建对象w时自动调用构造(有形参的)函数,将实参数据提供给对象w的私有数据成员。
这个例题中的数据成员全部定义为私有(private),以便保证数据安全性。
而函数成员全部定义为公有(public)成员函数,可以作为类对外部的接口。通过s. SetDat( m, y, xname ) 直接访问公有函数成员SetDat( ), 将实参(主函数的局部变量m、y、xname)的数据赋值给类的私有数据成员num、x、name。通过 s.PrintOut( )直接访问公有函数成员PrintOut( ),由它间接访问和输出私有数据成员num、x、name。
在面向对象的程序设计中,正确理解构造函数的作用是非常重要的。
在主函数中,语句“Students s;”的作用是自动调用无参构造函数,声明创建一个类对象s。主函数中倒数第3行语句“Students w (1002, 85, \"LiHua\")s;”的作用是自动调用带有形参的构造函数,声明创建一个类对象w。而语句“w. PrintOut();”的作用是输出对象w的数据内容。
\"本书是数据结构课程的辅助教材,采用C和C++两种语言来描述数据结构,让学生在实验与习题中体会与掌握数据结构,同时培养编程能力和分析能力。主要内容包括实验与习题两大部分,用于巩固数据结构的理论知识,提高实践应用能力。
本书内容立足于高校教学的要求,适用于本科院校的课程和学生群体,可作为数据结构与算法课程的辅助教材,也可作为初学数据结构读者的自学读物。
\"



