C语言程序设计第8章数组ppt课件

上传人:痛*** 文档编号:189526768 上传时间:2023-02-22 格式:PPT 页数:65 大小:587KB
收藏 版权申诉 举报 下载
C语言程序设计第8章数组ppt课件_第1页
第1页 / 共65页
C语言程序设计第8章数组ppt课件_第2页
第2页 / 共65页
C语言程序设计第8章数组ppt课件_第3页
第3页 / 共65页
资源描述:

《C语言程序设计第8章数组ppt课件》由会员分享,可在线阅读,更多相关《C语言程序设计第8章数组ppt课件(65页珍藏版)》请在装配图网上搜索。

1、C语言程序设计第8章 数组 一维数组的声明、初始化和使用 数组的运算、作为函数参数的使用 字符串、多维数组 8.1 8.1 数组概述数组概述n程序程序=算法算法+数据结构数据结构nPASCAL程序设计语言发明者程序设计语言发明者Niklaus Wirth曾经说曾经说过过 n简单数据类型的变量简单数据类型的变量n仅能描述一个单独的数据仅能描述一个单独的数据n描述能力十分有限描述能力十分有限 n如何描述一群有联系的数据集合?如何描述一群有联系的数据集合?n数组数组n属于构造类型属于构造类型n是相同数据类型数据的集合是相同数据类型数据的集合n元素元素 n组成数组的这些数据组成数组的这些数据n任何类型

2、任何类型(简单类型、构造类型简单类型、构造类型)8.1 8.1 数组概述数组概述n数组特点数组特点n其所有元素数目固定其所有元素数目固定n其所有元素类型相同其所有元素类型相同n其所有元素顺序存放其所有元素顺序存放 n数组作用数组作用n集中管理集中管理n将相关的同类型数据集中用一个标识符数组将相关的同类型数据集中用一个标识符数组名表示名表示n元素顺序存放,但可随机定位元素顺序存放,但可随机定位n用若干个数字序号下标来区别各数组元素用若干个数字序号下标来区别各数组元素n例如定义例如定义float score30,可表述,可表述30位学生位学生成绩成绩 n用数组具有什么好处?用数组具有什么好处?8.

3、1 8.1 数组概述数组概述n问题问题n计算全班计算全班30位同学某门课程的平均成绩位同学某门课程的平均成绩 n解决方法解决方法n设置设置30个个float型变量来记录成绩型变量来记录成绩n设置一个有设置一个有30个个float型元素的数组来记录成绩型元素的数组来记录成绩n问题分析问题分析n参与运算的平均成绩,其数据类型都相同参与运算的平均成绩,其数据类型都相同(符合数组特符合数组特点点)n30位同学属于一个班,用数组可把位同学属于一个班,用数组可把30个成绩表示成一个成绩表示成一个整体个整体n用数组的优点用数组的优点n便于循环处理便于循环处理n提高效率,便于书写、检查、修改提高效率,便于书写

4、、检查、修改(对海量数据效果更对海量数据效果更明显明显)8.2 8.2 一维数组一维数组n维数维数 n标识一个数组元素所需要使用的下标的标识一个数组元素所需要使用的下标的个数个数 n一维数组一维数组n只有一个下标只有一个下标n可用于表示一个线性的数据队列可用于表示一个线性的数据队列n 使用数组的要求使用数组的要求n先声明数组先声明数组n对它进行初始化,然后才能使用对它进行初始化,然后才能使用8.2.1 8.2.1 一维数组的声明一维数组的声明n要解决三个问题要解决三个问题n确定数组的数据类型确定数组的数据类型n给数组定义一个名字,以便在程序中使用给数组定义一个名字,以便在程序中使用n指明数组的

5、大小,即数组中元素的个数指明数组的大小,即数组中元素的个数 n声明形式声明形式n存储类型说明符存储类型说明符 类型修饰符类型修饰符 类型说明符类型说明符 数组名数组名常量表达式常量表达式=初值表初值表;n存储类型说明符:存储类型说明符:extern、static n类型修饰符:类型修饰符:const、volatile n数组名:是一个标识符,是一个地址常量,用数组名:是一个标识符,是一个地址常量,用以表示数组中打头元素的地址以表示数组中打头元素的地址 8.2.1 8.2.1 一维数组的声明一维数组的声明n例例8.1 具有基本数据类型的一维数组的声明具有基本数据类型的一维数组的声明n#defin

