c_new_08.pptx

C语言程序设计(第3版)课件-黄维通

收藏

压缩包内文档预览:(预览前5页/共69页)
预览图 预览图 预览图 预览图 预览图
编号:74277633    类型:共享资源    大小:2.95MB    格式:RAR    上传时间:2020-04-19 上传人:独** IP属地:江苏
20
积分
关 键 词:
语言程序设计 课件 黄维通
资源描述:
C语言程序设计(第3版)课件-黄维通,语言程序设计,课件,黄维通
内容简介:
清华大学黄维通设计制作 1 第8章结构体 联合体和枚举 清华大学黄维通设计制作 2 本章主要内容 结构体的说明和定义结构体成员的引用与结构体变量的初始化结构体数组结构体指针结构体在函数间的传递结构体指针型和结构体型函数结构体嵌套联合体枚举类型自定义类型位字段结构体 清华大学黄维通设计制作 3 8 1结构体的说明和定义 清华大学黄维通设计制作 4 8 1 1什么叫结构体 结构体的概念是C语言中的构造类型 是由不同数据类型的数据组成的集合体 为处理复杂的数据结构提供了手段 为函数间传递不同类型的参数提供了便利 清华大学黄维通设计制作 5 结构体说明的格式 struct结构体名 结构体成员表 8 1 2结构体的说明及结构体变量的定义 structdate intyear intmonth intday intyearday 1 结构体的说明 清华大学黄维通设计制作 6 2结构体变量的定义 1 在结构体说明的同时定义结构体变量 例如 structexample char name intage guo zhang 2 直接定义结构体变量 例如 struct char name intage guo zhang 未给出结构体名 3 把定义和说明分开 例如 structexample char name intage structexampleguo zhang 结构体变量占用内存的大小可用sizeof 运算来求出 清华大学黄维通设计制作 7 变量说明形式struct结构体名结构体变量名 注意 结构变量的存储类型概念 它的寿命 可见性及使用范围与普通变量 数组等完全一致 结构体变量说明必须在结构类型定义之后 二者也可同时进行 清华大学黄维通设计制作 8 8 2结构体成员的引用与结构体变量的初始化 清华大学黄维通设计制作 9 引用结构体成员的一般形式如下 结构体变量名 成员名 8 2 1结构体成员的引用 成员名与程序中其他变量名可以相同 但代表不同的对象 为增强可读性 不提倡这样做 structexample longintid charadd 100 guo 各成员的引用 guo idguo add或guo add i 清华大学黄维通设计制作 10 不能将一个结构体变量作为一个整体加以引用 而只能对结构体变量中各个成员进行引用如 printf student1 错误 对成员变量可以象普通变量一样进行各种运算成员地址与结构体地址都可以引用 如 scanf d 它是结构体地址引用赋值时 与数组类似 只能当结构体变量为全局变量及静态变量时 可以赋值 清华大学黄维通设计制作 11 结构体变量初始化的一般形式如下 struct结构体名结构体变量名 初始数据 structdate intyear intmonth intday charmonthname 4 structdatedate1 2003 10 1 Oct 8 2 2结构体变量的初始化 12 例 结构体的初始化和引用 include stdio h voidmain structregist1 char name charsex intold he li he name Hezhonghua he sex m he old 20 li name Liaihua li sex f li old 21 printf namesexold n printf n printf s c 6d n he name he sex he old printf s c 6d n li name li sex li old 若把main 移到结构体定义后面 意味着什么 清华大学黄维通设计制作 13 结构体字节长度的计算 include stdio h structregist charyour name 66 intyour age wang voidmain printf regist d n sizeof structregist printf wang d n sizeof wang 结果为何不是所有成员字节大小之和 偏移量的问题 清华大学黄维通设计制作 14 8 3结构体数组 15 1结构体数组的定义 也有类似三种方式 存储类型 struct结构体名结构体数组名 元素个数 结构体数组名 元素个数 8 3 1结构体数组的定义及初始化 2结构体数组的初始化 structkeykeytab shift 0 del 0 pause 0 16 例 用结构体数组处理通讯录 include include defineMAXIMUM20structstud charname 30 intage charsex chartel 8 charadd 100 voidmain structstudstu MAXIMUM charstr 10 inti 8 3 2结构体数组的应用举例 17 for i 0 i MAXIMUM i printf name gets s stu i name printf sex gets s str stu i sex str 0 printf age gets s str stu i age atoi str printf tel gets s stu i tel printf add gets s stu i add for i 0 i MAXIMUM i printf s d stu i name stu i age printf c s s n stu i sex stu i tel stu i add 18 8 4结构体指针 19 8 4 1结构体指针及其定义 结构体指针的定义类似格式如下 存储类型 struct结构体名 结构体指针名 例如 staticstructexample pexample 存放结构体首地址结构指针的运算按照C语言的地址运算原则进行 20 用指针引用结构体成员的方式如下 结构体指针名 成员或结构体指针名 成员名 8 4 2通过指针引用结构体成员 pman name等同于 pman name pman name等同于 pman name 21 例 指向结构体数组的指针及其应用 include includestructdate intyear intmonth intday structscore floatc floatvb floatdelphi doubleaverage structstudent charname 10 intnumber charsex structdateb structscorer s 2 22 voidmain inti doublet charch 20 structstudent p p s for i 0 iname printf Numberd scanf s d 23 printf nNameNumberSexYearMonthDaycvbdelphiaverage n for i 0 i 2 i printf s d c s i name s i number s i sex printf d d d s i b year s i b month s i b day printf f f f lf n s i r c s i r vb s i r delphi s i r average 24 1用地址复制方式传递结构体变量 例 用地址复制方式传递结构体变量给出年月日计算它是该年的第几天 include stdio h structdate intyear intmonth intday intyearday 8 5结构体在函数间的传递 25 intdays structdate sp staticintmonthtable 13 0 31 28 31 30 31 30 31 31 30 31 30 31 0 31 29 31 30 31 30 31 31 30 31 30 31 inti leap sp yearday sp day i sp year leap 0 if i 4 0 判断是否为闰年 如果输入2月32日是否也能出结果 怎么完善 请思考 26 voidmain structdated1 printf Eenteryear month day scanf d d d 27 例 建立和显示学生成绩册 include stdio h include stdlib h defineMAXIMUM300structstud charid 6 charname 30 intscore student MAXIMUM intinput structstud sp charstr 10 printf 学号 gets s sp id printf 姓名 gets s sp name printf 成绩 gets s str sp score atoi str return 1 2结构体数组在函数间的传递 28 voiddisplay structstud sp intn inti for i 0 iid sp name sp score voidmain inti for i 0 i MAXIMUM i 建立学生成绩册 input 29 8 6结构体指针型和结构体型函数 30 结构体指针型函数定义的一般形式为 struct结构体名 函数名 形参表 形参说明 内部数据说明语句 执行语句 其说明形式为 struct结构体名 函数名 8 6 1结构体指针型函数 31 例 假设有一个电话号码表 给定一个用户id 找出其对应信息 include stdio h defineNull0 defineMAX500structdata inttel intid charname 30 charadd 100 structdataper MAX 32 intpersonlist 建立电话号码表函数 inti for i 0 i MAX printf notfound n return 0 for i 0 i MAX i if per i id n break return 33 voidmain intnumber structdata sp personlist printf n请输入要查找信息的id scanf s d 给定id查信息返回指针 34 结构体型函数定义的一般形式如下 struct结构体名函数名 形参表 形参说明 内部数据说明语句 执行语句 结构体型函数说明的一般形式如下 struct结构体名函数名 8 6 2结构体型函数 35 例 返回值为结构体变量的函数 include include stdio h structdata chars 30 intn doublex structdataexample structdataemp strcpy emp s Anexample emp n 68 emp x 213 52 printf s s n d x lf n emp s emp n emp x return emp voidmain structdataredata printf n运行函数 n redata example printf s s n d x lf n redata s redata n redata x 36 结构型指针型函数 输入学号 查找相应学生的数据 include stdio h defineNULL0structstudent longintnum char name floatscore stu 990001 Li 90 990002 Zhang 80 990003 Zhao 70 0 0 0 structstudent search longintn 查找 返回找到的结构体的首地址 inti for i 0 stu i num NULL i 寻找stu 0 至stu 3 if stu i num n break 找到了 若没找到 则返回stu i num 0 返回后 经if比较 执行else语句 return 注意不能写成 stu i num 37 voidmain longintnumber structstudent result 定义结构指针及结构指针函数printf Enteranumber scanf ld 38 structdate intyear intmonth intday 8 7结构体嵌套 structperson charid 6 charname 30 charsex structdatebirthday stu Birthday具有monthday和year三个成员这就是结构体嵌套 参加运算和操作的只能是最内层结构的成员项内层结构成员的引用形式 结构变量名 外层成员名 内层成员名如 stu birthday month 39 structadd intpost charaddr 100 chartel 8 structperson charname 30 structaddwadd structaddhadd structpersonLi 8 7 2嵌套结构体类型变量的引用 Li nameLi hadd postLi wadd postLi wadd addr structperson pman pman namepman wadd postpman wadd tel 40 例 用嵌套型结构体变量处理通讯录 include include defineMAXIMUM3structaddress charpostcode 10 charaddr 100 chartel 8 structperson charname 30 structaddresswadd structaddresshadd grade MAXIMUM 8 7 3结构体嵌套应用举例 41 voidinputdata inti for i 0 i MAXIMUM i printf 姓名 gets s grade i name printf 工作电话 gets s grade i wadd tel printf 工作地址 gets s grade i wadd addr printf 邮编1 gets s grade i wadd postcode printf 家庭电话 gets s grade i hadd tel printf 家庭地址 gets s grade i hadd addr printf 邮编2 gets s grade i hadd postcode return 42 voidmain inti inputdata for i 0 i MAXIMUM i if grade i name 0 0 break printf n s n grade i name printf s n s n s n grade i wadd postcode grade i wadd addr grade i wadd tel printf s n s n s n grade i hadd postcode grade i hadd addr grade i hadd tel 43 structexample intdata structexample next 44 联合体是一种类似于结构体的构造型数据类型 它准许不同类型和不同长度的数据共享同一块存储空间 8 8联合体 45 1联合体的说明联合体的说明与结构体类似 union联合体名 类型标识符成员名1 类型标识符成员名n 8 8 1联合体的说明及联合体变量的定义 共用体的定义与结构体定义很类似 只是关键词的不同structunion既然几种不同的变量占用同一个内存段 那么 变量所占的内存长度应为最长的成员长度 46 2联合体变量的定义 1 说明与定义分开 union联合体名 类型标识符成员名1 类型标识符成员名n union联合体名变量名表 例如 unionuniontype inta longd unionuniontypemy data 2 定义与说明合在一起 union联合体名 数据类型标识符成员名1 数据类型标识符成员名n 变量名表 例如 unionuniontype inta longd my data 47 结构体与联合体可以互相嵌套 例如 unionuniontype inti floatf structstructtype shorts longl structsutype charc unionuniontypeu unionustype inti structstructtypest 48 3联合体变量成员的引用联合体变量成员的引用类似结构体变量 也是利用运算符 和 例如 unionuniontype inti charc my data unionuniontype p p my data 下列引用都是合法的 my data i my data c p i p c 49 两个具有相同联合体类型的联合体变量可以互相赋值联合体变量可以作为参数传递给被调用函数联合体变量可以作为函数的返回值 从被调用函数返回调用函数同一内存段可用来存放几种不同类型的成员 但每一瞬间只有一个成员不能对共用体变量表列赋值 这一点与结构体不一样 如 union inti charch floatb a a a 1 5 8 8 2使用联合体变量应注意的问题 这是不对的 50 例 建立教师和学生登记表 其中包括识别号 姓名 身份和职称 若身份是 student 时 则职称一栏填年级 若身份是 teacher 时 则职称栏填职称 include stdio h include string h include stdlib h defineN3structpersontype intid charname 30 charjob 10 union intgrade charposition 10 level person 5 联合体嵌套在结构体的定义中 51 voidmain inti charstr 10 for i 0 i N i 输入数据 printf nPersonalInformation ID d 姓名 s 身份 s student teacher n gets s str person i id atoi str gets s person i name gets s person i job if strcmp person i job student printf Inputthegrade n scanf s d 相等时结果为0 对于if 0 意味着啥 52 elseprintf 输入错误 n printf IDnamejobgrade position n for i 0 i N i 输出数据 if strcmp person i job student 0 printf d s s d n person i id person i name person i job person i level grade elseprintf d s s s n person i id person i name person i job person i level position 53 8 9枚举类型 54 1枚举的概念枚举类型也是一种数据类型 对那些只可能取有限的某几种值的数据 可以把它定义为枚举类型数据 8 9 1枚举类型数据的概念及其定义 如果某些变量只有几种可能 如 星期一 星期二 星期日性别及特定范围的概念可以通过枚举法将变量一一列出 在这种情况下可以使用枚举类型变量 55 2枚举类型数据的说明枚举类型说明的一般形式为 enum枚举名 元素名1 元素名2 元素名n 例如 enummonth Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 该枚举类型只准许取12种值enumweekday Sun Mon Tue Wed Thu Fri Sat 该枚举类型只准许取7种值 56 3枚举型变量的定义枚举型变量的定义也有三种方式 说明与定义合一 如 enumweekday Sun Mon Tue day 2 用无名枚举类型 如 enum Sun Mon Tue day 3 说明与定义分开 如 enumweekday Sun Mon Tue enumweekdayday 57 为正确使用枚举型变量 应注意 枚举类型说明中的元素以常量名处理 不是变量名 这些常量依序分别为0 1 n 1 例如 enumweekday Sun Mon Tue Wed Thu Fri Sat workday 上述枚举元素的值分别为0 1 2 3 4 5 6 8 9 2枚举型变量的使用 枚举元素是常量 不是变量 运算过程不能对它赋值 如 sun 0 mon 1 etc 58 枚举元素的值可在定义时指定 enumweekday Sun 7 Mon 1 Tue Wed Thu Fri Sat workday 对于没有指定值的元素 其取值原则仍按所处的顺序取 故 Tue是2 Wed是3 Sat是6 可用枚举变量进行判断或比较操作enumflag true false my flag if my flag true 59 三种颜色取不同两种排序 有几种方式 include stdio h voidmain enumcolor red yellow blue intn 0 i j for i 0 i 2 i for j 0 j 2 j if j i n n 1 printf 4d n switch i casered printf 10s red break caseyellow printf 10s yellow break caseblue printf 10s blue break default break switch j casered printf 10s red break caseyellow printf 10s yellow break caseblue printf 10s blue break default break printf n printf ntotal 5d n n 结果 1redyellow2redblue3yellowred4yellowblue5bluered6blueyellowntotal 6 60 分别输入一周中的每天工作时间 并输出总的工资 周日的工资为120RMB h 周六为100RMB h 其他时间80RMB h includevoidmain enumweek SUN MON TUE WED THR FRI SAT inttotal pay hour day total 0 printf PleaseenteryourworkinghoursfromSUNtoSAT n for day 0 day 6 day scanf d 61 例 某小学举行竞赛活动 共有5个项目 每人只能选其中的3项 编写程序 列出每个学生可能的选择方案 设这5个项目分别称p1 p2 p5 故可用如下形式的枚举型表示它 enumgroup p1 p2 p3 p4 p5 用get1 get2和get3表示一种选择方案中的3个选项 并且这3个选项不能重复 即 get1 get2 get3 include stdio h voidmain enumgroup p1 p2 p3 p4 p5 intget1 get2 get3 pri intn 0 loop for get1 p1 get1 p5 get1 for get2 get1 1 get2 p5 get2 62 if get1 get2 for get3 get2 1 get3 p5 get3 if get3 get1 63 8 10自定义类型 64 类型定义 给已存在的数据类型重命名 类型定义的一般形式为 typedefoldtypenewtype 8 10 1自定义类型及其表示形式 例如 typedefintINTEGER 就为int重新命名了一个新名字 于是inta b 与INTEGERa b 是完全等价的两个变量定义语句 65 增强程序的可读性和可移植性 可以自定义结构体 如 typedefstructstudent char name intnumber STU STUstu1 那么 stu1就拥有name和number两个成员 8 10 2自定义类型的优点 66 有了上述概念之后 还可再进一步 typedefintNUM 10 定义NUM为整型数组类型NUMn 定义n为整型数组变量 ty
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:C语言程序设计(第3版)课件-黄维通
链接地址:https://www.renrendoc.com/p-74277633.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

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