- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序举例
程序举例
#define N 3 数组定义:必须用常量表达式 main() { int a[N],b[‗B‘-63],c[]={1,2,3},i; for(i=0;i<N;i++) scanf(―%d%d‖,&a[i],&b[i]); for(i=0;i<N;i++) printf(―%d ‖,a[i]); printf(―\n‖); 数组元素引用 for(i=0;i<N;i++) printf(―%d ‖,b[i]); printf(―\n‖); for(i=0;i<N;i++) c[i]=a[i]+b[N-i-1]; for(i=0;i<N;i++) printf(―%d ‖,c[i]); }
一维数组的引用
数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式 例 int a[10]; printf(―%d‖,a); ( ) 必须 for(j=0;j<10;j++) printf(―%d\t‖,a[j]);
49 38 例 38 49 65 76 97 13 97 76
38
38
38 13 49 49 27 13 49 30 27
38 13 13 27 38 30 27 38 30 38
13
13 27 30
13 27
49
65 13 76 27 76 13 27 30 76
4913 6527Fra bibliotek30 38
65 27 13
()
一维数组的初始化
初始化方式
int a[5]={1,2,3,4,5}; 在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值) 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值 只给部分数组元素赋初值 当全部数组元素赋初值时,可不指定数组长度
27 30 65 30 65
30 49
65
49
97 27 13 27 97 30
30 76
76
30 97 97 初 第 始 一 关 趟 键 字 n=8
第 二 趟
第 三 趟
第 四 趟
第 五 趟
第 六 趟
第 七 趟
#include <stdio.h> void Sort1(int a[],int n) {int i,j,t; for(j=0;j<n-1;j++) for(i=0;i<n-j-1;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} } void main(void) { int a[10],i; printf("Input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); Sort1(a,10); printf("The sorted numbers:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); }
五趟: 13 六趟: 13
27
27 27
38
38 38
49
49 49
[76
65 65
97
[97 76
65 ]
76 ] [97 ]
#include <stdio.h> void Sort2(int a[],int n) {int i,j,k,t;
for(i=0;i<n;i++) { k=i; for(j=i+1;j<n;j++) if(a[j]<a[k]) k=j; if(i!=k) { t=a[i]; a[i]=a[k]; a[k]=t;} }
#include <stdio.h> #define SIZE 10 main() 例 读10个整数存入 数组,找出其中最大 { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); 值和最小值。 for(i=0;i<SIZE;i++) { printf("%d:",i+1); 步骤: 1. 输入:for循环输入10个整数 scanf("%d",&x[i]); } 2. 处理: max=min=x[0]; (a) 先令max=min=x[0] for(i=1;i<SIZE;i++) (b) 依次用x[i]和max,min比较 (循环) 若max<x[i],令max=x[i] { if(max<x[i]) max=x[i]; if(min>x[i]) min=x[i]; 若min>x[i],令min=x[i] } 3. 输出:max和min printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }
§4.1 一维数组
一维数组的定义
定义方式: 数据类型
该数组元素的类型: 基本类型|构造类型
[ ] :数组运算符 单目运算符 优先级(1) 左结合 不能用( )
数组名[常量表达式];
表示元素个数 下标从0开始
合法标识符
例 int a[6];
a
0 1 2
3 数组名表示内存首地址, 4 是地址常量 5
} main() { int a[10],i,j,k,x; printf("Input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n");
Sort2(a,10)
printf("The sorted numbers:\n"); for(i=0;i<10;i++) printf("%d ",a[i]);
例 用冒泡法对10个数排序。
排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止——第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
一维数组作为函数的参数
2)数组名作为函数的参数 例2 void p2(int x[],int n) { int i; for(i=0;i<n;i++) x[i]=x[i]*2; } void main(void) { int a[5]={1,2,3,4,5},b[5],i; p2(b,5); for(i=0;i<5;i++) printf(“a[%d]=%d, 2*a[%d]=%d\n”,i,a[i],i,b[i]); }
k 例 i=1 初始: [ 49 13
k
k
38 j k
65
j
97 j
76
j
13 49 j
27 ]
j
k
97 j 97 [97 76 j 76 76 49 38 27 ] j 49 49 j 38 ] 65 ]
i=2 一趟: 13
[38 27 65 j
二趟: 13 三趟: 13
27 27
[65 38
四趟: 13
例 用简单选择法对10个数排序
排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它
与第一个数交换—第一趟选择排序,结果最小的数被安置 在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字 次小的记录,将它与第二个数交换—第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束
}
从以上例子可以看到: 用到两种循环,
第一种冒泡法循环––找第i大的元素;第二
种选择法循环––对其后的元素的一一比较, 找最小的数。
数据查找: 例1,在a={a0,a1,…,an}中查找想值为x元素,找到则返回其在数组的下标, 否则返回-1 int Seq_locate(int a[],int len,int x) { int i=0; while((i<len)&&(a[i]!=x))i++; if (i>=len)i=-1; return i; } void main(void) {int u[5]={34,21,44,55,6},x,l; //例 x=44 x=1 scanf(“%d”,&x); l=Seq_locate(u,5,x); if (l==-1) printf(“\n%d未找到\n”,x); else printf(“\nu[%d]=%d\n”,l,u[l]); }
第4章
数组
前面所用到的数据均为基本类型 ( 整、实、字符),为了丰
富数据类型 ,须提供强有力的数据表达方式。C语言提供了一
种构造类型数据–––由基本类型按某一规则组合在一起。 数组:同一种(基本)类型按一定顺序组合在一起的数据类型 • 构造数据类型之一 • 数组:有序数据的集合,用数组名标识 • 元素:属同一数据类型,用数组名和下标确定