结构体与共用体程序设计ppt课件_第1页
结构体与共用体程序设计ppt课件_第2页
结构体与共用体程序设计ppt课件_第3页
结构体与共用体程序设计ppt课件_第4页
结构体与共用体程序设计ppt课件_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 构造体与共用体程序设计?C言语程序设计言语程序设计?本章内容本章内容信息查讯问题信息查讯问题1信息打印问题信息打印问题2约瑟夫环问题约瑟夫环问题 3 共用体共用体构造体类型与变量、构造体数组构造体类型与变量、构造体数组 共享内存问题共享内存问题4自援用构造、动态内存分配、链表自援用构造、动态内存分配、链表 构造体指针构造体指针位读取问题位读取问题5 位运算、位段信息查讯问题信息查讯问题学号学号姓名姓名性别性别数学数学英英 语语计算机计算机C语言语言通信网通信网平均分平均分101张三张三M809098869088.8102李四李四M828994819187.4103王五王五F927886

2、798984.8104何六何六M898178637677.4105周七周七F986991856782106 数组是非常有用的一种数据构造,但它的一切元素的数据类型都必需一样。数组是非常有用的一种数据构造,但它的一切元素的数据类型都必需一样。但是,在现实生活中,将一组异型的数据看作一个整体也很重要。如:但是,在现实生活中,将一组异型的数据看作一个整体也很重要。如:对一个班的一切学生各课程按平均分排名。对一个班的一切学生各课程按平均分排名。假定输入某班假定输入某班30个学生信息包括:学号、姓名、性别、个学生信息包括:学号、姓名、性别、5门课程成果、门课程成果、平均分,要求按平均分由高到低输出该班学

3、生信息。我们该怎样做呢?平均分,要求按平均分由高到低输出该班学生信息。我们该怎样做呢?问题分析问题分析例例8-1 对一个班的学生成果进展排名。对一个班的学生成果进展排名。假定要求输入某班假定要求输入某班30个学生的信息包括学号、姓名、个学生的信息包括学号、姓名、性别、性别、3门课成果,求得平均成果,要求按平均成果门课成果,求得平均成果,要求按平均成果由高到低输出该班学生信息。由高到低输出该班学生信息。 【分析】【分析】学生学生“学号、学号、“姓名、姓名、“性别运用字符型数据,性别运用字符型数据,几门课程的几门课程的“成果运用整型数据,成果运用整型数据,“平均分运用平均分运用实型数据,可以分别定

4、义不同的变量来存放这几个类实型数据,可以分别定义不同的变量来存放这几个类型的数据。假设要显示某个学生的信息,那么要找到型的数据。假设要显示某个学生的信息,那么要找到该学生的信息就要从这几个变量中分别查找,并且还该学生的信息就要从这几个变量中分别查找,并且还要同步挪动数组元素位置,这给程序员带来了很多不要同步挪动数组元素位置,这给程序员带来了很多不便。便。数组处置方式数组处置方式v int studentId30; /* 最多可以管理最多可以管理30个学生个学生, 每个学生的学号每个学生的学号用数组的下标表示用数组的下标表示*/v char studentName3010;v int stude

5、ntSex;v int scoreMath30; /*数学课的成果数学课的成果*/v int scoreEnglish30; /*英语课的成果英语课的成果*/v int scoreComputer30;/*计算机原理课的成果计算机原理课的成果*/v int scoreC30; /*C言语课的成果言语课的成果*/v int scoreTelecomm30; /*通讯网的成果通讯网的成果*/v int aveage30; /*平均成果平均成果*/数组处置方式数组处置方式v数据的内存管理方式数据的内存管理方式 90788978839272957288988788.887.484.877.410110

6、2103104zhangsanwangwuheliuMMFM80829289希望的内存分配希望的内存分配101zhangsanM80909888.8102lisiM82899487.4103wangwuF92788684.8104heliuM89817877.4问题分析问题分析在在C言语中,允许用户本人构造一种新的数据类型,它的成员言语中,允许用户本人构造一种新的数据类型,它的成员可以包括各种数据类型,这种数据构培育是构造体可以包括各种数据类型,这种数据构培育是构造体structure,它相当于其他高级言语中的,它相当于其他高级言语中的“记录。构造记录。构造体中的元素称为体中的元素称为“成员,

