c语言-数组
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83
i=1 k=2
84
87
88
j=4
i != k:交换a[i]与a[k]
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84
83
87
61
84 < 88
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 88
i=0
84
83
j=2 k=2
87
61
83 < 84
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
• for (i=0; i<10; i++) printf(“%d”, a[i]);
若数组下标<0或>=n,将出现数组下标越界的问题, 此类问题编译器可能不会给出错误提示。
西北农林科技大学
1.3 数组下标
• 为便于修改,采用宏(define)预先定义数组
元素个数。
• #define N 9 • int a[N] = {3,4,1,4,5,6,8,0,2};
的顺序排序后输出。 88
i=0 k=2
84
83
87
j=3
61
87 > 83:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 88
i=0
84
83
87
61
j=4 k=4
61 < 83
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84 87
i=3 k=i
88
j=i+1
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84 87
i=3 k=3
88
j=4
西北农林科技大学
例1.4 二分查找
在一个有序数组中查找是否存在某一个数据 ,如果存在,输出该数的在数组中的位置.
要求如下:
1. 定义一个整型数组int a[100] 2. 输入数组元素个数n,输入n个有序的整数,并
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 88
i=0 k=i
84
j=i+1
83
87
61
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 88
i=0
84
j=1 k=1
西北农林科技大学
第 8 章 数组
1、一维数组
2、多维数组 3、变长数组
西北农林科技大学
1、一维数组
1.1 问题引入
1.2 定义
1.3 数组下标 1.4 数组初始化 1.5 求数组中元素个数 1.6 字符数组
西北农林科技大学
1.1 问题引入
(1)校验位的有效性判断
int main() { int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12, a13; int s1, s2, check_digit; scanf("%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d", &a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10,&a11,&a12, &a13); s1 = a2+a4+a6+a8+a10+a12; s2 = a1+a3+a5+a7+a9+a11; check_digit = 9-(3*s1+s2-1)%10; 问题:输入变量太多! if(a13==check_digit) printf("Correct code!\n"); scanf语句太繁琐! else printf("Invalid code!\n"); return 0; }
西北农林科技大学
1.1 问题引入
int main() { int up,down; int m, n; int r, I; for(i=0; i<5; i++) { scanf("%d/%d", &up, &down); m = up, n = down; do { r = m % n; 问题:不能统一输入, m = n, n = r; 统一输出! } while(r!=0); printf("%d/%d\n", up/m, down/m); } }
4
1
1
2
4
3
5
4
6
5
8
6
0
7
2
8
1
9
• a[0] = 1;
• printf(“%d”, a[5]);
西北农林科技大学
1.3 数组下标
• n元数组下标取值范围为0~n-1
• int a[10] = {3,4,1,4,5,6,8,0,2,1};
a
3 0
4 1
1 2
4 3
5 4
6 5
8 6
0 7
2 8
1 9
i=2 k=i
87
j=i+1
88
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84
i=2 k=2
87
j=3
88
87 > 84:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84i=2Fra bibliotekk=287
88
j=4
88 > 84:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84
i=2 k=2
87
88
j=4
i == k:不交换
西北农林科技大学
例1.3 选择排序
的顺序排序后输出。 61 84
i=1 k=2
83
87
88
j=4
88 > 83:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 84
i=1 k=2
83
87
88
j=4
i != k:交换a[i]与a[k]
西北农林科技大学
a
3 0
4 1
1 2
4 3
5 4
6 5
8 6
0 7
2 8
• for (i=0; i<N; i++) printf(“%d”, a[i]);
西北农林科技大学
1.4 数组初始化
• 采用大括号括起来的常量表达式列表
• int a[10] = {3,4,1,4,5,6,8,0,2,1};
a
3 0
4 1
1 2
西北农林科技大学
例1.2 多分数化简后统一输出
#define N 5
int main() { int up[N],down[N]; int m, n; int r, i; for(i=0; i<N; i++) { scanf("%d/%d", &up[i], &down[i]); m = up[i], n = down[i]; do { r = m % n; m = n, n = r; } while(r!=0); up[i]/=m, down[i]/=m; } for(i=0; i<N; i++) printf("%d/%d\n", up[i], down[i]);
87
88
83 < 84
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 84
i=1 k=2
83
87
j=3
88
87 > 83:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
88 > 87:k不变
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61 83 84 87
i=3 k=3
88
j=4
i == k:不交换
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
(2)输入多个分数,化简后统一输出问题
西北农林科技大学
1.2 定义
(1)数组:含有多个具有相同数据类型元素 的数据结构
(2)可以存储一组数值
(3)可以根据所处位置读写元素
西北农林科技大学
1.2 定义
一维数组:
(1)数据类型 数组名[元素个数];
(2)数据类型 数组名[元素个数]={初始化值};
int a[10];
a 1
0
0
1
0
2
0
3
0
4
6
5
西北农林科技大学
1.4 数组初始化
• C99中的指定初始化方式:
int a[] = {[0]=1,[5]=2};
a 1
0
0
1
0
2
0
3
0
4
2
5
西北农林科技大学
1.5 求数组中元素个数
• 对数组使用sizeof运算符
int a[] = {3,4,1,4,5,6,8,0,2,1,5,9,14};
的顺序排序后输出。 61 83 84 87 88
西北农林科技大学
例1.3 选择排序
for (i = 0; i < N-1; i++) { k = i; for ( j = i+1; j < N; j++) { if (a[j] < a[k]) k = j; } if ( i != k ) { temp = a[i]; a[i] = a[k]; a[k] = temp; } }
int a[10] = {3,4,1,4,5,6,8,0,2,1};
a 3 4 1 4 5 6 8 0 2 1
0
1
2
3
4
5
6
7
8
9
西北农林科技大学
1.3 数组下标
• 为读写特定位置的数组元素,在数组名后面
加上用[]括起来的整数值——下标或索引。
• int a[10] = {3,4,1,4,5,6,8,0,2,1};
a
3
0
4
1
1
2
4
3
5
4
6
5
8
6
0
7
2
8
1
9
• a[0] = 1;
• printf(“%d”, a[5]);
西北农林科技大学
1.3 数组下标
• 为读写特定位置的数组元素,在数组名后面
加上用[]括起来的整数值——下标或索引。
• int a[10] = {3,4,1,4,5,6,8,0,2,1};
a
1
0
4 3
5 4
6 5
8 6
0 7
2 8
1 9
西北农林科技大学
1.4 数组初始化
• 如果初始化常量个数比数组元素个数少,数
组中剩余的元素被初始化为0。
• int a[10] = {3,4,1,4,5};
a
3
0
4
1
1
2
4
3
5
4
0
5
0
6
0
7
0
8
0
9
西北农林科技大学
1.4 数组初始化
• 将所有元素初始化为0:
int n = sizeof(a)/sizeof(int);
或 n = sizeof(a)/sizeof(a[0]);
西北农林科技大学
例1.1 数组实现校验位的判断
#define N 13
int main() { int a[N]; int i, s1, s2, check_digit; for(i=0; i<N; i++) scanf("%1d",&a[i]); s1 = a[1]+a[3]+a[5]+a[7]+a[9]+a[11]; s2 = a[0]+a[2]+a[4]+a[6]+a[8]+a[10]; check_digit = 9-(3*s1+s2-1)%10; if(a[12]==check_digit) printf("Correct code!\n"); else printf("Invalid code!\n"); return 0; }
int a[10] = {0};
a 0
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
西北农林科技大学
1.4 数组初始化
• 若给定初始化表达式,可省略数组长度。
int a[] = {1,3,5,2,4,6};
a 1
0
3
1
5
2
2
3
4
4
6
5
西北农林科技大学
1.4 数组初始化
• C99中的指定初始化方式:
int a[] = {1,0,0,0,0,6};
的顺序排序后输出。 88
i=0
84
83
87
61
j=4 k=4
i != k:交换a[i]与a[k]
西北农林科技大学
例1.3 选择排序
• 对一组数据{88, 84, 83, 87, 61}按从小到大
的顺序排序后输出。 61
i=0
84
83
87
88
j=4 k=4
i != k:交换a[i]与a[k]