《第5章 数组、字符串、指针.ppt》由会员分享,可在线阅读,更多相关《第5章 数组、字符串、指针.ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C程序设计程序设计魏英魏英 tutor_ 7952616 第第5章章 数组数组教学内容教学内容理解数组数据类型理解数组数据类型掌握一维数组与二维数组的定义、存放、初始化和基本操作掌握一维数组与二维数组的定义、存放、初始化和基本操作掌握数组与指针的关系掌握数组与指针的关系掌握字符串的相关操作掌握字符串的相关操作熟悉使用指针处理字符串的方法熟悉使用指针处理字符串的方法掌握数组的常用算法掌握数组的常用算法教学重点教学重点字符串的相关操作字符串的相关操作数组的常用算法数组的常用算法教学难点教学难点数组的常用算法数组的常用算法C程序设计程序设计魏英魏英 tutor_ 7952616 数组概念数组概念数组
2、是一种数组是一种构造数据类型构造数据类型数组是数组是相同类型相同类型有序数据的集合有序数据的集合数组中的每一个数据称为数组的一个数组中的每一个数据称为数组的一个元素元素数组中的元素可以通过统一的数组中的元素可以通过统一的数组名数组名和和下标下标来唯来唯一确定一确定C编译器给数组分配一块编译器给数组分配一块连续连续存储空间存储空间依次依次存放存放数组的各个元素数组的各个元素C程序设计程序设计魏英魏英 tutor_ 7952616 一维一维数组数组只用一个下标的数组称为一维数组只用一个下标的数组称为一维数组定义定义类型说明符类型说明符 数组名数组名常量表达式常量表达式;例:例:int a10,b2
3、*3;常见错误常见错误int a(10);int n;scanf(“%d”,&n);int an;#define N 10 int aN;C程序设计程序设计魏英魏英 tutor_ 7952616 一维数组一维数组初始化:在定义数组的同时给数组元素赋初值初始化:在定义数组的同时给数组元素赋初值基本方法:基本方法:int a5=1,2,3,4,5;其它方法:其它方法:教材教材P127存放存放12345a引用数组元素引用数组元素形式:形式:数组名数组名下标下标下标可以是常量,也可以是变量下标可以是常量,也可以是变量下标取值范围从下标取值范围从0开始开始a0a2a1a4a3C程序设计程序设计魏英魏英
4、tutor_ 7952616 一维一维数组的基本操作数组的基本操作输入输出输入输出一次处理一个元素一次处理一个元素循环实现循环实现main()int a10,i;for(i=0;i10;i+)scanf(“%d”,&ai);for(i=0;i10;i+)printf(“%d”,ai);C程序设计程序设计魏英魏英 tutor_ 7952616 一维数组的基本操作一维数组的基本操作求最值求最值逐个判断逐个判断#define N 10main()int aN,i,p,max;/*p存放最大值下标存放最大值下标,max存放最大值存放最大值*/*输入数组元素输入数组元素*/max=a0;p=0;for(
5、i=0;imax)max=ai;p=i;printf(“The max number a%d=%d”,p,max);C程序设计程序设计魏英魏英 tutor_ 7952616 一维数组的基本操作一维数组的基本操作倒置倒置ai与与aN-i-1交换交换N个元素交换个元素交换N/2次次for(i=0;iN/2;i+)t=ai;ai=aN-i-1;aN-i-1=t;C程序设计程序设计魏英魏英 tutor_ 7952616 一维数组应用举例一维数组应用举例例例5-4:求某班:求某班20个学生某门课程考试的平均成个学生某门课程考试的平均成绩及高于平均成绩的学生人数。绩及高于平均成绩的学生人数。P130程序流
6、程程序流程输入数据:输入数据:20个成绩个成绩处理数据:求平均分处理数据:求平均分,统计高于平均分的人数统计高于平均分的人数输出结果:平均分输出结果:平均分,人数人数i=0iavern+非非00开始开始输入输入20个成绩个成绩求平均分求平均分输出最高分输出最高分结束结束统计人数统计人数sum=0,i=0i20i+0非非0sum=sum+aiaver=sum/20C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define NUM 20main()int aNUM,n,i;float sum,aver;sum=0;for(i=0;iNUM;i+)scanf(“%d”,&a
7、i);sum=sum+ai;aver=sum/NUM;n=0;for(i=0;iaver)n+;printf(“%dn”,n);C程序设计程序设计魏英魏英 tutor_ 7952616 二维二维数组数组使用两个下标的数组称为二维数组使用两个下标的数组称为二维数组定义定义类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式;例:例:int a34;初始化初始化基本方法:基本方法:int a34=1,2,3,4,5,6,7,8,9,10,11,12;其它方法:其它方法:教材教材P135C程序设计程序设计魏英魏英 tutor_ 7952616 二维数组二维数组存放:二维表格,按
8、行存储存放:二维表格,按行存储123456789101112aa00a01a02a03a10a11a12a13a20a21a22a23引用数组元素引用数组元素形式:形式:数组名数组名下标下标 下标下标下标可以是常量,也可以是变量下标可以是常量,也可以是变量下标取值范围从下标取值范围从0开始开始a00a01a02a03a10a11a12a13a20a21a22a23a0a1a2C程序设计程序设计魏英魏英 tutor_ 7952616 二维数组应用举例二维数组应用举例例例:设一个学习小组有设一个学习小组有5个学生个学生,每个学生有每个学生有3门课门课的考试成绩的考试成绩,求全组每个学生的平均成绩求
9、全组每个学生的平均成绩.分析分析:处理一批性质相同的数据时处理一批性质相同的数据时,可以考虑使用数组可以考虑使用数组,并根据数据间的逻辑关系选择数组的维数并根据数据间的逻辑关系选择数组的维数用一个二维数组存放考试成绩用一个二维数组存放考试成绩用一个一维数组存放平均成绩用一个一维数组存放平均成绩C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序main()int a53,aver5,sum,i,j;for(i=0;i5;i+)for(j=0;j3;j+)scanf(“%d”,&aij);sum=sum+aij;averi=sum/3;for(i=0;i5;i+)for(j=0
10、;j3;j+)printf(“%d”,aij);printf(“%d”,averi);如何找出最高成绩如何找出最高成绩?sum=0;printf(“n”);C程序设计程序设计魏英魏英 tutor_ 7952616 矩阵操作矩阵操作相乘相乘P136Cm,n=Am,l*Bl,n(i=1,2,m;j=1,2,n)for(i=0;iM;i+)for(j=0;jN;j+)cij=0;for(k=0;kL;k+)cij=cij+aik*bkj;C程序设计程序设计魏英魏英 tutor_ 7952616 矩阵操作矩阵操作转置转置P137方阵转置方阵转置:可以不定义新数组可以不定义新数组非方阵转置非方阵转置:需
11、要定义新数组需要定义新数组147258369123456789对角线上的元素不交换对角线上的元素不交换行列下标相同行列下标相同,i=jaij与与aji交换交换逐行逐行处理处理第第i行需要处理行需要处理N-i-1个元素个元素C程序设计程序设计魏英魏英 tutor_ 7952616 指向一维数组的指针指向一维数组的指针可将某个数组元素的地址存放在一个指针变量中可将某个数组元素的地址存放在一个指针变量中前提前提:定义一个基类型与数组元素数据类型相同的指针定义一个基类型与数组元素数据类型相同的指针变量变量例例:输入输出一维数组中的所有元素输入输出一维数组中的所有元素下标法下标法#include#def
12、ine N 10void main()int aN,i;for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN;i+)printf(%d,ai);/*等价于等价于scanf(%d,a+i);*/*等价于等价于printf(%d,*(a+i);*/C程序设计程序设计魏英魏英 tutor_ 7952616 指向一维数组的指针指向一维数组的指针指针法指针法#include#define N 10void main()int aN,i,*p;for(p=a;pa+N;p+)scanf(%d,p);for(p=a;pa+N;p+)printf(%d,*p);C程序设计程序设计魏英魏
13、英 tutor_ 7952616 二维二维数组的存储与访问数组的存储与访问以以int a23为例为例数组数组aa00a01a02a10a11a12200020022004200620082010地址地址a00a01 a02a10a11 a12200020022004200620082010C程序设计程序设计魏英魏英 tutor_ 7952616 二维数组的存储与访问二维数组的存储与访问数组是一种数组是一种构造构造数据类型,构成数组的元素是既数据类型,构成数组的元素是既可以是整型等基本数据类型,也可以是数组数据可以是整型等基本数据类型,也可以是数组数据类型类型一个二维数组就是一维数组,其中每个元
14、素又都一个二维数组就是一维数组,其中每个元素又都是一个一维数组是一个一维数组 a00a01a02a10a11a12a0a1a2000a+1 2006C程序设计程序设计魏英魏英 tutor_ 7952616 二维数组的存储与访问二维数组的存储与访问2000a0+02002a0+12004a0+2a00a01a02数组数组a02006a1+02008a1+12010a1+2a10a11a12数组数组a1C程序设计程序设计魏英魏英 tutor_ 7952616 二维数组的存储与访问二维数组的存储与访问a0=*(a+0)=*a=2000&a00=&(*(a0+0)=a0+0=*a=2000a00=*(
15、&a00)=*(a0+0)=*a&a01=&(*(a0+1)=a0+1=*a+1=2002a01=*(&a01)=*(a0+1)=*(*a+1)a1=*(a+1)=2006&a10=&(*(a1+0)=a1+0=*(a+1)=2006a10=*(&a10)=*(a1+0)=*(a+1)&a12=&(*(a1+2)=a1+2=*(a+1)+2=2010a12=*(&a12)=*(a1+2)=*(*(a+1)+2)C程序设计程序设计魏英魏英 tutor_ 7952616 总结总结a0是数组名,即数组的首地址,也就是数组元素是数组名,即数组的首地址,也就是数组元素a00的地址即的地址即&a00虽然虽
16、然a与与a0(或或*a)的值均为的值均为2000,但其含义并不,但其含义并不相同相同a指向一块大小为指向一块大小为6个字节的存储空间,而个字节的存储空间,而a0指向一块大小指向一块大小为为2个字节的存储空间个字节的存储空间a+1指向下一块大小为指向下一块大小为6个字节的存储空间,即数组个字节的存储空间,即数组a1a0+1则指向下一块大小为则指向下一块大小为2个字节的存储空间,即元素个字节的存储空间,即元素a01。一般而言,一般而言,&aij=ai+j=*(a+i)+j,aij=*(ai+j)=*(*(a+i)+j)C程序设计程序设计魏英魏英 tutor_ 7952616 指向二维数组的指针指向
17、二维数组的指针例例:输入输出二维数组中的所有元素输入输出二维数组中的所有元素下标法下标法#include#define M 4#define N 5void main()int aMN,i,j;for(i=0;iM;i+)for(j=0;jN;j+)scanf(%d,&aij);for(i=0;iM;i+)for(j=0;jN;j+)printf(%d,aij);printf(n);scanf(%d,ai+j);printf(%d,*(ai+j);C程序设计程序设计魏英魏英 tutor_ 7952616 指向二维数组的指针指向二维数组的指针指针法指针法#include#define M 4#d
18、efine N 5void main()int aMN,i,*p;for(p=&a00;p&aM-1N-1;p+)scanf(%d,p);i=0;for(p=&a00;p&aM-1N-1;p+)printf(%d,*p);i+;if(i%N=0)printf(n);p=a虽然虽然a+1的值与的值与a10的地址的地址相等,但相等,但p+1却指向却指向a01,因为因为p的基类型为整型,每执行的基类型为整型,每执行一次一次p+,指针将移动指针将移动2个字节个字节.C程序设计程序设计魏英魏英 tutor_ 7952616 指向二维数组的指针指向二维数组的指针#include#define M 4#de
19、fine N 5void main()int aMN,i;int(*p)N;/*定义一个指向包含定义一个指向包含N个元素的整型一维数组的指针变量个元素的整型一维数组的指针变量*/for(p=a;paM;p+)for(i=0;iN;i+)scanf(%d,*p+i);for(p=a;paM;p+)for(i=0;iN;i+)printf(%d,*(*p+i);printf(n);指针变量指针变量p的基类型为包含的基类型为包含N个元素的整型一维数组。个元素的整型一维数组。每执行一次每执行一次p+,指针将移指针将移动动2*N个字节,即指向二维个字节,即指向二维数组的下一行数组的下一行*p+i指向当前
20、行第指向当前行第i个元素,个元素,*(*p+i)为当前行第为当前行第i个元素个元素的值的值 不要将不要将int(*p)N;写成写成int*pN;,后者后者表示定义一个包含表示定义一个包含N个元素的一维数组,每个元素的一维数组,每个元素为基类型为整型的指针变量个元素为基类型为整型的指针变量 C程序设计程序设计魏英魏英 tutor_ 7952616 字符数组字符数组用于存放字符数据的数组,字符数组中的一个元用于存放字符数据的数组,字符数组中的一个元素存放素存放一个一个字符字符定义定义char 数组名数组名常量表达式常量表达式;初始化初始化char c7=W,e,l,c,o,m,e;引用引用数组名数
21、组名下标下标C程序设计程序设计魏英魏英 tutor_ 7952616 字符串字符串C语言中没有字符串数据类型,而是使用字符数语言中没有字符串数据类型,而是使用字符数组来处理字符串组来处理字符串系统自动为字符串常量增加一个系统自动为字符串常量增加一个字符串结束标志字符串结束标志0(ASCII码为码为0)字符串字符串“Welcome”的存放形式的存放形式W elcome 08个个字节字节char c=“Welcome”;数组数组c的存放形式的存放形式W elcome 08个个元素元素c0 c1 c2 c3 c4 c5c6 c7不等价于不等价于char c7=W,e,l,c,o,m,e;C程序设计程
22、序设计魏英魏英 tutor_ 7952616 字符数组字符数组输入输入逐个字符输入逐个字符输入for(i=0;iN;i+)scanf(“%c”,&ci);for(i=0;iN;i+)ci=getchar();整串字符输入整串字符输入scanf(“%s”,c);gets(c);输出输出逐个字符输出逐个字符输出for(i=0;iN;i+)printf(“%c”,ci);for(i=0;iN;i+)putchar(ci);整串字符输出整串字符输出printf(“%s”,c);puts(c);%s格式符使用说明格式符使用说明:P99100输出时输出时,遇遇0结束且不输出结束且不输出0输入输出时输入输出
23、时,均使用数组名作参数均使用数组名作参数scanf函数以空格和回车作为输入函数以空格和回车作为输入结束标志结束标志gets函数以回车作为输入结束标志函数以回车作为输入结束标志C程序设计程序设计魏英魏英 tutor_ 7952616 字符串函数字符串函数P157162#include字符串连接:字符串连接:strcat字符串复制:字符串复制:strcpy字符串比较:字符串比较:strcmp字符串长度:字符串长度:strlen字符串小写:字符串小写:strlwr字符串大写:字符串大写:struprC程序设计程序设计魏英魏英 tutor_ 7952616 字符数组应用举例字符数组应用举例例例5-32
24、:加密问题:加密问题教材教材P173程序流程程序流程输入数据:一行字符(原文)输入数据:一行字符(原文)处理数据:字母字符按规律转换,非字母字符不变处理数据:字母字符按规律转换,非字母字符不变输出结果:密文输出结果:密文算法分析算法分析逐一判断逐一判断是否为字母,对字母进行转换是否为字母,对字母进行转换解决方案:循环解决方案:循环循环条件循环条件循环变量初始化循环变量初始化改变循环变量的值改变循环变量的值当前字符不是结束标志当前字符不是结束标志0取取第一个第一个字符字符取取下一个下一个字符字符C程序设计程序设计魏英魏英 tutor_ 7952616 开始开始输入一串字符输入一串字符不是不是0?
25、是字母是字母?转换字母转换字母取下一个字符取下一个字符输出结果输出结果结束结束非非000非非0取取第一个字符第一个字符流程图流程图A B C D E F G H I JZ KY LX MW V U T S R Q P O NC程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#include#define K 3main()char st80,strp80,tmp;int i=0;printf(“Enter a stringn”);gets(st);while(sti!=0)if(sti=a&sti z)tmp=tmp-26;else if(sti=A&sti Z)tmp=t
26、mp-26;else tmp=sti;strpi+=tmp;printf(“%sn”,strp);是否可改为是否可改为:if(sti=a&sti=A&sti z|tmpZ)tmp=tmp-26;C程序设计程序设计魏英魏英 tutor_ 7952616 字符数组应用举例字符数组应用举例例例5-33:统计单词个数:统计单词个数P175程序流程程序流程输入数据:一行字符输入数据:一行字符处理数据:统计处理数据:统计输出结果:单词个数输出结果:单词个数算法分析算法分析问题实质:问题实质:统计问题统计问题解决方案:解决方案:单词之间以单词之间以空格或其它标点符号空格或其它标点符号进行分隔进行分隔如果如果
27、当前字符当前字符不是分隔符不是分隔符,而而前一个字符前一个字符是分隔符是分隔符,则表示一个新单则表示一个新单词开始词开始实现形式:循环实现形式:循环C程序设计程序设计魏英魏英 tutor_ 7952616 流程图流程图开始开始输入一行字符串输入一行字符串统计单词个数统计单词个数输出单词个数输出单词个数结束结束逐个判断逐个判断0当前字符非当前字符非0非非0取下一个字符取下一个字符取第一个字符取第一个字符计数器清计数器清0前一个字符前一个字符设为空格设为空格当前字符非分隔符当前字符非分隔符前一字符是分隔符前一字符是分隔符单词记数单词记数非非0非非000C程序设计程序设计魏英魏英 tutor_ 79
28、52616 源程序源程序#includemain()char st80,last=,ch;int i=0,nw=0;printf(“Enter a stringn”);gets(str);while(ch=sti)!=0)if(!(ch=|ch=,|ch=;|ch=!|ch=.)if(last=|last=,|last=;|last=!|last=.)nw+;last=ch;i+;printf(“%d wordsn”,nw);C程序设计程序设计魏英魏英 tutor_ 7952616 字符串字符串长度长度strlen(“Hello World!”)strlen(“Hello World!n”)s
29、trlen(“Hello0World!n”)Helloworld!n0s1s10s11s12s13s112s14s15s16s17s18s19s110s111s113存储存储char s1=“Hello World!n”;char s2=“Hello0World!n”;12135访问访问下标法下标法:s1i等价于等价于*(s1+i)Hello0world!n0s2s20s21s22s23s212s24s25s26s27s28s29s210s211s213C程序设计程序设计魏英魏英 tutor_ 7952616 指向字符串的指针指向字符串的指针使用字符数组处理字符串的缺点使用字符数组处理字符串的
30、缺点不能直接将一个字符串赋值给一个已经定义好的数组不能直接将一个字符串赋值给一个已经定义好的数组只能将各个字符逐一赋值给数组中各元素只能将各个字符逐一赋值给数组中各元素并且数组中能够存放的字符串不能超过数组长度并且数组中能够存放的字符串不能超过数组长度使用指针处理字符串的方法使用指针处理字符串的方法定义一个基类型为字符型为指针变量定义一个基类型为字符型为指针变量char*s;将需要处理的字符串直接赋值将需要处理的字符串直接赋值s=“Welcome”;C程序设计程序设计魏英魏英 tutor_ 7952616 指向字符串的指针指向字符串的指针例例5-19:字符串复制字符串复制 P154使用字符数组
31、使用字符数组#includevoid main()char s1=Hello World!n,s220;/*数数组组s2的的长长度要定义合适度要定义合适*/int i;for(i=0;s1i!=0;i+)s2i=s1i;s2i=0;/*复制循环中未复制的字符串结束标志复制循环中未复制的字符串结束标志*/puts(s1);/*printf(“%s”,s1);*/puts(s2);C程序设计程序设计魏英魏英 tutor_ 7952616 指向字符串的指针指向字符串的指针使用指针变量使用指针变量#include#include#includevoid main()char*s1=Hello Worl
32、d!n,*s2,*t;puts(s1);/*初始化初始化s2,使其指向一块能够容纳所复制字符串的存储空间使其指向一块能够容纳所复制字符串的存储空间*/s2=calloc(strlen(s1)+1,sizeof(char);t=s2;while(*s1!=0)*s2=*s1;s1+;s2+;*s2=0;/*复制循环中未复制的字符串结束标志复制循环中未复制的字符串结束标志*/s2=t;puts(s2);C程序设计程序设计魏英魏英 tutor_ 7952616 常用算法常用算法排序排序选择法排序选择法排序冒泡法排序冒泡法排序查找查找顺序查找顺序查找二分查找(折半查找)二分查找(折半查找)插入插入C程
33、序设计程序设计魏英魏英 tutor_ 7952616 选择法排序选择法排序算法描述(算法描述(递增递增)从从n个数中选出最小的数与第个数中选出最小的数与第1个数交换位置个数交换位置除第除第1个数外,从剩下个数外,从剩下n-1个数中选出最小的数与第个数中选出最小的数与第2个数交换位置个数交换位置重复上述步骤重复上述步骤n-1次得到一个递增序列次得到一个递增序列C程序设计程序设计魏英魏英 tutor_ 7952616 排序过程示意图排序过程示意图数组数组 a0a1a2a3a4排序前:排序前:53691第第1次选择后次选择后:13695第第2次选择后:次选择后:13695第第3次选择后:次选择后:1
34、3596第第4次选择后:次选择后:13569第第i次选择的范围为第次选择的范围为第i个到第个到第n-1个元个元素素第第i次选择出的元素与第次选择出的元素与第i个元素交换个元素交换0123C程序设计程序设计魏英魏英 tutor_ 7952616 流程图流程图选择次数选择次数i=0in-1查找最小的数查找最小的数与第与第i个数交换个数交换i=i+1YN注意:变量注意:变量i除了控制选择除了控制选择次数外,还表次数外,还表示本次选出的示本次选出的元素将要存放元素将要存放的位置的位置C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define N 20main()int aN,
35、i,j,p,t;for(i=0;iN;i+)scanf(“%d”,&ai);for(i=0;iN-1;i+)p=i;for(j=i+1;jN;j+)if(ajap)p=j;t=ai;ai=ap;ap=t;for(i=0;iN;i+)printf(“%d”,ai);if(i+1)%10=0)printf(“n”);C程序设计程序设计魏英魏英 tutor_ 7952616 冒泡法排序冒泡法排序算法描述(算法描述(递增递增)第第1趟从第趟从第1个数到第个数到第n个数,将相邻的两个数进行比个数,将相邻的两个数进行比较,并将小的数调到前面较,并将小的数调到前面第第2趟将除第趟将除第n个数外所有相邻的两个
36、数进行比较,个数外所有相邻的两个数进行比较,并将小的数调到前面并将小的数调到前面重复重复n-1趟得到一个递增序列趟得到一个递增序列C程序设计程序设计魏英魏英 tutor_ 7952616 排序过程示意图排序过程示意图数组数组 a0a1a2a3a4排序前:排序前:53691第第1趟:趟:35691356913569135619第第2趟:趟:35169第第3趟:趟:31569第第4趟:趟:13569第第i趟比较的范围趟比较的范围为第为第0个到第个到第n-i-1个元素个元素每趟都是将第每趟都是将第j个个元素与第元素与第j+1个元个元素比较素比较0123C程序设计程序设计魏英魏英 tutor_ 795
37、2616 流程图流程图比较趟数比较趟数i=0in-1第第i趟比较趟比较i=i+1YNjaj+1二者交换二者交换j+YNYNC程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define N 10main()int aN,i,j,k,t;for(i=0;iN;i+)scanf(“%d”,&ai);for(i=0;iN-1;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;for(i=0;iN;i+)printf(“%d”,ai);C程序设计程序设计魏英魏英 tutor_ 7952616 顺序查找顺序查找算法描述算法描述将待查数据依次与各个元素进行比较
38、,若找到则返回将待查数据依次与各个元素进行比较,若找到则返回元素下标,若均不相等,则表明查无此数元素下标,若均不相等,则表明查无此数流程图流程图iN查找范围查找范围i=0n=aii+YNYN查无此数查无此数输出输出i正常出口正常出口紧急出口紧急出口C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define N 10main()int aN,i,n;for(i=0;iN;i+)scanf(“%d”,&ai);scanf(“%d”,&n);for(i=0;i=N)printf(“not findn”);与与教材教材P168程序进行比较程序进行比较,体会变量体会变量inde
39、x的用途的用途C程序设计程序设计魏英魏英 tutor_ 7952616 二分查找二分查找前提:在有序数列中查找前提:在有序数列中查找算法描述(算法描述(以递增序列为例以递增序列为例)用用top代表当前查找起始范围,用代表当前查找起始范围,用bot代表当前查找代表当前查找终止范围终止范围计算当前查找范围中间位置计算当前查找范围中间位置mid=(top+bot)/2将待查数将待查数x与第与第mid个数进行比较,若相等则返回个数进行比较,若相等则返回mid,若大于第若大于第mid个数则个数则bot=m+1,若小于第若小于第m个个数则数则top=mid-1重复上述步骤直到找到,或发现重复上述步骤直到找
40、到,或发现topamidbot=mid+1top=mid-1top=bot输出无此数输出无此数YYNNY紧急出口紧急出口正常出口正常出口C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define N 10main()int aN=1,2,3,4,5,6,7,8,9,10;int bot,top,mid,x;scanf(“%d”,&x);domid=(bot+top)/2;if(x=amid)printf(“%dn”,mid);break;else if(xamid)bot=mid+1;else top=mid-1;while(top=bot);if(topbot)pr
41、intf(“not findn”);与与教材教材P169程序进行比程序进行比较较,体会变量体会变量find的用途的用途C程序设计程序设计魏英魏英 tutor_ 7952616 插入法插入法把一个给定的数据把一个给定的数据x按大小顺序插入已排好序的按大小顺序插入已排好序的数组中数组中,插入后数组元素仍然有序插入后数组元素仍然有序算法分析算法分析确定插入位置确定插入位置空出插入位置空出插入位置插入元素插入元素x25a10 20 30 40 50p=0p=1p=250403025C程序设计程序设计魏英魏英 tutor_ 7952616 源程序源程序#define N 10 /*N代表数据的个数代表数
42、据的个数*/void main()/*定义定义N+1个元素的数组个元素的数组*/int aN+1=1,4,7,13,16,19,28,36,49,60;int x,p,i;printf(Befor Inserted:n);for(i=0;iap&pp;i-)/*将元素往后移将元素往后移,空出空出x所在的位置所在的位置*/ai=ai-1;ap=x;/*将将x插入到数组中插入到数组中*/printf(After Inserted:n);for(i=0;i=N;i+)/*输出插入后的数据序列输出插入后的数据序列*/printf(%d,ai);C程序设计程序设计魏英魏英 tutor_ 7952616
43、指针数组指针数组含义含义数组中的每一个元素都是一个指针类型的数据数组中的每一个元素都是一个指针类型的数据(地址地址)数组中的每一个元素都是一个指针变量数组中的每一个元素都是一个指针变量(基类型相同基类型相同)定义定义类型名类型名*数组名数组名元素个数元素个数;char*name4;典型应用典型应用处理一批字符串处理一批字符串TomMikeM aryPeter 00 00 00 00TomMikeM aryPeter 0000name0name1name2name3C程序设计程序设计魏英魏英 tutor_ 7952616 指针数组指针数组例例5-25:字符串排序字符串排序 P163#includ
44、e#includevoid strsort(char*s,int n);void main()char*name=Tom,Mike,Mary,Peter;int i;strsort(name,4);for(i=0;i4;i+)puts(namei);C程序设计程序设计魏英魏英 tutor_ 7952616 指针数组指针数组void strsort(char*s,int n)char*t;int i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=j)t=si;si=sk;sk=t;TomMikeM aryPeter 0000name0name1na
45、me2name3C程序设计程序设计魏英魏英 tutor_ 7952616 指向指针的指针指向指针的指针含义含义用于存放某个指针变量地址的指针变量用于存放某个指针变量地址的指针变量定义定义类型名类型名*变量名变量名;例:例:int a,*p1,*p2;a=10;p1=&a;p2=&p1;6608661010p2p1a地址地址6608地址地址6610*p1*p2*p2C程序设计程序设计魏英魏英 tutor_ 7952616 实验六实验六实验指导实验指导P36:1实验指导实验指导P36:4C程序设计程序设计魏英魏英 tutor_ 7952616 实验七实验七实验指导实验指导P36:5实验指导实验指导P37:7C程序设计程序设计魏英魏英 tutor_ 7952616 作业作业教材教材P115:4(4)教材教材P116:5(2)教材教材P117:6(2)教材教材P118:6(8)