350 likes | 464 Views
Visual C++ 程序设计. 武汉职业技术学院计算机科学系. 万 彪 2004.11. 第三章 C++ 语言基础. 本 章 内 容. 1 、 C++ 语言概述. 6 、函数. 2 、基本数据类型. 7 、指针与数组. 3 、常量和变量. 8 、扩展数据类型. 4 、表达式. 9 、类、对象的表达. 5 、流程控制. 10 、重要的函数. 3.8 扩展数据类型. 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.4 结构成员的访问操作
E N D
Visual C++程序设计 武汉职业技术学院计算机科学系 万 彪 2004.11
第三章 C++语言基础 本 章 内 容 1、C++语言概述 6、函数 2、基本数据类型 7、指针与数组 3、常量和变量 8、扩展数据类型 4、表达式 9、类、对象的表达 5、流程控制 10、重要的函数
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.4 结构成员的访问操作 3.8.5 结构与函数 3.8.6 结构与链表 3.8.7 共用体
3.8.1 结构的定义 • 结构体 是一种构造数据类型。 • 用途 把不同类型的数据组合成一个整体-------自定义数据类型。 • 定义 合法标识符 可省:无名结构体 struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct是关键字, 不能省略 成员类型可以是 基本型或构造型
2字节 num … name 20字节 1字节 sex 2字节 age 4字节 score ….. addr 30字节 3.8.1 结构的定义 例子图解 例 struct student { short num; char name[20]; char sex; short age; float score; char addr[30]; }; 结构体类型定义描述结构 的组织形式,不分配内存 结构体类型定义的作用域
3.8.1 结构体变量的定义 一般形式: 定义结构体类型的同时定义结构体变量 例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2; struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.4 结构成员的访问操作 3.8.5 结构与函数 3.8.6 结构与链表 3.8.7 共用体
3.8.2 结构体变量的初始化 struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 结构体变量={初始数据}; 形式一: 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
3.8.2 结构体变量的初始化 形式二: struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据}; 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
3.8.2 结构体变量的初始化 形式三: struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据}; 例 struct { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.3 结构成员的访问操作 3.8.4 结构与函数 3.8.5 结构与链表 3.8.6 共用体
num num name name 25B stu[0] sex sex age age stu[1] 3.8.3 结构体数组及其初始化 结构体数组的定义 struct student { short num; char name[20]; char sex; short age; }stu[2];
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.3 结构成员的访问操作 3.8.4 结构与函数 3.8.5 结构与链表 3.8.6 共用体
3.8.2 结构成员的访问操作 • 用.操作符访问 stu1.num=1; stu1.name=“Wang Lin”; stu1.age=19; 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
3.8.2 结构成员的访问操作 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; • 用->操作符访问(结构体指针作间接访问) student *pa=&stu1; pa->num=112; pa->name=“Wang Lin”; pa->age=19;
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.3 结构成员的访问操作 3.8.4 结构与函数 3.8.5 结构与链表 3.8.6 共用体
3.8.3 结构与函数 结构体在函数间的传递 • 以结构体变量作为函数参数 函数参数可以为结构体变量或结构体指针变量。 • 结构型函数 函数的返回值为结构体类型或结构体指针类型。
3.8.3 结构与函数 以结构体变量作为函数参数 • #include<iostream.h> • void func(struct data); • struct data • { int a, b, c; }; • main() • { struct data arg; • arg.a=27; arg.b=3; arg.c=arg.a+arg.b; • cout<<"arg.a="<<arg.a<<",arg.b=" • <<arg.b<<",arg.c="<<arg.c<<endl; • cout<<"Call Func()..."<<endl; • func(arg); • cout<<"arg.a="<<arg.a<<",arg.b=" • <<arg.b<<",arg.c="<<arg.c; • }
3.8.3 结构与函数 以结构体变量作为函数参数 • cout<<"arg.a="<<arg.a<<",arg.b=" • <<arg.b<<",arg.c="<<arg.c; • } • void func(struct data parm) • { cout<<"parm.a="<<parm.a<<",parm.b=" • <<parm.b<<",parm.c="<<parm.c<<endl; • cout<<"Process..."<<endl; • parm.a=18; parm.b=5; parm.c=parm.a*parm.b; • cout<<"parm.a="<<parm.a<<",parm.b=" • <<parm.b<<",parm.c="<<parm.c<<endl; • cout<<"Return..."<<endl; • }
3.8.3 结构与函数 以结构体指针作为函数参数 • #include<iostream.h> • struct date{ • int day; • int month; • int year; • int yeardays;}; • void days(struct date *pd); • void main() • { • struct date ymd; • cout<<"Enter year/month/day:"; • cin>>ymd.year>>ymd.month>>ymd.day; • days(&ymd); • cout<<"the passeddays:"<<ymd.yeardays; • }
3.8.3 结构与函数 以结构指针作为函数参数 • void days(struct date *pd) • { • static int day_tab[2][13]={ • {0,31,28,31,30,31,30,31,31,30,31,30,31}, • {0,31,29,31,30,31,30,31,31,30,31,30,31},}; • int i,lp; • pd->yeardays=pd->day; • lp=pd->year%4==0&&pd||pd->year%100!=0 • ||pd->year%400==0; • for(i=1;i<pd->month;i++) • pd->yeardays=pd->yeardays+day_tab[lp][i]; • }
3.8.3 结构与函数 结构型函数 • #include<iostream.h> • #include<string.h> • struct datatype • {char s[20]; • int a; • float b;}; • struct datatype function(void); • void main() • { • cout<<"CALL FUNTION..."<<endl; • datatype rev=function(); • cout<<"rev.s[]="<<rev.s<<",rev.a=" • <<rev.a<<",rev.b="<<rev.b<<endl; • }
3.8.3 结构与函数 结构型函数 • void main() • { cout<<"CALL FUNTION..."<<endl; • datatype rev=function(); • cout<<"rev.s[]="<<rev.s<<",rev.a=" • <<rev.a<<",rev.b="<<rev.b<<endl; • } • struct datatype function(void) • { • struct datatype samp; • strcpy(samp.s,"programm"); • samp.a=256; • samp.b=36.485; • cout<<"samp.s[]="<<samp.s<<",samp.a=" • <<samp.a<<",samp.b="<<samp.b<<endl; • return samp; • }
3.8.3 结构与函数 结构指针型函数 • #include<iostream.h> • #define NULL 0 • struct sample{ • int num; • char color; • char type; • }car[]={101,'G','c',210,'Y','m',105,'R','l', • 222,'B','s',308,'p','b',0,0,0,}; • struct sample *find(int n); • void main() • { • int number; • struct sample *result; • cout<<"Enter the number:"; • cin>>number;
3.8.3 结构与函数 结构指针型函数 • cin>>number; • result=find(number); • if(result->num!=NULL) • { cout<<"number:"<<result->num<<endl; • cout<<"color:"<<result->color<<endl; • cout<<"type:"<<result->type<<endl;} • else cout<<"Not Found!"<<endl; • } • struct sample *find(int n) • { • int i; • for(i=0;car[i].num!=NULL;i++) • if(car[i].num==n)break; • return(&car[i]); • }
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.3 结构成员的访问操作 3.8.4 结构与函数 3.8.5 结构与链表 3.8.6 共用体
3.8.4 结构与链表 链表是一种常用的、能够实现动态存储分配的 数据结构。 • 头指针变量head—指向链表的首节点。 • 每个节点由两个域组成: 数据域—存储节点本身的信息; 指针域—指向后继节点的指针。 • 尾节点的指针域置为“NULL(空)” ,作为链表结束的标志。
3.8.4 结构与链表 链表节点的结构描述 例如: struct grade { char no[7]; //学号 int score; //成绩 grade *next; //指针域 }
3.8.4 结构与链表 创建一个新链表 • struct grade • {char no[7]; • int score; • grade *next; • }; • struct grade *create(void) • {grade *head=NULL,*p,*tail; • int count=0; //链表中的节点个数(初值为0) • for( ; ; ) //缺省三个表达式的for语句 • {p=new grade; //申请一个新节点的空间 • cout<<"The number of student No.:"<<count+1<<endl; • cin>>p->no; • if(strcmp(p->no,"000000")==0)
3.8.4 结构与链表 创建一个新链表 • cin>>p->no; • if(strcmp(p->no,"000000")==0) • {delete p; • break; • } • cout<<"the score of the student No."<<count+1<<endl; • cin>>p->score; • count++; //节点个数加1 • p->next=NULL; • if(count==1)head=p;//是第一个节点,置头指针 • else tail->next=p; //非首节点,将新节点插入到链表尾 • tail=p; //设置新的尾节点 • } • return (head); • }
3.8 扩展数据类型 3.8.1 结构的定义 3.8.2 结构体变量的初始化 3.8.3 结构体数组及其初始化 3.8.3 结构成员的访问操作 3.8.4 结构与函数 3.8.5 结构与链表 3.8.6 共用体
i ch f 3.8.6 共用体 • 共用体,也叫联合体,是一种构造数据类型。 • 用途:使几个不同类型的变量共占一段内存(相互覆盖)。 • 共用体类型定义: union 共用体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; 例 union data { short i; char ch; float f; }; 类型定义不分配内存
i i ch ch f f a b 3.8.6 共用体变量的定义 形式一: union data { short i; char ch; float f; }a,b; 形式二: union data { short i; char ch; float f; }; union data a,b,c,*p,d[3]; 形式三: union { short i; char ch; float f; }a,b,c; 共用体变量任何时刻 只有一个成员存在 共用体变量定义分配内存, 长度=最长成员所占字节数
变量的各成员同时存在 struct node { char ch[2]; short k; }a; ch a k ch b k union node { char ch[2]; short k; }b; 任一时刻只有一个成员存在 3.8.6 共用体与结构体 • 区别: 存储方式不同 联系: 两者可相互嵌套
3.8.6 共用体 • #include<iostream.h> • struct w_tag • { • char low; • char high; • }; • union u_tag • { • struct w_tag byte; • short word; • }u; • void main() • { • u.word=0x1234; • cout<<"word value:"<<u.word<<endl; • cout<<"highbyte:"<<u.byte.high<<endl; • cout<<"lowbyte:"<<u.byte.low<<endl; • u.byte.low=0xFF; • cout<<"word value:"<<u.word<<endl; • }