6、e SIZE 10nint array5;ndouble d5,eSIZE;nchar nameSIZE*5;n 错误例子错误例子nunsigned int size;nchar strsize,buffer2*size;n 错误原因错误原因n数组的大小一经说明就不能改变数组的大小一经说明就不能改变n长度说明不是常量表达式,在编译之前就必须明确确长度说明不是常量表达式,在编译之前就必须明确确定定8.2.1 8.2.1 一维数组的声明一维数组的声明例例8.2 采用类型修饰符的一维数组的声明采用类型修饰符的一维数组的声明static int y10;数组数组y中的每一个成员都是静态整型成员中的每一

7、个成员都是静态整型成员extern double s2;作了一个外部双精度型数组的引用性声明作了一个外部双精度型数组的引用性声明应该在另外的源文件中通过应该在另外的源文件中通过double s2;来定义来定义s数组,这样第数组,这样第2个声明语句才有意义个声明语句才有意义8.2.2 8.2.2 一维数组的使用一维数组的使用nC提供的各种操作符提供的各种操作符 n针对基本数据类型的变量针对基本数据类型的变量n数组数组n是构造数据类型是构造数据类型n但其元素是基本数据类型的变量但其元素是基本数据类型的变量n访问数组访问数组n不需设计专门的数组操作符不需设计专门的数组操作符n方法:数组名方法:数组名

8、下标表达式下标表达式n例例int a5,j=2;n5个元素依次是个元素依次是a0,a1,a2,a3,a4naj+2、a+j、aj-、a5*j-7 n错误写法:错误写法:aj-3、a2*j+1 例例8.3 8.3 使用一维数组计算学生使用一维数组计算学生的平均成绩。的平均成绩。n#include stdio.hnvoid main(void)nn int score30,i,sum=0;n double average;n printf(input the scores please:n);n for(i=0;i30;i+)n scanf(“%d”,&scorei);/*将键盘输入的成绩赋给各个

9、数组元素*/nfor(i=0;i30;i+)n sum+=scorei;/*求学生成绩的累加和*/naverage=sum/30.0;/*计算平均成绩*/nprintf(sum=%dn,sum);nprintf(average=%lfn,average);n8.2.3 8.2.3 一维数组的初始化一维数组的初始化n显式初始化值的个数与说明长度相同显式初始化值的个数与说明长度相同nint x5=0,1,2,3,4;nint y5=0,1,2,3,4,5;错误:初值个数大于数错误:初值个数大于数组长度组长度n有初始化值时,长度说明可缺省有初始化值时,长度说明可缺省n数组长度由初值个数确定数组长度由

10、初值个数确定nint y=1,2,3,4,5,6,7,8;n初始化值的个数可以小于说明长度,但只能缺省最后初始化值的个数可以小于说明长度,但只能缺省最后连续元素的初值连续元素的初值nint z10=0,1,2,3,4;/*前前5个下标变量个下标变量赋值赋值*/nint u9=,1,2;错误:缺省错误:缺省u0,u2不不是最后连续元素是最后连续元素例例8.8 8.8 观察局部数组、静态数组观察局部数组、静态数组和外部数组的缺省初值的程序和外部数组的缺省初值的程序 n#include stdio.hndouble s2;nvoid main(void)nn int a2,i;n static in

11、t b2;n for(i=0;i2;i+)n printf(s%d=%dn,i,si);n printf(a%d=%dn,i,ai);n printf(b%d=%dn,i,bi);n n n程序的运行结果如下:n s0=0,a0=64,b0=0n s1=0,a1=3129,b1=0n结论:n 外部数组s和静态数组b的元素的缺省初值都是0n 局部数组a的初值则是随机的 8.2.4 8.2.4 一维数组的存储结构一维数组的存储结构n存放方法n各个元素从数组名标明的起始地址开始在内存中连续存放 n例如int a5;n这里是16位机,1个int变量占2个字节空间数组元素 a0a1a2a3a4元素地址

12、a+0a+1a+2a+3a+4&a0&a1&a2&a3&a4例例8.9 8.9 观察一维数组的存储情观察一维数组的存储情况的程序况的程序 n#include stdio.hn#define SIZE 3nvoid main(void)nn int xSIZE=1,3,5,k;n char sSIZE+1=ABC;n float fSIZE=1.414,3.1415,5.25;n printf(the value of x is 0 x%xn,x);n for(k=0;kSIZE;k+)n printf(x%d=%dt addr=0 x%xn,xk,&xk);n程序运行结果如下:n the va

