福建师范大学 c语言 第十三章结构联合名师优质资料

上传人:仙*** 文档编号:48809367 上传时间:2022-01-14 格式:PPT 页数:42 大小:246.50KB
收藏 版权申诉 举报 下载
福建师范大学 c语言 第十三章结构联合名师优质资料_第1页
第1页 / 共42页
福建师范大学 c语言 第十三章结构联合名师优质资料_第2页
第2页 / 共42页
福建师范大学 c语言 第十三章结构联合名师优质资料_第3页
第3页 / 共42页
资源描述:

《福建师范大学 c语言 第十三章结构联合名师优质资料》由会员分享,可在线阅读,更多相关《福建师范大学 c语言 第十三章结构联合名师优质资料(42页珍藏版)》请在装配图网上搜索。

1、1/42结构和联合第十三章:结构联合2/42结构体是一种结构体是一种构造构造数据类型数据类型l用途:把用途:把不同类型不同类型的数据组合成一个整体的数据组合成一个整体时间:时间:second,minute,hoursecond,minute,hour日期:日期:day,month,yearday,month,year图书:图书:title,author,price,yeartitle,author,price,year城市:城市:name,country,populationname,country,population存货:存货:item,stock,valueitem,stock,valu

2、e学生:学生:num,name,gender,age,score,addr,birthnum,name,gender,age,score,addr,birth结构体第十三章:结构联合3/42结构体类型定义和结构体变量定义形式一:形式一:例例 struct student int num; char name20; char gender; int age; float score; char addr30; ; struct student stu1,stu2; struct是关键是关键字字.结构体类结构体类型定义描述结型定义描述结构的组织形式构的组织形式,不分配内存不分配内存namenumg

3、enderagescoreaddr4字节字节4字节字节20字节字节1字节字节4字节字节30字节字节.namenumgenderagescoreaddr4字节字节4字节字节20字节字节1字节字节4字节字节30字节字节.stu2stu1一般格式:一般格式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名 结构体变量表列;结构体变量表列;第十三章:结构联合4/42形式二:形式二:例例 typedef struct int num; char name20; char gender; int age; f

4、loat score; char addr30; STUDENT; STUDENT stu1,stu2; 例例 #define STUDENT struct student STUDENT int num; char name20; char gender; int age; float score; char addr30; ; STUDENT stu1,stu2; 第十三章:结构联合5/42形式三:形式三:struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列;变量名表列;例例 struct char title40; char auth

5、or20; float price; int year; book1,book2; 用用无名结构体无名结构体直接定义直接定义变量变量只能一次只能一次第十三章:结构联合6/42例例 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

6、year; birthday; stu;结构体可嵌套结构体可嵌套第十三章:结构联合7/42结构体变量的初始化struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;例例 struct student int num; char name20; char gender; int age; char addr30; stu1=12301,Wang Lin,M,19, 200 Beijing Road;struct student stu2=12302,Chen Pin

7、,M,19, 51 Nanjing Road, stu3=12303,Zhao Min,F,19, 51 Hunan Road;struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .结构体变量结构体变量=初始数据初始数据;第十三章:结构联合8/42结构体变量的引用q引用规则引用规则n 结构体变量不能整体引用结构体变量不能整体引用,只能引用变量成员只能引用变量成员n可以将一个结构体变量赋值给另一个结构体变量可以将一个结构体变量赋值给另一个结构体变量n结构体嵌套时逐级引用结构体嵌套时逐级引用成员成员(分量分量)运算符运算符优先级优先级:

8、1结合性结合性:从左向右从左向右引用方式:引用方式: 结构体变量名结构体变量名.成员名成员名stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;printf(“%d,%s,%c,%d,%f,%sn”,stu1); ( )stu2=stu1; ( )stu1.birthday.month=12;if(stu1=stu2). ( )第十三章:结构联合9/42#include struct data int a, b, c; ;void main() void func(struct data); struct data arg

9、; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18

10、; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n);arga :27b: 3c :30(main)(func)parma :27b: 3c :30arga :27b: 3c :30(main)(func)parma :18b: 5c :90arga :27b: 3c :30(main)arga :27b: 3c :30(main)例例 用结构体变量作函数参数用结构体变量作函数参数第十三章:结构联合10/42结构体数组q结构体

11、数组的定义结构体数组的定义形式一形式一: : struct student int num; char name20; char gender; int age; ;struct student stu2;形式二形式二: : struct student int num; char name20; char gender; int age; stu2;形式三形式三: struct int num; char name20; char gender; int age; stu2;numnamegenderagenumnamegenderagestu0stu129B第十三章:结构联合11/42结构

