第七章数组 本章重点 妆处理好循环与数组下标的关系,就掌握了数组的核心技术 数组的赋值方法 ↓一些典型算法:排序,查找,插入的过程 字符数组和字符串的根本区别在于程序在处理字符串时是以0 作为结束标志的 ↓字符串不能用赋值语句 7.1一维数组的定义和引用 1.一维数组的定义 定义方式为 类型说明符数组名[常量表达式] 例如:inta[10 1204609398050 a[o]a[1]a[2]a[3]a[4]a[5]a[6]a[T]a[8]a[9] 说明: 常量表达式用中括号括起 下标从0开始,inta[10] a[0],a[1] a[9] ·常量表达式必须是常量,不能是变量。 ●数组名后面的常量表达式只能用“[]”括起来,不能用“()” 号 2.一维数组元素的引用 每次可引用一个数组元素,不能引用整个数组。 个数组元素就如同一个简单变量 引用时应注意下标的值不要超过数组长度的范围 a[0}=a5]+a门7]-a[2*3]常量和表达式做下标 aj=a[+1; 变量做下标 aa[0=>a[ll 数组元素做下标 例7.1程序自已输入0-9,然后按逆序输出。 maino
第七章 数 组 本章重点: 处理好循环与数组下标的关系,就掌握了数组的核心技术. 数组的赋值方法. 一些典型算法:排序,查找,插入的过程 字符数组和字符串的根本区别在于程序在处理字符串时是以\0 作为结束标志的. 字符串不能用赋值语句. 7.1 一维数组的定义和引用 1.一维数组的定义 定义方式为: 类型说明符 数组名[常量表达式] 例如:int a[10]; ⚫ 数组名后面的常量表达式只能用“[ ]”括起来,不能用“( )” 号。 2. 一维数组元素的引用 每次可引用一个数组元素,不能引用整个数组。 一个数组元素就如同一个简单变量. 引用时应注意下标的值不要超过数组长度的范围。 a[0]=a[5]+a[7]-a[2*3] 常量和表达式做下标 a[i]=a[i]+1; 变量做下标 a[a[0]]=>a[1] 数组元素做下标 例 7.1 程序自已输入 0-9,然后按逆序输出。 main() {
for(i=0=9;计+)a[=i, for(i=9;1>=0;-) printf(" %od, ali); 3.一维数组的初始化 (1)在定义数组时对各元素指定初始值 inta[10}={1,2,34,5,6,78,9,10}; 等价于 int a[10 a0}1:a[l=2;a[2]=3;…a[9}=10; (2)可只对一部分元素赋以初值。 a[S}{1,3,5 a[0}=1;a]=3a[2]=5;a[3]a4]未确定 (3)数组可以不规定维数,在初始化赋值时,数组维数从0开始 被连续赋值。 例如 char fl=(a,b,'c') a[]={1,3,5}; (4)数组不赋初值,系统自动给所有实数组元素赋以0值。数 组元素的赋值可以通过赋值语句或 scant函数输入 例7.2:求一组数(10个)的平均与总和。E51a maino i int i, sum, a[10]; float av for(i=0;i<10; scanf("%d",&a[),*数据输入* sum=o for(i=0;1<10;i++){ printf"%d"a[j);/*数据输出。并求和* sum=sum+al Iv=Sum/10.0 printf("%odn", sum) printf("%fn", av);
int i, a[10]; for (i=0;i<=9;i++) a[i]=i; for (i=9; i>=0;i--) printf(“%d”,a[i]); } 3.一维数组的初始化 (1)在定义数组时对各元素指定初始值。 int a[10]={1,2,3,4,5,6,7,8,9,10}; 等价于 int a[10]; a[0]=1;a[1]=2;a[2]=3; … a[9]=10; (2)可只对一部分元素赋以初值。 int a[5]={1,3,5}; a[0]=1;a[1]=3;a[2]=5; a[3],a[4]未确定 (3)数组可以不规定维数, 在初始化赋值时, 数组维数从 0 开始 被连续赋值。 例如: char f[]={'a', 'b', 'c'}; int a[ ]={1,3,5}; (4)数组不赋初值,系统自动给所有实数组元素赋以 0 值。数 组元素的赋值可以通过赋值语句或 scanf 函数输入。 例 7.2:求一组数(10 个)的平均与总和。E5_1a main() { int i,sum,a[10]; float av; for(i=0;i<10;i++) scanf("%d",&a[i]); /*数据输入*/ sum=0; for(i=0;i<10;i++) { printf("%d ",a[i]); /*数据输出。并求和*/ sum=sum+a[i]; } av=sum/10.0; printf("%d\n",sum); printf("%f\n",av); }
4.一维数组举例 例7.3:对10个数由小到大排序(冒泡排序)。 冒泡排序法的基本思想: 将相邻两个数相比较,将小的调到前头。不断比较,直 到将最后两数比较处理完毕。每进行一轮,把剩下的数 中最大的一个移到最后位置。 9854206137第1次,a[0和a[1比较 8954206137第2次,a[1和a[2]比较 8594206137 8549206137 第次,;和a[i+1比较 8542906137 8542096137 or (j=0;j<10-1;j if (alj]>alj+1) 8542069137 i temp=aljI 8542061937 aLJ 8542061397 Lj+1]=temp: 1 8542061379 # include“ stdio.h no {inta[10={9,854,2,0,6,1,3,7 nt in=10 for (i=0; i<n-1; i++) for〔=0;n-ij++) if (ajaj+iD i temp=ajl, alj=alj+l; temp; 1 for(i0; i<9; i+ p %3d",a[i) 例7.4:对N个数由小到大排序(选择排序)。 选择法的基本思想 从所有元素中选择一个最小元素放在a0],作为第一轮,第 二轮从a[]开始到最后的各元素中选择一个最小元素,放在a[1 中,依次类推,n个数进行n-1轮
4.一维数组举例 例 7.3:对 10 个数由小到大排序(冒泡排序)。 冒泡排序法的基本思想: 将相邻两个数相比较,将小的调到前头。不断比较,直 到将最后两数比较处理完毕。每进行一轮,把剩下的数 中最大的一个移到最后位置。 #include “stdio.h” main() { int a[10]={9,8,5,4,2,0,6,1,3,7} int i, n=10; for (i=0;i<n-1;i++) for (j=0;j<n-i;j++) if (a[j]>a[j+1]) { temp=a[j],a[j]=a[j+1];a[j+1]=temp;} for (i=0;i<9;i++) printf(“%3d”,a[i]); } 例 7.4:对 N 个数由小到大排序(选择排序)。 选择法的基本思想: 从所有元素中选择一个最小元素放在 a[0],作为第一轮,第 二轮从 a[1]开始到最后的各元素中选择一个最小元素,放在 a[1] 中,依次类推,n 个数进行 n-1 轮
351472 第一轮:1857310 第二轮:1357810 for(i=0,1<10,i++) for(=+1j<10j+) if (akakd k /k记住最小值的下标 if (il=k temp=aa]=a[k]; a[k=temp; 例75折半查找法。 顺序查找及折半查找。 折半查找方法的介绍 前提:査找数据已按一定规律(升序或降序)排列好, 2、基本思想:先检索正中间一个数据,看它是否为所需的 数据,若不是,则判断数据在正中间数的哪一边,若在 左侧,就在左侧范围査找,否则,在右侧查找 3、查找过程 例:有一组已排序的数据 81321283541526371768195 101150164 按树形排列如下: 28 95 41 76 150 2135527181101164 Maino inta1l5}={8,13,21,28,3541,5263,71,768195,101,150,164} int m=15, n=0,y, x; printf( enter scanf(%od", &x); do {y=(m+n)/2 if((x>ay &&x<aly+lD(x<aly &&x>aly-ID) printf("no find! ) break; l if (x<ayD
3 5 1 4 7 2 第一轮:1 8 5 7 3 10 第二轮:1 3 5 7 8 10 for(i=0,i<10,i++) { k=i; for(j=i+1,j<10,j++) if ( a[j]<a[k]) k=j //k 记住最小值的下标 if (i!=k) { temp=a[i];a[i]=a[k];a[k]=temp;} } 例 7.5 折半查找法。 顺序查找及折半查找。 折半查找方法的介绍 1、 前提:查找数据已按一定规律(升序或降序)排列好。 2、 基本思想:先检索正中间一个数据,看它是否为所需的 数据,若不是,则判断数据在正中间数的哪一边,若在 左侧,就在左侧范围查找,否则,在右侧查找。 3、 查找过程: 例:有一组已排序的数据: 8 13 21 28 35 41 52 63 71 76 81 95 101 150 164 按树形排列如下: Main() { int a[15]={8,13,21,28,35,41,52,63,71,76,81,95,101,150,164}; int m=15,n=0,y,x; printf("enter x:"); scanf("%d",&x); do { y=(m+n)/2; if ((x>a[y] && x<a[y+1]) || (x<a[y] && x>a[y-1])) {printf("no find!");break;} if (x<a[y]) m=y;
if(x>alyD if(x==ayd printf"%d at the position %d", x, y+ 1); break; 3 while(1); 7.2二维数组 721.二维数组 (1)一般说明格式是: 类型数组名[第1维长度第2维长度] 2).例如 int m32 *定义一个整数型的二维数组* char c[3[4],/*定义一个字符型的三维数组* 数组m[32共有3*2=6个元素,顺序为 mO[oJ,m[oj[1l,m[1oj,m[1[l,m[2]o],m[2][1] 数组c34共有3*4=12个元素,顺序为 [0J10]c[oJ[1] c[02], c0J3 cl1JoJcllll c[12], c[l3 c{2][o]c[2u1l.c[22],c[2[3 (3).数组占用的内存空间(即字节数)的计算式为 字节数=第1维长度*第2维长度*该数组数据类型占用的字节数 722二维数组的初始化 intp[2]3}={{2,-9,0},{8,2,-5}};/定义数组p并初始化/ intm②2][4}={{27,-5,19,3},{1,8,-14,-2}} (2)多维数组存储是连续的,因此可以用一维数组初始化的办法 来初始化多维数组。 例如 intx[2[3}={1,2,3,4,5,6};/用一维数组来初始化二维数组* 对数组初始化时,如果初值表中的数据个数比数组元素少,则 不足的数组元素自动用0来填补 3.二维数组的引用 行号和列号都是从0开始的,并注意行号和列号不要超过数组 定义的范围 a[]=2 maino intm[21[2];
if (x>a[y]) n=y; if (x==a[y]) printf("%d at the position %d",x,y+1);break;} } while (1); } 7.2 二维数组 7.2.1.二维数组 (1)一般说明格式是: 类型 数组名[第 1 维长度][第 2 维长度] (2).例如: int m[3][2]; /*定义一个整数型的二维数组*/ char c[3][4]; /*定义一个字符型的三维数组*/ 数组 m[3][2]共有 3*2=6 个元素, 顺序为: m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]; 数组 c[3][4]共有 3*4=12 个元素, 顺序为: c[0][0] c[0][1], c[0][2], c[0][3] c[1][0] c[1][1], c[1][2], c[1][3] c[2][0] c[2][1], c[2][2], c[2][3] (3). 数组占用的内存空间(即字节数)的计算式为: 字节数=第1 维长度*第2 维长度*该数组数据类型占用的字节数 7.2.2.二维数组的初始化 ( 1) int p[2][3]={{2, -9, 0}, {8, 2, -5}}; /*定义数组 p 并初始化/* int m[2][4]={{27, -5, 19, 3}, {1, 8, -14, -2}}; (2) 多维数组存储是连续的, 因此可以用一维数组初始化的办法 来初始化多维数组。 例如: int x[2][3]={1, 2, 3, 4, 5, 6}; /*用一维数组来初始化二维数组*/ (3) 对数组初始化时, 如果初值表中的数据个数比数组元素少, 则 不足的数组元素自动用 0 来填补。 3. 二维数组的引用 行号和列号都是从 0 开始的,并注意行号和列号不要超过数组 定义的范围。 a[0][0]=1; a[0][1]=2;…. main() { int m[2][2];