13、lue of x is 0 xffc8n x0=1 addr=0 xffc8n x1=3 addr=0 xffcan x2=5 addr=0 xffcc例例8.9 8.9 观察一维数组的存储情观察一维数组的存储情况的程序况的程序 nk=0;nprintf(nthe value of s is 0 x%xn,x);nwhile(sk)n printf(s%d=%ct addr=0 x%xn,sk,&sk),k+;nprintf(s%d+X=%ct addr=0 x%xn,sk+X,&sk);nprintf(nthe value of f is 0 x%xn,f);nfor(k=0;kSIZE;k

14、+)n printf(f%d=%ft addr=0 x%xn,fk,&fk);nn程序运行结果如下:n the value of s is 0 xffcen s0=A addr=0 xffcen s1=B addr=0 xffcfn 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 xffda8.2.5 8.2.5 一维数组的运算一维数组的运算nC提供的各种操作符提供的各种操作符 n赋值运算

15、、各种算术运算、赋值运算、各种算术运算、+、-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”数组的直接相加数组的直接相加 n例例8.10 n设设5个同学修了高等数学普通物理、程序设计语言个同学修了高等数学普通物

16、理、程序设计语言并取得了成绩,现计算三门课总分、平均分,每门并取得了成绩,现计算三门课总分、平均分,每门课的总分、平均分,每个同学的总分、平均分课的总分、平均分,每个同学的总分、平均分n#include stdio.hn#define SIZE 5nvoid main(void)n n int mathSIZE=91,67,88,78,81;n int physicsSIZE=87,79,81,86,67;n int programmingSIZE=86,81,85,92,87;/*3个数组依次存放数学、物理、程序设计的成绩个数组依次存放数学、物理、程序设计的成绩*/例例8.108.10nin

17、t course_sum3=0,0,0;ndouble course_even3;/*分别为各门课程总分、平均分数组*/nint student_sum5=0,0,0,0,0;ndouble student_even5;/*分别为各位同学总分、平均分数组*/nint sum=0;ndouble even;/*分别为全部课程的总分、平均分*/nint i;nfor(i=0;i5;i+)n course_sum0+=mathi;n course_sum1+=physicsi;n course_sum2+=program mingi;n/*计算各门课程的总分*/nfor(i=0;i3;i+)n co

18、urse_eveni=course_su mi/5.0;n sum+=course_sumi;n/*计算各门课平总分*/neven=sum/(3.0*SIZE);/*计算全部课程的平均分*/例例8.108.10nfor(i=0;i5;i+)/*计算每个学生的总分、平均分计算每个学生的总分、平均分*/n student_sumi=mathi+physicsi+programmingi;n student_eveni=student_sumi/3.0;n nprintf(三门课程的总分三门课程的总分:%dn,sum);nprintf(三门课程的平均分三门课程的平均分:%lfn,even);n程序的

19、运行结果如下程序的运行结果如下 n 三门课程的总分三门课程的总分:1236n 三门课程的平均分三门课程的平均分:82.400000例例8.108.10nfor(i=0;i3;i+)n printf(course_sum%d=%dn,i,course_sumi);n printf(course_even%d=%lfn,i,course_eveni);n n程序的运行结果如下程序的运行结果如下 n course_sum0=405n course_even0=81.000000n course_sum1=400n course_even1=80.000000n course_sum2=431n co

