您好,欢迎访问三七文档
第9章用户自己建立数据类型9.1定义和使用结构体变量9.2使用结构体数组9.3结构体指针9.4用指针处理链表9.5共用体类型9.6使用枚举类型9.7用typedef声明新类型名9.1定义和使用结构体变量9.1.1自己建立结构体类型9.1.2定义结构体类型变量9.1.3结构体变量的初始化和引用9.1.1自己建立结构体类型用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系9.1.1自己建立结构体类型structStudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};由程序设计者指定了一个结构体类型structStudent它包括num,name,sex,age,score,addr等不同类型的成员9.1.1自己建立结构体类型声明一个结构体类型的一般形式为:struct结构体名{成员表列};类型名成员名;9.1.1自己建立结构体类型说明:(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如structTeacherstructWorkerstructDate等结构体类型各自包含不同的成员9.1.1自己建立结构体类型说明:(2)成员可以属于另一个结构体类型。structDate{intmonth;intday;intyear;};structStu{intnum;charname[20];charsex;intage;structDatebirthday;charaddr[30];};9.1.1自己建立结构体类型说明:(2)成员可以属于另一个结构体类型。numnamesexagebirthdayaddrmonthdayyear9.1.2定义结构体类型变量前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。9.1.2定义结构体类型变量1.先声明结构体类型,再定义该类型变量声明结构体类型structStudent,可以用它来定义变量structStudentstudent1,student2;结构体类型名结构体变量名9.1.2定义结构体类型变量1.先声明结构体类型,再定义该类型变量声明结构体类型structStudent,可以用它来定义变量structStudentstudent1,student2;10001ZhangXinM1990.5Shanghaistudent110002WangLiF2098Beijingstudent29.1.2定义结构体类型变量2.在声明类型的同时定义变量structStudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;9.1.2定义结构体类型变量3.不指定类型名而直接定义结构体类型变量其一般形式为:struct{成员表列}变量名表列;指定了一个无名的结构体类型。9.1.2定义结构体类型变量(1)结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。9.1.2定义结构体类型变量(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。例9.1把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。解题思路:自己建立一个结构体类型,包括有关学生信息的各成员用它定义结构体变量,同时赋以初值输出该结构体变量的各成员9.1.3结构体变量的初始化和引用#includestdio.hintmain(){structStudent{longintnum;charname[20];charsex;charaddr[20];}a={10101,“LiLin”,‘M’,“123BeijingRoad”};printf(NO.:%ld\nname:%s\nsex:%c\naddress:%s\n,a.num,a.name,a.sex,a.addr);return0;}#includestdio.hintmain(){structStudent{longintnum;charname[20];charsex;charaddr[20];}a={10101,“LiLin”,‘M’,“123BeijingRoad”};printf(NO.:%ld\nname:%s\nsex:%c\naddress:%s\n,a.num,a.name,a.sex,a.addr);return0;}{}#includestdio.hintmain(){structStudent{longintnum;charname[20];charsex;charaddr[20];}a={10101,“LiLin”,‘M’,“123BeijingRoad”};……}a.num=10010;对printf(“%s\n”,a);不对#includestdio.hintmain(){structStudent{longintnum;charname[20];charsex;charaddr[20];}a={10101,“LiLin”,‘M’,“123BeijingRoad”};……}b=a;对structStudentb;b.num++;对#includestdio.hintmain(){structStudent{longintnum;charname[20];charsex;charaddr[20];}a={10101,“LiLin”,‘M’,“123BeijingRoad”};……}scanf(″%ld″,&a.num);对printf(″%o″,&a);对scanf(“%ld,%s,%c,%s\n”,&a);错#includestdio.hintmain(){structDate{intmonth;intday;intyear;};structStu{intnum;charname[20];charsex;intage;structDatebirthday;charaddr[30];}a,b;a.birthday.month=12;对a.age=10;b.age=9;对sum=a.age+b.age;对例9.2输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩解题思路:(1)定义两个结构相同的结构体变量student1和student2;(2)分别输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,如果学生1的成绩高于学生2,就输出学生1的全部信息,如果学生2的成绩高于学生1,就输出学生2的全部信息。如果二者相等,输出2个学生的全部信息#includestdio.hintmain(){structStudent{intnum;charname[20];floatscore;}student1,student2;scanf(%d%s%f,&student1.num,student1.name,&student1.score);scanf(“%d%s%f”,&student2.num,student2.name,&student2.score);不能加&printf(Thehigherscoreis:\n);if(student1.scorestudent2.score)printf(%d%s%6.2f\n,student1.num,student1.name,student1.score);elseif(student1.scorestudent2.score)printf(%d%s%6.2f\n,student2.num,student2.name,student2.score);else{printf(%d%s%6.2f\n,student1.num,student1.name,student1.score);printf(%d%s%6.2f\n,student2.num,student2.name,student2.score);}return0;}9.2使用结构体数组9.2.1定义结构体数组9.2.2结构体数组的应用举例9.2.1定义结构体数组例9.3有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。9.2.1定义结构体数组解题思路:设一个结构体数组,数组中包含3个元素每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1输出所有元素的信息#includestring.h#includestdio.hstructPerson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,“Sun”,0};全局的结构体数组namecountleader[0]Li0Zhang0Sun0intmain(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(“%s”,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n“,leader[i].name,leader[i].count);return0;}leader[j].count=leader[j].count+1;intmain(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(“%s”,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n“,leader[i].name,leader[i].count);return0;}说明:(1)定义结构体数组一般形式是①struct结构体名{成员表列}数组名[数组长度];②先声明一个结构体类型,然后再用此类型定义结构体数组:结构体类型数组名[数组长度];如:structPersonleader[3];说明:(2)对结构体数组初始化的形式是在定义数组的后面加上:={初值表列};如:structPersonleader[3]={Li,0,Zhang,0,Fun,0};9.2.2结构体数组的应用举例例9.4有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。解题思路:用结构体数组存放n个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。#includestdio.hstructStudent{intnum;charname[20];floatscore;};intmain(){structStudentstu[5]={{10101,Zhang,78},{10103,Wang,98.5},{10106,Li,86},{10108,“Ling”,73.5},{10110,“Fun”,100}};structStudenttemp;co
本文标题:制备纯水之5
链接地址:https://www.777doc.com/doc-6581289 .html