7、在成员,在“记录中称为记录中称为“字段,用来字段,用来存储一切存储一切“记录的数据集合称为记录的数据集合称为“数据库。数据库。构造体中的一切成员变量在内存中是延续存储的,构造体的内构造体中的一切成员变量在内存中是延续存储的,构造体的内存空间大小为各成员内存空间大小之和。存空间大小为各成员内存空间大小之和。本例声明一个构造体类型本例声明一个构造体类型struct student,它包括:学号、,它包括:学号、姓名、性别、姓名、性别、3门课成果、平均成果共门课成果、平均成果共5个成员。存放一个学个成员。存放一个学生的信息定义一个构造体变量,要存放生的信息定义一个构造体变量,要存放30个学生的信息就

8、要个学生的信息就要定义一个构造体数组。定义一个构造体数组。 例例8-1 实现代码实现代码/* LI8_1.c */#include /* 声明构造体类型声明构造体类型 */struct student char num5; /* 学号学号 */ char name10; /* 姓名姓名 */ char sex; /* 性别:性别: M男,男,F女女 */ int score3; /* 3门成果门成果 */ float average; /* 平均成果平均成果 */; /* 自定义函数的声明自定义函数的声明 */void enterstruct student a,int n; /* 输入学生信

9、息输入学生信息 */void sortstruct student a,int n; /* 按平均成果由高到低排序按平均成果由高到低排序 */void printstruct student a,int n; /* 输出学生信息输出学生信息 */* 主函数主函数 */int main int n; struct student stu30; /* 定义构造体数组定义构造体数组 */ printf请输入该班学生人数请输入该班学生人数nn=30: ; scanf%d,&n; enterstu,n; /* 调用输入函数调用输入函数 */ sortstu,n; /* 调用排序函数调用排序函数

10、*/ printstu,n; /* 调用输出函数调用输出函数 */ return 0;例例8-1程序续程序续1/* 输入函数输入函数 */void enterstruct student a,int n int i,j,sum=0; printf请输入请输入 %d 个学生信息学号个学生信息学号,姓名姓名,性别性别,3门课成果门课成果: n,n; fori=0; in; i+ printf请输入第请输入第 %d 个学生的学号个学生的学号 姓名姓名 性别性别: n,i+1; scanf%s %s %c,ai.num,,&ai.sex; /* 援用成员援用成员 */ print

11、f请输入第请输入第 %d 个学生的个学生的3门课成果门课成果: n,i+1; sum=0; forj=0; j3; j+ scanf%d,&ai.scorej; /* 输入输入3门课成果门课成果 */ sum=sum+ai.scorej; /* 求每个学生总成果求每个学生总成果 */ ai.average=sum/3.0; /* 求每个学生平均成果求每个学生平均成果 */ 例例8-1程序续程序续2/* 选择法排序函数选择法排序函数 */void sortstruct student a,int n int i,j,p; struct student temp; /* 定义构造体变量定义

12、构造体变量 */ fori=0; in-1; i+ p=i; forj=i+1; jap.average /* 援用构造体成员援用构造体成员 */ p=j; ifp!=i temp=ai; ai=ap; ap=temp; /* 输出函数输出函数 */void printstruct student a,int n int i,j,mc=1; /* mc表示名次表示名次 */ printfn按平均成果排名的名次表按平均成果排名的名次表: n; printf学号学号t姓名姓名t性别性别tcj1tcj2tcj3t平均成果平均成果t名次名次n; fori=0; in; i+ printf%st%st%

13、ct,ai.num,,ai.sex; forj=0; j3; j+ printf%dt,ai.scorej; printf%6.1ft%dn,ai.average,mc+; 例例8-1程序分析程序分析v本例程序定义了一个构造体类型本例程序定义了一个构造体类型student,并用它定义了,并用它定义了包括包括30个元素的个元素的stu构造体数组和构造体变量构造体数组和构造体变量temp。vstruct studentv char num5; /* 学号学号 */v char name10; /* 姓名姓名 */v char sex; /* 性别:性别: M男,男,F女女 */v i

