大学C语言实用教程(课件)-第5章-数组_第1页
大学C语言实用教程(课件)-第5章-数组_第2页
大学C语言实用教程(课件)-第5章-数组_第3页
大学C语言实用教程(课件)-第5章-数组_第4页
大学C语言实用教程(课件)-第5章-数组_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、第 5 章 数组和字符串,数组属于构造类型,使用数组可以有效地组织循环,能简化算法设计、简化编程。,2. 数组元素 数组的成员,用数组名加下标表示 。,5.1 数组的概念,数组是同类型变量的集合。数组具有如下特征: 类型 数组的类型就是所有数组元素的数据类型; 数组名 各元素共用同一个名称; 维数 一维数组有一个下标,二维数组有两个下标。,1. 数组, 维界只能是整常数表达式(含符号常数); 数组的下标从0开始; 多个相同类型的数组可以在一个语句中定义。,1. 数组的定义 存储类型 数据类型 数组名expnexpn-1exp2exp1 int data10; /一维数组 float a34;

2、/二维数组 char str130; /一维字符型数组 char str21080; /二维字符型数组,5.2 数组的定义和初始化,【例】int a8; float b23; char c27;,2. 数组的存储结构 数组占用一片连续的存储单元,数组中的各个元素依次存放。数组名就是这一片存储单元的首地址。 一维数组:各个元素顺序存放。 二维数组:先按行的顺序,然后按列的顺序依次存放各个元素。 每个元素占用存储单元的多少,取决于数组的数据类型,同一个数组的各个元素占用相同数量的存储单元。 字符型数组:各个字符依次存放,每个字符占1字节。,(1)一维数组初始化 把初值顺序放在等号右边的花括号中,各

3、常量之间用逗号隔开。 int ata10=50,60,70,80,90,100,101,102,103,104; float table5=1,2.5,3.6,4.7,5; (2)二维数组初始化 把全部初值放在一对花括号中,每一行的初值又分别放在一对内嵌的花括号中。 int a43=1,2,3,4,5,6,7,8,9,10,11,12; 其中代表每一行的内层花括号也可以省略,直接写成 int a43=1,2,3,4,5,6,7,8,9,10,11,12;,3. 数组的初始化,对数组初始化的几点说明: 如果赋初值的花括号中的常数个数少于数组元素个数,则编译程序会自动以零来补足。 int x6=1

4、,2,3,4; 相当于 int x6=1,2,3,4,0,0; int a43=1,2,4,5; 相当于 int a43=1,2,0,4,5,0,0,0,0,0,0,0; 花括号中的初值可以缺省,但逗号不能省略,缺省的值将被视为0。 float array5=,2.5,3.5,; 相当于 float array5=0,2.5,0,3.5,0; 当花括号中给出初值的个数多于定义的数组元素个数时,将出错。 int a4=1,2,3,4,5; 编译时会显示错误信息。, 用字符常数初始化 char str12=T,h,e, ,s,t,r,i,n,g,.,0; char language58=B,A,S

5、,I,C,0, F,O,R,T,R,A,N,0,P,A,S,C,A,L,0, C,0,C, O,B,O,L,0; 直接用字符串常量初始化 char str12=The string.; 或 char str12=The string.; char Language58=BASIC,FORTRAN, PASCAL,C,COBOL;,(3)字符型数组的初始化, C语言允许通过初始化方式隐含规定数组的大小。 int a =0,1,2,3,4,5,0; 等价于 int a7=0,1,2,3,4,5,0; 用初始化方法隐含规定多维数组的大小时,只能省略最左边的维界表达式。例如对二维数组,只能省略第一个方

6、括号中的表达式,写成: int a 3=1,2,3,4,5,6,7; 等价于 int a43=1,2,3,4,5,6,7; 不能写成: int a4 =1,2,3,4,5,6,7; 或 int a =1,2,3,4,5,6,7;,4. 利用初始化隐含规定数组的大小, 用初始化方法隐含规定字符型数组的大小,可以免除乏味的统计字符个数的工作。例如 char str =T,h,e, ,s,t,r,i,n,g,.,0; char str =The string.; 编译系统会根据初值给出的字符个数自动确定其维界是12。 char language 8=BASIC,FORTRAN, PASCAL,C,C

