• 1. 第九章 构造数据类型§9.1 结构体数据类型 §9.2 结构体数组 §9.3 结构体变量与函数 10/19/20181
  • 2. §9.1 结构体数据类型 前面介绍的变量都只包含一种类型 ,但在实际问题中,常常要求把一些属于不同类型的数据作为一个整体来处理。 如:一个职员的编号、姓名、年龄、性别、身份证号码、民族、文化程度、职务、住址、联系电话等等。 由一些不同类型的数据组合而成的数据整体,C语言称之为“结构体”类型,结构体中所包含的数据元素称之为成员。10/19/20182
  • 3. § 9.1.1结构体类型的定义 定义形式为: struct 结构体名 { 成员项列表; }; 其中成员项列表的形式同简单变量的定义形式相同。例: struct person { long no; char name[12]; int age;10/19/20183
  • 4. char sex; long indentityNo; char education[12]; char addr[40]; long telno; };说明:struct为关键字, person为结构体名, no、name、age、sex、indentityNo、education、addr、telno称为成员。10/19/20184
  • 5. 结构体类型的特点: ① 结构体名为任何合法的标识符,建议用具有一定意义的单词或组合作为结构体名。 ② 虽然成员的类型定义形式同简单变量,不能直接使用。 ③ 定义结构体类型只是定义类型而不是定义变量。§9.1.2 结构体类型变量的定义 一、先定义了结构体类型,再定义该类型的变量。10/19/20185
  • 6. 定义格式:类型标识符 <变量名列表>; 例如: struct person stu, worker; 类型标识符 结构体变量名上面定义了两个变量stu, worker,它们是结构体类型struct person型的变量。 注意,“struct person”代表类型名(类型标识符)。 二、在定义一个结构体类型的同时定义一个若干个结构体类型变量。定义格式:struct <结构体名> { 成员项列表; }<变量名列表>;10/19/20186
  • 7. 例如: struct person { long no; char name[12]; int age; char sex; long indentity No; char education[12]; char addr[40] long telno; }teacher, doctor;10/19/20187
  • 8. 三、直接定义结构体类型的变量。定义格式: Struct { 成员项列表; }<变量名列表>; 例如:struct { long no; char name[12]; int age; char sex; long indentity No; char education[12]; char addr[40]; long telno; } teacher, doctor;在此只是定义了teacher和doctor两个变量为上面花括号内的结构体类型,但没有定义此结构体类型的名字。 10/19/20188
  • 9. §9.1.3 结构体变量的初始化 在定义变量的同时给变量的成员赋值。例如: struct smail { char name[12]; char addr[40]; long zip; long tel; }; 则:struct smail teacher={“Li Ming”, “Blue Road 18”,430000, 88753540}; teacher为结构体类型的变量,定义时依次对它的各成员赋予了初值。10/19/20189
  • 10. 又例如结构体定义和变量定义可以合二为一: struct smail { char name[12]; char addr[40]; long zip; long tel; }teacher={“Li Ming”, “Blue Road 18”, 430000, 88753540};10/19/201810
  • 11. §9.1.4 结构型变量成员的引用 一、引用结构体变量中的成员。 引用格式:<结构变量名>.<成员名>其中的圆点运算符称为成员运算符,它的运算级别是最高的。 如:teacher.no、teacher.age、teacher.name[0]等等。 若一个结构体类型中含有另一个结构体类型的成员,则在访问该成员时,应采取逐级访问的方法。如: doctor.birthday.day——出生日份 doctor.birthday.month——出生月份 doctor.birthday.year——出生年份10/19/201811
  • 12. 二、将结构体变量作为一个整体来使用。 可以将一个结构体变量作为一个整体赋给另一个结构体变量,条件是这两个变量必须具有相同的结构体类型。 例如:struct person doctor={“Li Ming”,24, 3, 1970, ‘M’, 88753540}; struct person teacher; teacher=doctor; /*将结构体变量doctor的值赋给teacher */ 这样,变量teacher中各成员的值均与doctor 的成员的值相同。10/19/201812
  • 13. 【例9-1】阅读下面的程序,了解结构体成员的使用 /*exam9_1.c 结构体成员的使用*/ #include #include struct score { int math; int eng; int comp; }; struct stu { char name[12]; char sex; long StuClass; struct score sub; }10/19/201813
  • 14. main() { struct stu student1={"Li Ming",'M',990324,88,80,90}; struct stu student2; clrscr(); student2=student1; student2.name[0]='H'; student2.name[1]='u'; student2.StuClass=990325; student2.sub.math=83; printf("Record1---%s,%c,%ld,%d,%d,%d\n",student1.name, student1.sex,student1.StuClass,student1.sub.math, student1.sub.eng,student1.sub.comp); printf("Record2---%s,%c,%ld,%d,%d,%d\n",student2.name, student2.sex,student2.StuClass,student2.sub.math, student2.sub.eng,student2.sub.comp); }程序运行结果: Record1---Li Ming,M,990324,88,80,90 Record1---Hu Ming,M,990325,83,80,90 10/19/201814
  • 15. §9.1.5 结构型变量成员的输入/输出 对变量的成员进行输入/输出,如下所示: scanf(“%s%s%ld”, stud.name, stud.addr, &stud.zip); printf(“%s, %s, %ld\n”, stud.name, stud.addr, stud.zip); 也可以用gets函数和puts函数输入和输出一个结构变量中字符数组成员。如: gets(stud.name); /* 输入一个字符串给stud.name */ puts(stud.name); /*将stud.name数组中的字符串输出到显示器*/10/19/201815
  • 16. §9.2 结构体数组 结构体数组,亦即数组中每一个元素都是一个结构体变量。 §9.2.1 结构体数组的定义 结构体数组的定义方法与结构体变量的定义方法相同。 一、先定义结构体,再定义结构体数组: struct <结构体名> { <成员项表列> }; struct <结构体名> <数组名> [<数组大小>];10/19/201816
  • 17. 二、在定义结构体的同时,定义结构体数组: struct <结构体名> { <成员项表列> }<数组名>[<数组大小>];三、直接定义结构体变量而不定义结构体名; struct { <成员项表列> }<数组名>[<数组大小>];10/19/201817
  • 18. §9.2.2 结构体数组成员的初始化和引用 结构体数组成员的值也可以初始化,初始化的形式与多维数组的初始化形式类似。 例如: struct student stu[30]={{“LiFei”, “DongFeng Road 14”, 430038}, {“LiMing”, “zhongshan Road 378”, 430082}, {“LiYong”, “Xiao Shan Road 25”, 430001}};10/19/201818
  • 19. 结构体数组的引用完全类似于结构体变量的引用,只是用结构体数组元素来代替结构体变量,其他规则不变,如下面所示: */引用某一元素的成员 */stu[0].name stu[0].age stu[0]=stu[2]; */将结构体数组元素作为一个整体来使用 */10/19/201819
  • 20. §9.3 结构体变量与函数 一、函数的形参与实参为结构型 【例9-2】下面的程序是计算四种书的购书情况,并输出统计结果。/*exam9_2.c 函数的参数为结构类型*/ #include #include #include struct BookLib { char name[12]; int num; float price; float SumMoney; };10/19/201820
  • 21. main() { void list(struct BookLib StuBook); struct BookLib Book[4]; int i; char temp[15]; for(i=0;i<4;i++) { printf("Please input data of book(%d): Name Number Price\n",i+1); gets(Book[i].name); gets(temp); Book[i].num=atoi(temp); gets(temp); Book[i].price=atof(temp); }10/19/201821
  • 22. printf("-------------------------------------\n"); printf("name num price SumMoney\n"); for(i=0;i<4;i++) list(Book[i]); } void list(struct BookLib StuBook) { StuBook.SumMoney=StuBook.num*StuBook.price; printf("%-12s %5d %6.2f %9.2f\n",StuBook.name, StuBook.num,StuBook.price,StuBook.SumMoney); }10/19/201822
  • 23. 程序运行结果: Please input data of book: Name Number Price Computer 300 18.6 Please input data of book: Name Number Price Mathematics 600 15.5 Please input data of book: Name Number Price English 360 22.8 Please imput data of book: Name Number Price Chemistry 150 14.210/19/201823
  • 24. ------------------------------------------------------- name num price SumMoney Computer 300 18.60 5580.00 Mathematics 600 15.50 9300.00 English 360 22.80 8208.00 Chemistry 150 14.20 2130.00在程序中,定义了一个结构体类型BookLib,用来描述购书的信息,还定义了一个函数list,它的参数为结构型变量,函数的作用是计算购书的总费用并输出所有信息。 在主程序中,定义了一个临时字符数组变量temp[15],用于将用户输入的两个数值:一个是书的数目num,另一个是书的价格price作为字符串来接收,然后通过atoi()函数和atof()函数将temp转成整型值和实型值。 10/19/201824
  • 25. 二、函数的返回值类型为结构型 C标准中还允许函数的返回值为结构体类型的值。 【例9-3】把上面这个程序例子稍作修改,将数据输入用一个函数NewBook()来实现。/*exam9_3.c 函数的返回值为结构类型*/ #include #include #include 10/19/201825
  • 26. struct BookLib { char name[12]; int num; float price; float SumMoney; }; void list(struct BookLib StuBook) { StuBook.SumMoney=StuBook.num*StuBook.price; printf("%-12s %5d %6.2f %9.2f\n",StuBook.name, StuBook.num,StuBook.price,StuBook.SumMoney); }10/19/201826
  • 27. struct BookLib NewBook() { struct BookLib book; char temp[15]; printf("Please input data of book: Name Number Price\n"); gets(book.name); gets(temp); book.num=atoi(temp); gets(temp); book.price=atof(temp); return(book); }10/19/201827
  • 28. main() { struct BookLib Book[4]; int i; for(i=0;i<4;i++) Book[i]=NewBook(); printf("----------------------------------\n"); printf("name num price SumMoney\n"); for(i=0;i<4;i++) list(Book[i]); }程序中定义了两个函数:无返回值的函数list(),返回值为结构体类型变量的函数NewBook()用来给结构体变量数组赋值。 10/19/201828