14、nt score3; /* 3门成果门成果 */v float average; /* 平均成果平均成果 */v; vstruct student stu30; /* 定义构造体数组定义构造体数组 */ vstruct student temp; /* 定义构造体变量定义构造体变量 */ v在在“构造体数组元素之间交换时,不是对构造体数组元构造体数组元素之间交换时,不是对构造体数组元素各成员进展交换,而是对该构造体数组元素进展整体交换。素各成员进展交换,而是对该构造体数组元素进展整体交换。交换语句为:交换语句为:temp=ai; ai=ap; ap=temp; v本程序涉及到构造体类型的声明、

15、构造体变量和数组的定本程序涉及到构造体类型的声明、构造体变量和数组的定义、构造体成员的援用、构造体的赋值和输出等知识点。义、构造体成员的援用、构造体的赋值和输出等知识点。构造体构造体构造体构造体structure是一个或多个一样数据是一个或多个一样数据类型或不同数据类型的变量集合在一个称号下类型或不同数据类型的变量集合在一个称号下的用户自定义数据类型。的用户自定义数据类型。由于其成员的类型可以不同,因此,用户必需由于其成员的类型可以不同,因此,用户必需先声明构造体类型,再根据构造体类型定义构先声明构造体类型,再根据构造体类型定义构造体变量来存放相应数据。造体变量来存放相应数据。构造体类型构造体

16、类型&构造体是一种构造数据类型构造体是一种构造数据类型&用途:把不同类型的数据组合成一个整体用途:把不同类型的数据组合成一个整体-自定义数据类型自定义数据类型&构造体类型定义格式:构造体类型定义格式:struct 构造体名构造体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;成员类型可以是根本型或构外型struct是关键字,不能省略合法标识符可省:无名构造体声明构造体类型声明构造体类型例 struct student int num; char name20; char sex; int age; float score; cha

17、r addr30; ; namenumsexagescoreaddr2字节字节2字节字节20字节字节1字节字节4字节字节30字节字节.构造体类型定义描画构造的组织方式,不分配内存,不能初始化构造体类型定义的作用域运用运用typedef定义数据类型的别名定义数据类型的别名功能:用自定义名字为已有数据类型命名功能:用自定义名字为已有数据类型命名类型定义简单方式:类型定义简单方式: typedef type name;类型定义语句关键字类型定义语句关键字已有数据类型名已有数据类型名用户定义的类型名用户定义的类型名例例 typedef int INTEGER;例例 typedef float REAL

18、;类型定义后类型定义后, ,与已有类型一样运用与已有类型一样运用例例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 阐明阐明: :1.typedef 1.typedef 没有发明新数据类型没有发明新数据类型2.typedef 2.typedef 是定义类型是定义类型, ,不能定义变量不能定义变量3.typedef 3.typedef 与与 define define 不同不同 define typedef define typedef预编译时处置预编译时处置 编译时处置编译时处置简单字符置换简单字符置换 为已有类型命名为已有类型命名 声明

19、一个新的类型别名的方法声明一个新的类型别名的方法1 1、按定义变量方法先写出定义体、按定义变量方法先写出定义体 如如 int i; int i;2 2、将变量名换成新类型名、将变量名换成新类型名 如如 int INTEGER; int INTEGER;3 3、最前面加、最前面加typedef typedef 如如 typedef int INTEGER; typedef int INTEGER;4 4、用新类型名定义变量、用新类型名定义变量 如如 INTEGER i,j; INTEGER i,j;类型定义可嵌套类型定义可嵌套例例 定义数组类型定义数组类型 int a100; int ARRAY

20、100; typedef int ARRAY100; ARRAY a,b,c; int a100,b100,c100;例例 定义指针类型定义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s10; char *p; char *s10;例例 定义函数指针类型定义函数指针类型 int (*p)(); int (*POWER)(); typedef int (*POWER)(); POWER p1,p2; int (*p1)(),(*p2)();例例 定义构造体类型定义构造体类型 struct date int month;