7、OBOL; 编译系统会根据初始化中字符串常量的个数自动确定该数组的第二维维界是5。,5.3 数组的基本操作,(1)用“数组名下标表达式”的形式来引用一维数组元素。下标的下限是0,而上限不能超过该数组定义时的维界值减1。(2)用“数组名下标表达式1下标表达式2”的形式来引用二维数组元素,其中,“下标表达式1”表示行下标,“下标表达式2”表示列下标,二者必须分别放在两个方括号内。 (3)可以用与上面类似的形式来引用一维或二维字符型数组的元素,即字符串中的一个字符。,数组的基本操作包括数组元素的引用、数组的赋值、数组的输入输出等。,1数组元素的引用, 只能逐个对数组元素赋值,不能直接对数组名赋值。

8、int i,a5; a0=100,a1=120,a2=200,a3=250,a4=500; 如果所赋的值有某种规律,就可以借助于循环来简化程序的编制。 int b23,i,j; for (i=0;i2;i+) for (j=0;j3;j+) bij=i+j;,2. 数组的赋值, 对字符型数组,只能对每个元素用字符常量赋值。 char st4 ; st0=A;st1=B;st2=C,st3=0; 为了解决直接用字符串对字符型数组赋值的问题,可用字符串处理函数实现。 #include strcpy(st,”ABC”);, 一维数组,一般用单重循环实现对各个元素逐个输入和输出。 float x10;

