再上一篇:8.6 引用和其它类型的指针
上一篇:8.7 简单链表及其应用
主页
下一篇:第九章 类和对象
再下一篇:9.2 类
文章列表

8.8 类型定义

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

为了增加程序的可读性和可移植性,C++语言提供了产生新的类型标识符的功能。定义新类型标识符的一般格式为:

typedef <类型> <标识符> 《,<标识符1> , ...》;

其中类型是标准的类型名(如integer,float等),或是用户自定义的类型名(如结构体,共同体等),或是已定义的新类型标识符。经类型定义后,这标识符可以作为类型说明符或者作为强制类型转换的类型标识符来使用。如:

typedef int LENGTH; //A

typedef char *STRING; //B

typedef int VEC[50]; //C

typedef struct node { //D

char *word;

int count;

struct node *left, *right;

} TREENODE, *TREEPTR;

A行指定用LENGTH代替int(或者说,把int定义为LENGTH)。可用LENGTH来说明变量,如:

LENGTH i,j; //等同于:int i,j;

B行指定用STRING代替char *(或者说,把char *定义为STRING)。可用STRING来说明变量,如:

STRING s1,s2; //等同于: char *s1,*s2;

C行将VEC指定为包含50个元素的一维整型数组,可用VEC来说明变量:

VEC x,y; //等同于: int x[50],y[50];

D行将TREENODE定义为结构体node类型,将TREEPTR定义为结构体node类型的指针。可用这二个类型名来定义变量:

TREENODE pp,p1[10]; //等同于: node pp,p1[10];

TREEPTR p; //等同于: node *p;

也可以用来定义指向函数的指针:

typedef int (*PF)(void);

把PF定义为指向函数的指针。如:

PF f; //等同于: int (*f)(void);

定义新类型标识符的方法可归结为:

1)先用定义变量的方法写出变量说明。如,int (*f)(void);

2)将变量名换为新的类型标识符。如,int (*FP)(void);

3)在前面加上typedef。如,typedef int (*FP)(void);

4)用新类型标识符定义变量。如,FP f1,f2;

例如,第一步,先定义结构体变量:

struct node {

int x,y;

} v1,v2[20],*ps;

第二步,把变量名换为新的类型名:

struct node {

int x,y;

} SV,SV2[20],*PS;

第三步,在其前面加上typedef:

typedef struct node {

int x,y;

} SV,SV2[20],*PS;

第四步,可用新的类型标识符定义变量:

SV s1,s2[10]; //等同于:node s1,s2[10];

SV2 s3,s4[5]; //等同于:node s3[20],s4[5][20];

PS p1,p2; //等同于:node *p1, *p2;

关于类型定义,说明以下几点:

1、typedef只能定义类型标识符,不能定义变量。

2、用typedef定义新的类型标识符来说明变量可增加程序的可读性和可理解性,即根据类型名的英文字意可知道变量的用途。如:

typedef int LENGTH,WIDTH,SIZE;

LENGTH l1,l2,l3; //变量l1,l2,l3表示长度

WIDTH w1,w1,w3; //变量w1,w1,w3表示宽度

SIZE s1,s2,s3; //变量s1,s2,s3表示大小

3、typedef 只能对已存在的类型增加新的类型名,并不能定义新的类型。

习题与思考8

1. 设有变量说明语句:

char *p1;

int *p2;

float *p3,x;

指出以下每一个语句的错误原因。

(1) cin >>p1;

(2) *p2 = 34567;

(3) p2 = p3;

(4) p3 = p1;

(5) p1 = &x;

2.用指针作为函数的参数,设计一个实现二个参数交换的函数。输入三个实数,按升序排序后输出。

3.定义一个二维的字符串数组,输入若干个字符串,按升序排序后输出。要求设计一个通用的排序函数,输入参数为字符串数组和要排序的字符串的个数。

4.设计一个通用的插入排序函数,参数为指向实数的指针(指向一个已排序好的数组)和一个实数,将这个实数插入到已排序好的数组中。主函数完成输入若干个实数,每输入一个实数,调用一次插入排序的函数完成数据的排序。最后输出已排序的数据。5.设计一个函数,求字符串的长度(指向字符串的指针作为函数的参数)。在主函数中输入一个字符串,并输出这个字符串及其长度。

6.设计一个函数,将一个字符串拼接到另一个字符串的尾部,拼接后构成一个新的字符串。主函数完成输入二个字符串,输出这二个字符串和拼接后的新字符串。

7.设计一个函数,将一个字符串拷贝到另一个参数所指向字符数组中。主函数完成输入一个字符串,输出拷贝后的字符串。

8.输入一个二维数组 A[6][6]。设计一个函数,用指向一维数组的指针变量和二维数组的行数作为函数的参数,求出平均值、最大元素和最小元素值,并输出。

9.设计一个用矩形法求积分的通用函数,被积函数的指针、积分的上限、积分的下限和积分区间的等分数作为函数的参数。分别求出以下几个定积分的值。

积分区间的等分数分别为1000,2000,3000。

10.定义一个指向字符串的指针数组,用一个函数完成n个不等长字符串的输入,用new 运算符根据实际输入的字符串长度分配存储空间,依次使指针数组中的元素指向每一个输入的字符串。设计一个完成n个字符串排序的函数(在排序的过程中,要求只交换指向字符串的指针值,不交换字符串)。在主函数中完成将排序后的字符串输出。

11.输入一个字符串,串内有数字和非数字字符,如:

abc2345 345rrf678 jfkld945

将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。如对于上面的输入,将2345存放到b[0],345放入b[1],…。统计出字符串中的整数个数,并输出这些整数。要求在主函数中完成输入和输出,设计一个函数,把指向字符串的指针和指向整数的指针作为函数的参数,并完成从字符串中依次提取出整数的工作。

12.建立一条无序链表,每一个结点包含:学号、姓名、年龄、C++成绩。由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间。

13.建立一条有序链表,其它的要求与上一题相同,按C++成绩的升序排序。14.建立一条无序链表,每一个结点包含:学号、姓名、年龄、C++成绩、数学和英语成绩。求出总分最高和最低的同学并输出。

15.建立一条无序链表,用一个函数实现将这条链表构成一条新的逆序链表,即将链表头当链表尾,链表尾当链表头。输出这二条链表上各个结点的值。

*16.设链表上的结点的数据结构为:

struct node {

int data;

node *left,*right;

};

构造一棵二叉树,结点上的指针left和right分别指向该结点的左子树和右子树。要求对任一结点,其左子树的所有结点上的数据data值,均小于该结点的data值;其右子树的所有结点上的数据data值,均大于该结点的data值。设输入的结点数据为:

24 36 12 8 13 25 77

构造一棵满足条件的二叉树。

第二部分 面向对象的程序设计

第一部分介绍的内容属于 C++程序设计语言的基础知识,适用于编写面向过程的程序设计。第二部分将逐步介绍C++中为面向对象程序设计所提供的类、

对象、成员数据和成员函数的、类的派生和继承、多态性、运算符的重载和I/O流类等有关内容。