21、 int day; int year; d;例例 定义构造体类型定义构造体类型 struct date int month; int day; int year; DATE;例例 定义构造体类型定义构造体类型typedef struct date int month; int day; int year; DATE;例例 定义构造体类型定义构造体类型 DATE birthday, *p; struct date int month; int day; int year; birthday, *p;例例 typedef struct club char name20; int size; int

22、 year; GROUP; typedef GROUP *PG; PG pclub; GROUP为构造体类型PG为指向GROUP的指针类型 GROUP *pclub; struct club *pclub;构造体变量的定义构造体变量的定义先定义构造体类型,再定义构造体变量普通方式:第一种方式第一种方式例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; struct 构造体名构造体名 类型标识符类型标识符 成员名;成员名;

23、类型标识符类型标识符 成员名;成员名; .;struct 构造体名构造体名 变量名表列;变量名表列;例例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2; 构造体变量的定义构造体变量的定义定义构造体类型的同时定义构造体变量定义构造体类型的同时定义构造体变量普通方式:普通方式:struct 构造体名构造体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名

24、表列;变量名表列;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 第二种方式第二种方式构造体变量的定义构造体变量的定义第三种方式第三种方式直接定义构造体变量直接定义构造体变量普通方式:普通方式:struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列;变量名表列;例例 struct int num; char name20; char sex; int age; float score; char ad

25、dr30; stu1,stu2; 用无名构造体直接定义变量,只用无名构造体直接定义变量,只能运用一次,不能再用该构造体能运用一次,不能再用该构造体定义变量名表列以外的其他变量定义变量名表列以外的其他变量构造体阐明构造体阐明v构造体类型与构造体变量概念不同构造体类型与构造体变量概念不同v类型:不分配内存;类型:不分配内存; 变量:分配内存变量:分配内存v类型:不能赋值、存取、运算类型:不能赋值、存取、运算; ; 变量:可以变量:可以v构造体可嵌套构造体可嵌套v构造体成员名与程序中变量名可一样,不会混淆构造体成员名与程序中变量名可一样,不会混淆v构造体类型及变量的作用域与生存期构造体类型及变量的作

26、用域与生存期例例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnamebirthdaymonthdayyear例例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear构造体变量的援用构造体变量的援用援用规那么 构造体变量不能整体援用,

27、只能援用变量成员v可以将一个构造体变量赋值给另一个构造体变量可以将一个构造体变量赋值给另一个构造体变量v构造体嵌套时逐级援用构造体嵌套时逐级援用成员分量运算符成员分量运算符优先级优先级: 1结合性结合性:从左向右从左向右援用方式:援用方式: 构造体变量名构造体变量名. .成员名成员名例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;

28、例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn,stu1); ()stu1=101,“Wan Lin,M,19,87.5,“DaLian; ()例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例例 struct student i

29、nt num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ()构造体变量的初始化构造体变量的初始化方式一方式一struct 构造体名构造体名 类型标识符类型标识符 成员名

30、;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 构造体名构造体名 构造体变量构造体变量=初始数据初始数据;例例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin,M,19, “200 Road;构造体变量的初始化构造体变量的初始化struct 构造体名构造体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .构造体变量构造体变量=初始数据初始数据;例例 struct student

31、 int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin,M,19, “200 Road; 方式二方式二构造体变量的初始化构造体变量的初始化struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .构造体变量构造体变量=初始数据初始数据;例例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin,M,19, “200 Road; 方式三方式三例例8-2 输出输出3

32、门课平均成果门课平均成果【分析】【分析】学生的根本信息包括学号、姓名、性别、地址、学生的根本信息包括学号、姓名、性别、地址、3门门课程成果、平均成果,假设这个学生的课程成果、平均成果,假设这个学生的3门课程的成门课程的成果分别为数学果分别为数学90分、英语分、英语80分、分、C言语言语85分,分,3门门课程成果用整型数组表示,平均成果用浮点数表示。课程成果用整型数组表示,平均成果用浮点数表示。例例8-2程序程序/* LI8_2.c */* 声明构造体类型声明构造体类型struct scoretype */#include struct scoretype int score3; /* 3门课成