12、体数组初始化和引用顺序初始化顺序初始化: struct student int num; char name20; char gender; 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 gender; int age; ;struct student stu =100,Wang Lin,M,20, 101,Li Gang,M,19, 110,Liu Yan,F,1

13、9; 全部初始化时维数可省全部初始化时维数可省q结构体数组引用结构体数组引用引用方式:引用方式: 结构体数组名结构体数组名下标下标.成员名成员名 struct student int num; char name20; char gender; int age; stu3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);第十三章:结构联合12/42例例 统计候选人选票统计候选人选票#include struct person int code; char name20; int count;leader3=1,Li,0,2,Zhang,0,3,Wang,0; void

14、 main() int i,j; char leader_name20; for(i=1;i=10;i+) gets(leader_name); for(j=0;j3;j+)if(!strcmp(leader_name,leaderj.name) leaderj.count+; for(i=0;i3;i+) printf(%d:%20s:%dn,leaderi.code, leaderi.name,leaderi.count);code name count1 Li2 Zhang3 Wang000第十三章:结构联合13/42结构体数组程序举例2计算一个班学生的三门课程的平均成绩,并输出该班学生

15、姓名及平均成绩。第十三章:结构联合14/42#include #define MAXSIZE 100struct student char name16;/*学生姓名学生姓名*/ int grade3,average;/*三门成绩,平均分三门成绩,平均分*/;第十三章:结构联合15/42void main() int i,j,num,s; struct student stuMAXSIZE; printf(Enter number of students:); scanf(%d,&num); for(i=0;inum;i+) printf(Enter name:); scanf(%s,

16、stui.name); printf(Enter the grades(3):); for (j=0,s=0;j3;j+) scanf(%d,&stui.gradej); s=s+stui.gradej; stui.average=s/3; for(i=0;i成员名: pst-num=1001;q注意:pst不能指向成员:pst=&stu1.num非法; 但是: int *q; q=&stu1.num合法第十三章:结构联合18/42用指向结构体变量的指针来访问学生的各项数据。#include struct stuint num;char *name;char sex;f

17、loat score;boy=102,Zhang ping,M,78.5,*p; 第十三章:结构联合19/42 void main()p=&boy;printf(Number=%dnName=%sn,boy.num,boy.name);printf(Sex=%cnScore=%4.1fnn,boy.sex,boy.score);printf(Number=%dnName=%sn,(*p).num,(*p).name);printf(Sex=%cnScore=%4.1fnn,(*p).sex,(*p).score);printf(Number=%dnName=%sn,p-num,p-na

18、me);printf(Sex=%cnScore=%4.1fnn,p-sex,p-score);第十三章:结构联合20/42指向结构体的指针输出数组中各元素中各成员的值。struct student int num; char name20; char sex; int age; ; struct student stu3 =10101,Zhang,M,18, 10102,Li,M,19, 10103,Wang,F,20;void main() struct student *p; printf(No. Name Sex Agen); for (p=stu; pnum, p-name, p-se

19、x, p-age); 10101“Zhang”M1810102“Li”M1910103“Wang”F20第十三章:结构联合21/42注意事项:如果p的初值为stu,即指向结构体数组的第1个元素stu0,则p+1指向下1个元素的起始地址stu1。区别:(+p)-num 和 (p+)-nump已定义为指向struct student类型的指针变量,则p只能指向1个结构体类型数据,而不能指向结构体类型的某一成员(即p的地址不是成员的地址)。如:p=&stu.name;( 错误)第十三章:结构联合22/42结构体案例分析维护零件数据库(P275) 程序围绕一个结构数组构建,且每个结构包含以下信

20、息:零件的编号、名称以及数量。程序支持以下操作:l添加新零件编号、名称和初始的现货数量l给定零件编号,显示出零件的名称和当前的现货数量l给定零件编号,改变现有的零件数量l显示列出数据库中全部信息的表格l终止程序的执行。第十三章:结构联合23/42Enter operation code: sEnter part number: 914Part not found. Enter operation code: iEnter part number: 914Enter part name: Printer cableEnter quantity on hand: 5 Enter operation

21、 code: uEnter part number: 528Enter change in quantity on hand: -2结构体案例分析维护零件数据库第十三章:结构联合24/42Program: Maintaining a Parts DatabaseEnter operation code: sEnter part number: 528Part name: Disk driveQuantity on hand: 8 Enter operation code: pPart Number Part Name Quantity on Hand 528 Disk drive 8 914

22、Printer cable 5 Enter operation code: q第十三章:结构联合25/42inventory.c/* Maintains a parts database (array version) */ #include #include readline.h #define NAME_LEN 25#define MAX_PARTS 100 struct part int number; char nameNAME_LEN+1; int on_hand; inventoryMAX_PARTS; int num_parts = 0; /* number of parts c

23、urrently stored */ int find_part(int number);void insert(void);void search(void);void update(void);void print(void);第十三章:结构联合26/42/* * main: Prompts the user to enter an operation code, * *then calls a function to perform the requested * * action. Repeats until the user enters the * * command q. Pri

24、nts an error message if the user * * enters an illegal code. * */int main(void) char code; for (;) printf(Enter operation code: ); scanf( %c, &code); while (getchar() != n) /* skips to end of line */ ;第十三章:结构联合27/42 switch (code) case i: insert(); break; case s: search(); break; case u: update()

25、; break; case p: print(); break; case q: return 0; default: printf(Illegal coden); printf(n); 第十三章:结构联合28/42/* * find_part: Looks up a part number in the inventory * * array. Returns the array index if the part * * number is found; otherwise, returns -1. * */int find_part(int number) int i; for (i =

26、 0; i = 0) printf(Part already exists.n); return; inventorynum_parts.number = part_number; printf(Enter part name: ); read_line(inventorynum_parts.name, NAME_LEN); printf(Enter quantity on hand: ); scanf(%d, &inventorynum_parts.on_hand); num_parts+;第十三章:结构联合31/42/* * search: Prompts the user to

27、enter a part number, then * * looks up the part in the database. If the part * * exists, prints the name and quantity on hand; * * if not, prints an error message. * */void search(void) int i, number; printf(Enter part number: ); scanf(%d, &number); i = find_part(number); if (i = 0) printf(Part

28、name: %sn, inventoryi.name); printf(Quantity on hand: %dn, inventoryi.on_hand); else printf(Part not found.n);第十三章:结构联合32/42/* * update: Prompts the user to enter a part number. * * Prints an error message if the part doesnt * * exist; otherwise, prompts the user to enter * * change in quantity on h

29、and and updates the * * database. * */void update(void) int i, number, change; printf(Enter part number: ); scanf(%d, &number); i = find_part(number); if (i = 0) printf(Enter change in quantity on hand: ); scanf(%d, &change); inventoryi.on_hand += change; else printf(Part not found.n);第十三章:结

30、构联合33/42/* * print: Prints a listing of all parts in the database, * * showing the part number, part name, and * * quantity on hand. Parts are printed in the * * order in which they were entered into the * * database. * */void print(void) int i; printf(Part Number Part Name Quantity on Handn); for (

31、i = 0; i num_parts; i+) printf(%7d %-25s%11dn, inventoryi.number, inventoryi.name, inventoryi.on_hand);第十三章:结构联合34/42readline.h#ifndef READLINE_H#define READLINE_H/* * read_line: Skips leading white-space characters, then * * reads the remainder of the input line and * * stores it in str. Truncates

32、the line if its * * length exceeds n. Returns the number of * * characters stored. * */int read_line(char str, int n); #endif 第十三章:结构联合35/42readline.c#include #include #include readline.h int read_line(char str, int n) int ch, i = 0; while (isspace(ch = getchar() ; while (ch != n & ch != EOF) if

33、 (i 成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.fq共用体变量中起作用的成员是最后一次存放的成员共用体变量中起作用的成员是最后一次存放的成员q不能在定义共用体变量时初始化不能在定义共用体变量时初始化例例 union int i; char ch; float f; a=1,a,1.5; ( ) 例例 a.

34、i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果编译通过,运行结果=?) 第十三章:结构联合39/42例例 将一个整数按字节输出将一个整数按字节输出01100001 01000001低字节低字节高字节高字节0100000101100001ch0ch1运行结果:运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a#include “stdio.h” main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,c

35、h1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1);第十三章:结构联合40/42q结构体与共用体结构体与共用体n区别区别: 存储方式不同存储方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在变量的各成员同时存在任一时刻只有一个成员存在任一时刻只有一个成员存在n联系联系: 两者可相互嵌套两者可相互嵌套第十三章:结构联合41/42例例 结构体中嵌套共用体结构体中嵌套共用体 name numgenderjobclasspositionLiWan

36、g10112086FMST501prof循环循环n次次读入姓名、号码、性别、职务读入姓名、号码、性别、职务job=s真真真真假假假假读入读入class读入读入position输出输出“输入错输入错”循环循环n次次job=s真真假假输出输出:姓名姓名,号码号码,性别性别,职业职业,班级班级输出输出:姓名姓名,号码号码,性别性别,职业职业,职务职务job=tstruct int num; char name10; char gender; char job; union int class; char position10; category;person2;第十三章:结构联合42/42ReferencesnChapter 15(Inventory 例子构建大程序)nChapter 16nChapter 17.5

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!