C程序设计第5章构造数据类型.ppt
《C程序设计第5章构造数据类型.ppt》由会员分享,可在线阅读,更多相关《C程序设计第5章构造数据类型.ppt(151页珍藏版)》请在三一办公上搜索。
1、第五章 程序的数据描述(II)构造数据类型,本章内容,构造数据类型概述 枚举类型数组类型结构与联合类型指针类型(参数传递和动态数据结构)引用类型,构造数据类型,有些数据不适合用基本数据类型来表示。语言往往提供了由基本数据类型来构造新类型的手段。构造数据类型属于用户自定义数据类型。枚举类型数组类型结构/联合类型指针/引用类型,枚举类型,如何描述一个星期的每一天这样的数据?如果用int来描述,将会面临:1表示什么意思?星期天用什么整数表示?0还是7?如果用06表示一个星期的每一天,则对于一个取值为一个星期某一天的int型变量day,如何防止下面的逻辑错误:day=10day=day*2在C+中用枚
2、举类型来解决上面的问题。,枚举类型的定义,枚举类型是由用户自定义的一种简单数据类型。在定义一个枚举类型时,需要列出其值集中的每个值(枚举值)。枚举类型的定义格式为:enum;为用逗号隔开的若干个标识符。例如:enum Day SUN,MON,TUE,WED,THU,FRI,SAT;enum Color RED,GREEN,BLUE;enum Month JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC;,每一个枚举值都对应着一个整数。默认情况下,第一个枚举值对应常量值0,其它的值为前一个值加1。在定义枚举类型时,也可给枚举值指定对应的整数值。例如:
3、enum Day SUN=7,MON=1,TUE,WED,THU,FRI,SAT;TUE:2,.bool类型可看成是C+语言提供的一个预定义的枚举类型:enum bool false,true;,枚举类型变量的定义格式为:;或enum;或enum;或enum;例如:enum Day SUN=7,MON=1,TUE,WED,THU,FRI,SAT;Day d1;,枚举类型的运算,赋值一个枚举类型的变量只能在相应枚举类型的值集中取值。例如:Day day;day=SUN;/OKday=1;/Errorday=RED;/Error相同枚举类型之间可以进行赋值操作,例如:Day d1,d2;d2=d1
4、;可以把一个枚举值赋值给一个整型变量,但不能把一个整型数赋值给枚举类型的变量,例如:int a;a=d1;/OKd1=a;/Errord1=(Day)a;/OK,但不安全,比较枚举值之间的比较为枚举值所对应的整数之间的比较。例:MON d;/Errorcout d;/OK,将把d转换成int,枚举类型输入/输出举例,#include using namespace std;int main()Day d;int i;cin i;switch(i)case 0:d=SUN;break;case 1:d=MON;break;case 2:d=TUE;break;case 3:d=WED;break
5、;case 4:d=THU;break;case 5:d=FRI;break;case 6:d=SAT;break;default:cout Input Error!endl;exit(-1);,.switch(d)case SUN:cout SUN endl;break;case MON:cout MON endl;break;case TUE:cout TUE endl;break;case WED:cout WED endl;break;case THU:cout THU endl;break;case FRI:cout FRI endl;break;case SAT:cout SAT
6、endl;break;return 0;,数组类型,如何表示一个向量和矩阵这样的复合数据?如果用独立的变量来分别表示它们的元素,则会面临:变量数量太多。变量之间缺乏显式的联系。C+提供了数组类型来表示上述的数据:数组类型是一种由固定多个同类型的元素按一定次序所构成的复合数据类型。数组类型是一种用户自定义的数据类型。数组类型可分为:一维数组:表示向量和线性表等二维数组:表示矩阵等多维数组(三维及三维以上),一维数组,用于表示由固定多个同类型的具有线性次序关系的数据所构成的复合数据类型。如:向量、某门课程的成绩表、学生的姓名表等。数组类型定义格式为:typedef;为任意C+类型(void除外)为
7、整型常量表达式例如:typedef int A10;/由10个int型元素所构成的/一维数组类型,一维数组类型变量定义格式为:;或;为任意C+类型(void除外)为整型常量表达式例如:typedef int A10;A a;/由10个int型元素所构成的数组。或int a10;/由10个int型元素所构成的数组。,一维数组的操作,通常情况下,对数组类型数据的操作要通过其元素来进行。访问一维数组元素格式:为整型表达式第一个元素的下标为:0例如:int a10;/数组aa0、a1、.、a9/数组元素C+语言不对数组元素下标越界进行检查。程序员必须仔细处置这个问题!如:ai中i的取值,可把数组的每个
8、元素看成是独立的变量。例如:int a10;int sum=0,i;.for(i=0;i10;i+)sum+=ai;不能对两个数组进行整体赋值,需要通过元素来进行:int a10,b10;.a=b;/Errorfor(int i=0;i10;i+)ai=bi;/OK,例:用一维数组实现求第n个费波那契(Fibonacci)数,#include using namespace std;int main()const int MAX_N=40;int fibsMAX_N;int n,i;cout n;if(n MAX_N)cout n太大!应不大于 MAX_N endl;return-1;fibs
9、0=fibs1=1;/初始化第1、2个费波那契数for(i=2;in;i+)/计算其它的费波那契数fibsi=fibsi-1+fibsi-2;cout 第 n 个费波那契数是:fibsn-1 endl;return 0;,例:从键盘输入10个数,输出其中的最大值,.int main()int a10;for(int i=0;i ai;int max=a0;/首先假设第0个元素最大for(i=1;i max)max=ai;cout max endl;,例:从键盘输入10个数,把它们从小到大排序后输出,从n个数中找出最大者,与第n个数交换位置;然后,从剩余的n-1个数中再找出最大者,与第n-1个数
10、交换位置;,一直到剩下的数只有一个为止。int main()int a10;int i;for(i=0;i ai;for(int n=10;n1;n-)/n为元素个数 int j=0;/用j记住最大元素的下标,首先假设第0个元素最大 for(i=1;iaj)j=i;/保持j为最大元素的下标/交换aj和an-1的值 int temp=an-1;an-1=aj;aj=temp;for(i=0;i10;i+)cout ai;,一维数组变量的初始化,用一对花括号把元素的初始值括起来。例如:int a10=1,2,3,4,5,6,7,8,9,10;初始化表中的值可以少于数组元素个数,不足部分的数组元素初
11、始化成0。例如:int b10=1,2,3,4;/b4b9为0如果每个元素都进行了初始化,则数组元素个数可以省略。例如:int c=1,2,3;/隐含着c由三个元素构成,一维数组的存储分配,对于一维数组类型的数据,编译程序将会在内存中给其分配连续的存储空间来存储数组元素。例如:int a10;其内存空间分配如下:a0 a1.a9,一维数组所占的内存空间大小可以用sizeof操作符来计算。例如:int a10;cout sizeof(a);/输出数组a所占的内存字节数。,向函数传递一维数组,被调用函数的形参一般为不带数组大小的一维数组定义以及数组元素的个数。例如:int max(int x,in
12、t num)int i,j;j=0;/先假设第0个元素最大for(i=1;i xj)j=i;return j;,调用者需要把一个一维数组变量的名以及数组元素的个数传给被调用函数。例如:int a10,b20,index_max;.index_max=max(a,10);cout aindex_max index_max endl;index_max=max(b,20);cout bindex_max index_max endl;,为了提高数组传递的效率,数组作为函数参数传递时实际传递的是数组在内存中的首地址,函数的形参数组不再分配内存空间,它共享实参数组的内存空间。函数中通过形参数组能改变实
13、参数组的值!(函数的副作用),字符串的一种实现一维字符数组,C+语言本身没有提供字符串类型。在C+中,通常用元素类型为char的一维数组(字符数组)来表示字符串类型。例如:char s10;/可表示长度为9的字符串用字符数组存贮字符串时,通常在最后一个字符的后面放置一个字符串结束标记:0。在定义一个字符数组时,其元素个数应比它实际能够存储的字符串最大长度多一个.字符串作为函数参数传递时,只要给出一维字符数组类型的形参,不需要给出字符个数(长度)。,例:编写一个函数把一个由数字构成的字符串转换成一个整型数,算法:1234-(1*10+2)*10+3)*10+4int str_to_int(cha
14、r str)if(str0=0)return 0;int n=str0-0;for(int i=1;stri!=0;i+)n=n*10+(stri-0);return n;,int str_to_int(char str)int n=0;for(int i=0;stri!=0;i+)n=n*10+(stri-0);return n;,字符数组的初始化,char s10=h,e,l,l,o,0;char s10=hello;char s10=hello;char s=hello;在上面的字符数组初始化中,除了第一种形式,其它形式的初始化都会在最后一个字符的后面自动加上0,而对于第一种形式,程序中
15、必须显式地加上0。,标准库中的字符串处理函数(头文件cstring或string.h),计算字符串的长度int strlen(const char s);字符串复制char*strcpy(char dst,const char src);char*strncpy(char dst,const char src,int n);字符串拼接char*strcat(char dst,const char src);char*strncat(char dst,const char src,int n);字符串比较int strcmp(const char s1,const char s2);int st
16、rncmp(const char s1,const char s2,int n);,例:从键盘输入一个字符串,然后把该字符串逆向输出,#include#include using namespace std;int main()const int MAX_LEN=100;char strMAX_LEN;cin str;/?int len=strlen(str);/str中的字符个数for(int i=0,j=len-1;ilen/2;i+,j-)char temp;temp=stri;stri=strj;strj=temp;cout str endl;return 0;,二维数组,二维数组通常
17、用于表示由固定多个同类型的具有行列结构的数据所构成的复合数据。如矩阵等。二维数组所表示的是一种具有两维结构的数据,第一维称为二维数组的行,第二维称为二维数组的列。二维数组的每个元素由其所在的行和列唯一确定。,二维数组类型定义格式:typedef;为任意C+类型(void除外)和为整型常量表达式例如:typedef int A105;/由10行、5列int型元素/所构成的二维数组类型,二维数组类型变量的定义格式:;或;或 为任意C+类型(void除外)、和为整型常量表达式,例如:typedef int A105;A a;或int a105;或typedef int B5;B a10;,二维数组的
18、操作,访问二维数组元素,格式是:和为整型表达式,均从0开始。例如:int a105;a00、a01、.、a90、.、a94以行为单位访问,例如:int a105;a0、a1、.、a9上面每一个都为一个一维数组,代表二维数组中的一行,对二维数组的操作通常是通过其元素来进行。例如:int a105,sum=0;.for(int i=0;i10;i+)for(int j=0;j5;j+)sum+=aij;,例:从键盘输入一个NN的矩阵,把它转置后输出,#include using namespace std;int main()const int N=3;int aNN;int i,j;/输入矩阵数
19、据cout aij;,/矩阵转置:交换aij和aji的值,i=0N-1,j=i+1N-1for(i=0;iN;i+)for(j=i+1;jN;j+)/交换aij与aji的值int temp=aij;aij=aji;aji=temp;/输出转置后的矩阵cout 转置后为:n;for(i=0;iN;i+)for(j=0;jN;j+)cout aij;cout endl;return 0;,x x x x x x x x x x x x x x x,二维数组的初始化,int a23=1,2,3,4,5,6;int a23=1,2,3,4,5,6;int a23=1,2,3,4;以上初始化按照数组的行
20、来进行 int a23=1,2,3,4;a00、a01、a10和a11分别初始化为1,2,3和4,其它为0int a3=1,2,3,4,5,6,7,8,9;行数为3,二维数组的存贮,在C+中,二维数组元素是按照行来存储的,即先是第一行的元素;再是第二行的元素;.。例如:int a105;其内存空间分配如下:,a00.a04 a10.a14.a90.a94,向函数传递二维数组,被调用函数的形参应为不带数组行数的二维数组定义及其行数。例如:int sum(int x5,int lin)/接收lin行、5列的二维数组int s=0;for(int i=0;ilin;i+)for(int j=0;j5
21、;j+)s+=xij;return s;注意:二维数组作为函数参数传递时实际传递的也是数组的首地址,因此,二维数组形参的列数必须要写,否则,函数体中无法计算xij的内存地址:xij的地址=x的首地址+i列数+j,调用者需要提供一个二维数组变量(列数要与形参相同)的名和行数。例如:int a105,b205;.cout a的元素之和为:sum(a,10)endl;cout b的元素之和为:sum(b,20)endl;下面的二维数组c就不能调用函数sum来计算其元素的和,因为c的列数与函数sum要求的列数不符:int c4020;.sum(c,40);/Error,二维数组降为一维数组处理,int
22、 sum(int x,int num)int s=0;for(int i=0;inum;i+)s+=xi;return s;.int a105,b205,c4020;.cout sum(a0,10*5)endl;cout sum(b0,20*5)endl;cout sum(c0,40*20)endl;,例:求解约瑟夫(Josephus)问题,约瑟夫(Josephus)问题是:有N个小孩围坐成一圈,从某个小孩开始顺时针报数,报到M的小孩从圈子离开,然后,从下一个小孩开始重新报数,每报到M,相应的小孩从圈子离开,最后一个离开圈子的小孩为胜者,问胜者是哪一个小孩?采用一个一维的循环数组in_circ
23、le来表示小孩围成一圈:bool in_circleN;in_circlei为true表示编号为i的小孩在圈子里。圈子中i的下一个位置j=(i+1)%N,0,N-1,1,N-2,报数采用下面的方法来实现:从编号为0的小孩开始报数,用变量index表示要报数的小孩的下标,其初始值为N-1(即将报数的前一个小孩的下标)。下一个要报数的小孩的下标由:(index+1)%N 来计算。用变量count来对成功的报数进行计数,每一轮报数前,count为0,每成功地报一次数,就把count加1,直到M为止。要使得报数成功,in_circleindex应为true。用变量num_of_children_rem
24、ained表示圈中剩下的小孩数目,其初始值为N。,/变量num_of_children_remained表示圈中剩下的小孩数目,其初始值为N/变量count来对成功的报数进行计数/变量index表示要报数的小孩的位置#include using namespace std;const int N=20,M=5;int main()bool in_circleN;int num_of_children_remained,index;/初始化数组in_circle。for(index=0;indexN;index+)in_circleindex=true;,/开始报数index=N-1;/从编号为
25、0的小孩开始报数,/index为前一个小孩的位置。num_of_children_remained=N;/报数前的圈子中小孩个数while(num_of_children_remained 1)int count=0;while(count M)/对成功的报数进行计数,直到M。index=(index+1)%N;/计算要报数的小孩的编号。if(in_circleindex)count+;/如果编号为index的/小孩在圈子中,该报数为成功的报数。in_circleindex=false;/小孩离开圈子。num_of_children_remained-;/圈中小孩数减1。,/找最后一个小孩fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 构造 数据类型
链接地址:https://www.31ppt.com/p-6503643.html