33、果门课成果 */ float average; /* 平均成果平均成果 */;/* 声明构造体类型声明构造体类型struct student */typedef struct scoretype SCORE;struct student char num5; /* 学号学号 */ char name10; /* 姓名姓名 */ char sex; /* 性别:性别: M-男,男,F-女女 */ char *addr; /* 地址地址 */ SCORE a; /* 成果成果 */;typedef struct student STUDENT;int main int i,sum=0; STUDE

34、NT s=101,zhangjuan, F,90,85,80,0.0; fori=0; i3; i+ sum+=s.a.scorei; /* 求总成果求总成果 */ /* 求平均成果求平均成果 */ s.a.average=sum/5.0; /* 输出学生信息输出学生信息 */ printfnum=%s,name=%s, sex=%c,addr=%s, average=%fn, s.num,, s.sex,s.addr, s.a.average; return 0;构造体变量作函数参数构造体变量作函数参数 构造体变量作为函数的参数,系统采用构造体变量作为函数的参数,系统采用“数据复

35、制的方式,系统数据复制的方式,系统开销大,影响程序的执行效率,因此普通采用构造体指针作为函数的开销大,影响程序的执行效率,因此普通采用构造体指针作为函数的参数。参数。 1 1、用构造体变量的成员作函数参数、用构造体变量的成员作函数参数 如用:如用:stu1.numstu1.num、2等作函数实参,将实参传给形等作函数实参,将实参传给形参。用法和用普通变量作实参是一样的,属于参。用法和用普通变量作实参是一样的,属于“值传送方式。该当值传送方式。该当留意实参与形参的类型坚持一致。留意实参与形参的类型坚持一致。 2 2、用构造体变量作函数实参、用构造体变量作函数

36、实参 老版本的老版本的C C系统不允许用构造体变量作实参,而系统不允许用构造体变量作实参,而ANSICANSIC取消了这一限取消了这一限制。用构造体变量作实参时,采取的是制。用构造体变量作实参时,采取的是“值传送方式,该当留意实值传送方式,该当留意实参与形参必需是同类型的构造体变量。由于参与形参必需是同类型的构造体变量。由于“值传送时系统开销比值传送时系统开销比较大,普通不采用这种方式。较大,普通不采用这种方式。 函数的前往值为构造体类型函数的前往值为构造体类型v一个函数可以带回一个函数值,这个函数值可以一个函数可以带回一个函数值,这个函数值可以是整型、实型、字符型、指针等,也可以是构造是整型

37、、实型、字符型、指针等,也可以是构造体变量或构造体指针。体变量或构造体指针。例例8-3 输出学生成果等信息输出学生成果等信息/* LI8_3.c */#include #include #define FORMAT %st%st%fn%ft%fn/* 声明构造体类型声明构造体类型struct student */struct student char num5; /* 学号学号 */ char name10; /* 姓名姓名 */ int score3; /* 3门成果门成果 */; typedef struct student STUDENT;void printSTUDENT stu;in

38、t main STUDENT stu; Strcpystu.num,106; /* 给构造体成员赋值给构造体成员赋值 */ ,Li Lin; stu.score0=67; stu.score1=89; stu.score2=78; printstu; return 0;void printSTUDENT stu /* 构造体变量作函数参数构造体变量作函数参数 */ printfFORMAT,stu.num,,stu.score0, stu.score1,stu.score2; 思索题思索题例例8-3只输出了一个学生的信息,假设需求输出只输出了一个学生

39、的信息,假设需求输出200个学生的信息,又怎样实现呢?个学生的信息,又怎样实现呢?构造体数组构造体数组v定义一个整型变量可以表示一个学生的某门课程的成果,假定义一个整型变量可以表示一个学生的某门课程的成果,假设存储设存储200个学生的某门课程的成果,就必需使器具有个学生的某门课程的成果,就必需使器具有200个元素的一维数组来处置。个元素的一维数组来处置。v构造体变量只能表示一个学生二维表中的一行的数据,构造体变量只能表示一个学生二维表中的一行的数据,即一个学生的信息,假设要表示假设干个学生行的数据,即一个学生的信息,假设要表示假设干个学生行的数据,可以运用构造体数组。可以运用构造体数组。v构造