9、 int i; for(i=0;i10;i+) scanf(%f,3. 数组的输入和输出,按行的顺序输入 int a34,i,j; for (i=0;i3;i+) for (j=0;j4;j+) scanf(%d,按矩阵形式输出 #include void main() int i,j; int a34= 1,3,5,7,9,2,4,6,8,10,12,11; for (i=0;i3;i+) for (j=0;j4;j+) printf(%d ,aij); printf(n); , 二维数组的输入输出用二重循环实现。,【例】将10个元素的整形数组a分两行输出,每行5个数。 #include v

10、oid main() int i,a10=1,2,3,4,5,6,7,8,9,10; for (i=0;i10;i+) printf(%2d,ai); if (i%5=4|i=9) printf(n); ,程序中的if语句可以改用条件表达式: #include void main() int i,a10=1,2,3,4,5,6,7,8,9,10; for(i=0;i10;i+) printf(%2d%c,ai,i%5=4|i=9?n: ); , 字符型数组的输入和输出 用“%s”控制scanf()和printf()输入和输出字符串。,#include void main() int i; ch

11、ar ch10; for (i=0;i9;i+) scanf(%c, ,#include void main() char ch10; scanf(%s,ch); printf(%s,ch); ,输出有异常字符?,可以超出数组长度?, 用gets()和puts()实现。用gets()接收字符串的显著特点是遇到回车键才认为输入结束。 gets(字符型数组名); puts(字符型数组名);,【例】英文句子的输入输出。 #include void main() char word80; printf(Input a statement:); gets(word); puts(word); ,【例】

12、二维字符型数组的输入和输出。 #include void main() int i; char country38; printf(请输入国家名称:); for(i=0;i3;i+) gets(countryi); for(i=0;i3;i+) puts(countryi); ,【例】统计某班某门课考试成绩各分数档人数。,5.4 数组的应用,1数据统计,#include void main() int a11=0,i; float x; for(i=1;i=30;i+) scanf(%f, ,5.4.1 数值数组的应用,【例】试编程找出二维数组a34中最大和最小的元素,并指出它们所在的行号和列

13、号。,#include main() int a45,i,j, max,max_row,max_col; int min, min_row,min_col; printf( 输入二维数组如下:n); for (i=0;iaij) min=aij,min_row=i,min_col=j; printf( 输出结果如下:n); printf(max=%d, row=%d, column=%dn,max,max_row,max_col); printf(min=%d, row=%d, column=%dn,min,min_row,min_col); ,【例】 数据统计中经常用到标准差的概念。假设有n

14、个数di (i=1n),标准差的计算公式为:,#include #include #define N 1000 main() int i,n; float dN,dd,s; scanf(%d, ,选择排序的基本思路: 若有n个数需要排序,则需要进行n-1轮排序; 第1轮有n个数参加排序,此后,每一轮参加排序的数据个数逐次减少,即第2轮有后n-1个,第n-1轮只剩下后2个; 在第i轮排序时,要将ai与其后的各个数进行比较,凡出现比ai小的数就记下它的位置j,这一轮结束后,将ai与aj交换位置,从而找到第i小的元素。,【例】 选择排序。假设有10个数,要求将它们按从小到大的顺序排列。,2排序,排序

15、是将一批杂乱无序的数据按从小到大或从大到小的顺序整齐排列。排序的主要操作是比较和交换。,#include #define N 10 main() int i,j,k,m; int aN,t; for (i=0;iN;i+) /* 该循环用于输入数组元素的值 */ scanf(%d, ,经过9轮比较和交换后,整个数组即变成有序。 选择排序总共要进行(n-1)+(n-2)+.+1=n(n-1)/2次比较和最多n-1次交换,是一种比较简单但效率较低的排序方法。,冒泡排序的基本思路: 若有n个数需要排序,则需要进行n-1轮排序; 第1轮参加排序的数有n个,此后,每一轮参加排序的数据个数逐次减少,即第2

16、轮有前n-1个,第n-1轮只剩下前2个; 每一轮排序,都是进行相邻两个数的比较,即a0与a1,a1与a2比较,当不满足规定的顺序时就进行交换。该轮排序结束时,大数沉底,小数上浮一个位置,就像气泡一样。,【例】 冒泡排序。要求将保存在数组a10中的数按从小到大的顺序排序。,#include #define N 10 void main() int i,j,aN,t; printf(输入数据:); for (i=0;iaj+1) / 若为逆序,则相互交换 t=aj,aj=aj+1,aj+1=t; / 逗号表达式,实现数据的交换 printf(输出结果:); for(i=0;iN;i+) print

17、f(%-4d,ai); ,在处理大量数据时,经常要按某种方法找出所需的数据,这个过程称为检索或查找。常用的检索方法有顺序检索、二分检索、菲波那契检索、跳步检索等。当要检索的数据已经大小有序时,采用二分检索的搜索次数最多为log2n次(其中n是数据总个数),是一种比较快的检索方法。,3数据检索,顺序检索:不要求数据有序。依次审查数组中的数据是否要查找的数据,若是,结束审查;否则,继续审查。平均查找次数为(n+1)/2。 二分检索:要求数据有序。开始时将整个数组作为搜索区间,审查位于中间位置的元素是否要查找的数据,若否,则将查找区间折半,通过不断折半,直到找到或可确定数组中已没有指定的数据为止。,

18、(n+1)/2,log2n,【例】二分检索(对分检索、折半检索)。假设有n个从小到大排序好了的数,存放在数组v中,要求用二分检索的方法查找指定的数x是否在该数组中。,#include #define N 20 main() int vN,x,low,high,mid,i; printf( Enter data being sorted :n); for (i=0;i字符串2,则返回1;若字符串1字符串2,则返回-1。,(3)字符串比较函数strcmp(),#include #include void main() char str10=Book,Basic,Boolen, Babble,Bas

19、cket,st10; int i; strcpy(st,str0); for(i=1;i0) strcpy(st,stri); printf(Minimum string is %sn,st); ,解题思路:可将5个字符串存放在一个二维字符型数组str中,并设置一个一维字符型数组st用来存放最小的字符串。先将str中第一个字符串拷贝到st中,并以st为基准,逐个与str中余下的4个字符串比较,每次比较,总是将较小的字符串拷贝到st中。比较结束时,st中存放的就是最小的字符串。,【例】编制程序,从给定的5个字符串中找出最小的字符串。,【例】字符串连接函数的使用示例。 #include #incl

20、ude void main() char s17=ABC,s2=xyz,str50=abc; strcat(str,strcat(s1,s2); printf(%s,str); ,该函数用来将第2个字符串连接到第1个字符串的末尾,它的调用格式为 strcat(字符串1,字符串2); 其中,字符串1必须是字符型数组名。函数返回值为第一个字符串。经过连接后,第1个字符串末尾的0字符将被第2个字符串的第1个字符取代,第2个字符串不变。,(4)字符串连接函数strcat(),i=0 to strlen(str)/2,字符型数组在文字处理方面有着广泛的应用。,2字符型数组的应用,【例】若一个字符串正读和

21、反读都一样,如level,madam等,我们称之为回文。请编一个程序验证输入的字符串是不是回文。,解题思路:要验证一个字符串是不是回文,只要分别将它的第一个字符和最后一个字符、第二个字符和倒数第二个字符,直至最中间的两个字符进行比较,如果对应相等,说明它是回文,否则就不是。,#include #include main() char str80; int i,k,m=1; gets(str); k=strlen(str); for( i=0;ik/2;i+) if (stri!=strk-i-1) m=0;break; if (m) printf(%s is yes.n,str); else

22、printf(%s is no.n,str); ,说明:程序中使用了变量m作为标志(m=1,假设其为回文)。其作用是标识循环是正常结束还是非正常退出。循环正常结束,m的值不发生改变;循环非正常结束,将m=0,表明其不是回文。,【例】编制程序,其功能是从键盘输入一个字符串,然后将该字符串中的字符a全部替换成字符b。,解题思路:通过循环从字符串的第一个字符起逐个向后搜索,凡遇到字符a,就用赋值语句将它替换成字符b。当已达到字符串末尾的0字符时,整个替换工作结束。,#include #include main() char str80; int i=0; gets(str); printf(befo

23、re replacing: %sn,str); while(stri) if (stri=a) stri=b; i+; printf(after replacing: %sn,str); ,【例】编制程序,其功能是从键盘输入一个字符串,然后将该字符串中指定的字符删除。,方法1:依次取出每一个字符,若该字符要删除,则将其后的所有字符依次前移,直到字符串末尾的0字符为止。 方法二:用另一个字符型数组,将不需要删除的字符依次存入该数组中,需要删除的字符则不存入。,#include #include main() char str80,ch; int i=0,j; printf(Enter a str

24、ing:); gets(str); printf(Enter a character to be deleted:); scanf(%c, ,#include #include void main() char str80,str180,ch; int i=0,j=0; printf(Enter a string:); gets(str); printf(Enter a character to be deleted:); scanf(%c, ,注意:字符移动完成删除操作后,要在字符串的末尾加上0,否则,不能满足指定要求。,#include #include void main() char

25、str80,ch1,ch2; int i=0,j,k; printf(Enter a string:); gets(str); printf(Enter a character expressing the position to be inserted:); scanf(%c%*c,【例】编制程序,其功能是从键盘输入一个字符串,然后在指定的字符前插入一个字符。,插入字符实际上是将该字符及其后续字符均向后移动一个位置,在空出的位置上放置要插入的字符。,i+; i+; printf(after inserting: %sn,str); ,【例】编制程序,其功能是从键盘输入五个字符串,然后将这五个

26、字符串进行升序排列。,解题思路:对字符串进行有序排列,与前面章节讲的数值型数据排序类似,可以采用选择排序算法,也可以采用冒泡排序算法进行。所不同的是字符串大小的比较需要应用函数strcmp(),而字符串的相互赋值需要应用函数strcpy()。下面的程序采用选择排序对字符串进行排序,欲排序的字符串存放在二维数组str512中,数组array12用于字符串间相互复制的过渡字符串。,#include #include #define N 5 #define M 12 main() int i,j,k; char strNM,arrayM; for (i=0;iN;i+) /* 该循环用于输入初始字符串 */ sc

温馨提示

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

评论

0/150

提交评论