1、C语言程序设计第8章 数组 n一维数组的声明、初始化和使用一维数组的声明、初始化和使用 n数组的运算、作为函数参数的使用数组的运算、作为函数参数的使用 n字符串字符串、多维数组、多维数组 11/14/202218.1 8.1 数组概述数组概述n程序程序=算法算法+数据结构数据结构nPASCAL程序设计语言发明者程序设计语言发明者Niklaus Wirth曾经说过曾经说过 n简单数据类型的变量简单数据类型的变量n仅能描述一个单独的数据仅能描述一个单独的数据n描述能力十分有限描述能力十分有限 n如何描述一群有联系的数据集合?如何描述一群有联系的数据集合?n数组数组n属于构造类型属于构造类型n是相同
2、数据类型数据的集合是相同数据类型数据的集合n元素元素 n组成数组的这些数据组成数组的这些数据n任何类型任何类型(简单类型、构造类型简单类型、构造类型)11/14/202228.1 8.1 数组概述数组概述n数组特点数组特点n其所有元素其所有元素数目固定数目固定n其所有元素其所有元素类型相同类型相同n其所有元素其所有元素顺序存放顺序存放 n数组作用数组作用n集中管理集中管理n将相关的同类型数据集中用一个标识符(数组名)表示将相关的同类型数据集中用一个标识符(数组名)表示n元素顺序存放,但可随机定位元素顺序存放,但可随机定位n用若干个数字序号(下标)来区别各数组元素用若干个数字序号(下标)来区别各
3、数组元素n例如定义例如定义float score30,可表述,可表述30位学生成绩位学生成绩 n用数组具有什么好处?用数组具有什么好处?11/14/202238.1 8.1 数组概述数组概述n问题问题n计算全班计算全班30位同学某门课程的平均成绩位同学某门课程的平均成绩 n解决方法解决方法n设置设置30个个float型变量来记录成绩型变量来记录成绩n设置一个有设置一个有30个个float型元素的数组来记录成绩型元素的数组来记录成绩n问题分析问题分析n参与运算的平均成绩,其数据类型都相同参与运算的平均成绩,其数据类型都相同(符合数组特点符合数组特点)n30位同学属于一个班,用数组可把位同学属于一
4、个班,用数组可把30个成绩表示成一个整体个成绩表示成一个整体n用数组的优点用数组的优点n便于循环处理n提高效率,便于书写、检查、修改(对海量数据效果更明显)11/14/202248.2 8.2 一维数组一维数组n维数维数 n标识一个数组元素所需要使用的下标的个数标识一个数组元素所需要使用的下标的个数 n一维数组一维数组n只有一个下标只有一个下标n可用于表示一个线性的数据队列可用于表示一个线性的数据队列n 使用数组的要求使用数组的要求n先声明数组先声明数组n对它进行初始化,然后才能使用对它进行初始化,然后才能使用11/14/202258.2.1 8.2.1 一维数组的声明一维数组的声明n要解决三
5、个问题要解决三个问题n确定数组的数据类型确定数组的数据类型n给数组定义一个名字,以便在程序中使用给数组定义一个名字,以便在程序中使用n指明数组的大小,即数组中元素的个数指明数组的大小,即数组中元素的个数 n声明形式声明形式n存储类型说明符存储类型说明符 类型修饰符类型修饰符 类型说明符类型说明符 数组数组名名常量表达式常量表达式=初值表初值表;n存储类型说明符:存储类型说明符:extern、static n类型修饰符:类型修饰符:const、volatile n数组名:是一个标识符,是一个地址常量,用以表数组名:是一个标识符,是一个地址常量,用以表示数组中打头元素的地址示数组中打头元素的地址
6、11/14/202268.2.1 8.2.1 一维数组的声明一维数组的声明n例例8.1 具有基本数据类型的一维数组的声明具有基本数据类型的一维数组的声明n#define SIZE 10nint array5;ndouble d5,eSIZE;nchar nameSIZE*5;n 错误例子错误例子nunsigned int size;nchar strsize,buffer2*size;n 错误原因错误原因n数组的大小一经说明就不能改变数组的大小一经说明就不能改变n长度说明不是长度说明不是常量常量表达式,在编译之前就必须明确确定表达式,在编译之前就必须明确确定11/14/202278.2.1 8
7、.2.1 一维数组的声明一维数组的声明例例8.2 采用类型修饰符的一维数组的声明采用类型修饰符的一维数组的声明nstatic int y10;n数组数组y中的每一个成员都是静态整型成员中的每一个成员都是静态整型成员nextern double s2;n作了一个外部双精度型数组的引用性声明作了一个外部双精度型数组的引用性声明n应该在另外的源文件中通过应该在另外的源文件中通过double s2;来定义来定义s数组,这样第数组,这样第2个声明语句才有意义个声明语句才有意义11/14/202288.2.2 8.2.2 一维数组的使用一维数组的使用nC提供的各种操作符提供的各种操作符 n针对基本数据类型
8、的变量针对基本数据类型的变量n数组数组n是构造数据类型是构造数据类型n但其元素是基本数据类型的变量但其元素是基本数据类型的变量n访问数组访问数组n不需设计专门的数组操作符不需设计专门的数组操作符n方法:数组名方法:数组名下标表达式下标表达式n例例int a5,j=2;n5个元素依次是个元素依次是a0,a1,a2,a3,a4naj+2、a+j、aj-、a5*j-7 n错误写法:错误写法:aj-3、a2*j+1 11/14/20229例例8.3 8.3 使用一维数组计算学生使用一维数组计算学生的平均成绩。的平均成绩。1.#include stdio.h2.void main(void)3.4.in
9、t score30,i,sum=0;5.double average;6.printf(input the scores please:n);7.for(i=0;i30;i+)8.scanf(“%d”,&scorei);/*将键盘输入的成绩赋给各个将键盘输入的成绩赋给各个数组元素数组元素*/9.for(i=0;i30;i+)10.sum+=scorei;/*求学生成绩的累加和求学生成绩的累加和*/11.average=sum/30.0;/*计算平均成绩计算平均成绩*/12.printf(sum=%dn,sum);13.printf(average=%lfn,average);14.11/14/
10、2022108.2.3 8.2.3 一维数组的初始化一维数组的初始化n显式初始化值的个数与说明长度相同显式初始化值的个数与说明长度相同nint x5=0,1,2,3,4;nint y5=0,1,2,3,4,5;错误:初值个数大于数组长度错误:初值个数大于数组长度n有初始化值时,长度说明可缺省有初始化值时,长度说明可缺省n数组长度由初值个数确定数组长度由初值个数确定nint y=1,2,3,4,5,6,7,8;n初始化值的个数可以小于说明长度,但只能缺省最后初始化值的个数可以小于说明长度,但只能缺省最后连续元素的初值连续元素的初值nint z10=0,1,2,3,4;/*前前5个下标变量赋值个下
11、标变量赋值*/nint u9=,1,2;错误:缺省错误:缺省u0,u2不是最后连续不是最后连续元素元素11/14/202211例例8.8 8.8 观察局部数组、静态数组观察局部数组、静态数组和外部数组的缺省初值的程序和外部数组的缺省初值的程序 1.#include stdio.h2.double s2;3.void main(void)4.5.int a2,i;6.static int b2;7.for(i=0;i2;i+)8.printf(s%d=%dn,i,si);9.printf(a%d=%dn,i,ai);10.printf(b%d=%dn,i,bi);11.12.n程序的运行结果如下
12、:程序的运行结果如下:s0=0,a0=64,b0=0 s1=0,a1=3129,b1=0n结论:结论:外部数组外部数组s和静态数组和静态数组b的元素的缺省初值都是的元素的缺省初值都是0 局部数组局部数组a的初值则是随的初值则是随机的机的 11/14/2022128.2.4 8.2.4 一维数组的存储结构一维数组的存储结构n存放方法存放方法n各个元素从数组名标明的起始地址开始在内各个元素从数组名标明的起始地址开始在内存中连续存放存中连续存放 n例如例如int a5;n这里是这里是16位机,位机,1个个int变量占变量占2个字节空间个字节空间数组元素 a0a1a2a3a4元素地址 a+0a+1a+
13、2a+3a+4&a0&a1&a2&a3&a411/14/202213例例8.9 8.9 观察一维数组的存储情观察一维数组的存储情况的程序况的程序 1.#include stdio.h2.#define SIZE 33.void main(void)4.5.int xSIZE=1,3,5,k;6.char sSIZE+1=ABC;7.float fSIZE=1.414,3.1415,5.25;8.printf(the value of x is 0 x%xn,x);9.for(k=0;kSIZE;k+)10.printf(x%d=%dt addr=0 x%xn,xk,&xk);n程序运行结果如下
14、:程序运行结果如下:the value of x is 0 xffc8 x0=1 addr=0 xffc8 x1=3 addr=0 xffca x2=5 addr=0 xffcc11/14/202214例例8.9 8.9 观察一维数组的存储情观察一维数组的存储情况的程序况的程序 11.k=0;12.printf(nthe value of s is 0 x%xn,x);13.while(sk)14.printf(s%d=%ct addr=0 x%xn,sk,&sk),k+;15.printf(s%d+X=%ct addr=0 x%xn,sk+X,&sk);16.printf(nthe valu
15、e of f is 0 x%xn,f);17.for(k=0;kSIZE;k+)18.printf(f%d=%ft addr=0 x%xn,fk,&fk);19.n程序运行结果如下:程序运行结果如下:the value of s is 0 xffce s0=A addr=0 xffce s1=B addr=0 xffcf s2=C addr=0 xffd0s3+X=X addr=0 xffd1the value of f is 0 xffd2f0=1.414000 addr=0 xffd2f1=3.141500 addr=0 xffd6f2=5.250000 addr=0 xffda11/14
16、/2022158.2.5 8.2.5 一维数组的运算一维数组的运算nC提供的各种操作符提供的各种操作符 n赋值运算、各种算术运算、赋值运算、各种算术运算、+、-n针对基本数据类型的变量针对基本数据类型的变量n可针对可针对int、float、以及、以及double类型数组中类型数组中元素元素n合法操作合法操作 nint x3=1,2,3,y3=4,5,6,z3,k=1;nz0=x0+y0;nz1=x0+y3;nzk=+x0+-yk+;nz1=x0+yx1;n不允许两个数组直接相加不允许两个数组直接相加nz=x+y;编译时给出提示编译时给出提示“cannot add two pointers”11
17、/14/202216数组的直接相加数组的直接相加 n例例8.10 n设设5个同学修了高等数学个同学修了高等数学普通物理、程序设计普通物理、程序设计语言并取得了成绩,现计算三门课总分、平均分,语言并取得了成绩,现计算三门课总分、平均分,每门课的总分、平均分,每个同学的总分、平均每门课的总分、平均分,每个同学的总分、平均分分1.#include stdio.h2.#define SIZE 53.void main(void)4.5.int mathSIZE=91,67,88,78,81;6.int physicsSIZE=87,79,81,86,67;7.int programmingSIZE=8
18、6,81,85,92,87;/*3个数组依次存放数学、物理、程序设计的成绩个数组依次存放数学、物理、程序设计的成绩*/11/14/202217例例8.108.108.int course_sum3=0,0,0;9.double course_even3;/*分别为各门课程总分、平均分数分别为各门课程总分、平均分数组组*/10.int student_sum5=0,0,0,0,0;11.double student_even5;/*分别为各位同学总分、平均分数分别为各位同学总分、平均分数组组*/12.int sum=0;13.double even;/*分别为全部课程的总分、平均分分别为全部课程
19、的总分、平均分*/14.int i;15.for(i=0;i5;i+)16.course_sum0+=mathi;17.course_sum1+=physicsi;18.course_sum2+=program mingi;19./*计算各门课程的总分计算各门课程的总分*/20.for(i=0;i3;i+)21.course_eveni=course_su mi/5.0;22.sum+=course_sumi;23./*计算各门课平总分计算各门课平总分*/24.even=sum/(3.0*SIZE);/*计算全部课程的平均分计算全部课程的平均分*/11/14/202218例例8.108.102
20、5.for(i=0;i5;i+)/*计算每个学生的总分、平均分计算每个学生的总分、平均分*/26.student_sumi=mathi+physicsi+programmingi;27.student_eveni=student_sumi/3.0;28.29.printf(三门课程的总分三门课程的总分:%dn,sum);30.printf(三门课程的平均分三门课程的平均分:%lfn,even);n程序的运行结果如下程序的运行结果如下 三门课程的总分三门课程的总分:1236 三门课程的平均分三门课程的平均分:82.40000011/14/202219例例8.108.1031.for(i=0;i3
21、;i+)32.printf(course_sum%d=%dn,i,course_sumi);33.printf(course_even%d=%lfn,i,course_eveni);34.n程序的运行结果如下程序的运行结果如下 course_sum0=405 course_even0=81.000000 course_sum1=400 course_even1=80.000000 course_sum2=431 course_even2=86.200000 11/14/202220例例8.108.1035.for(i=0;i=n-1n一遍循环中未发生交换,即已排一遍循环中未发生交换,即已排好序
22、好序11/14/202226例例8.12 8.12 冒泡排序冒泡排序1.void bubble_sort(int a,int n)/*形参用形式数组形参用形式数组a*/2.3.int i,j,t,k;int flag=1;4.for(i=0;(in-1)&flag;i+)*共进行共进行n-1轮轮冒泡冒泡*/5.6.flag=0;7.for(j=0;jaj+1)/*对两两相邻的元素进行比较对两两相邻的元素进行比较*/9.t=aj,aj=aj+1,aj+1=t;10.flag=1;11.12.13.11/14/2022278.3 8.3 字符数组字符数组8.3.1 字符数组的声明和使用字符数组的声
23、明和使用n字符数组字符数组n元素的数据类型为元素的数据类型为char或或wchar_t n声明格式声明格式n与前面讨论的一维数组相同与前面讨论的一维数组相同nchar s81;n字符串字符串n用一对双引号界定的一个字符序列用一对双引号界定的一个字符序列nC语言没有规定字符串类型语言没有规定字符串类型n用一个字符数组来存放字符序列,并且在末尾加一个空字用一个字符数组来存放字符序列,并且在末尾加一个空字符符0来构造字符串来构造字符串 11/14/2022288.3 8.3 字符数组字符数组n字符串的存储字符串的存储 n字符串的长度字符串的长度n字符串的长度字符串的长度=字符串的存储长度字符串的存储
24、长度1 n设计字符数组的最小长度设计字符数组的最小长度n应该等于该字符串的存储长度应该等于该字符串的存储长度n或字符数组的最小长度应该等于该字符串的长度加或字符数组的最小长度应该等于该字符串的长度加1 n字符数组的使用字符数组的使用 n通过下标来访问字符数组中的具体字符元素通过下标来访问字符数组中的具体字符元素 W u h a n 011/14/2022291.#include stdio.h2.void main(void)3.char Capital27,Lowercase27;4.int i,delt=a-A;5.Capital0=A;6.Lowercase0=Capital0+delt
25、;7.for(i=1;i0?great12.then:strcmp(s1,s2)0?great14.then:strcmp(s1,s3)0?great16.then:strcmp(s1,s4)0?less then:equal to,s4);17.n运行结果:运行结果:car is great then bus.car is less then truck.car is equal to car.11/14/202236例例8.17 8.17 字符串的连接函数字符串的连接函数 1.char*strcat(char t,char s)2.int j=0,k=0;3.while(tj+!=0)4.
26、;5.j-;6.while(tj+=sk+);7.return t;8.9.void main(void)10.11.char s180=I like,s2=the C programming.;12.strcat(s1,s2);13.printf(%sn,s1);14.n运行结果:运行结果:I like the C programming.11/14/202237例例8.18 8.18 求字符串子串的函数求字符串子串的函数 1.int strstr(char cs,char ct)2.int j=0,k;3.for(;csj!=0;j+)4.if(csj=ct0)5.k=1;6.while(
27、csj+k=ctk&ctk!=0)7.k+;8.if(k=strlen(ct)9.return j;10.11.return-1;12.void main(void)13.char s180=C is the most widely used programming language.,s2=use;14.int i,j=0;15.i=strstr(s1,s2);16.printf(the sub_strings beginning position is%dn,i);17.while(ji)18.putchar(s1j+);19.putchar(n);20.while(putchar(s1i
28、+)21.;22.putchar(n);n运行结果:运行结果:the sub_strings beginning position is 21 C is the most widely used programming language.11/14/202238例例8.19 8.19 删除字符串首尾空白删除字符串首尾空白字符的函数字符的函数 1.int trim(char s)2.int i,num,j=0,k=0,L=strlen(s);3.while(sj=|sj=t|sj=n|sj=r)4.j+;/*j计算首部空白字符的个数计算首部空白字符的个数*/5.i=L-1;/*i为字符串最后一个
29、字符为字符串最后一个字符(0前面前面)的下标的下标*/6.while(si-k=|si-k=t|si-k=n|si-k=r)7.k+;/*k计算尾部空白字符的个数计算尾部空白字符的个数*/8.num=L-j-k;9.for(i=0;inum;i+)10.si=si+j;11.snum=0;12.return strlen(s);11/14/202239例例8.20 8.20 从字符串从字符串s s中删除所有中删除所有与给定字符相同的字符与给定字符相同的字符 从字符串从字符串s中去掉与字符变量中去掉与字符变量c值相同的字符值相同的字符 1.void delete_c(char s,char c)
30、2.3.int j=0,k=0;/*j-读指示器,读指示器,k-写指示器写指示器*/4.while(sj!=0)5.if(sj!=c)6.sk+=sj;7.j+;8.9.sk=0;10.11/14/202240例例8.21 8.21 将字符串反转的函数将字符串反转的函数 将一个字符串首尾颠倒过来将一个字符串首尾颠倒过来如:将如:将abcde颠倒为颠倒为edcba1.void reverse(char s)2.3.int j,k;/*j-前指示器前指示器 k-尾指示器尾指示器*/4.char c;5.for(j=0,k=strlen(s)-1;jk;j+,k-)6.c=sj,sj=sk,sk=c
31、;7.11/14/202241上面三个函数的应用上面三个函数的应用 1.void main(void)2.char str80=atbtctdtetft ;3.printf(before trim,the string is%sn,str);4.trim(str);5.printf(after trim,the string is%sn,str);6.delete_c(str,t);7.printf(after delete t,the string is%sn,str);8.reverse(str);9.printf(after reverse,the string is%sn,str);n
32、运行结果:运行结果:before trim,the string is atbtctdtetft after trim,the string is atbtctdtetft after delete t,the string is abcdef after reverse,the string is fedcba11/14/2022428.4.2 8.4.2 数字串与数之间转换的数字串与数之间转换的函数函数 例例8.22 将一个十进制数字串转换成为对应的整数的函数将一个十进制数字串转换成为对应的整数的函数natoi函数功能函数功能n将将s字符数组中存放的一个十进制数字串转换成为对应的整数,字符
33、数组中存放的一个十进制数字串转换成为对应的整数,并返回该整数并返回该整数n算法算法:nASCII码字符码字符sj转换为对应数字转换为对应数字nsj-0n本位乘以本位乘以10加下一位的算法加下一位的算法n54321=(5)*10+4)*10+3)*10+2*10)+111/14/202243atoiatoi函数函数1.#define BASE 102.int atoi(char s)3.4.int j=0,num=0;5.for(;sj!=0;j+)6.num=num*BASE+sj-0;7.return num;8.11/14/202244例例8.23 8.23 将一个整数转换成为将一个整数转
34、换成为基数为基数为BASEBASE的数字串的函数的数字串的函数 1.#define BASE 102.void itoa(int n,char s)3.int sign,j=0;4.if(sign=n)0)7.sj+=n%BASE+0;8.n/=BASE;9.if(sign=0&sj=a&sj=A&sj=F)num=num*16+sj-A+10;11.12.return num;13.11/14/2022478.5 8.5 多维数组多维数组语文 数学010285829195n实际应用实际应用n有时需要用多个下标来实现对数组元素的访问有时需要用多个下标来实现对数组元素的访问 n例如例如n张三同学
35、,学号为张三同学,学号为01,语文和数学成绩分别为,语文和数学成绩分别为85,91,李四同学,学号位李四同学,学号位02,语文和数学成绩分别为,语文和数学成绩分别为82,95 n解决方法解决方法n用二维数组可以描述学号用二维数组可以描述学号-课程成绩表中的成绩数据课程成绩表中的成绩数据 n多维数组的用途多维数组的用途n二维数组可以描述数学中的矩阵或行列式二维数组可以描述数学中的矩阵或行列式n三维数组可以描述空间中的点集三维数组可以描述空间中的点集nn维数组来描述维数组来描述n维线性空间中的维线性空间中的n维向量维向量 11/14/2022488.5.1 8.5.1 多维数组的说明与使用多维数组
36、的说明与使用n形式形式 n类型说明类型说明 数组名数组名常量表达式常量表达式1 常量表达常量表达式式2常量表达式常量表达式n=初值表初值表;n类型说明:类型说明:存储类型说明符存储类型说明符 类型修饰符类型修饰符 数数据类型据类型n例如,例如,int x22;n对其元素的引用对其元素的引用 n数组名数组名下标下标1 下标下标2下标下标n n例如,例如,x10=3;11/14/202249例例8.25 8.25 对二维数组中元素的对二维数组中元素的访问与操作访问与操作 1.#include stdio.h2.void main(void)3.4.int x23,a=2;5.x02=8;6.sca
37、nf(%d,&x12);7.x11=x02;8.x12=a;/*将元素将元素x12的内容左移的内容左移2位位*/9.printf(%dn,x12);10.11/14/202250n计算每个同学的平均成绩并且输出数组中各元素的地址和内容计算每个同学的平均成绩并且输出数组中各元素的地址和内容 1.#include stdio.h2.#define SIZE 23.void main(void)4.int xSIZESIZE+1;5.int i,j;6.for(i=0;iSIZE;i+)7.for(j=0;jSIZE;j+)8.scanf(%d,&xij);9.xiSIZE=(xi0+xi1)/2;
38、10.printf(n);例例8.26 8.26 用二维数组表示学号用二维数组表示学号-课程成绩表课程成绩表 n输入如下:输入如下:85 91 82 95语文数学01028582919511/14/202251例例8.26 8.26 用二维数组表示学号用二维数组表示学号-课程成绩表课程成绩表11.for(i=0;iSIZE;i+)12.for(j=0;jSIZE+1;j+)13.printf(%ptx%d%d=%dt,&xij,i,j,xij);14.printf(n);15.16.n程序的运行结果为:程序的运行结果为:FFD0 x00=85 FFD2 x01=91 FFD4 x02=88 F
39、FD6 x10=82 FFD8 x11=95 FFDA x12=8811/14/2022528.5.2 8.5.2 多维数组的存储结构多维数组的存储结构x00=85x01=91x02=88x10=82x11=95x12=88地 址元 素值0 xFFD0 x00850 xFFD20 xFFD40 xFFD60 xFFD80 xFFDAx01x02x10 x11x129188829588二维数组x的逻辑存储结构 二维数组x的物理存储结构 11/14/2022538.5.3 8.5.3 多维数组的初始化多维数组的初始化n按照物理存储结构的顺序按照物理存储结构的顺序nint a22=85,91,82,
40、95;n按照逻辑存储结构的顺序按照逻辑存储结构的顺序n可读性好,但初值表的形式与数组的维数有关可读性好,但初值表的形式与数组的维数有关 nint x23=85,91,0,82,95,0;nint d222=1,2,3,4,5,6,7,8;n注意注意n当数组的初值全部给出时,第当数组的初值全部给出时,第1维大小的说明可以省略维大小的说明可以省略nint x 3=85,91,0,82,95,0;nint d 22=1,2,3,4,5,6,7,8;n其它维大小不能省略其它维大小不能省略11/14/2022548.5.4 8.5.4 二维字符数组二维字符数组n二维字符数组二维字符数组 n与其它二维数组
41、类似与其它二维数组类似 n用用char说明的二维数组说明的二维数组nchar text2580;n初始化初始化 n与其它二维数组类似与其它二维数组类似nchar s24=a,b,c,0,d,e,f,0;nchar s24=a,b,c,0,d,e,f,0;n用字符串对二维数组进行初始化用字符串对二维数组进行初始化nchar devices312=“hard disk”,”CRT”,”keyboard”;n省略第省略第1维的方式维的方式 nchar devices 12=“hard disk”,”CRT”,”keyboard”;11/14/202255二维字符数组的使用二维字符数组的使用 n引用单
42、个字符元素引用单个字符元素 nweekendij=m;n引用字符串引用字符串 nweekendi表示表示weekend数组中第数组中第i行字行字符串的首地址符串的首地址nprintf(“%s”,weekendi);11/14/202256例例8.27 8.27 字符串数组的输入输字符串数组的输入输出操作出操作 1.#include stdio.h2.void main(void)3.4.int i;5.char devices312=hard disk,CRT,keyboard;6.devices00=H;/*hard disk变为变为Hard disk*/7.devices20=K;/*ke
43、yboard 变为变为Keyboard*/8.for(i=0;i3;i+)9.printf(%sn,&devicesi0);10.scanf(%s,devices1);11.for(i=0;i3;i+)12.printf(%sn,devicesi);13.11/14/202257*8.6 8.6 数组的应用程序设计数组的应用程序设计30323130222120121110020100232221201312111003020100,kkjikijbacBACbbbbbbbbbbbbBaaaaaaaaaaaaA其中8.6.1 矩阵乘法运算矩阵乘法运算n算法算法n定义定义3个个2维数组维数组 n通
44、过三重循环来实现通过三重循环来实现 n外层循环用于控制乘积矩阵外层循环用于控制乘积矩阵C的行的行n中间层循环用于控制乘积矩阵中间层循环用于控制乘积矩阵C的列的列n内层循环用于计算乘积矩阵元素内层循环用于计算乘积矩阵元素Cij 11/14/202258例例8.28 8.28 矩阵的乘法运算矩阵的乘法运算 1.#include stdio.h2.#define N 33.#define K 44.#define M 35.void mul_matrix(int aK,int bM,int cM,int n,int k,int m)6.int i,j,p,sum;7.for(i=0;in;i+)8.
45、for(j=0;jm;j+)9.sum=0;10.for(p=0;pk;p+)11.sum+=aip*bpj;12.cij=sum;13.14.11/14/202259例例8.28 8.28 矩阵的乘法运算矩阵的乘法运算 15.void main(void)16.int ANK=1,2,3,4,5,6,7,8,9,0,1,2;17.int BKM=1,2,3,4,5,6,7,8,9,0,1,2;18.int CNM;int i,j;19.mul_matrix(A,B,C,N,K,M);20.for(i=0;iN;i+)21.for(j=0;jM;j+)22.printf(%8d ,Cij);2
46、3.printf(n);24.程序的运行结果为:程序的运行结果为:30 40 50 78 104 130 16 28 4011/14/2022608.6.2 8.6.2 基于分治策略的二分查基于分治策略的二分查找函数找函数n二分查找算法的思路二分查找算法的思路n将已排好序的将已排好序的n个元素数组个元素数组a分成两半,取分成两半,取an/2与与x比较比较n如果如果x=an/2,则找到,则找到x,算法结束,算法结束n如果如果xan/2,则在数组,则在数组a的后半部分继续查找的后半部分继续查找xn返回值返回值n如果找到如果找到x,返回该数所在单元的下标,返回该数所在单元的下标n如果没有找到,返回如
47、果没有找到,返回-1 11/14/202261例例8.29 8.29 二分查找函数二分查找函数 1.#include stdio.h2.int BinarySearch(int a,int x,int n)3.int front=0,back=n-1,middle;4.while(front=back)5.middle=(front+back)/2;/*计算中间单元的下标计算中间单元的下标*/6.if(xamiddle)9.front=middle+1;/*查找单元变成原来的后半部查找单元变成原来的后半部*/10.else11.return(middle);/*找到,返回下标找到,返回下标*/
48、12.13.return-1;/*没有找到,返回没有找到,返回-1*/11/14/202262例例8.29 8.29 二分查找函数二分查找函数 14.void main(void)15.16.int x=1,3,5,7,9,11,13,15,17,19,index;17.index=BinarySearch(x,11,10);18.if(index!=-1)19.printf(find%d!n,xindex);20.else21.printf(not find!n);22.n程序的运行结果是:程序的运行结果是:find 11!11/14/2022638.6.3 8.6.3 选择法排序选择法排序
49、122-2156789-1234n假设有下面的假设有下面的8个整数构成的数组个整数构成的数组n算法思想算法思想n首先找出数组内首先找出数组内8个元素中最小的元素个元素中最小的元素n然后将它与第一个元素(下标为然后将它与第一个元素(下标为0)交换)交换n再在剩余的后续再在剩余的后续7个元素中找出最小的元素,再将它与第二个元素中找出最小的元素,再将它与第二个元素(下标为个元素(下标为1)交换)交换n余以类推,直到在最后剩余的两个元素中找出较小者并将较余以类推,直到在最后剩余的两个元素中找出较小者并将较大者放在最后(下标为大者放在最后(下标为7)为止)为止11/14/202264例例8.30 8.3
50、0 用选择法进行排序用选择法进行排序1.#include stdio.h2.int f_small(int a,int begin,int end)/*在在begin与与end之间找最小数之间找最小数*/3.int i,p=begin;4.for(i=begin;i=end;i+)5.if(aiap)6.p=i;7.return p;8.void sel_sort(int a,int n)9./*排序函数排序函数*/10.int cur,index,t;13.for(cur=0;curn-1;cur+)14.index=f_small(a,cur,n-1);13.if(index!=cur)1