40、体数组的每个元素仍是构造体类型,每个元素可以存储构造体数组的每个元素仍是构造体类型,每个元素可以存储一个学生的数据,具有一个学生的数据,具有200个元素的构造体数组就可以存放个元素的构造体数组就可以存放200个学生信息。个学生信息。构造体数组的定义构造体数组的定义方式一方式一: : struct studentstruct student int num; int num; char name20; char name20; char sex; char sex; int age; int age; ; ;struct student stu2;struct student stu2;方式二方

41、式二: : struct student struct student int num; int num; char name20; char name20; char sex; char sex; int age; int age; stu2; stu2;方式三方式三: struct int num; char name20; char sex; int age; stu2;numnamesexagenumnamesexagestu0stu125B构造体数组的援用构造体数组的援用 struct student int num; char name20; char sex; int age;

42、str3,hu,wu;stu1.age+;strcpy(,ZhaoDa);援用方式:援用方式: 构造体数组名构造体数组名下标下标.成员名成员名v一样构造体变量可以相互赋值:一样构造体变量可以相互赋值:hu=str2;str0=wu;v构造体数组元素的输入输出:构造体数组元素的输入输出:v scanf“%d,%s,&str1.num,;v printf“%d,%s,str1.num,;构造体数组的初始化构造体数组的初始化例 struct int num; char name20; char sex; int age; stu =,;顺

43、序初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin,M,20, 101,“Li Gang,M,19, 110,“Liu Yan,F,19; 例 struct student int num; char name20; char sex; int age; stu =,;分行初始化分行初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“

44、Wang Lin,M,20, 101,“Li Gang,M,19, 110,“Liu Yan,F,19; 全部初始化时维数可省全部初始化时维数可省构造体数组作函数参数构造体数组作函数参数v构造体数组作函数参数与普通数组作函数参构造体数组作函数参数与普通数组作函数参数一样,它是数一样,它是“地址传送的。地址传送的。v在主调函数中,只需求将构造体数组名带入在主调函数中,只需求将构造体数组名带入即可,在被调函数中运用构造体数组的方法即可,在被调函数中运用构造体数组的方法与主调函数一样。与主调函数一样。例例8-4 设计一个洗牌和发牌的程序设计一个洗牌和发牌的程序【分析】【分析】一幅扑克一幅扑克52张牌

45、,分为张牌,分为4种花样,用种花样,用H代表红桃,代表红桃,D代表方块,代表方块,C代表梅花,代表梅花,S代表黑桃,每种花样又有代表黑桃,每种花样又有13张牌:张牌:A、2、3、10、J、Q、K。显然,每一张牌由两个元素组成:花样和牌面,我们可以定义显然,每一张牌由两个元素组成:花样和牌面,我们可以定义一个构造体表示一张牌。一个构造体表示一张牌。发牌的过程就是将发牌的过程就是将52张牌按照随机顺序存放。我们可以定义一张牌按照随机顺序存放。我们可以定义一个构造体数组存放个构造体数组存放52张牌,然后用张牌,然后用for循环陈列循环陈列52张牌数组张牌数组下标下标051,第,第i次循环,程序选择一

46、个次循环,程序选择一个051的随机数的随机数j,然后将第然后将第i张牌和第张牌和第j张牌交换,从而完成洗牌的过程。张牌交换,从而完成洗牌的过程。发牌的过程就是将发牌的过程就是将52张牌按照随机顺序发放。张牌按照随机顺序发放。 例例8-4程序程序/* LI8_4.c */#include #include #include #include /* 声明构造体类型声明构造体类型 */struct card char suit2; /* 花样花样 */ char face3; /* 牌面牌面 */;typedef struct card CARD;/* 自定义函数的声明自定义函数的声明 */void

