




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
乔 林,计算机程序设计基础,Email: Tel: 62780973,清华大学计算机科学与技术系,第四章 复合数据结构基础,学习目标 掌握数组定义与基本使用方法,熟悉字符型数组概念 掌握指针基本概念,能熟练使用指针操作基本数据对象,掌握指针基本运算,了解指针与数组的关系 掌握结构体类型的声明、结构体变量的定义与基本用法,能在程序中熟练使用结构体 掌握联合体类型的声明、联合体变量的定义与基本用法,能在程序中熟练使用联合体 掌握枚举类型的概念、定义与使用方法 了解自定义类型的定义与使用方法,4.1 数组及其应用,一维数组 多维数组 字符数组的应用,一维数组的定义与格式,一维数组的定义:相同类型的一系列数据 数据类型 数组名元素个数; 例:int a8;,关于数组定义的几点说明 数组声明中的方括号不能使用小括号代替 数组元素个数必须为整型常量或编译期可计算的常量表达式,不能为变量 数组元素下标从0开始编号,数组元素个数必须大于1 系统不检查数组下标,注意数组下标是否超出定义范围!,一维数组的初始化,初始化格式:相同类型的一系列数据 数据类型 数组名元素个数 = 值1, 值2, , 值n; 例:int a8 = 10, 20, 30;,关于数组初始化的几点说明 花括号中数据序列表示数组初始值,以逗号分隔 数组元素的初始化从第0个元素开始;若初始值数目少于数组元素个数,则后继元素未初始化;若中间部分元素无需初始化,则应使用逗号分隔(系统默认为0) 数组定义与初始化场合,可省略方括号中的元素个数说明,系统自动将其设为初始化值的个数,一维数组示例一,输入一个含有12个浮点数的一维数组,分别计算数组中所有正数与所有负数的和,#include int main() float data12; float result1 = 0.0, result2 = 0.0; int i; printf(“Please input 12 floats:n“); for(i = 0; i 0.0) result1 += datai; else result2 += datai; printf(“Positives: %fnNegatives: %fn“, result1, result2); return 0; ,实际为数组元素遍历问题:使用循环,从头至尾搜索整个数组,数组经常与循环联系在一起,这是因为数组下标的变化与循环控制变量是一致的,一维数组示例二,使用冒泡法对5个整数按从大到小的顺序排列,利用冒泡法进行排序,5个数分别位于不同层。要使大数在顶层小数在底层,小数应下降,大数应上升。最大数上升到顶层最多需要“冒泡”4次,其中每一次称为一趟。而在每一趟中,最小数不断下降,因为每次只交换相邻两个层面的数据,所以每一趟内的执行次数不大于4次,并会随着趟数的增加不断减少。,一维数组示例二,使用冒泡法对5个整数按从大到小的顺序排列,#include int main() int i, j, temp; static int a5 = 1, 7, 12, 16, 20; for(i = 0; i 4; i+) for(j = 0; j 4 i; j+) if(aj aj+1) / 若后面数据比前面大则交换 temp = aj; aj = aj+1; aj+1 = temp; for(j = 0; j 5; j+) printf(“a%d = %dn“, j, aj); return 0; ,多维数组的定义与格式,多维数组的定义:相同类型的一系列数据 数据类型 数组名常量表达式1常量表达式2; 例:int a28;,关于多维数组定义的几点说明 数据顺序存放,先存第一行,再存第二行 只能引用元素,不能引用整体数组,如不能整体赋值 系统不检查数组下标,注意数组下标是否超出定义范围!,多维数组的初始化,按数据元素的存放顺序依次初始化每个元素 例:int a28 = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; 按其维度分别初始化:相当于降维处理 例:int a28 = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;,多维数组示例,用户输入一个44的整数矩阵,编写程序求其两对角线上元素的和,#include int main() int matrix44, i, j, result1 = 0, result2 = 0; for(i = 0; i 4; i+) printf(“Line %d: “, i); for(j = 0; j 4; j+) scanf(“%d“, ,字符型数组的应用,字符型数组:元素类型为字符的数组 常用于存放字符串 二维字符数组:元素类型为字符串的一维数组 初始化 使用数组形式:char s6 = H,e,l,l,o,0; 使用字符串形式:char s6 = “Hello”; 字符型数组的输入输出 putchar()、 getchar()、printf()、scanf(),字符型数组示例,编写程序,将两个字符串中的字符拼接起来,#include int main() char str041, str121; / 定义字符型数组,存放两个字符串 int j, k; / 定义两个循环因子 printf(“Please input the first string:n“); scanf(“%s“, str0); printf(“Please input the second string:n“); scanf(“%s“, str1); for(j = 0; str0j != 0; j+) ; / 搜索到str0的结尾处 for(k = 0; str1k != 0; k+, j+) / 将str1中字符拷贝到str0后面 str0j = str1k; str0j = 0; / 添加字符串结尾标志 printf(“%s“, str0); return 0; ,4.2 指针及其应用,指针的基本概念与定义 指针的初始化 指针运算 使用指针操作基本数据对象 使用指针操作数组,指针的基本概念与定义,指针是一种数据类型 格式:目标数据对象的数据类型 *指针变量名; 例:int *p; float *q; char *s;,多个指针变量声明指针 每个变量名前都需使用指针符号 例:int *p, *q;,指针数据对象与目标数据对象,指针数据对象 指针变量:指针数据类型定义的变量(数据对象) 指针变量的值:内存地址值,一般为其他数据对象地址 目标数据对象:指针所指向的数据对象 和指针数据对象不是一回事,一般位于不同的地址 一般匿名,在使用时指定,指针的初始化,未初始化的指针非常危险 既可能指向未知地址,也可能指向未初始化的目标对象 指针的初始化方法 目标数据对象的数据类型 *指针变量名 = 初始值; 例:int n = 100; int *p = / a为数组名,表示数组首地址,关于指针初始化的说明,指针的初始化是指针数据对象的初始化,而不是目标数据对象的初始化 目标数据对象的数据类型必须与指针定义一致 可以使用其他同类型指针变量进行初始化 初始值为某个数据对象的地址,该数据对象必须已定义 普通整型数据一般不能作为初始值,否则会造成程序灾难 可以将指针初始化为空指针,即设为0,使其不指向任何对象,指针的算术运算,指针递增递减运算 向下(递增)或向上(递减)移动一个数据单位 例:int a8; int *p = a; p+; / 使p指向a1 指针加减某个整数运算 向下(加)或向上(减)移动n个数据单位 例:int a8; int *p = a; p = p + 2; / 使p指向a2 指针相减运算 确定两个指针间的数据个数,不是字节数 例:int a8; int *p1 = a, *p2 = / p2 p1 7,指针的关系运算与赋值运算,指针的关系运算 只能判断指针是否为空指针 例:int a8; int *p = a; if( p != 0 ) *p = 100; 指针的赋值运算 将变量地址赋给指针:int n; int *p; p = ,指针操作示例一,使用指针将输入的两个整数交换顺序,#include int main() int m, n,*pm,*pn, temp; / 定义整型变量和指针变量 pm = ,问题:使用下边的语句替换行不行?,指针操作示例二,使用指针输入输出数组元素,#include int main() float data5, *pf = data; int k; printf(“Input data:n“); for(k = 0; k 5; k+) scanf(“%f“, pf + k); / 通过指针进行数组元素的输入 for(k = 0; k 5; k+) printf(“%f,“, *pf ); pf+; / 通过指针输出数组元素 pf = data; / 指针重新指向数组的首地址 printf(“n“); for(k = 0; k 5; k+) printf(“%f, “, *(pf + k); / 依次输出数组各元素 printf(“n“); return 0; ,pf + k &datak *(pf + k) datak,4.3 结构体及其应用,结构体类型的声明 结构体变量的声明 结构体成员的引用 结构体变量的初始化,结构体类型的声明,结构体类型的性质:不同数据类型组成的集合体 声明格式,struct 结构体名 数据类型声明符1 成员名1; 数据类型声明符2 成员名2; 数据类型声明符n 成员名n; ;,struct DATE int year; int month; int day; int yearday; ;,说 明 结构体类型声明为数据结构的存储模型,并不分配内存 结构体成员不能为本结构体类型,但可以为与本结构体完全无关的其他结构体类型,结构体变量的定义与初始化,结构体类型的变量定义 按照结构体类型分配实际的存储空间 声明格式: struct 结构体名 变量名; 例:struct DATE date; 结构体类型变量的初始化 按声明顺序逐成员进行 例:struct DATE date = 2004, 8, 3 ; 说明:初始化数据必须与结构体类型声明的类型与顺序完全一致,各个成员初始值之间用逗号分隔,结构体成员的引用,成员选择操作符“.” 格式:结构体变量名.成员名 例:struct DATE date; date.year = 2004; 成员选择操作符“” 格式:结构体变量名成员名 例:struct DATE *p = 说明: pyear (*p).year,结构体成员的引用示例,将某年某月某日转换成该年的第几天,#include struct DATE int year; int month; int day; int yearday; ; int main() int leap = 0, i; struct DATE date; static int month13 = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; printf(“nEnter year month and day: n“); scanf(“%d,%d,%d“, ,4.4 联合体及其应用,联合体类型的声明 联合体变量的声明 联合体成员的引用 联合体变量定义时应注意的问题,联合体类型的声明,联合体类型的性质 不同数据类型组成的集合体 除了各个成员共享同一片存储空间,其他性质与结构体完全相同 声明格式,union 联合体名 数据类型声明符1 成员名1; 数据类型声明符2 成员名2; 数据类型声明符n 成员名n; ;,union DATA int n; char* p; char c; ;,联合体成员的引用示例,编程建立教师与学生登记表,其中包括ID识别号、姓名、身份标志、职称(教师)或年级(学生),如若身份标志为S则填年级信息,若身份标志为T则填职称信息,#include #include struct PERSON int id; char name10; char levelflag; union int grade; char jobtitle10; level; ; struct PERSON person;,嵌套的联合体变量level作为结构体类型PERSON的成员,联合体成员的引用示例,int main() printf(“nPersonal Info(ID, name, level-flag, grade or job-title): n“); scanf(“%d%s%s“, ,4.5 枚举类型及其应用,枚举类型的声明 enum 枚举名 元素名1, 元素名2, , 元素名n ; 例:enum MONTH JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC ; 枚举类型变量的定义 例:enum MONTH month; 枚举类型的应用 意义:取代魔数,使源代码更易理解,关于枚举类型的说明,枚举类型声明中的元素为枚举文字,不是变量 枚举文字的值缺省时从0开始,依次递增 显式定义枚举文字的值也是允许的 例: enum WEEKDAY SUN=7, MON=1, TUE, WED, THU, FRI, SAT ; 枚举变量可用于比较或判断操作 例:if( month = D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025汽车配件买卖合同2篇
- 2025年智能工厂区生态环境建设与病虫害治理一体化服务合同
- 2025年度新能源领域股权投资与关键技术知识产权授权合同
- 2025年度工业废气处理技术改造工程劳务合作合同
- 2025年网络应用新用户开发与代理服务合同样本
- 2025年城市社区生鲜配送与冷链运输服务合同范本
- 2025年度智能玻璃电梯门设计与施工一体化工程合同
- 2025年度生态环保装修材料供应与田园风格家居设计合同
- 2025年度短视频直播平台用户权益维护与增值服务合同
- 2025年新能源车辆股份权属变更及使用权委托合同
- 联通创新人才认证(物联网)考试题库(附答案)
- GB/T 5900.1-2008机床主轴端部与卡盘连接尺寸第1部分:圆锥连接
- GB/T 10294-2008绝热材料稳态热阻及有关特性的测定防护热板法
- 房屋验收记录表
- 公司固定资产处置审批单
- 星火英语六级词汇大全(带音标)
- 第一章-马克思主义的诞生-(《马克思主义发展史》课件)
- 茶叶加工学试卷
- 陶瓷材料力学性能和测试方法
- 超声生物显微镜(UBM)临床应用课件
- 专升本00107现代管理学历年试题题库(含答案)
评论
0/150
提交评论