1、从基本顺序表到基本顺序表类在上一期的“数组和基本顺序结构”一文中我们讲到,优秀的程序员自觉地把函数分为基本操作函数和应用函数,然后把基本操作函数和基本顺序表结构看作一个整体,当作一个类型,用于应用函数即程序的设计和实现,表 1 简要概括了这些内容。 可是 C 语言编译器没有把这两类函数区别开,它们的声明、定义和调用方式都一样。不仅如此,它们对结构成员的访问权限也一样,应用程序可以直接访问结构成员,例如表 1 中的 Purge 函数可以修改为: void Purge(SeqList *L)/删除表中的重复数据 int i,j; for(i=0;iL-size;i+)/直接访问结构成员 size
2、j=i+1; while(jL-size) if(L-datai=L-dataj) /直接访问结构成员 data Erase(L,j); else j+; 而 C+编译器克服了 C 的局限性,实现程序员的设计方法,从概念和语法两个方面把两类函数区分开来。 1.从 C 基本顺序表到 C+基本顺序表类的转换 下面我们分十步把表 1 中简化的 C 基本顺序表结构转化为 C+基本顺序表类。 布尔型函数。C+ 增加了布尔型,它占用一个字节,仅取两个值:真和假(true 和 false),对应的整型值是 1 和 0。于是,对取真假值的函数,应将其返回值定义为布尔型。例如: bool ListEmpty(c
3、onst SeqList *l);/判空 将宏常量改为 const 常量。例如将 #define MaxSeqSize 100 改为 const int MaxSeqSize=100; 在 C+中一般都用 const 常量或者枚举常量来代替宏常量,这是因为宏代表的是在预处理阶段完成的一种文本替换过程,它忽略了语言的作用域、类型系统和所有其他的语言特性和规则,这使它和语言本身割裂开来。 常量型引用调用。把带有形式数据类型参量的值调用函数改为常量型引用调用1: void InsertRear(SeqList *l, const Type/尾插 函数类型是常量型引用。若函数类型是形式数据类型,则将其
4、改为常量型引用1: const Type/取值 重载。简化求长和判空等函数名: int Size(const SeqList *l);/求长。取元素个数 bool Empty(const SeqList *l);/判空 在 C 语言中,函数名代表函数地址,因此不同的函数必须有不同的函数名,即使参数表不同而功能相同的函数,也要赋予不同的函数名。例如,在基本顺序表、基本顺序队列和基本顺序栈中的求长基本操作,虽然功能一样,但是函数名必须有别: int ListSize(const SeqList *l);/基本顺序表求长 int QSize(const Queue *q);/基本顺序队列求长 int
5、 StSize(const Stack *s);/基本顺序栈求长 显然,这给程序设计和阅读带来不必要的麻烦。按照简约的习惯,功能相同的函数,即使参数表不同,也应具有相同的函数名,例如: int Size(const SeqList *l);/基本顺序表求长 int Size(const Queue *q);/基本顺序队列求长 int Size(const Stack *s);/基本顺序栈求长可是函数名相同而参数表不同的函数如何对应不同的地址呢?一种简单的方法是建立一个映射,使函数名和参数表对应一个新的函数名。这个映射是单一的:只要函数名和参数表有一处不同,所对应的新的函数名就不同。我们让这个新
6、的函数名对应函数的地址,这项工作由 C+编译器来完成。它根据参量表的参量个数和类型对函数名进行扩展,形成函数的内部名称,这个内部名称对应函数地址。例如,求长函数经编译器扩展后的内部名称可能是: Size_const_SeqList* Size_const_Queue* Size_const_Stack* 当然,不同的编译器,扩展方法可能不同,但实质相同。 成员函数。首先,将构造函数和基本操作函数参量表中的结构指针 l 改名为 this,例如:void SetList(SeqList *this);/给元素个数 size 赋值 0 int Size(const SeqList *this);/求
7、长 bool Empty(const SeqList *this);/ 判空 const Type GetData(const SeqList *this,int id); / 取值 void InsertRear(SeqList *this, const Type/尾插 void Delete(SeqList *this, int id);/定点删除 错误信息报告函数没有结构指针参量,需要补上(补上的 this 指针在定义中没有用,我们称它为哑元),然后将函数名简化: void Error(const SeqList *this,const char *c);/错误信息报告 接下来,将 th
8、is 指针隐藏,指向常量指针 this 的 const 修饰符移到参量表括号之后。最后,将构造函数和基本操作函数放入结构体内,成为结构的成员,称为成员函数,后带 const修饰符的函数称为常量型成员函数: const int MaxSeqSize=100; struct SeqList Type dataMaxSeqSize; int size; void SetList(void);/构造函数 int Size (void)const; /常量型成员函数 bool Empty(void)const; void InsertRear(const Type const Type/常量型成员函数
9、void Erase(int id); void Error(const char *c)const; /常量型成员函数 ; 成员函数的调用方式发生变化,设 L 为表结构变量,原来是 ListSize(/L 基本顺序表结构变量 Erase(现在是 L.Size(); L.Erase(1); 设 L 为表结构指针,原来是ListSize(L); /L 基本顺序表结构变量指针 Erase(L,1); 现在是 L-Size(); L-Erase(1); C+编译器对新的调用方式在内部展开的过程与上面生成函数成员的过程正相反。例如: L.Size(); 内部展开过程首先是显示 this 指针参量,然后
10、根据参量表扩展函数名,扩展之后,函数的内部原型可以假设是 int _ListSize(const SeqList*this); 然后调用形式为: _ListSize( 实质上与原来相同,但是意义大不一样:成员函数属于结构的成员,由结构变量负责调用,而且成员函数中隐藏的 this 指针就指向那个调用它的结构变量。 原来一个结构空间的大小是其数据成员空间大小之和,现在结构中包含了函数成员,是否结构空间就变大了?答案是没有。从图 1 演示的成员函数调用的内部过程我们不难理解,新的结构与原来的结构本质上是相同的,只是编译器的工作多了,函数和调用有了内部展开形式。 成员函数定义。成员函数的定义可以在结构
11、体内,也可以在结构体外。在结构体内定义,等于内联函数;在结构体外定义,等于函数类型标识符和函数名之间要加入结构名和域解析运算符“:” ,以区别于一般的实用函数。在函数定义体内, this 指针可以显示,也可以隐藏。 const int MaxSeqSize=100; struct SeqList Type dataMaxSeqSize; int size; void SetList(void); int Size (void)constreturn(size);/ return(this-size); /在结构体内定义 bool Empty(void)const; ; bool SeqList
12、:Empty() const/在结构体外定义 return(size=0);/return(this-size=0); 构造函数。现在从声明、定义和调用三个方面把基本操作函数与实用功能函数区分开了,接下来我们区分构造函数和基本操作函数。在基本顺序表中,构造函数的执行过程是: Seqlis L; SetList(/调用构造函数 这两条语句是不能分开的,它们一起完成了基本顺序表的创建。C+把这两条语句合并为一条。具体方法是:把构造函数名和结构名统一,都是 SeqList,使语句 Seqlis L; 蕴涵着调用构造函数。因为构造函数是基本顺序表定义的一部分,所以它的头应该是结构名称,不含返回值类型说
13、明。又因为它的内容需要程序员定义,所以保留了函数体。 struct SeqList SeqList(void);/构造函数声明,名称与结构名称相同,而且取消了函数返回值类型 ; SeqList:SeqList (void)/构造函数外部定义 size=0;/this-size=0; 访问权限。在基本顺序表中,各种函数都可以直接访问结构成员,没有区别。C+在结构中增加了访问权限,一般分私有和公有。私有成员只能由结构成员访问,即对结构成员公开,而结构以外的函数只能访问公有成员。公有部分是任何函数都可以直接访问或使用的,即对外公开、可见。 const int MaxSeqSize=100; stru
14、ct SeqList private:/私有声明 Type dataMaxSeqSize; int size; void Error(const char *c)const;/私有函数 public:/公有声明 SeqList(void);/构造函数 int Size (void)const; bool Empty(void)const; void InsertRear(const Type const Type void Erase(int id); ; 结构以外的函数“看不见”结构中的私有部分。例如,实用功能函数 Purge 是不能直接访问结构成员 data、size 和Error,只能通
15、过公有成员函数来处理: void Purge(SeqList *L) / 删除表中的重复数据 int i,j; for(i=0;i L-Size();i+) j=i+1; while(j L-Size() if(L-GetData(i)=L- GetData(j) L-Erase(j); else 摘要:本文以 VFP 教学为例,通过对循环语句中给出的一道例题,提出了在程序设计语言教学中如何培养学生编程的兴趣和技巧。在教学过程中应因材施教,引导学生在课堂上积极思考,提高分析和解决问题的能力。 关键词本文来自:计算机毕业网 :计算机程序设计;学习能力;兴趣 1引言 目前,国内绝大多数高校的“计算
16、机程序设计语言”这门课程一般是选择一门语言进行教学。按传统的教学模式,把计算机程序设计作为一门语言来进行讲解,注重语言的基本语句、语法和一些细节的分析,按部就班地依照语言教学的规范,进行“字” 、 “词” 、 “句”的讲解,使学生原来很高的学习热情,由于枯燥、乏味的语法和过分的细节约束而失去了对该门课程的学习兴趣,往往产生畏难的情绪。究其原因,是因为教学没有站在如何应用计算机工具编程解决实际问题或实际项目的角度,没有把逻辑与编程思想放在主体地位,没有教给学生如何分析和解决问题,其结果是教师教得很辛苦,学生学得很模糊,遇到问题不知如何分析,好像是在学习第二门外语,而不是程序设计。 根据以上情况,
17、本人在进行实际的教学过程中进行了改革,改变传统的教学方式,利用实验室多媒体的教学优势,在讲解循环语句时做了尝试。实践证明,课堂气氛活跃,互动性强,有利于学生共同参与讨论,锻炼学生的学习能力和创新思维,提高了学生的学习兴趣。2 问题的提出 首先,从一道例题着手分析。 例 1:要求输出如下图形: * * * * * * * 分析该图形的输出,不难得出如下的结论,该图形输出 7 行,每行输出 9 个“*” 。 给出伪代码: for i=1 to 7 ? “*” endfor 思考:如何用双重循环来实现该图形的输出,给出伪代码,并给出适当的说明。 for i=1 to 7 教学内容;教学方法;教学手段 近几年我国的高等成人教育在规模上得到了迅猛发展,在大发展的同时,我国的高等成人教育质量以及成教学员的学习现状不容乐观,成人教育管理工作者们越来越感到成人教育难于管理,成人教育的各个环节越来越难于保证按质按量完成,特别是成教学员参与学习的积极性不高,面授学习时间不能得到根本保证1。现有的成人教育内容与管理模式难以满足广大成教学员的需求等问题。反映了成人教育的教学目标、教育内容、教育方法、教育手段、管理观念等方面的问题。因此,成人高等教育有
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。