《C语言程序设计》PPT课件.ppt_第1页
《C语言程序设计》PPT课件.ppt_第2页
《C语言程序设计》PPT课件.ppt_第3页
《C语言程序设计》PPT课件.ppt_第4页
《C语言程序设计》PPT课件.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

请用PowerPoint2003播放,第5章数组与字符串,本章导读,学习完本章以后,你将能够:掌握一维数组、二维数组的定义和引用;掌握与数组有关的常用算法(如排序算法等),了解数组在数值计算、数据统计、排序和数据检索方面的应用;掌握字符数组的定义及应用,掌握利用字符串函数对字符数据进行简单处理。,内容介绍,本章主要讨论各种不同类型的一维和二维数组及其应用。要求学生理解数组的概念,掌握数组的形式化定义,数组的初始化方法,数组元素的访问规则;在此基础上学习数组的使用方法,如数组中元素的查找、排序、插入、计算等。字符数组作为一种特殊的数组,用来存储字符串,要求学生掌握字符串的操作函数。通过数组的学习提高学生的数据管理能力和编程能力。,教学目的,掌握一、二维数组的输入输出和使用方法;掌握多维数组程序的设计与应用,字符数组与字符串;掌握多维数组及相关程序的设计、调试与运行。,理解数组的概念掌握数组的形式化定义,数组的初始化方法掌握数组元素的访问规则掌握与数组有关的常用算法(如排序算法等)了解数组在数值计算、数据统计、排序和数据检索方面的应用掌握字符数组的定义及应用掌握字符串的操作函数,教学重点,教学难点,数据的组织和定义;数组名的理解;字符串的相关操作。,关键词,一维数组;二维数组;数组元素;下标;字符数组;字符串函数;数值计算;数据统计;排序;数据检索。,授课时量,理论学时:4,5.1数组的概念5.2数组的定义5.3数组作为函数的参数5.4数组应用举例5.5字符串5.6本章小结,本章主要内容如下:,5.1数组的概念,数组是一组具有相同名字的变量。它是将一系列具有相同属性的若干数据组织在一起而形成的集合。在C语言中,数组有两个要素,数组名和下标。数组用统一的数组名和下标来标示数组中的元素,用下标标示数组中元素的位置。数组中元素的下标从零开始,以数组中元素个数减1结束。,如描述全班50个同学的成绩,就可以定义一个一维数组c50,则下标范围是049,如果50个学生,每个同学选修了5门功课,那么学生的成绩用一维数组描述就很困难。需要用二维数组来描述。我们可以用行来描述每个学生的成绩,用列来描述每个功课的成绩。那么这个二维数组可以定义如下::inta505;,注:数学中矩阵都可以用二维数组来描述,5.2.1一维数组一维数组的定义定义方式:数据类型数组名常量表达式;,合法标识符,表示元素个数下标从0开始,:数组运算符单目运算符优先级(1)左结合不能用(),例inta6;,编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型),数组名表示内存首地址,是地址常量,5.2数组的定义,一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名下标其中:下标可以是常量或整型表达式,例inti=15;intdatai;(不能用变量定义数组维数),例inta10;printf(“%d”,a);()必须for(j=0;j10;j+)printf(“%dt”,aj);(),例intdata5;data5=10;/C语言对数组不作越界检查,使用时要注意,一维数组的初始化初始化方式,在定义数组时,为数组元素赋初值(在编译阶段使之得到初值),inta5=1,2,3,4,5;等价于:a0=1;a1=2;a2=3;a3=4;a4=5;,说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如inta5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如inta3=6,2,3,5,1;(),staticinta5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;,只给部分数组元素赋初值,inta=1,2,3,4,5,6;编译系统根据初值个数确定数组维数,【例5-1】数组元素的访问/对数组元素进行操作#includemain()inta5=0,1,2,3,8;/定义数组a并进行初始化a0=4;/把4赋给a0a1+=a0;/把a0的值4累加到a1,使的值变为5a3=3*a2+1;/把赋值号右边的值7赋给a3printf(“%d”,aa0);/因a0=4,所以aa0对应的元素为/a4,该语句输出的值8return0;,【例5-2】定义一个一维数组,通过键盘输入各元素的值,然后逆序输出数组元素的值#includevoidmain()inti,a6;/定义一个数组a,长度为6for(i=0;i=0;i-)/逆序输出数组元素的值printf(%d,ai);/每输出一个值,就输出一个空格,使数据分开,printf(n);,【例5-3】对一个给定的数组,求数组元素中的最大值。#includevoidmain()inta8=25,64,38,40,75,66,38,54;/定义一个数组a,并赋初值。intmax=a0;/定义变量max存储最大值,并假定a0最大。for(inti=1;imax)max=ai;/将最大者赋给maxprintf(max:%dn,max);/输出最大值max,【例5-4】从若干个数据元素中找出大于某一个数的所有数据。#include#defineN7/定义符号常量Nvoidmain()doublewN=2.6,7.3,4.2,5.4,6.2,3.8,1.4;/定义一个数组a并赋初值doublereN,x;inti,count=0;printf(%s,输入一个实数:);scanf(%lf,/记录数组w中大于x的数组元素于数组re中,count+;/记录数组w中大于x的元素个数for(i=0;icount;i+)/输出所有大于x的数组元素printf(w%d=%5.2lfn,i,rei);/printf(n);,【例5-5】斐波那契数列:1,1,2,3,5,8,其规律是从第三个数开始,每一项等于前两项的和,即ai=ai-1+ai-2,i=2,3,求该数列的前M(M=10)项。#include#defineM10voidmain()intaM=1,1,i;/定义含有M个元素的数组a,a0=1;a1=1;其余元素的值赋为0for(i=2;iM;+i)/计算第i个元素ai=ai-1+ai-2;/求第i+1项for(i=0;iM;+i)/按每行五个数据输出数列元素printf(%8d,ai);/输出aiif(i+1)%5=0)/若一行输出的数据个数已有5个,则换行。printf(n);/换行,5.2.2二维数组及多维数组二维数组的定义定义方式:数据类型数组名常量表达式常量表达式;,数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快,例inta34;floatb25;intc234;inta3,4;(),行数,列数,元素个数=行数*列数,二维数组理解,每个元素ai由包含4个元素的一维数组组成,二维数组a是由3个元素组成,二维数组元素的引用形式:数组名下标下标二维数组元素的初始化分行初始化:,按元素排列顺序初始化,【例5-6】对二维数组元素进行操作,给二维数组元素赋值,并按行输出#includemain()inti,j;inta45=0;/定义数组,并给所有元素赋初值0a12=6;/向a12元素赋值6a22=3*a12+1;/取出a12的值6参与运算,/把赋值号右边表达式的值19赋给a22元素中for(i=0;i4;i+)for(j=0;j5;j+)aij=(i+1)*(j+1);/把aij的值赋给aij-1元素中printf(“%5d”,aij);/按十进制整数输出数组元素,各元素占5个字节printf(n);return0;,【例5-7】求二组数组元素中最大值,各行元素的平均值。#includevoidmain()intb25=7,15,2,8,20,12,25,37,16,28,c2;inti,j,k=b00;for(i=0;ik)k=bij;ci=sum/5;/求第i行元素的平均值pirntf(“%dn”,k);,【例5-8】求一个二维数组各行元素之和,将结果存储在一个一维数组中,最后求出二维数组的所有元素之和。#include#defineM4;voidmain()intcM=0;/定义一个一维数组c,保存二维数组中各行元素之和intdM3=1,5,7,3,2,10,6,7,9,4,3,7;/定义一个二维数组dinti,j,sum=0;/sum存储二维数组d中所有元素之和for(i=0;im;i+)for(j=0;jb若nk,认为数组ab若n=k,认为数组a=b,5.3数组作为函数参数,数组名作函数参数地址传递在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不指定形参数组名是地址变量,例求学生的平均成绩,#includefloataverage(intstu10,intn);voidmain()intscore10,i;floatav;printf(Input10scores:n);for(i=0;i10;i+)scanf(%d,floataverage(intstu10,intn)inti;floatav,total=0;for(i=0;in;i+)total+=stui;av=total/n;returnav;,实参用数组名,形参用数组定义,intstu,例数组元素与数组名作函数参数比较,a0,a1,#includevoidswap2(intx,inty)intz;z=x;x=y;y=z;main()inta2=1,2;swap2(a0,a1);printf(a0=%dna1=%dn,a0,a1);,值传递,#includevoidswap2(intx)intz;z=x0;x0=x1;x1=z;main()inta2=1,2;swap2(a);printf(a0=%dna1=%dn,a0,a1);,地址传递,例数组元素与数组名作函数参数比较,例数组排序-简单选择排序,9,49,i=0,例数组排序-简单选择排序,13,68,i=1,i=8,例数组排序-简单选择排序,例求二维数组中最大元素值,intmax_value(intarray34)inti,j,k,max;max=array00;for(i=0;imax)max=arrayij;return(max);main()inta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(maxvalueis%dn,max_value(a);,例求二维数组中各行元素之和,get_sum_row(intx3,intresult,introw,intcol)inti,j;for(i=0;irow;i+)resulti=0;for(j=0;jcol;j+)resulti+=xij;main()inta23=3,6,9,1,4,7;intsum_row2,row=2,col=3,i;get_sum_row(a,sum_row,row,col);for(i=0;irow;i+)printf(Thesumofrow%d=%dn,i+1,sum_rowi);,18,12,5.4数组应用举例,数组是表示和存储数据的一种重要方法,是一种典型的数据组织形式。在实际中应用非常广泛,如计算、统计、排序、查找各种运算。【例5-12】已知两个矩阵A和B如下,7,-5,33,6,-9A=2,8,-6B=2,-8,31,-4,-25,-2,-7编一程序计算出矩阵A、B的和、差。#include#defineN3voidmain();intaNN=7,-5,3,2,8,-6,1,-4,-2;intbNN=3,6,-9,2,-8,3,5,-2,-7;inti,j,cNN,dNN;,for(i=0;iN;i+)for(j=0,jN;j+)cij=aij+bij;/计算矩阵a,b对应元素的和dij=aij-bij;/计算矩阵a,b对应元素的差for(i=0;iN;i+)/输出矩阵cfor(j=0;jN;j+)printf(%5d,cij);printf(n);for(i=0;iN;i+)/输出矩阵dfor(j=0;jN;j+)printf(%5d,dij);printf(n);,【例5-13】有一家公司,生产一种型号的产品,上半年各月的产量如表所示,每种型号的产品的单价如右表所示,编一个程序计算上半年的总产值。,#includevoidmain()intb65=438,269,738,624,513,340,420,572,726,612,455,286,615,530,728,385,324,713,594,544,402,382,550,633,654,424,400,625,578,615,c5=500,950,1340,2270,2985,d6=0,sum=0,i,j;for(i=0;i6;i+)for(j=0;j5;j+)di+=bij*cj;printf(%d,di);/输出第i+1月份的产值sum+=di;/把第i+1月份的产值累加到sum中printf(nsum:%dn,sum);/输出上半年总产值,【例5-14】某社区对所属N户居民进行月用电量统计,每隔50度用电量为一个统计区间,但当大于等于500度时为一个统计区间。编一程序,分析统计每个用电区间的居民户数。,#include#defineN100/定义符号常量N的值为100voidmain()intc11=0i,x;printf(输入每个用户的用电量,用电量必须大于或等于零:n);for(i=1;i=N;i+)scanf(“%d”,【例5-15】、已知10个常数42,65,80,74,36,44,28,65,94,72,编一个程序,采用插入排序法对其进行排序,并输出结果。,#include#definen10main()voidInsertSort(inta,intm);intan=42,65,80,74,36,44,28,65,94,72;/定义一个数组InsertSort(a,n);/调用函数进行插入排序for(inti=0;in;i+)/输出排序后的结果printf(%d,ai);printf(n);return0;,voidInsertSort(inta,intm)inti,j,x;for(i=1;i=0;j-)/寻找插入位置if(xaj)aj+1=aj;/后移一个位置elsebreak;aj+1=x;/将x插入到已找到的插入位置,【例5-16】、假定在一维数组a10中保存着10个整数42,55,73,28,48,66,30,65,94,72,编译程序从中顺序查找出具有给定值x的元素,若查找成功则返回该元素的下标位置,否则表明查找失败返回-1。,#include#defineN10/假定把数组中保存的证书个数用常量N表示intaN=42,55,73,28,48,66,30,65,94,72;intSequentialSearch(intx)/顺序查找算法for(inti=0;iN;i+)if(x=aireturni;/查找成功返回元素ai的下标值return1;/查找失败返回-1,voidmain()intx1=48,x2=60,f;f=SequentialSearch(x1);/从数组aN中查找值为x1的元素,if(f=-1)printf(“查找:%d失败!n”,x1);elseprintf(“查找:%d成功!下标为:%dn”,x1,f);/查找成功或失败分别显示出相应的信息f=SequentialSearch(x2);/查找值为x2的元素,返回值赋给fif(f=-1)printf(“查找:%d失败!n”,x2);elseprintf(“查找:%d成功!下标为:%dn”,x2,f);,【例5-17】假如一维数组aN中的元素是一个从小到大顺序排列的有序表,编一程序从a中二分查找出其值等于给定值x的元素。,include#defineN10/定义符号常量N,其值等于10intaN=15,26,37,45,52,60,66,73,90/定义数组aN,并初始化intBinarySearch(intx)/二分查找算法intlow=0,high=N-1;/定义并初始化区间下界和上界变量intmid;/定义保存中点元素下标的变量while(low=high)/当前查找区间进行一次二分查找过程mid=(low+high)/2;/计算出重点元素的下标if(x=amid)returnmid;/查找成功返回elseif(xamid)high=mid-1;/修改得到左区间elselow=mid+1;/修改得到右区间return-1;/查找失败返回-1,voidmain()intb3=37,48,70;/假定待查元素值用数组b表示intf;/用于保存调用二分函数查找函数的返回值for(inti=0;i3;i+)f=intBinarySearch(bi);if(f!=-1)printf(“二分查找:%d成功,其下标为:%dn”,bi,f);elseprintf(二分查找:%d失败!n,bi);,5.5字符串,数组是表示和存储数据的一种重要方法,是一种典型的数据组织形式。在实际中应用非常广泛,如计算、统计、排序、查找各种运算。【例5-12】已知两个矩阵A和B如下,7,-5,33,6,-9A=2,8,-6B=2,-8,31,-4,-25,-2,-7编一程序计算出矩阵A、B的和、差。#include#defineN3voidmain();intaNN=7,-5,3,2,8,-6,1,-4,-2;intbNN=3,6,-9,2,-8,3,5,-2,-7;inti,j,cNN,dNN;,字符数组定义,字符数组的初始化逐个字符赋值用字符串常量字符数组的引用,例charc10,ch34;,5.5字符串,例输出一个字符串,#includemain()charc10=I,a,m,a,b,o,y;inti;for(i=0;i10;i+)printf(%c,ci);printf(n);,字符串字符串及其结束标志无字符串变量,用字符数组处理字符串字符串结束标志:0,字符串的输入输出逐个字符I/O:%c整个字符串I/O:%s,例用%cmain()charstr5;inti;for(i=0;i5;i+)scanf(“%c”,例用%smain()charstr5;scanf(“%s”,str);printf(“%s”,str);,用字符数组名,不要加printf(“%s”,a);,例main()chara=“Hello”;printf(“%s”,a);,结果:Hello#-=*,结果:Hello,用“%s”输出时,遇0结束,main()chara=h,e,l,0,l,o,0;printf(%s,a);,例,输出:hel,数组中有多个0时,遇第一个结束,main()inti;chara5;scanf(%s,a);for(i=0;i5;i+)printf(%d,ai);,运行情况:(1)若输入hel,正常(2)若输入hell,正常(3)若输入hello,用%s输出时,会出现问题,输入字符串长度数组维数,例字符串输入举例,#includemain()chara15,b5,c5;scanf(%s%s%s,a,b,c);printf(a=%snb=%snc=%sn,a,b,c);scanf(%s,a);printf(a=%sn,a);,运行情况:输入:Howareyou?输出:a=Howb=arec=you?输入:Howareyou?输出:a=How,scanf中%s输入时,遇空格或回车结束,运行情况:输入:Howareyou?,例若准备将字符串“Thisisastring.”记录下来,错误的输入语句为:(A)scanf(“%20s”,s);(B)for(k=0;k17;k+)sk=getchar();(C)while(c=getchar()!=n)sk+=c;,常用的字符串处理函数包含在头文件string.h,字符串输出函数puts格式:puts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以0结束,字符串输入函数gets格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加0说明:输入串长度应小于字符数组维数,例#includemain()charstring80;printf(“Inputastring:”);gets(string);puts(string);输入:Howareyou?输出:Howareyou?,字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大拷贝时0一同拷贝不能使用赋值语句为一个字符数组赋值,例charstr120,str220;str1=“Hello!”;()str2=str1;(),例strcpy与strcat举例,#include#includevoidmain()chardestination25;charblank=,c=C+,turbo=Turbo;strcpy(destination,turbo);strcat(destination,blank);strcat(destination,c);printf(%sn,destination);,TurboC+,字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止返值:返回int型整数,a.若字符串1字符串2,返回正整数c.若字符串1=字符串2,返回零说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括0在内,例对于以下字符串,strlen(s)的值为:(1)chars10=A,0,B,C,0,D;(2)chars=“tv0willn”;(3)chars=“x69082n”;,答案:131,Howareyou?Hello!Len1=6,Len2=12,Len3=18,【例5-18】从键盘上依次输入10个字符串到二维字符数组w中保存起来,输入的每个字符串的长度不得超过29。#include#defineN10main()charwN30;for(inti=0;i=0;i-)printf(“%sn”,wi);return0;,【例5-19】将一个字符串复制到另一个字符串中,并求它们的长度。,#include#include/必须包含这个头文件main()chara10,b10=copy;strcpy(a,b);/将b指向字符串copy复制到a指向的字符串中printf(“%s%s”,a,b);/输出字符串a和b,它们应该相同printf(“%d%dn”,strlen(a),strlen(b);/输出这两个字符串的长度return0;,【例5-20】将两个字符串连接成一个字符串,输出连接以后的字符串及其长度。#include#include/必须包含这个头文件main()chara20=string;/字符串长度为6charb=catenation;/字符串长度为10strcat(a,);/连接一个空格到a串之后strcat(a,b);/把b串连接到a穿之后printf(“%s%dn”,a,strlen(a);return0;,【例5-21】设计一个字符串比较函数,用来比较两个字符串s1和s2的大小,若s1大于s2,则返回1,若s1等于s2,则返回0,否则返回-1。在主函数中调用该函数,验证其正确性。#include/#include/必须包含这个头文件intcompare(chars1,chars2);/比较两个字符串的大小main()chara20=string;/字符串长度为6charb=catenation;/字符串长度为10printf(strcmp(%s,1234)=%dn,a,compare(a,1234);printf(strcmp(%s,%s)=%dn,a,b,compare(a,b);printf(strcmp(123,%s)=%dn,a,compare(123,a);printf(strcmp(A,a)=%dn,compare(A,a);printf(strcmp(英文,汉字)=%dn,compare(英文,汉字);printf(strcmp(英文,英文)=%dn,compare(英文,英文);return0;,intcompare(chars1,chars2)/比较两个字符串的大小/在这个程序段中使用的s1i和s2i分别为s1数组和s2数组中下标为i的元素,分别表示s1和s2所指字符串中的第i+1个字符。inti;for(i=0;s1i,【例5-22】编写一个程序,首先从键盘上输入一个字符串,接着输入一个字符,然后分别统计出字符串中的大于、等于、小于该字符的字符个数。,#include#defineN30/假定输入的字符串的长度小于30voidmain()charaN,chl,i=0;intc1,c2,c3;printf(“输入一个字符串:)”;scanf(“%s”,a);printf(“输入一个字符:”);scanf(“%c”,【例5-23】编一程序,首先输入10个字符串到一个二维字符数组中,接着输入一个待查询的字符串,然后从二维字符数组中查找并统计出该待查字符串的个数。此程序比较简单,编写如下:#include#include#defineN5/定义常变量voidmain()charaN30=;/用于存储10个字符串,假定每个串的长度小于30chars30;/存储待查的字符串inti,k=0;,printf(输入%d个字符串:,N);for(i=0;iN;i+)scanf(“%s”,ai);printf(输入待查的字符串:);scanf(“%s”,s);for(i=0;iN;i+)/查找字符串Sif(strcmp(ai,s)=0)k+;printf(字符串%s个数:%dn,s,k);,【例5-24】编一程序,首先输入M个字符串到一个二维字符数组中,并假定每个字符串的长度均小于N,M和N为事先定义的整型常量,接着对这M个字符串进行选择排序,最后输出排列结果。,#include#include#defineM5/定义符号常量M#d

温馨提示

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

评论

0/150

提交评论