47、 initcardCARD deck,char s2,char f3;void shuffleCARD deck;void printCARD deck;int main CARD deck52; /* 定义一副纸牌有定义一副纸牌有52张张 */ char s42=H,D,C,S; /* 花样:花样: 红红H方方D梅梅C黑黑S */ char f133=A,2,3,4,5,6,7,8,9,10,J,Q,K; /* 牌面牌面 */ initcarddeck,s,f; /* 按顺序初始化一副牌按顺序初始化一副牌 */ srandunsignedtimeNULL; /* 产生随机数的种子函数产生随机

48、数的种子函数 */ shuffledeck; /* 洗牌洗牌 */ printdeck; /* 输动身牌结果输动身牌结果 */ return 0;例例8-4程序续程序续1/* 洗牌:随机产生一副牌洗牌:随机产生一副牌 */void shuffleCARD deck int i,j; CARD temp; fori=0; i52; i+ j=rand%52; /* 产生产生051的随机数的随机数 */ temp=decki; /* 将第将第i张牌与第张牌与第j张牌交换位置张牌交换位置 */ decki=deckj; deckj=temp; /* 输动身牌结果输动身牌结果 */void print

49、CARD deck int i; fori=0; i52; i+ /* 输出一张牌的花样和牌面输出一张牌的花样和牌面 */ printf%2s-%-2s,decki.suit,decki.face; printf%c,i+1%4 ? t : n; /* 条件运算符的运用条件运算符的运用 */ 例例8-4程序续程序续2/* 按顺序初始化一副牌按顺序初始化一副牌 H-A,H-2,H-K,D-A,S-K */void initcardCARD deck,char s2,char f3 int i; fori=0; i52; i+ strcpydecki.suit,si/13; /* 4种花样种花样

50、*/ strcpydecki.face,fi%13; /* 13种牌面种牌面 */ 举一反三举一反三例例8-5 计算某日是本年的第几天。计算某日是本年的第几天。【分析】【分析】一年一年12个月,除了个月,除了2月份有闰年和非闰年相差月份有闰年和非闰年相差1天外,其它月天外,其它月份均是不变的,份均是不变的,1月份月份31天,天,2月份月份28天闰年天闰年29天,天,3月月份份31天,天,4月份月份30天,天,5月份月份31天,天,6月份月份30天,天,7月份月份31天,天,8月份月份31天,天,9月份月份30天,天,10月份月份31天,天,11月份月份30天,天,12月份月份31天。假设当前月

51、份在天。假设当前月份在3月之后,并且该年度是闰年,月之后,并且该年度是闰年,那么总天数加那么总天数加1。例例8-5程序程序/* LI8_5.c */#include /* 声明构造体类型声明构造体类型struct date */struct date int year; /* 年年 */ int month; /* 月月 */ int day; /* 日日 */; typedef struct date YMD; /* 声明构造体别名声明构造体别名 */* 自定义函数的声明自定义函数的声明 */int countdaysYMD date; int main YMD date; /* 用别名定义

52、构造体变量用别名定义构造体变量 */ int days; printfInput year,month,day: ; scanf%d,%d,%d,&date.year,&date.month,&date.day; /* 输入年月日输入年月日 */ days=countdaysdate; /* 计算天数计算天数 */ printf%d-%d-%d is the %dth day in %d.n,date.year,date.month,date.day,days,date.year; return 0;/* 计算某日是本年第几天函数计算某日是本年第几天函数 */int c

53、ountdaysYMD date int days=0,i; int day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31; fori=1; i2 days+; /* 闰年且在闰年且在2月份之后要加月份之后要加1 */ returndays; 信息打印问题信息打印问题在对构造体变量进展操作的过程中,必然涉及屡次访问构造体在对构造体变量进展操作的过程中,必然涉及屡次访问构造体中的数据,通常的方式是运用圆点方式访问,除此之外,还可中的数据,通常的方式是运用圆点方式访问,除此之外,还可以运用指向构造体的指针来访问构造体中的数据。另外,指针以运用指向构造体的指

