c语言中有关字符数组的简介.ppt

上传人:牧羊曲112 文档编号:6503756 上传时间:2023-11-07 格式:PPT 页数:52 大小:558KB
返回 下载 相关 举报
c语言中有关字符数组的简介.ppt_第1页
第1页 / 共52页
c语言中有关字符数组的简介.ppt_第2页
第2页 / 共52页
c语言中有关字符数组的简介.ppt_第3页
第3页 / 共52页
c语言中有关字符数组的简介.ppt_第4页
第4页 / 共52页
c语言中有关字符数组的简介.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《c语言中有关字符数组的简介.ppt》由会员分享,可在线阅读,更多相关《c语言中有关字符数组的简介.ppt(52页珍藏版)》请在三一办公上搜索。

1、1,C语言编程是一项技艺,需要多年的历练才能达到较为完善的境界!-摘自Expert C Programming,高级语言程序设计,主讲教师:丁丁计算机与信息技术学院,3,第六章 数组,4,复习(数值型数组),如何定义数组?数组如何初始化?数组元素如何引用?循环语句循环三要素循环不变关系数组元素做函数参数传递的是什么?,5,数组的概念、定义和使用数组程序实例数组作为函数参数字符数组和字符串两维和多维数组编程实例,主要内容,一维数值型数组的重要应用,6,一维数组上的重要操作,排序查找插入删除元素交换,7,将计算机学院12级学生按平均分高低排序将08的奥运会各参赛国按英文字典序排序搜索引擎网页排序(

2、PageRank)learning to rank排序问题无处不在,例1一维数组的应用(排序),8,常用的排序算法,冒泡排序选择排序插入排序快速排序希尔排序堆排序,9,冒泡排序法 输入n个正整数存在数组中,按由小到大的顺序排序(最大的数下沉),例,38,49,76,97,13,97,97,27,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,a0a1a2a3a4a5a6a7,10,用冒泡法对10个数进行排序(N-S图及程序),变量、数组长度定义,for(j=0;j=N-i-1;j+),s

3、canf(“%d”,&ai),for(i=0;iN;i+),for(i=0;iN;i+),ajaj+1,1,0,aj与aj+1交换,for(i=1;i=N-1;i+),printf(“%6d”,ai),/*冒泡法对10个数由小到大排序*/#include#define N 10void main()int aN,i,j,t;printf(请输入10个数:n);for(i=0;i aj+1)t=aj;aj=aj+1;aj+1=t;printf(n排序后的数据为:n);for(i=0;i N;i+)printf(%6d,ai);printf(n);,11,问题,输入十个正整数,把这十个正整数按由大

4、到小的顺序排序,如何修改程序?课后作业n值如果是可变的?如果只对部分数据进行排序?某趟循环未发生交换,后面可不再循环,如何改进冒泡排序?,12,void BubbleSort(int n,int a)int flag,i,j;for(i=1;i aj+1)t=ai;ai=ai+1;ai+1=t;flag=1;if(!flag)return;,改进的冒泡排序(函数):设标志flag,如果某趟未发生交换,flag=0,说明排序完成,返回。,13,将数组a中的前5个数进行排序,#include void BubbleSort(int n,int a);int main()int a10,i,j,t;

