




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计 信息与电气工程学院2015年4月 1 第五章结构体数据类型 工资管理系统之数据结构设计 任务一学习目标任务二声明结构体类型任务三职工工资数据结构设计与结构体变量定义任务四输入职工工资任务五计算职工工资任务六输出职工工资 2 任务一学习目标 1 理解结构体类型 2 掌握结构体变量的使用方法 3 掌握结构体数组的使用方法 3 已了解的数据类型 整型 浮点型 字符型 存在的问题 难以处理较复杂的数据 如 图书信息管理程序中 每本图书的信息 4 又如 职工工资管理系统中的职工信息 每个成员的类型不一致 作为一个整体 如何表示和使用这种数据类型和变量呢 5 任务二声明结构体类型 声明结构体类型的一般形式 struct类型名 数据类型成员名1 数据类型成员名2 数据类型成员名n C语言允许将上述数据的集合定义为 结构体类型 关键字 基本型或构造型 以分号 结尾 与成员名 合法标识符 例 structdate intyear 年intmonth 月intday 日 6 structstudent intnum charname 20 charxingbie floatgaoshu floatyingyu floatCyuyan floatlixue 分号不能少 7 structzhigong 声明职工工资数据结构体 chargonghao 10 职工工号 charname 10 职工姓名 floatgwgz 岗位工资 floatxjgz 薪级工资 floatzwjt 职务津贴 floatjxgz 绩效工资 floatyfgz 应发工资 floatgrsds 个人所得税 floatsfgz 实发工资 8 结构体是一种构造数据类型用途 把不同类型的数据组合成一个整体 优点 体现了数据项之间的关系 独立变量表示 结构体变量表示 9 结构体是一种构造数据类型用途 把不同类型的数据组合成一个整体 优点 体现了数据项之间的关系 独立变量表示 结构体变量表示 10 注意 结构体类型 与char int等只是数据类型 系统不为数据类型分配实际内存空间 必须定义结构体类型的变量 系统才为分配内存空间 结构体类型已经声明 接下来该怎么做呢 11 1 先声明结构体类型再定义结构体变量 有三种方法可用来定义结构体变量 形式 struct结构体名变量名表列 12 如 structdate intyear intmonth intday structdatebirthday 定义birthday变量为date结构体类型 13 形式 struct结构体名 成员表列 变量名表列 2 在声明结构体类型的同时定义变量 如 structdate intyear intmonth intday birthday 形式 struct结构体名 成员表列 变量名表列 如 structdate intyear intmonth intday birthday 14 3 直接定义结构类型变量 形式 struct 成员列表 变量名列表 不指定结构体标签 如 struct intyear intmonth intday birthday 15 几点说明 1 结构体类型与结构体变量概念不同 定义结构体类型 不分配内存定义结构体变量 分配内存 2 结构体成员也可以嵌套是结构体类型 例 structdate intmonth intday intyear structstudent intnum charname 20 structdatebirthday stu 16 或 structstudent intnum charname 20 structdate intmonth intday intyear birthday stu 17 3 一个C程序可以定义多个结构体类型 定义的位置可在函数内 也可在函数外 其有效范围是从类型定义处开始到程序结束 includefun 自定义函数fun structstudent 定义结构体类型 main structstudentstu 结构体类型的有效范围 18 一 结构体变量的引用 成员 分量 运算符 和 优先级 最高 1级 结合性 左结合 非指针型结构体变量的引用 结构体变量名 成员名 指针型结构体变量的引用 后续讲 结构体指针 成员名 结构体指针 成员名 任务四输入职工工资 成员的引用和赋值 19 例 structdate intyear intmonth intday birthday 成员1 birthday year 成员2 birthday month 成员3 birthday day 成员运算符 20 二 初始化 先声明结构体类型 然后定义结构体变量的同时为每一个成员赋初值 如 structdate intyear intmonth intday birthday 1990 9 1 21 非初始化方法 声明结构体类型 定义结构体变量之后 逐成员赋值 birthday day 1 birthday year 1990 birthday month 9 structdate intyear intmonth intday birthday 22 如果希望输入或输出各成员的值 如何实现 structdate intyear intmonth intday birthday printf d birthday scanf d 23 1 引用结构体变量时 必须引用成员 结构体变量成员引用原则 scanf d d d structdate intyear intmonth intday birthday 24 structstudent intnum charname 20 floatscore stu1 stu1 101 WangLin 87 5 常见错误 25 例 structstudent intnum charname 20 floatscore stu1 101 wang 95 0 stu2 2 同类型结构体变量 可以使用赋值运算符 stu2 stu1 26 例structstudent intnum charname 20 floatscore stu1 stu2 stu1 score 85 5 stu2 score stu1 score 5 0 stu1 num 3 结构体变量中的成员可以像普通变量一样进行各种运算 if stu1 score stu2 score 27 注意 运算符的优先级为1级 stu1 num stu1 num 如何理解 28 例structstudent intnum charname 20 structdate intyear intmonth intday birthday stu stu birthday month 8 stu birthday year 1991 结构体变量名 成员名 子成员名 最低级子成员名 4 结构体嵌套时逐级引用 stu birthday day 21 29 案例5 1 对结构体变量进行初始化并输出 分析 定义结构体变量时指定初始值 30 代码 includemain structzhigong chargonghao 10 职工工号 charname 20 职工姓名 floatgwgz 岗位工资 floatxjgz 薪级工资 floatzwjt 职务津贴 floatjxgz 绩效工资 m 0101 张楠 10000 5000 5000 5000 printf 工号 s n姓名 s n岗位工资 2f n m gonghao m name m gwgz printf 薪级工资 2f n职务津贴 2f n绩效工资 2f n m xjgz m zwjt m jxgz 31 若从键盘输入m的各成员值 scanf s s f f f f m gonghao m name 由于成员项gonghao和name是字符数组 数组名就是数组在内存的首地址 所以按 s格式输入时 不需要加 32 运行工资管理系统程序 在主界面选择3 按提示依次输入信息 如图5 2所示 33 任务五计算职工工资 职工的应发工资为 岗位工资 薪级工资 职务津贴 绩效工资 职工的个人所得税根据grsds 计算 即 zg yfgz zg gwgz zg xjgz zg zwjt zg jxgz 34 即 zg grsds grsds zhigong yfgz 职工的实发工资 应发工资 个人所得税即 zg sfgz zg yfgz zg grsds grsds 函数是计算个人所得税的函数 此函数的功能是接收调用函数传递的一个职工的应发工资 计算得出这个职工本月应缴纳的个人所得税 35 任务六输出职工工资 完成了职工工资的计算之后 应将职工的各项工资在屏幕上输出 输出时不能把一个结构体变量作为一个整体进行输出 只能按成员变量进行输出 36 structzhigong 声明职工工资数据结构体 chargonghao 10 职工工号 charname 10 职工姓名 floatgwgz 岗位工资 floatxjgz 薪级工资 floatzwjt 职务津贴 floatjxgz 绩效工资 floatyfgz 应发工资 floatgrsds 个人所得税 floatsfgz 实发工资 zg 0101 张楠 8000 0 500 0 300 0 1200 0 37 要输出职工数据中各成员值 使用如下方式 printf s s f f f f n zg gonghao zg name zg gwgz zg xjgz zg zwjt zg jxgz 38 结构体变量所占内存的字节数 是所有成员占内存的总和吗 structsample charm1 intm2 charm3 main structsamples printf d n sizeof s 39 用sizeof运算符可以获得结构体的大小 结构体类型所占内存字节数不是各成员占内存的总和 printf d n sizeof s printf d n sizeof structsample 对于大多数计算机 数据项要求从某个数量字节的倍数开始存放 内存对齐 short 偶数地址 int 对齐在4字节地址 40 为了满足内存地址对齐的要求 需要在较小的成员后加入补位 问题 为什么要求内存地址对齐呢 提高内存寻址效率 在32位体系结构中 int数据被对齐在4字节地址边界 读写一个4字节int型数据 只需一次内存访问 41 结构体在内存中所占的字节数不仅与所定义的结构体类型有关 还与计算机系统本身有关 不同的系统和编译器 内存对齐方式可能会不同 在DOS下的TurboC2 0运行结果是 4 计算结构体在内存中所占的字节数时 一定要用sizeof运算符 structsample charm1 intm2 charm3 42 思考1 下面程序的运行结果是什么 includestruct intb 4字节 chare 1字节 charu 1字节 doubles 8字节 y main printf y d n sizeof y 最长字节对齐原则 43 思考2 下面程序的运行结果是什么 includestruct intb 4字节 doubles 8字节 chare 1字节 charu 1字节 yy main printf yy d n sizeof yy 44 任务六数组实践 结构体数组 如何处理大量复杂的数据 问题提出 结构体数组 数组中每一个元素是结构体类型 结构体数组的定义 初始化和引用的方法具有结构体和数组的特点 45 例如 定义一个结构体数组 存放3个学生的基本信息 包括 学号 姓名和成绩 1 定义 三种方法 structstudent intnum charname 20 floatscore stu 3 46 2 赋初值 初始化 赋值语句 输入函数 初始化 structstudent intnum charname 20 floatscore stu 3 1101 张娟 90 0 1102 李飞 80 0 1103 王伟 95 0 47 输入函数for i 0 i 2 i scanf d s f 赋值语句 stu 0 num 1101 stu 0 score 90 0 stu 0 name 张娟 strcpy stu 0 name 张娟 48 如果要实现 从键盘输入10个学生信息并输出 includestructstudent 声明结构体类型 intnum charname 20 floatscore 49 includemain structstudentstu 10 定义结构体数组inti for i 0 i 10 i scanf d s f 50 声明结构体zhigong 包括 工号 姓名 等成员 定义具有3个元素的结构体zhigong型数组gz 通过3次循环输入3位职工各成员的数据 通过3次循环分别判断各职工的 岗位工资 是否大于等于1600 若满足条件 则输出当前职工的各成员数据 案例5 2 由键盘输入3位职工属性数据 查找岗位工资为1600及以上的职工 并输出其属性数据 51 代码 include defineN3 职工人数 defineMIN3000 查找条件 structzhigong chargonghao 10 charname 10 floatgwgz floatxjgz floatzwjt floatjxgz floatyfgz floatgrsds floatsfgz 52 main inti k structzhigonggz N 定义结构体数组 for i 0 i i 1 scanf s 53 printf 岗位工资在3000及以上的职工有 n n for i 0 i MIN printf 6s 6s 9 2f gz i gonghao gz i name gz i gwgz printf 9 2f 9 2f gz i xjgz gz i zwjt printf 9 2f 9 2f gz i jxgz gz i yfgz printf 9 2f 9 2f n gz i grsds gz i sfgz gz i yfgz gz i gwgz gz i xjgz gz i zwjt gz i jxgz printf 请输入第 d位职工的 i 1 scanf f 54 结构体应用举例 案例5 2 编写程序输入10个学生的学号 姓名和考试成绩 找出高分者和低分者 利用循环结构 逐个比较数组中score成员值与stmax score stmin score大小 分析 定义结构体数组存放学生信息 定义两个结构体变量stmax stmin存放最高分 最低分学生信息 输入10个学生的数据 stmax score初值为0 stmin score初值为100 输出stmax stmin各成员值 55 程序运行结果如图5 3所示 56 代码 include defineN10structstudent intnum 记录学生学号 charname 20 记录学生姓名 intscore 记录学生的考试成绩 57 includemain inti structstudentst N stmax stmin stmax score 0 stmin score 100 for i 0 istmax score stmax st i if st i score stmin score stmin st i printf n 5d 15s 5d stmax num stmax name stmax score printf n 5d 15s 5d n stmin num stmin name stmin score 58 任务八精选案例 案例5 3 设计一个结构体类型 并定义一个变量 然后对结构变量进行赋值并输出其值 分析 在ANSIC中允许具有相同类型的结构变量相互赋值 但通常对结构体变量的使用 包括赋值 运算 输出等都是通过结构体变量的成员来实现的 59 代码 include includemain structstu intnum charname 20 charsex floatscore structstuboy1 boy2 boy1 num 102 scanf s boy1 name scanf c f 60 boy2 boy1 printf 学号 d n姓名 s n boy2 num boy2 name printf 性别 c n分数 f n boy2 sex boy2 score 注意 对结构体变量的整体操作只限于赋值操作和参数传递 而且要求类型一致 不能对结构体变量进行整体输入输出 61 案例5 4 在参加老年运动会的4名运动员当中找到年龄最大的人 并输出 分析 把所有运动员的信息用结构体变量存储 比较各个结构体变量的年龄 找到年龄最大的 把姓名和年龄输出到屏幕上 li 58 wang 59 zhang 62 sun 72 假设有四名运动员 62 includestaticstructman charname 20 intage p1 li 58 p2 wang 59 p3 zhang 62 p4 sun 72 main structmanmax max age 0 if p1 age max age max p1 if p2 age max age max p2 if p3 age max age max p3 if p4 age max age max p4 printf 年龄最大者是 s 年龄 d n max name max age 63 includestructstu charxuehao 10 charxingming 10 floatchengji 3 三门课成绩 main structstus 10 inti j floataverage 3 0 for i 0 i 10 i printf 请输入第 d名学生学号 i 1 scanf s s i xuehao printf 请输入第 d名学生姓名 i 1 scanf s s i xingming 实力检验 4 64 printf 各门课程平均成绩如下 n for i 0 i 10 i average 0 s i chengji 0 average 1 s i chengji 1 average 2 s i chengji 2 printf 该10名学生三门各平均成绩分别为 n printf f t f t f n average 0 10 average 1 10 average 2 10 for j 0 j 3 j printf 请输入该名学生的第 d门课程成绩 j 1 scanf f 65 任务九本章要点汇总 结构体可以把有联系的不同类型的数据组合成一种新的数据结构 结构体的使用包括结构体类型的定义 结构体类型变量的定义 结构体类型变量的初始化和结构体类型变量的成员引用 一个结构体变量的总长度在不同环境有所不同 可以用sizeof去计算得出 结构体定义允许嵌套 结构体类型的变量定义有三种形式 先声明结构体类型再定义变量名 在声明类型的同时定义变量 直接定义结构体类型变量 结构体成员的引用可以采用三种形式 结构体变量名 成员名 指针变量名 成员名 指针变量名 成员名 66 任务七知识扩展 共用体 共用体的概念对于同一个变量 有时需要向其存储不同类型的数据 并且在该段内存空间中 某一时刻只能存放其中的某一个数据 这种结构 称为 共用体 67 定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南快消品策划营销方案
- 咸宁团建活动策划方案公司
- 说明文知识总结
- 赣州税务筹划咨询方案
- 2025年营养师鉴定考试冲刺指南:实操技能强化与理论巩固试卷
- 城市智慧化发展案例分析
- 2025年度深基坑专项方案测试卷及答案
- 2024年水利设施管养人员练习题及参考答案详解(完整版)
- 2025年医师定期考核模考模拟试题及参考答案详解(突破训练)
- 2024年安全员考试通关考试题库含完整答案详解(各地真题)
- 《学术英语(综合)》课后答案
- 高中心理健康课程《人际关系-寝室篇》课件
- 水产微生物学
- 电力系统继电保护课程设计报告-三段式距离保护
- 香港永久性居民在内地所生中国籍子女赴香港定居申请表
- 部编人教版五年级上册小学道德与法治 第5课 协商决定班级事务 课件
- 跨境电商亚马逊运营实务完整版ppt课件-整套课件-最全教学教程
- GB∕T 31038-2014 高电压柴油发电机组通用技术条件
- 基层工会经费财务规范化建设
- 亚硒酸 MSDS危险化学品安全技术说明书
- 预防接种家长课堂(课堂PPT)
评论
0/150
提交评论