《C语言综合实验》构造数据类型.ppt

上传人:max****ui 文档编号:8320597 上传时间:2020-03-28 格式:PPT 页数:44 大小:515KB
返回 下载 相关 举报
《C语言综合实验》构造数据类型.ppt_第1页
第1页 / 共44页
《C语言综合实验》构造数据类型.ppt_第2页
第2页 / 共44页
《C语言综合实验》构造数据类型.ppt_第3页
第3页 / 共44页
点击查看更多>>
资源描述
C语言综合实验 构造数据类型 主要内容 结构体结构体的定义及引用结构体数组结构体与指针共用体枚举类型类型标识符的自定义结构体与链表 1 结构体的定义及引用 有时候需要将不同类型的数据组合成一个有机的整体 这些组合在一个整体中的数据是互相联系的 如一个学生的信息包括学号 姓名 性别 年龄 成绩 地址等 intnum charname 20 charsex intage floatscore charaddr 30 应当把它们组织成一个组合项 在一个组合项内包含若干个类型不同 或相同 的数据项 语言提供了这种数据结构 允许用户将不同类型的数据组合成一个有机的整体 这些数据互相联系 这种数据结构称为结构体 structure 结构体的定义是指定义相应的数据结构及相应的变量 步骤 先定义一个结构体类型标识符 用该标识符去定义相应的变量 structstudent intnum charname 20 charsex intage floatscore charaddr 30 说明 struct是关键字 不能省略 表示定义结构体 student是用户自己定义的结构体类型标识符 即该结构体名 结构体中具体每项的定义 由 和 括起来 语言中把用户自己定义的数据项称为成员 或称为域 即每个成员也叫结构体中的一个域 结构体类型标识符的定义 定义一个结构体类型的一般形式 struct结构体类型标识符 类型标识符1成员名1 类型标识符2成员名2 类型标识符n成员名n 结构体名 成员表列 结构体类型标识符的定义 1 定义形式 struct 结构体类型标识符变量名列表 2 定义结构体变量的三种方法 先定义结构体类型再定义变量名 structstudent intnum charname 20 floatscore structstudentstu1 stu2 结构体类型名 结构体变量名 stu1 stu2 在定义了结构体变量后 系统会为之分配内存单元 sizeof stu1 2 20 4 26 结构体变量的定义 在定义结构体类型的同时定义变量 struct结构体类型标识符 类型标识符1成员名1 类型标识符2成员名2 类型标识符n成员名n 变量名列表 structstudent intnum charname 20 floatscore stu1 stu2 直接定义结构体类型变量 struct 类型标识符1成员名1 类型标识符2成员名2 类型标识符n成员名n 变量名列表 不出现结构体类型名 struct intnum charname 20 floatscore stu1 stu2 3 关于结构体类型的几点说明 类型与变量是不同的概念 不要混淆 a 只能对变量赋值 存取或运算 而不能对一个类型赋值 存取或运算 b 在编译时 对类型不分配内存空间 只对变量分配空间 只有在定义变量后 才为该变量开辟存储单元 结构体变量所占的内存长度等于每个成员长度之和 structstudent intnum charname 20 floatscore sizeof structstudent 26 对结构体中的成员 域 可以单独使用 它的作用与地位相当于普通变量 成员也可以是一个已定义的结构体类型变量 structdate intyear intmonth intday structstudent intnum charname 20 charsex structdatebirthday charaddr 30 sizeof student 注意 结构体变量中各成员按照结构体类型说明的顺序依次存放在一片连续的内存单元中 但它们的长度不同 不能像访问数组元素那样通过下标访问 而是通过它们的名字 即成员名 访问 成员也可以是指向本结构体类型的指针变量 structstudent intnum charname 20 floatscore structstudent next 成员名可以与程序中的变量名相同 二者不代表同一对象 在定义结构体变量的同时可以给它的全部或部分成员赋初值 完成初始化 结构体类型名变量名 初值表列 structstudentstu1 10001 LiMing 男 1983 7 1 武汉理工大学 结构体变量的初始化 structstudent intnum charname 20 charsex structdate intyear intmonth intday birthday charaddr 30 注意 要将结构体变量的各成员的值按类型说明时的顺序一一对应 所赋的值可用常量或常量表达式表示 列出的值可以少于成员的个数 没有给出的初值 由系统自动赋予缺省值 structstudenttime inthours minutes seconds nowtime 10 30 1 引用形式 结构体变量名 成员名 是成员运算符 在所有的运算符中优先级最高 structstudent intnum charname 20 floatscore stu1 stu2 stu1 num 10001 stu1 score 95 stu1 name LiMing strcpy stu1 name LiMing 结构体变量的引用 2 不能将一个结构体变量作为一个整体进行输入输出 printf d s f stu1 scanf d s f 只能对结构体中的各个成员分别进行输入输出 printf d s f stu1 num stu1 name stu1 score scanf d gets stu1 name 结构体变量的引用 成员名也是一个变量 称为成员变量 具有自己的数据类型 使用与同类型的变量相同 3 只有在对结构体变量赋值或作为函数参数时才可以对一个结构体变量进行整体操作 赋值时要求具有相同结构 stu2 stu1 stu2 num stu1 num strcpy stu2 name stu1 name stu2 score stu1 score voidfun studentpx fun stu1 4 如果成员本身又属于一个结构体类型 则要用若干个成员运算符 一级一级的找到最低一级的成员 只能对最低一级的成员进行赋值 存取或运算 stu1 birthday year 2002 结构体变量的引用 5 对成员变量可以像普通变量一样进行各种运算 根据其类型决定可以进行的运算 sum stu1 score stu2 score stu1 age 结构体变量的引用 6 可以引用结构体变量成员的地址 也可以引用结构体变量的地址 scanf d printf x 结构体变量的地址主要用于作函数参数 传递结构体变量的地址 7 在定义结构体变量的同时 可以进行初始化 structstudent intnum charname 20 charsex charaddr 30 stu 15001 宋红 M Beijing 注意 结构体变量的各个初值用大括号 括起来 大括号内各个成员变量的值之间用逗号分隔 其值必须与成员变量一一对应 且数据类型应与成员变量一致 结构体变量的引用 includestructstudent intnum floatscore voidmain studentstu max inti floatsum 0 max score 0 for i 0 imax score max stu sum stu score printf nMax d 1f n max num max score printf Sumis 1f n sum 例 输入5名学生的学号及成绩 求成绩最好的学生的学号 成绩和所有学生的总成绩 结构体变量的引用 2 结构体数组 数组的每个元素都是结构体类型的数据 它们分别包含各个成员项 1 先定义结构体类型 再定义结构体数组 structstudent intnum floatscore structstudentstu 30 2 定义结构体类型的同时定义结构体数组 structstudent intnum floatscore stu 30 3 直接定义结构体数组 struct intnum floatscore stu 30 一般形式 struct结构体类型标识符 类型标识符1成员名1 类型标识符2成员名2 类型标识符n成员名n 结构体数组 数组元素0的各个初值 数组元素1的各个初值 structstudent intnum charname 20 floatscore stu 3 10101 LiMing 88 10102 ZhangJin 92 10103 WangLin 98 5 结构体数组的初始化 说明 1 初始化时 数组元素的个数可以不指定 系统会根据初值的结构体常量的个数来确定数组元素的个数 structstudent intnum charname 20 floatscore stu 10101 LiMing 88 10102 ZhangJin 92 10103 WangLin 98 5 2 数组中各个元素的初值用大括号 括起来 同一数组元素的各个成员变量的初值用逗号分隔 结构体数组应用举例 设李红 王建 赵明三名同学某学年考了8门课 要求分别统计出这3名同学该学年的总成绩 并按8门课总成绩的高低排序输出 includestructstudent charname 20 floatscore voidmain studentstu 3 LiHong 0 WangJian 0 ZhaoMing 0 studenttemp inti j floatx for i 1 i 8 i printf nInputthe dthcoursescore n i for j 0 j 3 j printf Name 12sScore stu j name scanf f 3 结构体与指针 结构体变量的指针就是该变量所占据的内存段的起始地址 1 指向结构体变量的指针 2 指向结构体数组的指针 3 结构体指针作为函数参数 1 指向结构体变量的指针 1 指向结构体变量指针的定义 structstudent intnum charname 20 floatscore structstudentstu p p p中存放着结构体变量stu在内存中的首地址 注意 不能用指向结构体变量的指针指向该结构体变量的某个成员 p int ip ip stu num stu name stu score p num p name p score p num p name p score 2 访问结构体成员变量的三种方法 3 说明 为指向运算符 是优先级最高的运算符 成员运算符 的优先级高于指针运算符 因此采用 p 成员名 形式时 括号不能省略 注意以下几种运算 p num 得到p指向的结构体变量中的成员num的值 p num 得到p指向的结构体变量中的成员num的值 用完后该值加1 p num 使p指向的结构体变量中的成员num的值加1 2 指向结构体数组的指针 指向结构体变量的指针变量 可以指向结构体变量 也可以指向同类型的结构体数组的元素 structstudent intnum charname 30 floatscore stu 30 p p stu p p p只能指向一个structstudent类型的数据 某个元素的的起始地址 不能指向一个成员变量 2 指向结构体数组的指针 注意 若p已定义为指向结构体类型的数据 则p只能指向相应类型的变量或数组元素 不能指向数组元素中的某一成员 include includestructstudent intnum charname 20 floatscore voidmain studentstu 3 10101 Li 87 10102 Zhang 92 10103 Wang 95 structstudent p printf n nNo NameScore for p stu pnum p name p score 3 结构体指针作为函数参数 将一个结构体变量的值传递给另一个函数 有3种办法 用结构体变量的成员作参数 将实参值传递给形参 属于 值传递 方式 注意实参与形参的类型保持一致 fun stu num voidfun int 用结构体变量作实参 采取的是 值传递 方式 将结构体变量所占的内存单元的内容全部顺序传递给形参 要求形参也必须是同类型的结构体变量 例 有一个结构变量stu 内含学生学号 姓名 和3门课的成绩 在main函数中赋值 在另一函数print中打印输出 用指向结构体变量 或数组 的指针作实参 将结构体变量 或数组 的地址传给形参 include defineFORMAT n d n s n 1f n 1f n 1f n structstudent intnum charname 20 floatscore 3 voidprint studentps printf FORMAT ps num ps name ps score 0 ps score 1 ps score 2 voidmain studentstu 10101 LiMing 87 96 93 print stu 主要内容 结构体结构体的定义及引用结构体数组结构体与指针共用体枚举类型类型标识符的自定义结构体与链表 共用体 共用体 使几个不同的变量共占同一段内存的结构 称为 共用体 类型的结构 定义形式 union共用体名 类型标识符1成员名1 类型标识符2成员名2 类型标识符n成员名n 变量表列 例如 引用形式 共用体名 成员名注意 不能只引用共用体变量 uniondata inti charch floatf uniondataa b c union inti charch floatf a b c 直接定义 先定义类型 注意共用体类型变量与结构体类型变量的区别 结构体类型变量所占内存长度是各成员占的内存长度之和 共用体类型变量所占内存长度等于最长的成员的长度 unionuarea charc data shorts data longl data sizeof unionuarea 的结果为 共用体类型数据的特点 1 每一瞬时只有一个成员起作用 2 共用体变量中起作用的成员是最后一次存放的成员 3 共用体变量的地址和它的各成员的地址都是同一地址 4 不能对共用体变量名赋值 也不能企图引用变量名来得到成员的值 也不能在定义共用体变量时对它初始化 5 不能把共用体变量作为函数参数 也不能使函数带回共用体变量 但可使用指向共用体变量的指针 6 共用体类型可以出现在结构体类型定义中 也可以定义共用体数组 而结构体也可以出现在共用体类型定义中 数组也可以作为共用体的成员 枚举类型 所谓 枚举 是指将变量的所有取值一一列举出来 变量的值只限于列举出来的值的范围内 枚举类型变量的定义 1 先定义枚举类型标识符 再定义变量 enum枚举类型标识符 枚举元素1 枚举元素2 枚举元素n enum枚举类型标识符变量列表 enumperson Man Woman enumpersonx enumweekday Sun Mon Tue Wed Thu Fri Sat enumweekdayworkday weekend 2 直接定义枚举变量 enum枚举类型标识符 枚举元素1 枚举元素2 枚举元素n 变量列表 enumperson Man Woman x enumweekday Sun Mon Tue Wed Thu Fri Sat workday weekend enumBOOL FALSE TRUE 3 说明 Sun Mon Sat等称为枚举元素或枚举常量 是用户自定义标识符 枚举变量的引用 1 在 编译时 对枚举元素按常量处理 故称枚举常量 但它们不是常量 不能对它们赋值 Sun 0 TRUE 1 2 枚举元素作为常量 它们是有值的 语言编译时按定义时的顺序使它们的值为0 1 2 enumweekday Sun Mon Tue Wed Thu Fri Sat workday workday Mon printf d workday 3 可以在定义时改变枚举元素的值 enumweekday Sun 7 Mon 1 Tue Wed Thu Fri Sat workday enumweekday Sun 7 Mon Tue Wed 0 Thu Fri Sat 4 枚举值可以用来做判断比较 if workday Mon if workday Sun 5 一个整数不能直接赋给一个枚举变量 workday 2 workday enumweekday 2 workday enumweekday x y 例 从键盘输入0 6的任意整数 0表示星期日 1 6分别表示星期一到星期六 要求编写程序输出对应的英文名称 enumweekday Sunday Monday Tuesday Wednesday Thursday Friday Saturday week switch week caseSunday break caseMonday break caseTuesday break caseWednesday break caseThursday break caseFriday break caseSaturday break 类型标识符的自定义 1 除了可以直接使用 提供的标准类型名 int char float等 和自己定义的数据类型 结构体 共用体 枚举类型 外 还可以用typedef声明新的类型名来代替已有的类型名 typedefintINTEGER inti p INTEGERi p typedeffloatREAL floatx y REALx y 2 定义类型标识符的方法 按定义变量的方式写出定义体 将变量名换成新的类型标识符 在最前面加typedef 3 例 定义含有10个元素的整型数组 先按照定义数组的形式书写 inta 10 将变量名a换成自己指定的类型名 intARRAY 10 在前面加上typedef typedefintARRAY 10 ARRAYa b 定义字符指针类型 char p char STRING typedefchar STRING STRINGp ps 10 声明结构体类型 struct intnum charname 20 floatscore stu struct intnum charname 20 floatscore STUDENT typedefstruct intnum charname 20 floatscore STUDENT STUDENTstu 30 p 4 说明 自定义类型标识符可以是任意合法的标识符 习惯上常把用typedef定义的标识符用大写字母表示 以便与系统提供的标准类型标识符相区别 用typedef只能为已经存在的数据类型标识符另起一个新名 而不能创造一种新的数据类型 typedefintARRAY 10 typedef与 define有相似之处 typedefintINTEGER defineINTEGERint 作用都是用INTEGER代表int define是在编译之前进行处理的 只做简单的字符替换 typedef是在编译时处理的 实际上并不是做简单的字符替换 如 typedefintARRAY 10 并不是用 ARRAY 10 去代替int 而是采用如同定义变量的方法那样来声明一个类型 选择菜单 用户根据菜单提示选择要进行的操作优点 方便用户的交互实现方法 窗口菜单 while 1 printf n printf 菜单 n printf n printf 1 输出元素 n printf 2 插入元素 n printf 3 删除元素 n printf 4 查找 n printf 5 排序 n printf 6 退出程序 n printf n printf 请输入你的选择 n scanf c 习题1 用结构数组实现学生信息的统计功能 structstudent longno 学号 charname 10 姓名 charsex 性别 intage 年龄 floatscore 平均成绩 完成下列任务 输入实际学生人数n 2 n 6 输入每个学生的信息 组成结构数组 并输出 统计男 女生人数并输出 计算全班平均成绩并输出 将低于全班平均成绩的学生信息按行输出 课后习题 习题2 用结构数组保存书的信息 结构体中包含数据 图书编号 图书名称 作者姓名 出版社名 出版日期 涉及各个函数分别实现以下功能 图书信息的输入显示所有图书的信息输入作者姓名 显示该作者编写的图书的记录设计菜单 通过选择菜单调用以上各函数 课后习题
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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