20、urse_even2=86.200000 例例8.108.10nfor(i=0;i=n-1n一遍循环中未发生交换,即已排好序例例8.12 8.12 冒泡排序冒泡排序nvoid bubble_sort(int a,int n)/*形参用形式数组形参用形式数组a*/nnint i,j,t,k;int flag=1;nfor(i=0;(in-1)&flag;i+)*共进行共进行n-1轮轮冒泡冒泡*/nn flag=0;n for(j=0;jaj+1)/*对两两相邻的元素进行比较对两两相邻的元素进行比较*/n t=aj,aj=aj+1,aj+1=t;n flag=1;n nn8.3 8.3 字符数组字

21、符数组8.3.1 字符数组的声明和使用字符数组的声明和使用字符数组字符数组元素的数据类型为元素的数据类型为char或或wchar_t 声明格式声明格式与前面讨论的一维数组相同与前面讨论的一维数组相同char s81;字符串字符串用一对双引号界定的一个字符序列用一对双引号界定的一个字符序列C语言没有规定字符串类型语言没有规定字符串类型用一个字符数组来存放字符序列,并且在末尾加用一个字符数组来存放字符序列,并且在末尾加一个空字符一个空字符0来构造字符串来构造字符串 8.3 8.3 字符数组字符数组n字符串的存储 n字符串的长度n字符串的长度=字符串的存储长度1 n设计字符数组的最小长度n应该等于该

22、字符串的存储长度n或字符数组的最小长度应该等于该字符串的长度加1 n字符数组的使用 n通过下标来访问字符数组中的具体字符元素 W u h a n 0n#include stdio.hnvoid main(void)n char Capital27,Lowercase27;n int i,delt=a-A;n Capital0=A;n Lowercase0=Capital0+delt;n for(i=1;i0?greatn then:strcmp(s1,s2)0?greatn then:strcmp(s1,s3)0?greatn then:strcmp(s1,s4)0?less then:equ

23、al to,s4);nn运行结果:运行结果:n car is great then bus.n car is less then truck.n car is equal to car.例例8.17 8.17 字符串的连接函数字符串的连接函数 nchar*strcat(char t,char s)nint j=0,k=0;nwhile(tj+!=0)n;nj-;nwhile(tj+=sk+);nreturn t;nnvoid main(void)nnchar s180=I like,s2=the C programming.;nstrcat(s1,s2);nprintf(%sn,s1);nn运

24、行结果:n I like the C programming.例例8.18 8.18 求字符串子串的函数求字符串子串的函数 nint strstr(char cs,char ct)nint j=0,k;n for(;csj!=0;j+)n if(csj=ct0)n k=1;n while(csj+k=ctk&ctk!=0)n k+;n if(k=strlen(ct)n return j;n n return-1;nvoid main(void)nchar s180=C is the most widely used programming language.,s2=use;nint i,j=0

25、;ni=strstr(s1,s2);nprintf(the sub_strings beginning position is%dn,i);nwhile(ji)nputchar(s1j+);nputchar(n);nwhile(putchar(s1i+)n;nputchar(n);n运行结果:n the sub_strings beginning position is 21n C is the most widelyn used programming language.例例8.19 8.19 删除字符串首尾空白删除字符串首尾空白字符的函数字符的函数 nint trim(char s)n i

26、nt i,num,j=0,k=0,L=strlen(s);n while(sj=|sj=t|sj=n|sj=r)nj+;/*j计算首部空白字符的个数计算首部空白字符的个数*/ni=L-1;/*i为字符串最后一个字符为字符串最后一个字符(0前面前面)的下标的下标*/nwhile(si-k=|si-k=t|si-k=n|si-k=r)nk+;/*k计算尾部空白字符的个数计算尾部空白字符的个数*/nnum=L-j-k;nfor(i=0;inum;i+)nsi=si+j;nsnum=0;nreturn strlen(s);例例8.20 8.20 从字符串从字符串s s中删除所有中删除所有与给定字符相同

27、的字符与给定字符相同的字符 从字符串从字符串s中去掉与字符变量中去掉与字符变量c值相同的字符值相同的字符 void delete_c(char s,char c)int j=0,k=0;/*j-读指示器,读指示器,k-写指示器写指示器*/while(sj!=0)if(sj!=c)sk+=sj;j+;sk=0;例例8.21 8.21 将字符串反转的函数将字符串反转的函数 将一个字符串首尾颠倒过来如:将将一个字符串首尾颠倒过来如:将abcde颠倒为颠倒为edcbavoid reverse(char s)int j,k;/*j-前指示器前指示器 k-尾指示器尾指示器*/char c;for(j=0,

28、k=strlen(s)-1;jk;j+,k-)c=sj,sj=sk,sk=c;上面三个函数的应用上面三个函数的应用 nvoid main(void)n char str80=atbtctdtetft ;nprintf(before trim,the string is%sn,str);ntrim(str);nprintf(after trim,the string is%sn,str);ndelete_c(str,t);nprintf(after delete t,the string is%sn,str);nreverse(str);nprintf(after reverse,the str

29、ing is%sn,str);n运行结果:运行结果:n before trim,the string is atbtctdtetft n after trim,the string is atbtctdtetft after delete t,the string is abcdef after reverse,the string is fedcba8.4.2 8.4.2 数字串与数之间转换的数字串与数之间转换的函数函数 例例8.22 将一个十进制数字串转换成为对应的整数的函数将一个十进制数字串转换成为对应的整数的函数atoi函数功能函数功能将将s字符数组中存放的一个十进制数字串转换成为对应

30、的整字符数组中存放的一个十进制数字串转换成为对应的整数,并返回该整数数,并返回该整数算法:算法:ASCII码字符码字符sj转换为对应数字转换为对应数字sj-0本位乘以本位乘以10加下一位的算法加下一位的算法54321=(5)*10+4)*10+3)*10+2*10)+1atoiatoi函数函数n#define BASE 10nint atoi(char s)nnint j=0,num=0;nfor(;sj!=0;j+)n num=num*BASE+sj-0;nreturn num;n例例8.23 8.23 将一个整数转换成为将一个整数转换成为基数为基数为BASEBASE的数字串的函数的数字串的

