第9章 用户自己建立数据类型pptConvertor.docx
- 文档编号:3647614
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:60
- 大小:29.07KB
第9章 用户自己建立数据类型pptConvertor.docx
《第9章 用户自己建立数据类型pptConvertor.docx》由会员分享,可在线阅读,更多相关《第9章 用户自己建立数据类型pptConvertor.docx(60页珍藏版)》请在冰豆网上搜索。
第9章用户自己建立数据类型pptConvertor
第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)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如
structTeacher
structWorker
structDate等结构体类型
各自包含不同的成员
9.1.1自己建立结构体类型
说明:
(2)成员可以属于另一个结构体类型。
structDate
{intmonth;intday;intyear;};
structStu
{intnum;charname[20];
charsex;intage;
structDatebirthday;
charaddr[30];
};
9.1.1自己建立结构体类型
说明:
(2)成员可以属于另一个结构体类型。
num
name
sex
age
birthday
addr
month
day
year
9.1.2定义结构体类型变量
前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。
相当于设计好了图纸,但并未建成具体的房屋。
为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
9.1.2定义结构体类型变量
1.先声明结构体类型,再定义该类型变量
声明结构体类型structStudent,可以用它来定义变量
structStudentstudent1,student2;
结构体类型名
结构体变量名
9.1.2定义结构体类型变量
1.先声明结构体类型,再定义该类型变量
声明结构体类型structStudent,可以用它来定义变量
structStudentstudent1,student2;
10001
ZhangXin
M
19
90.5
Shanghai
student1
10002
WangLi
F
20
98
Beijing
student2
9.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结构体变量的初始化和引用
#include
intmain()
{structStudent
{longintnum;charname[20];
charsex;charaddr[20];
}a={10101,“LiLin”,‘M’,
“123BeijingRoad”};
printf("NO.:
%ld\nname:
%s\n
sex:
%c\naddress:
%s\n",
a.num,a.name,a.sex,a.addr);
return0;
}
#include
intmain()
{structStudent
{longintnum;charname[20];
charsex;charaddr[20];
}a={10101,“LiLin”,‘M’,
“123BeijingRoad”};
printf("NO.:
%ld\nname:
%s\n
sex:
%c\naddress:
%s\n",
a.num,a.name,a.sex,a.addr);
return0;
}
{
}
#include
intmain()
{structStudent
{longintnum;charname[20];
charsex;charaddr[20];
}a={10101,“LiLin”,‘M’,
“123BeijingRoad”};
……
}
a.num=10010;对
printf(“%s\n”,a);不对
#include
intmain()
{structStudent
{longintnum;charname[20];
charsex;charaddr[20];
}a={10101,“LiLin”,‘M’,
“123BeijingRoad”};
……
}
b=a;对
structStudentb;
b.num++;对
#include
intmain()
{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);错
#include
intmain()
{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个学生的全部信息
#include
intmain()
{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.score>student2.score)
printf("%d%s%6.2f\n",student1.num,
student1.name,student1.score);
elseif(student1.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 输出所有元素的信息 #include #include structPerson {charname[20]; intcount; }leader[3]={“Li”,0,“Zhang”,0,“Sun”,0}; 全局的结构体数组 name count leader[0] Li 0 Zhang 0 Sun 0 intmain() {inti,j;charleader_name[20]; for(i=1;i<=10;i++) {scanf(“%s”,leader_name); for(j=0;j<3;j++) if(strcmp(leader_name, leader[j].name)==0) leader[j].count++; } for(i=0;i<3;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;j<3;j++) if(strcmp(leader_name, leader[j].name)==0) leader[j].count++; } for(i=0;i<3;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个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。 #include structStudent {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; constintn=5;inti,j,k; 常变量 若人数变为30 30 #include structStudent {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; constintn=5;inti,j,k; #defineN5 注意temp的类型 printf("Theorderis: \n"); for(i=0;i {k=i; for(j=i+1;j if(stu[j].score>stu[k].score)k=j; temp=stu[k]; stu[k]=stu[i];stu[i]=temp; } for(i=0;i printf("%6d%8s%6.2f\n", stu[i].num,stu[i].name,stu[i].score); printf("\n"); return0; } 写法上与普通变量一致 9.3结构体指针 9.3.1指向结构体变量的指针 9.3.2指向结构体数组的指针 9.3.3用结构体变量和结构体变量的指针作函数参数 9.3.1指向结构体变量的指针 指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。 指针变量的基类型必须与结构体变量的类型相同。 例如: structStudent*pt; 9.3.1指向结构体变量的指针 例9.5通过指向结构体变量的指针变量输出结构体变量中成员的信息。 解题思路: 在已有的基础上,本题要解决两个问题: 怎样对结构体变量成员赋值; 怎样通过指向结构体变量的指针访问结构体变量中成员。 #include #include intmain() {structStudent {longnum; charname[20]; charsex; floatscore; }; …… structStudentstu_1; structStudent*p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“LiLin”); stu_1.sex='M‘;stu_1.score=89.5; printf("No.: %ld\n”,stu_1.num); printf("name: %s\n",stu_1.name); printf("sex: %c\n”,stu_1.sex); printf(”score: %5.1f\n”,stu_1.score); return0; } stu_1 10101 LiLin M 89.5 p structStudentstu_1; structStudent*p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“LiLin”); stu_1.sex='M‘;stu_1.score=89.5; printf("No.: %ld\n”,stu_1.num); printf("name: %s\n",stu_1.name); printf("sex: %c\n”,stu_1.sex); printf(”score: %5.1f\n”,stu_1.score); return0; } stu_1 10101 LiLin M 89.5 p 说明: 为了使用方便和直观,C语言允许把(*p).num用p->num来代替 (*p).name等价于p->name 如果p指向一个结构体变量stu,以下等价: ①stu.成员名(如stu.num) ②(*p).成员名(如(*p).num) p->成员名(如p->num) 9.3.2指向结构体数组的指针 例9.6有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。 解题思路: 用指向结构体变量的指针处理 (1)声明structStudent,并定义结构体数组、初始化 (2)定义指向structStudent类型指针p (3)使p指向数组首元素,输出元素中各信息 (4)使p指向下一个元素,输出元素中各信息 (5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息 #include structStudent {intnum;charname[20]; charsex;intage; }; structStudentstu[3]={ {10101,"LiLin",'M',18}, {10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}}; intmain() {structStudent*p; printf("No.Namesexage\n"); for(p=stu;p printf(“%5d%-20s%2c%4d\n”, p->num,p->name, p->sex,p->age); return0; } 10101 LiLin M 18 10102 ZhangFang M 19 10104 WangMin F 20 stu[0] stu[1] stu[2] intmain() {structStudent*p; printf("No.Namesexage\n"); for(p=stu;p printf(“%5d%-20s%2c%4d\n”, p->num,p->name, p->sex,p->age); return0; } 10101 LiLin M 18 10102 ZhangFang M 19 10104 WangMin F 20 p stu[0] stu[1] stu[2] intmain() {structStudent*p; printf("No.Namesexage\n"); for(p=stu;p printf(“%5d%-20s%2c%4d\n”, p->num,p->name, p->sex,p->age); return0; } 10101 LiLin M 18 10102 ZhangFang M 19 10104 WangMin F 20 p stu[0] stu[1] stu[2] intmain() {structStudent*p; printf("No.Namesexage\n"); for(p=stu;p printf(“%5d%-20s%2c%4d\n”, p->num,p->name, p->sex,p->age); return0; } 10101 LiLin M 18 10102 ZhangFang M 19 10104 WangMin F 20 p stu[0] stu[1] stu[2] 9.3.3用结构体变量和结构体变量的指针作函数参数 将一个结构体变量的值传递给另一个函数,有3个方法。 (1)用结构体变量的成员作参数。 例如,用stu[1].num或stu[2].name作函数实参,将实参值传给形参。 用法和用普通变量作实参是一样的,属于“值传递”方式。 应当注意实参与形参的类型保持一致。 (2)用结构体变量作实参。 用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量 在函数调用期间形参也要占用内存单元。 这种传递方式在空间和时间上开销较大 在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数 一般较少用这种方法 (3)用指向结构体变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 用户自己建立数据类型pptConvertor 用户 自己 建立 数据类型 pptConvertor