第1讲 数值型数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 1 2
i
i+1
9
a 3 5 2 8 1 22 89 0
a[0] a[1] 0 1 2 a[9] 9 for(j=i+1;j<n;j++) a[j-1]=a[j]; n--;
a 3 5 2 8 22 89 0
插入x到下标为i的位置
• 思路:将下标为i~n-1的 数组元素向后移一位, 然后将新数组元素x插 入到下标为i的位置 • 后移操作必须从最后一 i 个数组元素n-1开始 1.循环j从n-1到i,step -1 a[j+1]=a[j]; 2.a[i]=x; j指向需要移位的数 3.n++; 组元素。
-1 7
0 1 2 3 . . .
数组名 :地 址常量,表示 数组首地址。
偏移量下标 --分量a[2]
a
9
内存地址
一维数组的初始化
• 定义数组时,对数组元素赋初值
类型名 数组名[数组长度] = {初值表}; int a[10] = {1,2,3,4,5,6,7,8,9,10};
即:a[0]=1, a[1]=2,...… a[9]=10
2016/3/28 30
算法实现(排升序)
void SelectSort(int a[], int n) { int i, j, index, t; for (i=0; i<n-1; i++) index=i; for( j=i+1;j<n ; j++) if ( a[j] < a[index]) index=j; /*选出的最小元素(index下标)与i下标的元素交换*/ if(index!=i) { t=a[index]; a[index]=a[i]; a[i]=t;} } /*index为某趟比较中记录最小元素的下标*/ /*n-1趟:找出的最小值与i位置元素交换*/
2016/3/28
26
冒泡法实现排序(升序)过程
1.设置双重循环 2.外循环i控制最大数上冒 位置(n-1~1) 3.内循环j对0~i下标位置的 元素两两比较和交换
for(i=n-1;i>=1;i--) for(j=0;j<i;j++) if(a[j]>a[j+1]) { 第一趟使最大数冒至最后, t=a[j]; 第二趟使次大数冒至倒数第2, a[j]=a[j+1]; 。。。。。。 a[j+1]=t; } 第n-1趟使大数冒至第2
sample01_03.cpp
• 修改课堂练习1 • 输出最大值及最大值所在的下标
提示:
最大值下标maxindex 最大值a[maxindex]
删除下标为i的数组元素
• 思路:将下标为i+1~n-1个数 • 循环j从i+1 到n-1 step +1 a[j-1]=a[j]; 组元素前移一位
j • n--; //数组长度-1 • 写出for循环语句 n-1
• 实质:传地址
– 将数组的首地址(数组名)传递到被调函数:
visit (a,n);
– 被调函数接收数组的首地址,在数组原存储空 间上进行操作
• 函数接收数组的首地址的方法
– 数组方式: void visit( int b[ ],int n) – 指针方式: void visit( int *p ,int n)
一维数组的基本运算
• • • • 访问数组元素 遍历数组 删除一个数组元素 增加一个数组元素
访问数组元素(引用)
必须是整型
数组名[下标] • 下标的范围: 下标的表示形式:
– 整型常量 – 整型变量 – 整型表达式 a[9] a[i] a[5+i]
从0开始~数组长度-1
a
0 1 2 9 3 5 2 8 1 22 89 0 -1 7 a[0] a[1] a[9]
int b[5] = {1, 2, 3}; 即:b[0]=1;b[1]=2;b[2]=3;
• 等价于全部元素初始化
b[0] = 1;b[1] = 2; b[2] = 3;b[3] = 0;b[4] = 0;
• 如果对全部元素都赋初值,可以省略数组长度
int a[ 10 ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 建议不要省略数组长度
– 整型数组 – 浮点型数组 – 字符数组
• 分量是构造类型:
– 二维数组: – 多维数组 – 结构体数组
一维数组的定义
类型说明符 数组名[常量表达式];
常量表达式确定数组的长度, C语言 例:int a[10]; 不允许对数组的长度作动态定义, char name[30]; 不能以变量的值来定义数组长度 类型说明符可以是 数组名的命名与变 int n; float score[5]; 简单类型,用户自 量命名规则相同 scanf(“%d”,&n); 定义类型(结构体 错误 int a[n]; 类型),指针类型
构造原则
• 构造原则一
– 相同数据类型的数据作为一个整体来处理——数组。 如,int a[3];
• 构造原则二
– 不同数据类型的数据作为一个整体来处理——结构体。 如,通讯录:姓名、电话、地址。
• 构造原则三
– 构造类型可以嵌套构造类型。如,地址:路名、门牌、 邮编等。
ቤተ መጻሕፍቲ ባይዱ要内容
• • • • 第1讲 数值型数组 第2讲 二维数组 第3讲 字符数组 第4讲 结构类型
j
n-1 → 思考:如果j指向移 位后的存放位置, 如何修改算法
a 3 5 2 8 1 22 89 0
for(j=n-1;j>=i;j--) a[0] a[1] a[9] a[j+1]=a[j]; a[i]=x; a 3 5 2 8 15 1 22 89 0 n++;
数组在函数间的传递 ——同类型数据的批量传递
数组的长度
• 数组的定义长度
• 数组的实际长度
#define MAX 10 main() { int a[MAX]; int n; }
注:数组下标最大取值为MAX-1,否则数组出界; 在遍历操作中,最大取值为n-1
for(i=0;i<n;i++)
遍历数组
• 思路:下标从0开始,到n-1存储n个数组元素 • 遍历算法:
void BubbleSort(int a[ ],int n) { int i,j,t; for(i=n-1;i>=1;i--) for(j=0;j<i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } }
28
改冒泡法实现(降序)排序!
2016/3/28
• 上机实验:从键盘输入数 每个元素输 组的n个整数并输出 出占5位,不
足左补空格
课堂练习1
sample01_02.cpp
• 从数据文件中读数据保存到数组中,求最 大值并显示结果。 • 主要步骤
– 读数据到整型数组,获取n值
• 打开文件,读数据,关闭文件
– 遍历整型数组,求最大值 – 输出最大值
课堂练习2
– 循环i从0到n-1
• 访问a[ i ] •数组的实际长度n
• 写出循环语句 for(i=0;i<n;i++)
{…a[i]…
}
遍历示例
• 输入n • 对数组中的n个元素赋值为 其下标
sample01_01.cpp
• 输入n个整数到整型数组a
• 输出整型数组a中n个整数
scanf(“%d”,&n); for(i=0;i<n;i++) a[i]=i; for(i=0;i<n;i++) scanf(“%d”,&a[i]); for(i=0;i<n;i++) printf(“%5d”,a[i]);
数组的存储结构
• 对应内存的连续空间,每一单元因数据类 型相同而大小相同,例: int a[10]
内存用户数据区
0x1001 0x1005 0x1009 0x100D 0x1011 0x1015 0x1019 0x101D 0x1021 0x1025 0x1029
3 5 2 8 1
数组元素
22 89 0
数组在函数间的传递——数组方式
• 主调函数传递数组名 和实际长度 • visit(a,n); • 被调函数为传递的地址 空间声明无长度的数组 • void visit(int b[ ],int n)
数组在函数间的传递 --数组方式示例sample01_04.cpp
• 输入数组:构造1~n的整数序列 void getArray(int arr[ ],int n) 无长度数组 • 输出数组:打印前n个数组元素 void pntArray(int arr[ ],int n)
输出 12345
main() 长度5 {int a[5]; getArray(a,5); for(int i=5;i>=1;i--) pntArray( ? ) } a,i
数组a
1234
123 12
1
上机实验:利用上述函数 构造5个整数并输出如左图 所示的结果。
简单的排序算法
• 对数组元素排序:void sort(int a[],int n)
第1讲 数值型数组
主要内容
• • • • • • 数组的逻辑结构 数组的存储结构 一维数组的基本运算 文件存储数组数据 函数之间传递一维数组 简单的排序算法
• 阅读教材 7.1、8.3
数组的逻辑结构
数组的分量是具有相同数据类型的数据。 分量——数组元素。
一维
二维
多维
数组的类型
• 分量都是简单类型 • 一维数组:
– 冒泡法 – 选择法
• 在主函数中建立长度为10的整型数组,调用sort进 行降升序排序。
2016/3/28
25
排序——冒泡法
• 将数列中相邻的两个元素依次进行比较, 将符合条件(前一个大于后一个)的进行 互换,当整个数列元素都比较完成后,可 以找到当前数列中的最大值。(且最大数 位于数列最后一位)。 • 这个过程是用循环实现。
• 静态数组的初始化
static int b[5] = {1, 2, 3, 4, 5}; static int b[5]; 注:静态存储的数组如果没有初始化,所有元素自动赋0
• 动态数组的初始化
auto int c[5]; *动态存储的数组如果没有初始化,所有元素为随机值
一维数组的初始化(续)
• 部分元素初始化
2016/3/28 27
例:建立长度为10数组,按冒泡 排序法升序排列,输出。
#include<stdio.h> void BubbleSort(int a[ ],int n); void main( ) {int arr[10]={22,33,44,11,67, 86,23,43,84,100}, i; BubbleSort(arr,10); for(i=0;i<10;i++) printf("%4d",arr[i]); printf("\n"); }
算法描述
n个记录放在下标为0……n-1范围的数组内 共进行n-1趟选最小记录并交换的排序
i=0时,在0~n-1下标范围内选最小的与0号记录交换 i=1时,在1~n-1下标范围内选最小的与1号记录交换 …… i=i 时,在i~n-1下标范围内选最小的与i号记录交换 …… i=n-2 时,在n-2~n-1下标范围内选最小的与n-2号记录 交换
排序——选择排序法
算法思想
对n个数据通过n-1次比较选到一个最小(大)值,把它交换 到正确的位置;对剩下的n-1个数据做同样的操作,直到 剩下一个元素。 本趟最小 举例(升序):
记录的关键字序列:
第1趟排序结果: 第2趟排序结果:
5 8 1 3 7 9 0 2
0 8 1 3 7 9 5 2 0 1 8 3 7 9 5 2
模块二 复合数据
数组 结构体
数据类型
简单类型: C语言中进行基本运算的基本单位。如果是一个 简单类型变量,可以被赋值或在表达式中直接使 用。每个变量单独存储,变量间没有任何联系。 例:int i,j; 构造类型: 由简单类型构造而成。构造类型的每个分量是一 个变量,这个变量可以是简单类型或构造类型。 相互间又有一定联系,并按一定顺序存储。
本趟最小 本趟最小 本趟最小 本趟最小
第3趟排序结果:
第4趟排序结果: 第5趟排序结果:
0 1 2 3 7 9 5 8
0 1 2 3 7 9 5 8 0 1 2 3 5 9 7 8
本趟最小
本趟最小
第6趟排序结果:
第7趟排序结果:
n-1趟比较
0 1 2 3 5 7 9 8
0 1 2 3 5 7 8 9
{ /*在下标i~n-1范围内选最小元素,由index记录该元素的下标*/ 编写主函数调用,实现 对数组元素的排序。
}
实践一
• 编写程序文件,在整型数组指定下 标处插入一个指定值的元素。