31、函数 n#define BASE 10nvoid itoa(int n,char s)nint sign,j=0;nif(sign=n)0)nsj+=n%BASE+0;nn/=BASE;nif(sign=0&sj=a&sj=A&sj=F)num=num*16+sj-A+10;nnreturn num;n8.5 8.5 多维数组多维数组语文 数学010285829195n实际应用n有时需要用多个下标来实现对数组元素的访问 n例如n张三同学,学号为01,语文和数学成绩分别为85,91,李四同学,学号位02,语文和数学成绩分别为82,95 n解决方法n用二维数组可以描述学号-课程成绩表中的成绩数据

32、n多维数组的用途n二维数组可以描述数学中的矩阵或行列式n三维数组可以描述空间中的点集nn维数组来描述n维线性空间中的n维向量 8.5.1 8.5.1 多维数组的说明与使用多维数组的说明与使用n形式形式 n类型说明类型说明 数组名数组名常量表达式常量表达式1 常量表常量表达式达式2常量表达式常量表达式n=初值表初值表;n类型说明:类型说明:存储类型说明符存储类型说明符 类型修饰类型修饰符符 数据类型数据类型n例如,例如,int x22;n对其元素的引用对其元素的引用 n数组名数组名下标下标1 下标下标2下标下标n n例如,例如,x10=3;例例8.25 8.25 对二维数组中元素的对二维数组中元

33、素的访问与操作访问与操作 n#include stdio.hnvoid main(void)nnint x23,a=2;nx02=8;nscanf(%d,&x12);nx11=x02;nx12=a;/*将元素将元素x12的内容左移的内容左移2位位*/nprintf(%dn,x12);nn计算每个同学的平均成绩并且输出数组中各元素的地址和内容计算每个同学的平均成绩并且输出数组中各元素的地址和内容 n#include stdio.hn#define SIZE 2nvoid main(void)n int xSIZESIZE+1;n int i,j;n for(i=0;iSIZE;i+)n for(

34、j=0;jSIZE;j+)nscanf(%d,&xij);n xiSIZE=(xi0+xi1)/2;n printf(n);例例8.26 8.26 用二维数组表示学号用二维数组表示学号-课程成绩表课程成绩表 n输入如下:输入如下:n 85 91 82 95语文数学010285829195例例8.26 8.26 用二维数组表示学号用二维数组表示学号-课程成绩表课程成绩表nfor(i=0;iSIZE;i+)n for(j=0;jSIZE+1;j+)n printf(%ptx%d%d=%dt,&xij,i,j,xij);n printf(n);n nn程序的运行结果为:程序的运行结果为:n FFD0

35、 x00=85 FFD2 x01=91 FFD4 x02=88n FFD6 x10=82 FFD8 x11=95 FFDA x12=888.5.2 8.5.2 多维数组的存储结构多维数组的存储结构x00=85x01=91x02=88x10=82x11=95x12=88地 址元 素值0 xFFD0 x00850 xFFD20 xFFD40 xFFD60 xFFD80 xFFDAx01x02x10 x11x129188829588二维数组x的逻辑存储结构 二维数组x的物理存储结构 8.5.3 8.5.3 多维数组的初始化多维数组的初始化n按照物理存储结构的顺序按照物理存储结构的顺序nint a22

36、=85,91,82,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其它维大小不能省略其它维大小不能省略8.5.4 8.5.4 二维字符数组二维字符数组n二维字符数组二维字符数组 n与其它二维数组类似

37、与其它二维数组类似 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”;二维字符数组的使用二维字符数组的使用 n引用单个字符元素引用单个字符元素

