C语言程序设计C语言程序设计PPT (9).pdf
《C语言程序设计C语言程序设计PPT (9).pdf》由会员分享,可在线阅读,更多相关《C语言程序设计C语言程序设计PPT (9).pdf(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、9 9用户自己建立数据类型第第章章定义和使用结构体变量C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structure)。在程序中建立一个结构体类型:自己建立结构体类型struct 结构体名成员表列;struct Studentint num;/学号为整型char name20;/姓名为字符串char sex;/性别为字符型int age;/年龄为整型float score;/成绩为实型char addr30;/地址为字符串;/注意最后有一个分号numnamesexagescoreaddr10010Li FangM1887.5Beijing结构体类型的名字是由一个关
2、键字struct和结构体名组合而成的。结构体名由用户指定,又称“结构体标记”(structure tag)。花括号内是该结构体所包括的子项,称为结构体的成员(member)。对各成员都应进行类型声明,即“成员表列”(member list)也称为“域表”(field list),每一个成员是结构体中的一个域。成员名命名规则与变量名相同。类型名 成员名;自己建立结构体类型(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,各自包含不同的成员。(2)成员可以属于另一个结构体类型。struct Date/声明一个结构体类型 struct Date int month;/月int day;/
3、日int year;/年;struct Student/声明一个结构体类型 struct Studentint num;char name20;char sex;int age;struct Date birthday;/成员birthday属于struct Date类型char addr30;numnamesexagebirthdayaddrmonthdayyear定义结构体类型变量1.先声明结构体类型,再定义该类型的变量2.在声明类型的同时定义变量3.不指定类型名而直接定义结构体类型变量struct Student student1,student2;|结构体类型名结构体变量名struct
4、 Studentint num;/学号为整型char name20;/姓名为字符串char sex;/性别为字符型int age;/年龄为整型float score;/成绩为实型char addr30;/地址为字符串;/注意最后有一个分号sutdent1:10001Zhang XinM 1990.5Shanghaistudent2:10002Wang LiF2098Beijingstruct Studentint num;char name20;char sex;int age;float score;char addr30;student1,student2;struct 结构体名成员表列变
5、量名表列;struct成员表列变量名表列;定义结构体类型变量(1)结构体类型与结构体变量是不同的概念,不要混淆。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。结构体变量的初始化和引用【例9.1】把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。#include int main()struct Student/声明结构体类型stru
6、ct Studentlong int num;/以下4行为结构体的成员char name20;char sex;char addr20;a=10101,Li Lin,M,123 Beijing Road;/定义结构体变量a并初始化printf(NO.:%ldnname:%snsex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);return 0;结构体变量的初始化和引用(1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。(2)可以引用结构体变量中成员的值,引用方式为“.”是成员运算符,它
7、在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待,相当于一个变量。不能企图通过输出结构体变量名来输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入和输出。结构体变量名.成员名student1.num=10010;/*已定义了student1为Student类型的结构体变量,则student1.num表示student1变量中的num成员,即student1的num(学号)成员*/printf(%sn,student1);/企图用结构体变量名输出所有成员的值注意对结构体变量初始化,不是对结构体类型初始化结构体变量的初始化和引用(3)如果成员本身又
8、属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。(5)同类的结构体变量可以互相赋值。(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址(结构体变量的地址主要用作函数参数,传递结构体变量的地址)。但不能用以下语句整体读入结构体变量。student1.num=10010;/结构体变量student1中的成员numstudent1.birthday.month=6;/结构体变量student1中的成员birthday中的成员month
9、student2.scorestudent1.score;/赋值运算sum=student1.score+student2.score;/加法运算student1.age+;/自加运算student1=student2;/假设student1和student2已定义为同类型的结构体变量scanf(%d,&student1.num);/输入student1.num的值printf(%o,&student1);/输出结构体变量student1的起始地址scanf(%d,%s,%c,%d,%f,%sn,&student1);结构体变量的初始化和引用【例9.2】输入两个学生的学号、姓名和成绩,输出成绩
10、较高的学生的学号、姓名和成绩。#include int main()struct Student/声明结构体类型struct Student int num;char name20;float score;student1,student2;/定义两个结构体变量student1,student2 scanf(%d%s%f,&student1.num,student1.name,&student1.score);/输入学生1的数据scanf(%d%s%f,&student2.num,student2.name,&student2.score);/输入学生2的数据printf(The higher
11、 score is:n);if(student1.scorestudent2.score)printf(%d%s%6.2fn,student1.num,student1.name,student1.score);else if(student1.scorestudent2.score)printf(%d%s%6.2fn,student2.num,student2.name,student2.score);elseprintf(%d%s%6.2fn,student1.num,student1.name,student1.score);printf(%d%s%6.2fn,student2.num,
12、student2.name,student2.score);return 0;使用结构体数组定义结构体数组【例9.3】有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。#include#include struct Person/声明结构体类型struct Personchar name20;/候选人姓名int count;/候选人得票数leader3=Li,0,Zhang,0,Sun,0;/定义结构体数组并初始化int main()int i,j;char leader_name20;/定义字符数组for(i=1;i=10;i+)sc
13、anf(%s,leader_name);/输入所选的候选人姓名for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;printf(nResult:n);for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);return 0;namecountLi0Zhang0Sun0定义结构体数组(1)定义结构体数组一般形式是 先声明一个结构体类型,然后再用此类型定义结构体数组(2)对结构体数组初始化的形式是在定义数组的后面加上:struct 结构体名成员表列 数组名数组
14、长度;struct Personchar name20;int count;struct Person leader3;/leader是结构体数组名结构体类型数组名数组长度;初值表列;struct Personchar name20;int count;leader3;struct Person leader3=Li,0,Zhang,0,Sun,0;结构体数组的应用举例【例9.4】有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。#include struct Student/声明结构体类型struct Studentint num;char name20;fl
15、oat score;int main()struct Student stu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,Ling,73.5,10110,Sun,100;/定义结构体数组并初始化struct Student temp;/定义结构体变量temp,用作交换时的临时变量const int n=5;/定义常变量nint i,j,k;printf(The order is:n);for(i=0;in-1;i+)k=i;for(j=i+1;jstuk.score)/进行成绩的比较k=j;temp=stuk;stuk=stui;stui
16、=temp;/stuk和stui元素互换for(i=0;in;i+)printf(%6d%8s%6.2fn,stui.num,stui.name,stui.score);printf(n);return 0;结构体指针结构体指针所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。指向结构体变量的指针【例9.5】通过指向结构体变量的指针变量输出结构体变量中成员的信息。#include#include int main()struct Student/声明结构体类型str
17、uct Studentlong num;char name20;char sex;float score;struct Student stu_1;/定义struct Student类型的变量stu_1 struct Student*p;/定义指向struct Student 类型数据的指针变量p p=&stu_1;/p指向stu_1 stu_1.num=10101;/对结构体变量的成员赋值strcpy(stu_1.name,Li Lin);/用字符串复制函数给stu_1.name赋值stu_1.sex=M;stu_1.score=89.5;printf(No.:%ldnname:%snsex
18、:%cnscore:%5.1fn,stu_1.num,stu_1.name,stu_1.sex,stu_1.score);/输出结果printf(nNo.:%ldnname:%snsex:%cnscore:%5.1fn,(*p).num,(*p).name,(*p).sex,(*p).score);return 0;p10101Li LinM89.5(*p).num也可表示为p-num如果p指向一个结构体变量stu,以下3种用法等价:stu.成员名(*p).成员名 p-成员名stu.num(*p).nump-nump10101stu0Li LinM18p10102stu1Zhang FangM
19、19p10104stu2Wang MinF20指向结构体数组的指针【例9.6】有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。#include struct Student/声明结构体类型struct Studentint num;char name20;char sex;int age;struct Student stu3=10101,Li Lin,M,18,10102,Zhang Fang,M,19,10104,Wang Min,F,20;/定义结构体数组并初始化int main()struct Student*p;/定义指向struct Student结构体变量的指针变量p
20、rintf(No.Name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);/输出结果return 0;用结构体变量和结构体变量的指针作函数参数将一个结构体变量的值传递给另一个函数,有3个方法:(1)用结构体变量的成员作参数。例如,用stu1.num或stu2.name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。(2)用结构体变量作实参。用结构体变量作实参时,采取的也是“值传递”的方式,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量。在函数调用
21、期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,如果结构体的规模很大时,开销是很可观的。此外,由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便。因此一般较少用这种方法。(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。用结构体变量和结构体变量的指针作函数参数【例9.7】有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。#include#define N 3/学生数为3struct Stu
22、dent/建立结构体类型struct Studentint num;/学号char name20;/姓名float score3;/3门课成绩float aver;/平均成绩;int main()void input(struct Student stu);/函数声明struct Student max(struct Student stu);/函数声明void print(struct Student stu);/函数声明struct Student stuN,*p=stu;/定义结构体数组和指针input(p);/调用input函数print(max(p);/调用print函数,以max函
23、数的返回值作为实参return 0;void input(struct Student stu)/定义input函数int i;printf(请输入各学生的信息:学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);/输入数据stui.aver=(stui.score0+stui.score1+stui.score2)/3.0;/求平均成绩struct Student max(struct Student stu)/定义max函数int
24、i,m=0;/用m存放成绩最高的学生在数组中的序号for(i=0;istum.aver)m=i;/找出平均成绩最高的学生在数组中的序号return stum;/返回包含该生信息的结构体元素void print(struct Student stud)/定义print函数printf(n成绩最高的学生是:n);printf(学号:%dn姓名:%sn三门课成绩:%5.1f,%5.1f,%5.1fn平均成绩:%6.2fn,stud.num,stud.name,stud.score0,stud.score1,stud.score2,stud.aver);*用指针处理链表什么是链表链表是一种常见的重要的
25、数据结构。它是动态地进行存储分配的一种结构。链表有一个“头指针”变量,图中以head表示,它存放一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:(1)用户需要用的实际数据;(2)下一个结点的地址。head指向第1个元素,第1个元素又指向第2个元素直到最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。head12491356147510211249ABCD135614751021NULL什么是链表可以用结构体变量建立链表。一个结构体变量包含若干成员,这些成员可以是数值类型、字符类型、数组类型
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计C语言程序设计PPT 9 语言程序设计 PPT
限制150内