第四章复合数据结构基础 计算机程序设计基础 学习目标 掌握数组定义与基本使用方法,熟悉字符型数组概念 掌握指针基本概念,能熟练使用指针操作基本数据对象, 掌握指针基本运算,了解指针与数组的关系 掌握结构体类型的声明、结构体变量的定义与基本用法, 能在程序中熟练使用结构体 掌握联合体类型的声明、联合体变量的定义与基本用法, 能在程序中熟练使用联合体 掌握枚举类型的概念、定义与使用方法 了解自定义类型的定义与使用方法 清华大学计算中心 http://learn.tsinghua.edu.cn 2
清华大学计算中心 http://learn.tsinghua.edu.cn 2 计 算 机 程 序 设 计 基 础 第四章 复合数据结构基础 • 学习目标 – 掌握数组定义与基本使用方法,熟悉字符型数组概念 – 掌握指针基本概念,能熟练使用指针操作基本数据对象, 掌握指针基本运算,了解指针与数组的关系 – 掌握结构体类型的声明、结构体变量的定义与基本用法, 能在程序中熟练使用结构体 – 掌握联合体类型的声明、联合体变量的定义与基本用法, 能在程序中熟练使用联合体 – 掌握枚举类型的概念、定义与使用方法 – 了解自定义类型的定义与使用方法
计 算 4.1数组及其应用 机 程 序·一维数组 设 计·多维数组 基 础 字符数组的应用 清华大学计算中心 http://learn.tsinghua.edu.cn 3
清华大学计算中心 http://learn.tsinghua.edu.cn 3 计 算 机 程 序 设 计 基 础 4.1 数组及其应用 • 一维数组 • 多维数组 • 字符数组的应用
维数组的定义与格式 计算机程序设计基础 一维数组的定义:相同类型的一系列数据 数据类型数组名[元素个数 例:inta[8l; a[0]a[1a[2]a[3]a[4]a[5]a[6]a[7 关于数组定义的几点说明 数组声明中的方括号不能使用小括号代替 数组元素个数必须为整型常量或编译期可计算的常量表 达式,不能为变量 数组元素下标从0开始编号,数组元素个数必须大于1 系统不检查数组下标,注意数组下标是否超出定义范围! 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 4 计 算 机 程 序 设 计 基 础 一维数组的定义与格式 • 一维数组的定义:相同类型的一系列数据 – 数据类型 数组名[元素个数]; – 例:int a[8]; • 关于数组定义的几点说明 – 数组声明中的方括号不能使用小括号代替 – 数组元素个数必须为整型常量或编译期可计算的常量表 达式,不能为变量 – 数组元素下标从0开始编号,数组元素个数必须大于1 – 系统不检查数组下标,注意数组下标是否超出定义范围! a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
一堆维数组的初始化 计算机程序设计基础 ·初始化格式:相同类型的一系列数据 数据类型数组名[元素个数]={值1值2,…值n 例:inta[8]={10,20,30 10 20 30 a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7 关于数组初始化的几点说明 花括号中数据序列表示数组初始值,以逗号分隔 数组元素的初始化从第0个元素开始;若初始值数目少于 数组元素个数,则后继元素未初始化;若中间部分元素 无需初始化,则应使用逗号分隔(系统默认为0) 数组定义与初始化场合,可省略方括号中的元素个数说 明,系统自动将其设为初始化值的个数 清华大学计算中心 http://learn.tsinghua.edu.cn 5
清华大学计算中心 http://learn.tsinghua.edu.cn 5 计 算 机 程 序 设 计 基 础 一维数组的初始化 • 初始化格式:相同类型的一系列数据 – 数据类型 数组名[元素个数] = {值1, 值2, …, 值n}; – 例:int a[8] = {10, 20, 30}; • 关于数组初始化的几点说明 – 花括号中数据序列表示数组初始值,以逗号分隔 – 数组元素的初始化从第0个元素开始;若初始值数目少于 数组元素个数,则后继元素未初始化;若中间部分元素 无需初始化,则应使用逗号分隔(系统默认为0) – 数组定义与初始化场合,可省略方括号中的元素个数说 明,系统自动将其设为初始化值的个数 10 20 30 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
计 算 维数组示例 机 程 序 输入一个含有12个浮点数的一维数组,分别计算数 设组中所有正数与所有负数的和 计 基 include 础ntmi0 实际为数组元素遍历问题:使用 循环,从头至尾搜索整个数组 float data[12]: float result1=0.0, result2=0.0 数组经常与循环联系 int i. 在一起,这是因为数 printf("Pleaseinput 12 floats:"; 组下标的变化与循环 for(i=0;i0.0) result1+=datalil; else result2+=datalil: printf("Positives: %ofnNegatives: %fn,result1, result2), return O: 清华大学计算中心 http://learn.tsinghua.edu.cn 6
清华大学计算中心 http://learn.tsinghua.edu.cn 6 计 算 机 程 序 设 计 基 础 一维数组示例一 • 输入一个含有12个浮点数的一维数组,分别计算数 组中所有正数与所有负数的和 #include int main() { float data[12]; float result1 = 0.0, result2 = 0.0; int i; printf(“Please input 12 floats:\n“); for(i = 0; i 0.0) result1 += data[i]; else result2 += data[i]; } printf(“Positives: %f\nNegatives: %f\n“, result1, result2); return 0; } 实际为数组元素遍历问题:使用 循环,从头至尾搜索整个数组 数组经常与循环联系 在一起,这是因为数 组下标的变化与循环 控制变量是一致的
维数组示例二 计算机程序设计基础 使用冒泡法对5个整数按从大到小的顺序排列 7 2、1620 112121216.20个16 12 1 16162012 12 161616 20 20202020 1 1 一趟二趟三趟四趟 利用冒泡法进行排序,5个数分别位于不同层。要使大数在顶层 小数在底层,小数应下降,大数应上升。最大数上升到顶层最 多需要“冒泡”4次,其中每一次称为一趟。而在每一趟中,最 小数不断下降,因为每次只交换相邻两个层面的数据,所以每 趟内的执行次数不大于4次,并会随着趟数的增加不断减少 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 7 计 算 机 程 序 设 计 基 础 一维数组示例二 • 使用冒泡法对5个整数按从大到小的顺序排列 利用冒泡法进行排序,5个数分别位于不同层。要使大数在顶层 小数在底层,小数应下降,大数应上升。最大数上升到顶层最 多需要“冒泡”4次,其中每一次称为一趟。而在每一趟中,最 小数不断下降,因为每次只交换相邻两个层面的数据,所以每 一趟内的执行次数不大于4次,并会随着趟数的增加不断减少。 1 7 12 16 20 7 1 12 16 20 7 12 1 16 20 7 12 16 1 20 7 12 16 20 1 12 16 20 7 1 16 20 12 7 1 20 16 12 7 1 一 趟 二 趟 三 趟 四 趟
计 算 维数组示例二 机 序·使用冒泡法对5个整数按从大到小的顺序排列 设 include 计 int main0 基 础inti,j,temp static int a[5]={1,712,16,20} for(i=0;i<4;i++) for(=0;j<4-i+){ if(al<a+1)∥若后面数据比前面大则交换 temp=alil; alil=alj+1l; alj+1]=temp for(j=0; j<5; j++)printf("al%od=%dn",j, aljD return 0: 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 8 计 算 机 程 序 设 计 基 础 一维数组示例二 • 使用冒泡法对5个整数按从大到小的顺序排列 #include int main() { int i, j, temp; static int a[5] = {1, 7, 12, 16, 20}; for(i = 0; i < 4; i++) for(j = 0; j < 4 – i; j++){ if(a[j] < a[j+1]) // 若后面数据比前面大则交换 { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } for(j = 0; j < 5; j++) printf(“a[%d] = %d\n“, j, a[j]); return 0; }
多维教组的定义与格式 计算机程序设计基础 多维数组的定义:相同类型的一系列数据 数据类型数组名[常量表达式1常量表达式2] 例:inta[2I[8] a[o[o]a[o1a[OJ2]a[03]a[0[4]a[05]a[oJ6]a[07 I[o]a[l[]a[1l[2]a[1[B3]a[[4]a[1[5]a[1[6]a[1[7 关于多维数组定义的几点说明 数据顺序存放,先存第一行,再存第二行 只能引用元素,不能引用整体数组,如不能整体赋值 系统不检查数组下标,注意数组下标是否超出定义范围 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 9 计 算 机 程 序 设 计 基 础 多维数组的定义与格式 • 多维数组的定义:相同类型的一系列数据 – 数据类型 数组名[常量表达式1][常量表达式2]…; – 例:int a[2][8]; • 关于多维数组定义的几点说明 – 数据顺序存放,先存第一行,再存第二行 – 只能引用元素,不能引用整体数组,如不能整体赋值 – 系统不检查数组下标,注意数组下标是否超出定义范围! a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] a[1][6] a[1][7] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] a[0][6] a[0][7]
计 算 多维数组的初始化 机 序·按数据元素的存放顺序依次初始化每个元素 设 例:inta[2[8]={0,12,34.567,89,10,1112,131415} 计 基 础 按其维度分别初始化:相当于降维处理 例:inta[2[8]={0,1,2345,6,78,9,10,1112,13,14,15 a[o[o]a[o1]a[0J[2]a[0[3]a[o][4]a[o0J5]a[o[6]a[0[7] 2 3 4 6 7 8 9 10 11 12 13 14 15 [lI0]a[l[]a[1][2]a[1][3]a[14]al[5]al6]a[1[7] 清华大学计算中心 http://learn.tsinghua.edu.cn 10
清华大学计算中心 http://learn.tsinghua.edu.cn 10 计 算 机 程 序 设 计 基 础 多维数组的初始化 • 按数据元素的存放顺序依次初始化每个元素 – 例:int a[2][8] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; • 按其维度分别初始化:相当于降维处理 – 例:int a[2][8] = {{0,1,2,3,4,5,6,7},{8,9,10,11,12,13,14,15}}; 8 9 10 11 12 13 14 15 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] a[1][6] a[1][7] 0 1 2 3 4 5 6 7 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] a[0][6] a[0][7]
计 算 多维数组示例 机 序·用户输入一个4×4的整数矩阵,编写程序求其两对 设 角线上元素的和 计 基# Include 础ntmi0 int matrix[41[4l, i, j, result1=0, result2=0; for(i=0i<4;i++) printf("Line %/ od: ,i); for(=0;j<4+ scnf(°od,& cmatrixlil[) if(i=j result1+=matrirlilljl; if(i+j==3) result2+=matrixlilljl printf(Results: %od, %od\",result, result2 ); return 0: 清华大学计算中心 http://learn.tsinghua.edu.cn 11
清华大学计算中心 http://learn.tsinghua.edu.cn 11 计 算 机 程 序 设 计 基 础 多维数组示例 • 用户输入一个4×4的整数矩阵,编写程序求其两对 角线上元素的和 #include int main() { int matrix[4][4], i, j, result1 = 0, result2 = 0; for(i = 0; i < 4; i++){ printf(“Line %d: “, i); for(j = 0; j < 4; j++){ scanf(“%d“, &matrix[i][j]); if(i == j) result1 += matrix[i][j]; if( i + j == 3 ) result2 += matrix[i][j]; } } printf(“Results: %d, %d\n“, result1, result2); return 0; }