38、nweekendij=m;n引用字符串引用字符串 nweekendi表示表示weekend数组中第数组中第i行行字符串的首地址字符串的首地址nprintf(“%s”,weekendi);例例8.27 8.27 字符串数组的输入输字符串数组的输入输出操作出操作 n#include stdio.hnvoid main(void)n n int i;nchar devices312=hard disk,CRT,keyboard;ndevices00=H;/*hard disk变为变为Hard disk*/ndevices20=K;/*keyboard 变为变为Keyboard*/nfor(i=0;i

39、3;i+)n printf(%sn,&devicesi0);nscanf(%s,devices1);nfor(i=0;i3;i+)n printf(%sn,devicesi);n*8.6 8.6 数组的应用程序设计数组的应用程序设计30323130222120121110020100232221201312111003020100,kkjikijbacBACbbbbbbbbbbbbBaaaaaaaaaaaaA其中8.6.1 矩阵乘法运算算法定义3个2维数组 通过三重循环来实现 外层循环用于控制乘积矩阵C的行中间层循环用于控制乘积矩阵C的列内层循环用于计算乘积矩阵元素Cij 例例8.28 8.2

40、8 矩阵的乘法运算矩阵的乘法运算 n#include stdio.hn#define N 3n#define K 4n#define M 3nvoid mul_matrix(int aK,int bM,int cM,int n,int k,int m)n int i,j,p,sum;n for(i=0;in;i+)n for(j=0;jm;j+)n sum=0;n for(p=0;pk;p+)n sum+=aip*bpj;n cij=sum;n n例例8.28 8.28 矩阵的乘法运算矩阵的乘法运算 nvoid main(void)n int ANK=1,2,3,4,5,6,7,8,9,0,1

41、,2;n int BKM=1,2,3,4,5,6,7,8,9,0,1,2;n int CNM;int i,j;n mul_matrix(A,B,C,N,K,M);n for(i=0;iN;i+)n for(j=0;jM;j+)n printf(%8d ,Cij);n printf(n);n 程序的运行结果为:程序的运行结果为:30 40 50 78 104 130 16 28 408.6.2 8.6.2 基于分治策略的二分查基于分治策略的二分查找函数找函数n二分查找算法的思路二分查找算法的思路n将已排好序的将已排好序的n个元素数组个元素数组a分成两半,取分成两半,取an/2与与x比较比较n如果

42、如果x=an/2,则找到,则找到x,算法结束,算法结束n如果如果xan/2,则在数组,则在数组a的后半部分继续的后半部分继续查找查找xn返回值返回值n如果找到如果找到x,返回该数所在单元的下标,返回该数所在单元的下标n如果没有找到,返回如果没有找到,返回-1 例例8.29 8.29 二分查找函数二分查找函数 n#include stdio.hnint BinarySearch(int a,int x,int n)n int front=0,back=n-1,middle;n while(front=back)n middle=(front+back)/2;/*计算中间单元的下标计算中间单元的下

43、标*/n if(xamiddle)nfront=middle+1;/*查找单元变成原来的后半部查找单元变成原来的后半部*/n elsenreturn(middle);/*找到,返回下标找到,返回下标*/n nreturn-1;/*没有找到,返回没有找到,返回-1*/例例8.29 8.29 二分查找函数二分查找函数 nvoid main(void)nnint x=1,3,5,7,9,11,13,15,17,19,index;nindex=BinarySearch(x,11,10);nif(index!=-1)nprintf(find%d!n,xindex);nelsenprintf(not fi

44、nd!n);nn程序的运行结果是:程序的运行结果是:n find 11!8.6.3 8.6.3 选择法排序选择法排序122-2156789-1234n假设有下面的8个整数构成的数组n算法思想n首先找出数组内8个元素中最小的元素n然后将它与第一个元素下标为0交换n再在剩余的后续7个元素中找出最小的元素,再将它与第二个元素下标为1交换n余以类推,直到在最后剩余的两个元素中找出较小者并将较大者放在最后下标为7为止例例8.30 8.30 用选择法进行排序用选择法进行排序n#include stdio.hnint f_small(int a,int begin,int end)/*在begin与end之

45、间找最小数*/n int i,p=begin;n for(i=begin;i=end;i+)n if(aiap)np=i;n return p;nvoid sel_sort(int a,int n)n /*排序函数*/n int cur,index,t;n for(cur=0;curn-1;cur+)n index=f_small(a,cur,n-1);n if(index!=cur)n t=acur,acur=ain dex,aindex=t;nnvoid main(void)n int x=12,2,-21,5,67,89,-12,34,i,n;n n=8;n sel_sort(x,n);n for(i=0;i8;i+)n printf(%d ,xi);n printf(n);n

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!