54、针来访问构造体中的数据。另外,指针还可以作为构造体的成员。还可以作为构造体的成员。例例8-6 经过指针打印构造体中的信息。经过指针打印构造体中的信息。 【分析】【分析】访问构造体成员的运算符有两种,一种是前面运用的圆点运算访问构造体成员的运算符有两种,一种是前面运用的圆点运算符符“.,还有一种是指向运算符,还有一种是指向运算符“-,它经过指向构造体,它经过指向构造体的指针访问构造体的成员。的指针访问构造体的成员。 例例8-6实现代码实现代码/* LI8_6.c */#include /* 声明构造体类型声明构造体类型struct card */struct card char *face; /

55、* 牌面牌面 */ char *suit; /* 花样花样 */; typedef struct card CARD; /* 声明构造体别名声明构造体别名 */int main CARD a; /* 定义构造体变量定义构造体变量 */ CARD *aptr; /* 定义构造体指针定义构造体指针 */ /* 分别给构造体成员赋值分别给构造体成员赋值 */ a.face=Ace; /* A */ a.suit=“Spades; /* 黑桃黑桃 */ aptr=&a; /* 将构造体指针将构造体指针aptr指向构造体变量指向构造体变量a */ /* 三种不同的方式打印构造体信息三种不同的方式

56、打印构造体信息 */ printf%s %s %sn%s %s %sn%s %s %sn, a.face,of,a.suit, aptr-face,of,aptr-suit, *aptr.face,of,*aptr.suit; return 0;本例程序中运用了aptr-face和*aptr.face两种新的方式访问构造体成员。这里涉及到指向构造体的指针知识点。构造体中的指针构造体中的指针v在构造体中定义指针和定义其他的普通变量的方式在构造体中定义指针和定义其他的普通变量的方式是一样的,运用的情况也一样,比如假设要在学生是一样的,运用的情况也一样,比如假设要在学生构造体中添加一个数据成员表示地

57、址,可以定义如构造体中添加一个数据成员表示地址,可以定义如下:下:v struct studentv vint num;vchar *name;vchar sex;vfloat score;v ;指向构造体变量的指针指向构造体变量的指针v假设经过指向构造体的指针访问上面定义的构造体假设经过指向构造体的指针访问上面定义的构造体student的各个数据成员,代码如下的各个数据成员,代码如下v struct student stu; /*定义构造体变量定义构造体变量*/v struct student *p; /*定义构造体指针定义构造体指针*/v p=&stu; /*指针指向变量赋值方式指

58、针指向变量赋值方式*/v这时运用这时运用p访问构造体中的变量有两种方式均:访问构造体中的变量有两种方式均:v p-num 或或*p.num /*与与stu.num等价等价*/v p-name或或* /*与与等价等价*/v其中:符号其中:符号“-为指向构造体成员运算符,其为指向构造体成员运算符,其级别最高,结合方向从左到右。级别最高,结合方向从左到右。例例8-7/* LI8_7.c */#include struct student char num5; char *name; char sex; float score; ;typedef struct studen

59、t STUDENT;int main STUDENT zhang=111,Zhang hua,M,88.5; STUDENT *pname; /* 构造体指针构造体指针 */ pname=&zhang; /* 给构造体指针变量赋值给构造体指针变量赋值 */ printfName=%snNumber=%dn,,zhang.num; printfName=%snNumber=%dn,pname-name,pname-num;/*指指针访问成员针访问成员*/ printfName=%snNumber=%dn,*,*pname.num; return 0

60、;指向构造体数组的指针指向构造体数组的指针v前面曾经引见,可以用指针指向前面曾经引见,可以用指针指向数组或数组元素。同样,可以用数组或数组元素。同样,可以用指针指向构造体数组及其元素,指针指向构造体数组及其元素,其定义格式与指向构造体指针一其定义格式与指向构造体指针一样,其值为构造体数组的首地址。样,其值为构造体数组的首地址。 v指向构造体数组的指针实践上与指向构造体数组的指针实践上与前面定义的指向二维数组的指针前面定义的指向二维数组的指针类似,可以了解为二维数组的行类似,可以了解为二维数组的行指针。指针。stu0stu1numnamesexagepscorenumnamesexagescorep+1例例8-8/* LI8_8.c */#include struct student char num5; c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论