5、printf(请输入10个数:n);for(i=0;i 10;i+)scanf(“%d”,14,冒泡排序算法的复杂度分析,最坏情形下扫描数据总数n*(n+1)/2最坏情形下数据交换的次数n*(n-1)/2,15,选择法排序:把n个正整数按由小到大的顺序排序。,例,初始:49 38 65 97 76 13 27,i=1,13,49,一趟:13 38 65 97 76 49 27,i=2,27,38,六趟:13 27 38 49 65 76 97,16,用选择法对10个数进行排序(N-S图及程序),/*选择法对10个数由小到大排序*/#include#define N 10void SelectS

6、ort(int n,int a);void main()int aN,i;for(i=0;i N;i+)scanf(%d,变量、数组长度定义,k=ifor(j=i+1;jN;j+),scanf(“%d”,&ai),for(i=0;iN;i+),for(i=0;iN;i+),ajak,1,0,k=j,for(i=0;iN-1;i+),printf(“%4d”,ai),ai与ak交换,17,void SelectSort(int n,int a)int i,j,k,t;for(i=0;i n-1;i+)k=i;for(j=i+1;j n;j+)if(aj ak)k=j;t=ak;ak=ai;ai=

7、t;,可否优化?如何优化?,18,选择排序算法的复杂度分析,最坏情形下扫描数据总数n*(n+1)/2最坏情形下数据交换的次数n1次,19,直接插入排序,排序方法(以排杂志为例):1.任取一本杂志,作为排好序的一叠杂志的开始情况;2.从剩余杂志中任取一本,根据月份把它插入排好序的那叠杂志里的正确位置,使插入后的这叠杂志仍有序;3.如果还有未排好的杂志,就回到2,否则就结束;,20,a,t=8,t=77,t=66,t=55,21,void insertsort(int n,int a)/*递增序直接插入排序*/int i,j;int t;/*默认a0为已排好序*/for(i=1;i=0,排序函数的

8、定义:,t=55,a0,ai,ai-1,将t插入到a0到ai之间,22,插入排序的复杂度分析,最坏情形下数据移动的次数n*(n-1)/2,23,例2一维数组的应用(查找),int search(int b,int key,int n)int j;for(j=0;j n;j+)if(bj=key)return j;return(-1);,线性查找:从头到尾逐个查找,也称为顺序查找。,效率底!最坏情形下的时间复杂度是O(n),#include#define N 10int search(int b,int,int);void main()int aN,i,searchkey,element;for

9、(i=0;i N;i+)scanf(%d,24,先检索中间的一个数据,如果不是所需的数据,则判断这要找的数在那一边,在所在的一边中再看中间的数是否为所需的数,依次下去。只适用于已排好序的数列。,折半查找,101720223144515568738995120133137 0 1 2 3 4 5 6 7 8 9 1011 12 13 14,折半查找最坏情形下的复杂度是O(lgn),25,折半查找程序,#include#define N 100void f(int,int,int);void main()int aN,j,n,x;scanf(“%d”,void f(int a,int n,int

10、x)int b=0,t,find=0,m;t=n-1;do m=(t+b)/2;if(am=x)printf(找到了%3d,是a%dn,x,m);find=1;else if(x am)t=m-1;else b=m+1;while(b=t,26,例3一维数组的应用(插入/删除)将一个数插入一个有序的数列中,插入后数列仍然有序。an,有m个有序数(小-大),nm,算法:需插入x,3)插入x,1)找插入位置P,将ap到am依次后移一个位置,x=16,p,p=0;while(x ap)/*小于或等于时插入*/,for(j=m-1;j=p;j-)aj+1=aj;,ap=x;,如何用for改写,if(x

11、 am-1)am=x;else for(i=0;i=x)for(j=m-1;j=i;j-)aj+1=aj;ai=x;break;,27,例4一维数组的应用(元素交换)将a数组中从第m个元素起一直到最后的元素平移到数组的开头,把a0到am-2中的元素向后顺移。,a0,am-1,an-1,算法:1、输入数组a,m 2、for(j=1;jn-m+1;j+)将an-1放临时单元t;an-2a0依次后移一个位置;a0=t;3、输出数组a,2023/11/7,高级语言程序设计,28,主要内容:数组,6.1 数组的概念、定义和使用6.2 数组处理程序实例6.3 数组作为函数参数6.4 字符数组与字符串6.5

12、 两维和多维数组6.6 编程实例,29,字符数组预备知识,字符常量与字符串常量有什么区别?如何定义一个字符变量?,单引号括起来的单个字符。如:a双引号括起来的字符序列。如“goodbye”,“0”等printf(Good morning!n);,规定:一个字符串书写时不能跨行多个字符串之间仅由空白分隔,系统会将它们连成一个长字 符串。双引号需用转义符:He said:Im ok!。,30,字符串以字符数组形式保存,存储形式是在所有字符后放0作为串结束标志。例 Beijing,0不是串内容,却是字符串表示不可缺的部分。标准库的字符串处理函数都按这种表示设计,写字符串处理程序时也应该遵守这一规则。

13、,31,6.4 字符数组与字符串,字符数组定义方式(与其他数组一样):char line1000;字符数组使用方式(与其他数组一样):i=0;/*注意越界控制*/while(i1000,字符数组初始化方式一:逐个字符赋值char city15=B,e,i,j,i,n,g;未指定初值的元素自动设0,编码0的字符称为0字符/空字符,用0表示,在C中有特殊用途(字符串结束标志)。,32,若字符数组里存了一些字符后放0,就符合字符串形式,可当作字符串使用(数组里存着字符串):char a5=g,o,o,d,“good”b5=i,s,a,“isa”c5=o,k,0,“ok”d5=o,k,0,x,“ok”

14、x5=i,s,n,o,t;注意:字符数组的有效长度指第一个0前的字符个数+1,33,初始化方式二:用字符串常量char a120=Peking University;未标元素个数时,数组大小确定为串长加1。例:char a3=Peking University;数组a3有18个字符元素。,字符数组变量中保存字符串后,可作字符串用。例,若多个输出语句都用同样输出格式描述:char outform1=”point:(%f,%f)n;.printf(outform1,x,y);.printf(outform1,s,t);,34,字符数组的赋值,将一个字符串赋值给一个字符数组,只能用在初始化的情况下,

15、不能用在赋值语句中例如:char str11;str=“I am happy”;是错误的.,35,字符串的输入输出,逐个字符I/O:%c数组名下标整个字符串I/O:%s数组名,例 用%c main()char str5;int i;for(i=0;i 5;i+)scanf(“%c”,例 用%s main()char str5;scanf(“%s”,str);printf(“%s”,str);,输入用字符数组名,不要加&输入串长度数组维数遇空格或回车结束自动加0,输出用字符数组名,遇0结束,36,int main()int i;char a5;scanf(%s,a);for(i=0;i 5;i+

16、)printf(%c,ai);return 0;,运行情况:(1)若输入 hel,正常(2)若输入 hell,正常(3)若输入 hello,用%s 输出,会出现问题?,输入字符串长度数组维数,例子,37,#include main()char a15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);printf(a=%sn,a);,运行情况:输入:How are you?输出:a=How b=are c=you?输入:How are you?输出:a=How,scanf中%s输入时,遇空格或回车结束,运行情

17、况:输入:How are you?,字符串输入举例,38,void str_copy(char s,const char t)int i=0;while(ti!=0)si=ti;+i;si=0;,循环结束时ti的空字符正好赋给si。void str_copy(char s,const char t)int i=0;while(si=ti)!=0)+i;,字符串处理程序实例,例1,写函数将一字符串复制到一字符数组。假定数组足以存放被复制串及空字符。,39,字符串处理函数的典型循环:for(i=0;si!=0;+i)用是否空字符确定对字符串的处理是否已完成。,例2,(二进制转换)写函数,给它一个表

18、示二进制数的0/1字符串,它算出这个串表示的整数值。,二进制数bnbn-1.b2b1b0的值可以用下面公式计算:(.(bn2)+bn-1)2+.)2+b2)2+b1)2+b0据此可写出循环,循环条件判断二进制数是否结束。二进制数位只能是0/1,只需要在遇到1时加1。,40,int bin2int(const char s)int i=0,n=0;while(si!=0,由于数字字符的编码连续排列.函数改为:int bin2int(const char s)int i=0,n=0;while(si!=0/*这种写法可以推广到八进制和其他进制*/,41,例3 计算字符数组的有效长度,#includ

19、e int strLen(const char s);int main()int len;char str10;scanf(%s,str);len=strLen(str);printf(%dn,len);printf(%sn,str);return 0;,int strLen(const char s)int i=0;while(si!=0)i+;return(i+1);,有问题吗?,42,包含在头文件 string.h,字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以0结束,字符串输入函数gets格式:gets(字符数组)功能:从键

20、盘输入一以回车结束的字符串放入字符数组中,并自动加0说明:输入串长度应小于字符数组维数,标准库中常用的字符串处理函数,43,例#include main()char string80;printf(“Input a string:”);gets(string);puts(string);输入:How are you?输出:How are you?,scanf(“%s”,str);gets(str);区别是scanf取不到空格,gets()函数是个过时的函数,44,标准库中常用的字符串处理函数,包含在头文件 string.h字符串(实际)长度函数strlen(const char s);,#in

21、clude#includeint main()char str10=China;int n;printf(Length=%dn,strlen(str);n=strlen(str);printf(n=%dn,n);return 0;,45,标准库中常用字符串处理函数,复制函数:strcpy(char s,const char t);t应为字符串,const说明参数值不修改。字符数组s应足够大,以保证复制不越界。例:char a116,a216;strcpy(a1,programming);strcpy(a2,a1);,限界复制函数strncpy,限制复制长度:strncpy(char s,con

22、st char t,int n);将t中前n个字符复制到s中。,a1,46,#include#includeint main()char a5,b5=Power,c1,c2;c1=A;c2=B;printf(b=%sn,b);a0=C;a1=h;a2=i;a3=n;a4=a;printf(a=%sn,a);a=Study;printf(a=%sn,a);a=b;printf(a=%sn,a);return 0;,程序查错,47,#include#includeint main()char a6,b6=Power,c1,c2;c1=A;c2=B;printf(b=%sn,b);a0=C;a1=h

23、;a2=i;a3=n;a4=a;a5=0;printf(a=%sn,a);strcpy(a,Study);printf(a=%sn,a);strcpy(a,b);printf(a=%sn,a);return 0;,改正错误后,48,int strcmp(const char s1,const char s2)两字符串相同时返回值0;s1大于s2的情况下返回大于0的值;否则返回小于0的值。判断字符串大小的标准是字符串的字典序。(字典序就是普通英语词典里单词排列的顺序,按ASCII码值大小比较)“DOG”A”“computer”compare”,字符串比较函数,限界比较函数:int strncmp

24、(const char s1,const char s2,int n);,49,#include#includeint main()char str16=China,str26=Korea;int yes;yes=strcmp(str1,str2);printf(%dn,yes);yes=strcmp(China,Korea);printf(%dn,yes);if(str1 str2)printf(yes1n);if(strcmp(str1,str2)0)printf(yes2n);return 0;,50,strcat(char s,const char t);t是字符串,s是保存字符串的数

25、组。把t复制到s已有的字符之后,形成连起的串。数组s必须足够大。char b140=Programming,b210;strcat(b1,language);strcpy(b2,C);strcat(b1,b2);,字符串连接函数,另有限界连接函数strncat:strncat(char s,const char t,int n);string.h还包含许多函数,参看有关标准库的一章,51,课后练习,将插入、冒泡和选择排序改写成完整函数,并在主程序中调用实现N个正整数从大到小排序(N个数由键盘输入)。根据排好序的N个正整数,用折半查找法完成某个数的查找(要求先调用排序函数再调用查找函数)。,52,Q&A!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号