《C语言程序设计(第7章).ppt》由会员分享,可在线阅读,更多相关《C语言程序设计(第7章).ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第七章 结构体与共用体高级语言程序设计高级语言程序设计计算机基础教研室本章主要内容 本章介绍:如何自己构造数据类型本章介绍:如何自己构造数据类型(构造型数据构造型数据)结构体内存分配函数共用体枚举类型类型定义教学目的与要求n n掌握结构体和共同体类型的说明掌握结构体和共同体类型的说明n n结构体和共用体变量的定义及初始化方法结构体和共用体变量的定义及初始化方法n n掌握结构体与共用体变量成员的引用掌握结构体与共用体变量成员的引用n n领会存储动态分配和释放领会存储动态分配和释放n n领会链表的基本概念和基本操作领会链表的基本概念和基本操作n n领会枚举类型变量的定义领会枚举类型变量的定义n n
2、了解了解TypedefTypedef的作用的作用重点与难点n n结构体的基本概念结构体的基本概念n n结构体类型及变量的定义结构体类型及变量的定义n n结构数组结构数组n n用指针处理链表用指针处理链表n n共用体及枚举类型的基本概念共用体及枚举类型的基本概念n nTypedefTypedef的基本概念的基本概念C(C+)C(C+)数据类型数据类型一、结构体1 1概述概述数数 组组 是构造类数据,其是构造类数据,其数组元素数组元素必须是同一数据类型的。必须是同一数据类型的。结构体结构体 也是构造类数据,但其也是构造类数据,但其成员成员可以是任何类型的。可以是任何类型的。构造类型使用户可以象处理
3、单个变量一样来处理复构造类型使用户可以象处理单个变量一样来处理复杂的数据结构。杂的数据结构。诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点:每个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。不同的人,数据的值不同,但都有共同的成员组成。使用结构体的一般步骤根据问题的要求定义一个结构体类型用自己定义的结构体类型定义结构体变量在程序中使用结构体变量处理问题 比较普通变量的情况:用系统给定的数据类型定义变量在程序中使用变量处理问题如何定义结构体类型?struct 结构体名 类型标识符 成员名;;关键字 用户指定/*str
4、uct 结构体名合称“结构类型标识符”*/*成员表列*/*此处分号不能省略*/一个示例【例一】main()struct student int number;char name6;char sex;int age;char address20;本质上,它定义了一个名为”student”的“结构体类型”(表头)。numbernumberName6Name6sexsexageageAddress20Address20小结:什么是“结构体类型”?用户自己定义的构造型数据类型由若干数据项(成员)组成同一结构体中的成员可以具有不同的数据类型注意成员定义与普通变量定义的区别:成员定义时不为其分配内存 变量
5、定义时为其分配内存结构体类型的特点:组成结构体的成员本身必须是一种已有定义的数据:组成结构体的成员本身必须是一种已有定义的数据:n n基本类型成员(整型基本类型成员(整型/字符型字符型/实型)实型)n n指针类型成员指针类型成员n n数组类成员数组类成员n n其他构造类成员其他构造类成员(包括已定义的另一种结构体)包括已定义的另一种结构体)n n 注意:成员注意:成员 变量,故成员名可与变量名同名变量,故成员名可与变量名同名 n n结构体类型可以有千千万万种,表示由若干不同数据项组结构体类型可以有千千万万种,表示由若干不同数据项组 成的成的复合类型。复合类型。定义结构体类型时,系统不会为该结构
6、体分配内存(只是定义结构体类型时,系统不会为该结构体分配内存(只是定义类型,而非变量声明)定义类型,而非变量声明)2、结构体类型变量的定义 定义了以上结构体类型后定义了以上结构体类型后,struct studentstruct student 相当于标准数据类相当于标准数据类型关键字型关键字char,int,floatchar,int,float我们可以用它来定义我们可以用它来定义“结构体变量结构体变量”。在结构体类型定义后,用在结构体类型定义后,用 struct struct 结构体名结构体名 复合词定义复合词定义 struct struct 结构体名结构体名 ;struct struct
7、结构体名结构体名 变量名变量名1 1,变量名,变量名2 2,变量名变量名n;n;如:如:struct student a,b30,*p;struct student a,b30,*p;a a 为为struct studentstruct student类型的变量类型的变量 b b 为为struct studentstruct student类型的数组(每个元素都是一个结构类型的数组(每个元素都是一个结构 体变量,都有众成员)体变量,都有众成员)p p 为指向为指向struct studentstruct student类型的指针变量类型的指针变量还有两种合二为一方法 在定义结构体类型的同时定义
8、结构体类型变量 struct 结构体名 变量名1,变量名2,变量名n;直接定义结构体类型变量 struct 变量名1,变量名2,变量名n;实际使用中,还可以使用以下形式:先定义#define STU struct student尔后 STU student1,student2;【例二】定义结构体类型【例二】定义结构体类型的同时定义结构体类型变的同时定义结构体类型变量。量。main()main()struct student struct student int number;int number;char name6;char name6;char sex;char sex;int age;i
9、nt age;char address20;char address20;a,b30,*p;a,b30,*p;【例三】不定义结构体类【例三】不定义结构体类型,直接定义结构体类型型,直接定义结构体类型变量。变量。main()main()struct struct int number;int number;char name6;char name6;char sex;char sex;int age;int age;char address20;char address20;a,b30,*p;a,b30,*p;其他有关知识实际使用中,还可以使用以下形式:实际使用中,还可以使用以下形式:#defi
10、ne STU struct student#define STU struct student STU stu1,stu2;STU stu1,stu2;比较一下两种变量定义方式的异同:比较一下两种变量定义方式的异同:intint a,b,ca,b,c;定义三个整型变量,每个变量占二个字节,可单定义三个整型变量,每个变量占二个字节,可单独赋值。独赋值。structstruct student student a,b,ca,b,c;定义三个结构体类型变量,每个变量下有若干定义三个结构体类型变量,每个变量下有若干“成员成员”。其占用的内存长度等于各成员项长度之。其占用的内存长度等于各成员项长度之和。
11、和。示例【例四】main()struct student int number;char name6;char sex;int age;char address20;printf(%dn,sizeof(struct student);结果:31示例【例五】若有以下定义,则正确的赋值语句为【例五】若有以下定义,则正确的赋值语句为 。struct complex struct complex float real;float real;float image;float image;struct value struct value int no;int no;struct complex com
12、;struct complex com;val1;val1;A)comA)com.real=1;B)val1real=1;B)plexcomplex.real=1;real=1;C)val1C)com.real=1;D)val1real=1;D)val1.real=1;real=1;答案:C).real=1 3、结构体变量的初始化和赋值使一个结构体变量获得数据“值”(实际上是给其各个成员赋值)有三种方法:定义时初始化之定义时初始化之 用赋值语句对各成员分别赋值用赋值语句对各成员分别赋值 同类型的结构体变量间相互赋值同类型的结构体变量间相互赋值 如如 student1=student2stude
13、nt1=student2 示例:定义时初始化之【例六】【例六】main()main()struct struct char name15;char name15;char class12;char class12;long num;long num;stu=Wenli,Computer,200113;stu=Wenli,Computer,200113;printf(%sn%sn%ldn,stu.name,stu.class,stu.num);printf(%sn%sn%ldn,stu.name,stu.class,stu.num);结果:结果:WenliWenli Computer 1 Com
14、puter 1 200113 200113示例:用赋值语句对各成员分别赋值【例七】【例七】main()main()struct struct char name15;char name15;char class12;char class12;long num;long num;stu=Wenli,Computer,200113;stu=Wenli,Computer,200113;stu.name0=1;stu.name0=1;stu.class2=A;stu.class2=A;stu.num=1111;stu.num=1111;printf(%s,%s,%dn,stu.name,stu.cla
15、ss,stu.num);printf(%s,%s,%dn,stu.name,stu.class,stu.num);结果:结果:1enli,CoAputer,11111enli,CoAputer,1111 示例:用赋值语句对各成员分别赋值【例七】【例七】main()main()struct struct char name15;char name15;char class12;char class12;long num;long num;stu=Wenli,Computer 1,200113;stu=Wenli,Computer 1,200113;stu.name0=1;stu.name0=1;
16、stu.class2=A;stu.class2=A;stu.num=1111;stu.num=1111;printf(%s,%s,%dn,stu.name,stu.class,stu.num);printf(%s,%s,%dn,stu.name,stu.class,stu.num);结果:结果:1enli,CoAputer,11111enli,CoAputer,1111 进行所谓“结构体变量赋值”只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体变量stu,以下语句是错误的:scanf(“%s,%s,%ld”,stu);printf(“%s,%s,%ld”,stu);正确
17、编程:main()struct char name15;char class12;long num;stu;scanf(%s,stu.name);scanf(%s,stu.class);scanf(%ld,&stu.num);printf(%s,%s,%ldn,stu.name,stu.class,stu.num);亦可用以下赋值语句:strcpy(stu.name,”wenli”);strcpy(stu.class,“Computer”);stu.num=200113;为什么啊?但是如果改为stu.name=”wenli”是错误的。4、结构体变量的引用 只能引用其成员变量只能引用其成员变量
18、用圆点(成员运算符)用圆点(成员运算符)优先级最高优先级最高 如如 val1.no+val1.no+可以将成员变量按普通变量运算方式处理,包括可以将成员变量按普通变量运算方式处理,包括取地址:取地址:&val1&val1(函数间传递用)(函数间传递用)&val1.no&val1.no对多级结构体,只能对最低级的成员进行赋值、对多级结构体,只能对最低级的成员进行赋值、存取及运算处理。存取及运算处理。示例以下函数getdays()计算某年某月某日是该年的第几天。如2001年2月5日是该年的第36天。闰 年 的 二 月 有 29天,表 达 式“(year%4=0&year%100!=0)|(year
19、%400)=0”值为真,即为闰年,其中year表示年号。示例#include stdio.hstruct datetp unsigned year,month,day;unsigned months=0,31,28,31,30,31,30,31,31,30,31,30,31;main()struct datetp d;printf(请输入年 月 日:);scanf(%u%u%u,&d.year,&d.month,【1】);if(d.year%4=0&d.year%100!=0)|(d.year%400)=0)months2=29;printf(%d年%d月%d日是该年的第%d天。n,d.yea
20、r,d.month,d.day,getdays(d);getdays(【2】date)unsigned days=0,i;for(i=1;idate.month;i+)days+=【3】;days+=date.day;return days;答案:【1】&d.day 【2】struct datetp 【3】monthsi 5、结构体数组 定义 P265P265定义结构体后定定义结构体后定义义 定义结构体时同定义结构体时同时定义时定义定义结构体后定义定义结构体后定义struct student int num;char name20;char sex;int age;float score;ch
21、ar addr30;struct student stu3;定义结构体时同时定义结构体时同时定义定义struct student int num;char name20;char sex;int age;float score;char addr30;stu3;5、结构体数组 初始化 P266P266n n一般初始化一般初始化n n省略维数省略维数 n n定义后初始化定义后初始化一般初始化一般初始化struct student int num;char name20;char sex;int age;float score;stu3=10101,李宁,M,18,87.5,10102,张凡,M,
22、19,99,10103,王敏,F,20,78.5 ;定义后初始化定义后初始化struct student int num;char name20;char sex;int age;float score;;Struct student stu3=10101,李宁,M,18,87.5,10102,张凡,M,19,99,10103,王敏,F,20,78.5 ;一般初始化示例 main()struct student int num;char name20;char sex;int age;float score;stu3=10101,李宁,M,18,87.5,10102,赵凡,M,19,99,10
23、103,王敏,F,20,78.5 ;int i;clrscr();for(i=0;iage p-age (指针变量名(指针变量名.成员名)成员名)此时:此时:p-age+p-age+等效于(等效于(p-agep-age)+先得先得 到成员值,再使它加到成员值,再使它加1 1;+p-age+p-age 等效于等效于+(p-age)+(p-age)先使成员先使成员 值加值加1 1,再使用之。,再使用之。struct tm int hours,minutes,seconds;main()struct tm time;time.hours=time.minutes=time.seconds=0;clr
24、scr();printf(Now,press any key to begin my clock.);getch();for(;)update(&time);display(&time);update(struct tm*t)(*t).seconds+;if(*t).seconds=60)(*t).seconds=0;(*t).minutes+;if(*t).minutes=60)(*t).minutes=0;(*t).hours+;if(*t).hours=24)(*t).hours=0;delay();display(struct tm*t)clrscr();printf(%d:,(*t)
25、.hours);printf(%d:,(*t).minutes);printf(%dn,(*t).seconds);delay()long int t;for(t=1;t结果有什么变化?7、链表特点:按需分配内存不连续存放有一个“头指针”(head)变量每个结点中应包括一个指针变量,用它存放下一结点的地址。最后一个结点的地址部分存放一个“NULL”(空地址)。链表结点定义形式l l定义形式:定义形式:struct student struct student int number;int number;char name6;char name6;struct student*next;stru
26、ct student*next;链表操作常用技术语句l lp=p-nextp=p-next 在链表结点间顺序移动指针在链表结点间顺序移动指针 将将p p原来所指结点中原来所指结点中nextnext的值赋给的值赋给p p,而,而p-nextp-next值即下一值即下一结点起始地址,故结点起始地址,故p=p-next p=p-next 的作用是使的作用是使p p指向下一结点指向下一结点起始地址。起始地址。l lp2-next=p1 p2-next=p1 将新结点添加到现在链表中将新结点添加到现在链表中 如果如果p2p2是链表中的末结点,是链表中的末结点,p1p1指新建结点,此句的功能是指新建结点,
27、此句的功能是使使p1p1所指新结点变成链表中的新的末结点。所指新结点变成链表中的新的末结点。l lp2-next=NULL p2-next=NULL 让让p2p2所在结点成为链表中最后结点所在结点成为链表中最后结点示例若已建立下面的链表结构,指针若已建立下面的链表结构,指针p p指向某单向链表的首结点,如下图指向某单向链表的首结点,如下图所示。所示。struct node struct node int data;int data;struct node*next;struct node*next;*p;*p;以下语句能正确输出该链表所有结以下语句能正确输出该链表所有结点的数据成员点的数据成员
28、datadata的是的是 。A)for(;p!=NULL;p+)printf(“%7d,”,p-data);B)for(;!p;p=p-next)printf(“%7d,”,(*p).data);C)while(p)printf(“%7d,”,(*p).data);p=p-next;D)while(p!=NULL)printf(“%7d,”,p-data);p+;答案:C链表指针p+表示什么?main()struct stu int num;char*name;int age;st=12,ABC,100,*p=&st;clrscr();printf(%pn,p+);printf(%pn,p+)
29、;printf(%pn,p+);printf(%pn,p+);printf(%dn,sizeof(st);结果:FFD2 FFD8 FFDE FFE4 6结论:若p指向某个结构体变量,则 p+的功能是将指针p 移到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p+进行结点间的跳转。静态链表的建立 P274 P274 例例11.711.7#define NULL 0struct student long num;float score;struct student*next;main()struct student a,b,c,*head,*p;a.num=99101;a.sc
30、ore=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do printf(%ld,%.1fn,p-num,p-score);p=p-next;while(p!=NULL);注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?二、内存分配函数1、“动态内存分配”的概念 使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。如
31、,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。使用动态内存分配技术建立的链表称为“动态链表”。2、动态内存分配函数 P275/P387P275/P387 以下函数在以下函数在malloc.hmalloc.h或或stdlib.hstdlib.h中定义(中定义(n,xn,x为无符号整数,为无符号整数,p p为指针变量):为指针变量)
32、:void*malloc(x)void*malloc(x)分配一个长度为分配一个长度为x x字节的连续空间,分配成功返回起始地字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回址指针,分配失败(内存不足)返回NULLNULLvoid*calloc(n,x)void*calloc(n,x)分配分配n n个长度为个长度为x x字节的连续空间(成败结果同上)字节的连续空间(成败结果同上)void*realloc(p,x)void*realloc(p,x)将将p p所指的已分配空间大小调整为所指的已分配空间大小调整为x x个字节个字节void free(p)void free(p)将由
33、以上各函数申请的以将由以上各函数申请的以p p为首地址的内存空间全部释放为首地址的内存空间全部释放动态内存分配函数使用示例#include stdlib.h#include stdlib.hmain()main()char*p;char*p;p=(char*)malloc(17);p=(char*)malloc(17);if(!p)if(!p)printf(printf(内存分配出错内存分配出错););exit(1);exit(1);strcpy(p,This is 16 chars);strcpy(p,This is 16 chars);/*/*如果超过如果超过1616个字符,可能破坏程序其
34、他部分个字符,可能破坏程序其他部分*/*/p=(char*)realloc(p,18);p=(char*)realloc(p,18);if(p=NULL)if(p=NULL)printf(printf(内存分配出错内存分配出错););exit(1);exit(1);strcat(p,.);strcat(p,.);printf(p);printf(p);free(p);free(p);结果:结果:This is 16 chars.This is 16 chars.动态链表的建立和遍历示例(后进先出的数据结构,即所谓“栈”)#define NULL 0#define NULL 0 struct i
35、nfostruct info int data;int data;struct info*next;struct info*next;main()main()struct info*base,*p;struct info*base,*p;int n;int n;base=NULL;base=NULL;for(n=0;n10;n+)for(n=0;ndata=n+1;p-data=n+1;p-next=base;p-next=base;base=p;base=p;while(p!=NULL)while(p!=NULL)printf(%4d,p-data);printf(%4d,p-data);p
36、=p-next;p=p-next;结果:10 9 8 7 6 5 4 3 2 1 动态链表的建立和遍历示例(以建立以建立P274P274链表为例链表为例)#define NULL 0#define NULL 0 struct infostruct info long num;long num;int score;int score;struct info*next;struct info*next;main()main()struct info*head,*p1,*p2;struct info*head,*p1,*p2;int n=1;int n=1;clrscr();clrscr();hea
37、d=p1=p2=(struct info*)malloc(sizeof(struct info);head=p1=p2=(struct info*)malloc(sizeof(struct info);printf(printf(请输入第请输入第%d%d个同学的学号和成绩个同学的学号和成绩:,n+);:,n+);scanf(%ld,%d,&p1-num,&p1-score);scanf(%ld,%d,&p1-num,&p1-score);while(p1-num!=0)while(p1-num!=0)p1=(struct info*)malloc(sizeof(struct info);p1=
38、(struct info*)malloc(sizeof(struct info);if(!p1)if(!p1)printf(printf(内存分配出错内存分配出错!);exit();!);exit();printf(printf(请输入第请输入第%d%d个同学的学号和成绩个同学的学号和成绩:,n+);:,n+);scanf(%ld,%d,&p1-num,&p1-score);scanf(%ld,%d,&p1-num,&p1-score);p2-next=p1;p2-next=p1;p2=p1;p2=p1;p2-next=NULL;p2-next=NULL;p1=head;p1=head;whi
39、le(p1-next!=NULL)while(p1-next!=NULL)printf(%ld,%dn,p1-num,p1-score);printf(%ld,%dn,p1-num,p1-score);p1=p1-next;p1=p1-next;三、共用体(联合体)1、概述 P287P287 与结构体相似,共用体也是一种用户自己定义的构造型数据,其成员也可以具有不同的数据类型,但共用体将几种不同的数据项存放在同一段内存单元中。所以,每一时刻只能有一个成员存在占用分配给该共用体的内存空间(新进旧出)。该共用体的数据长度等于最长的成员长度。如何定义共用体类型?union 共用体名 类型标识符 成员
40、名;;关键字 用户指定/*union 共用体名合称“共用类型标识符”*/*成员表列*/*此处分号不能省略*/示例union data int i;char ch;float p;3、共用体变量的声明 用union 共用体名 复合词声明 union 共用体名 ;union 共用体名 变量名1,变量名2,变量名n;在定义共用体类型的同时声明 union 共用体名 变量名1,变量名2,变量名n;直接声明共用体类型变量 union 变量名1,变量名2,变量名n;共用体变量的引用共用体变量的引用与结构体相似共用体变量的引用与结构体相似只能引用其成员变量,不能引用共用体变量本身只能引用其成员变量,不能引用
41、共用体变量本身 正确:正确:printfprintf(“%d”,data.i);(“%d”,data.i);错误:错误:printfprintf(“%d”,data);(“%d”,data);不能对共用体变量赋值,不能初始化,不能作为不能对共用体变量赋值,不能初始化,不能作为 函数参数!函数参数!见见P289P289示例示例允许两个同类型共用体之间相互赋值。允许两个同类型共用体之间相互赋值。可通过指针引用。可通过指针引用。示例main()main()union u_type union u_type int i;int i;char ch6;char ch6;long s;long s;str
42、uct st_type struct st_type union u_type u;union u_type u;float score3;float score3;printf(%dn,sizeof(struct st_type);printf(%dn,sizeof(struct st_type);结果:18示例main()main()union example union example struct struct int x;int x;int y;int y;in;in;int a2;int a2;e=0,0;e=0,0;e.a0=1;e.a1=2;e.a0=1;e.a1=2;prin
43、tf(%d,%dn,e.in.x,e.in.y);printf(%d,%dn,e.in.x,e.in.y);结果:1,2四、枚举类型1、概述 P291P291 所谓“枚举”,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。枚举类型也是用户自定义的数据类型,用此种类型声明的变量只能取指定的若干值之一。2、定义枚举类型一般形式enum cnred,yellow,blue,while,black;enum daysun,mon,tue,wed,thu,fri,sat;0 ,1 ,2,3,4,5 (有值常量)花括号中间的数据项称“枚举元素”或“枚举常量”,是用户定义的标识符。3、枚举型
44、变量的声明 enum cn a,b,c;enum cn a,b,c;enum day x,y,z;enum day x,y,z;亦可在定义类型时同时声明枚举型变量:亦可在定义类型时同时声明枚举型变量:enum cnred,yellow,blue,white,black a,b,c;enum cnred,yellow,blue,white,black a,b,c;【注意】枚举元素为有值常量,默认为【注意】枚举元素为有值常量,默认为0,1,2,30,1,2,3 但定义时不能将但定义时不能将 enum cnred,yellow,blue,while,black;enum cnred,yellow,b
45、lue,while,black;写成写成 enum cn0,1,2,3,4;enum cn0,1,2,3,4;也不能对元素直接赋值,如也不能对元素直接赋值,如red=3;red=3;应先进行强制类型转换才能赋值。应先进行强制类型转换才能赋值。见见P292P292 但可在定义时改变其值。但可在定义时改变其值。示例一、以下程序的运行结果是什么?一、以下程序的运行结果是什么?main()main()enum colorred,green=4,blue,white=blue+10;enum colorred,green=4,blue,white=blue+10;printf(%d,%d,%dn,red
46、,blue,white);printf(%d,%d,%dn,red,blue,white);二、以下正确的枚举类型定义是二、以下正确的枚举类型定义是 。A)enum a=“sun”,”mon”,”tue”;A)enum a=“sun”,”mon”,”tue”;B)enum bsun=7,mon=-1,tue;B)enum bsun=7,mon=-1,tue;C)enum c 7,1,2;C)enum c 7,1,2;结果:结果:0 0,5 5,1515答案:答案:B B示例main()main()enum colorred,green,blue,white;enum colorred,gree
47、n,blue,white;enum color fc;enum color fc;clrscr();clrscr();printf(printf(请输入色号请输入色号:);:);scanf(%d,&fc);scanf(%d,&fc);switch(fc)switch(fc)case red:printf(case red:printf(红色红色!);break;!);break;case green:printf(case green:printf(绿色绿色!);break;!);break;case blue:printf(case blue:printf(蓝色蓝色!);break;!);b
48、reak;case white:printf(case white:printf(白色白色!);break;!);break;default:printf(default:printf(其他颜色其他颜色!);!);五、类型定义(typedef)给已有的数据类型加一个新的别名提高程序可读性(但未建立新的数据类型)。一般形式:typedef 数据类型名 新别名 (已有定义)(习惯用大写)例 typedef float REAL;REAL a,b,c;用 法1 1、简单数据类型、简单数据类型 typedef float REAL;typedef float REAL;REAL a,b;REAL a,
49、b;=float a,b;=float a,b;2 2、数组、数组 typedef char STR80;typedef char STR80;STR s1;STR s1;=char s180;=char s180;3 3、指针、指针 typedef float*PF;typedef float*PF;PF p;PF p;=float *p;=float *p;4 4、函数、函数 typedef char FCH();typedef char FCH();FCH a;FCH a;=char a();=char a();用 法5、结构体/联合体等 typedef union DATE;typedef struct DATE;DATE birthday,*p;相当于 union birthday,*p;struct birthday,*p;本章编程练习1、编写一个竞赛用的秒表程序,按S键开始计时,按E键停止计时。2、编写一个通讯录程序,能动态存储不超过10个同学的个人信息(如姓名、性别、年龄等),并能进行查询。
限制150内