计算机软件及应用chap7数组.pptx_第1页
计算机软件及应用chap7数组.pptx_第2页
计算机软件及应用chap7数组.pptx_第3页
计算机软件及应用chap7数组.pptx_第4页
计算机软件及应用chap7数组.pptx_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第 7 数组是同类元素的集合、占据连续的存储空间,数组名标识了数组的起始地址。7.1 一维数组 定义一维数组语法:类型说明符 数组名整形常量表达式类型说明符说明了数组元素的数据类型;数组名符合标识符命名规则;整形常量表达式的值为数组中元素的数目。 数组元素:数组元素可以和基本数据类型变量一样使用。 数组元素可以通过如下形式引用: 数组名下标 其中:下标为整形常量或变量、也可以是表达式形式,其值为数组元素序号,下标依次为0、1、2、(-1)。如:int num5;定义了具有5个整形元素的数组;数组元素依次为num0、 num1、 num2、 num3、 num4。 C编译对数组下标越界不作检查,

2、如num5不属于数组num的元素、但引用了内存中紧邻数组num之后的整数,这点要特别注意! 严格说来、C编译将 理解为一运算符,定义语句的 为数组运算符,左右两边为运算对象、驱动C编译在内存中建立指定数据类型及指定大小的数组并将首地址与数组名相关联。其它地方的 为下标运算符,下标值指称了数组中的一个元素。数组运算符 中的运算对象“数组大小”必须为整形常量,如下语句序列是错误的:int n; scanf(“%d”,&n); int an;数组的作用域及存储属性与基本数据类型一样,有外部数组、局部数组和静态局部数组。数组的初始化 定义数组时给元素值称之为初始化,当然、程序运行过程中可用赋值语句改变

3、元素的值。C编译提供了初始值表方式进行数组初始化,外部数组和静态局部数组的数组元素若未初始化、其值为0(char 型为0); 方式初始化局部数组时、未初始化的元素也为0。全部一维数组元素赋初值时,可以不指定数组长度。如:int a =1,2,3,4,5;系统认为a有5个元素。分析下面程序结果:#includeint num1=1,2,3,4; /数组4个大、依次初始化外部数组为: /1、2、3、4;num14不是num1的元素!void main()static char num25; /静态局部数组、未初始化全为0 int num35=1,2; /局部数组 方式初始化依次为: /num30:

4、1、num31:2、其余:0 int num45; /局部数组、未初始化、全部未知 int i; num23=a; /赋值语句改变静态局部数组元素值num23:97 for (i=0;i=2;i+) /赋值语句改变局部数组元素值 num4i=i+1; /num40:1、num41:2、num42:3 printf(itnum1tnum2tnum3tnum4n); printf(-n); for(i=0;i5;i+) printf(%d:t%dt%dt%dt%dn,i,num1i,num2i,num3i,num4i);7.2 一维数组应用实例例7.2 将一个十进制正整数转换成二进制数。#incl

5、udevoid main( ) int i, k, r, x, b16; printf(Enter an integer x :); scanf(%d,&x); printf(%6d binary number is :n,x); k = -1; do r =x%2; b+k= r ; x/=2; while (x != 0); for ( i=k; i=0; i-) printf(%d,bi); printf(n);附:如何获取0100不同的随机数序列与产生不同随机数有关的三个函数原型:int rand(void);返回随机整数void srand (unsigned int n);n初始化

6、随机数产生器long time(NULL);获取当前时间(参数要大写)说明:srand()函数使用自变量n作为种子,用来初始化随机数产生器。如果把相同的种子先传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免多次运行程序出现重复的随机数序列。#include#include /使用rand、srand#include /使用timevoid main( ) srand(unsigned)time(NULL); /初始化 for (int i=0; i10; i+) printf(“%d ”, rand( )%100

7、); /%100使随机数范围0100 printf(n); 排序是数组的主要操作,“冒泡排序法”和“选择排序法”是两种常用方法。例7.3_1 用冒泡法将N个数按从小到大排序。冒泡(升序)算法:将序列(数组)中的N个数进行N-1轮比较操作:从首个开始、作相邻比较、若大于-交换;经N-1次、N个数的最大者已置于序列尾。将次短的序列进行同样操作、直至(次短的)序列为一个数。共N-1次大循环、第j次大循环在N-j个数中“冒泡”降序算法如何?#include #include #define N 10void main( ) int i, j,t,aN; printf(the first numbers

8、 :n); for(i=0;iN;i+) ai=rand()%100;printf(%-4d,ai); printf(n); for (i=0;iN-1;i+) /N-1次大循环 for (j=0;jaj+1) t=aj;aj=aj+1;aj+1=t; /交换 printf(the sorted numbers :n); for(i=0;iN;i+) printf(%-4d,ai); printf(n);本次比较中N-1-i单元不参与下次大循环比较、正好保存本次比较得出的最大数!for(i=0;ii;j-) if(ajaj-1) t=aj;aj=aj-1;aj-1=t;例7.3_2 用选择法将

9、整形数组aN中数升序排列。算法一:假设序列中首数最小、将其与后续序列各数相比,若 小交换、直至序列尾; 第二数作为新序列首数、重复、直至首数为一个。for(i=0;iN-1;i+) for(j=i+1;jN;j+) /寻找比序列首更小的数 if(ajai) /遇到更小的数(交换) t=aj;aj=ai;ai=t; /一次大循环有可能交换多次for(i=0;iN-1;i+) k=i; /保存序列首下标 for(j=i+1;jN;j+) /寻找序列中最小数下标k if(ajak) k=j; /保存更小数下标、小循环完成保存最小数下标 if(k!=i) t=ak;ak=ai;ai=t; /大循环只作

10、一次交换或不作算法二: 假设序列中首数最小、将其与后续序列各数相比、寻 找最小数下标,若最小数下标不为首数下标、与首数交换。 第二数作为新序列首数、重复、直至首数为一个。#include #include #include /含种子#define N 5void main( )int i, j,t,aN,k; printf(the first numbers :n); srand(time(NULL); for(i=0;iN;i+) ai=rand()%100; printf(%-4d,ai); printf(n);/选择排序算法二 for(i=0;iN-1;i+) k=i; for(j=i+

11、1;jN;j+) if(ajak) k=j; if(k!=i) t=ak;ak=ai;ai=t; printf(the sorted numbers :n); for(i=0;iN;i+) printf(%-4d,ai); printf(n);分析如下程序作业:将数组定义为外部的、用六个函数:main()、冒泡函数、选择排序一函数、选择排序二函数、随机数初始化数组函数、打印输出函数处理aN数组排降序!7.3 二维数组1)二维数组的定义:类型名 数组名常量表达式1常量表达式2 常量表达式1的值指明了二维数组有多少行元素、表达式2指明了每行中有多少列元素。如:float f23 ; 定义了一个2行

12、3列的float型二维数组f,可用于保存6个float型数。2) 二维数组元素的引用 二维数组元素采用双下标引用,行列下标都是从0开始编号、最大下标为常量表达式指定的值减1。上面定义的f数组各元素用下标表示为: 第一行:f00、 f01、 f02 第二行:f10、 f11、 f12 如此类推、也可以定义多维数组,如:int a345;定义了一个三维数组a,可用于保存60(3*4*5)个 int型数。3) 多维数组元素在内存中的存放次序 C编译保存多维数组元素的原则是:从首个开始、右边下标优先递增、依次存放。 前面讨论一维数组时介绍过, C编译将 理解为一运算符,一维数组名指称了第一个元素的第一

13、个字节地址;二维数组的定义语句、如 int a34;也要按照数组运算符 的运算对象及优先级和结合性去理解其含义。 具有左结合性、因此这样说: “3左边的运算对象a是一数组名、数组包含有(左边方括号中的运算对象)3个元素:a0、a1、a2,a的每个元素是一维数组(考虑右边 号)、a0等又为作为右边4的运算对象、因此a0、a1、a2都是一维数组名;每个一维数组又包含有4个元素,如a0包括:a00、 a01、 a02、 a03,而它的每个元素是int型数据”。 由此可见、a指称了a0的地址;a0指称了a00的地址,a当然也指称了a00的地址;a2为a数组第3行的一维数组名、指称了a20的地址。 多维

14、数组的定义语句 、看起来虽然简单、其内涵却十分丰富,不仅仅只定义了一个程序对象,同时依据该程序对象名所带 个数不同、也定义了不同大小的子数组,这些子数组名在源程序中是可以引用的。 依据多维数组元素存放原则、不难理解:多维数组“各级别的元素”都是连续存放的!2维3维等只是个逻辑概念,其元素对应着物理上是一维的、不同大小的连续内存块。使用“最小的元素”如同使用基本数据类型变量一样。4)二维数组的初始化 初始化二维数组时可以内嵌、内嵌的代表行;所赋给的值是按行按列对号入座;缺少的内嵌或内未指定的为0。如: int a34=1,5,9;/每行首个分别为1,5,9其余为0 static int a34=

15、1,0,6,0,0,11; int a34=1,5,6; /第三行全为0 static int a34=1, ,9; /第二行全为0 对二维数组的全部元素赋初值时,可以不指定第一维的长度,但不得省去第二维的长度。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成:static int a 4=1,2,3,4,5,6,7,8,9,10,11,12;同样,static int a 4=0,0,3, ,0,10; 也是正确的 常采用如下方式将所有元素初始化为0: int a56=;或int a56=0; 对二维数组常采用二重循环访问。 二维数组的常应用于

16、矩阵元素查找、矩阵运算、特殊矩阵的生成等。例7.4 将二维数组行和列的元素互换后存到另一个数组中。#includevoid main( ) static int a23=1,2,3,4,5,6; static int b32, i, j; printf(array a:n); for (i=0; i=1; i+) for ( j=0; j=2; j+) printf(%5d,ai j);b ji=ai j; printf(n); printf(array b:n); for (i=0; i=2; i+) for ( j=0; j=1; j+) printf(%5d,bi j); printf(

17、n); 例7.5 输出一个34数组中每行中的最大元素之值及其位置。#includevoid main( ) int i,j,c,max ; static int a34=6,-5,11,3,8,9,4,7,2,13,1,-10; for (i=0; i=2; i+) max=ai0;c=0; for (j=0;jmax)max=aij;c=j; printf(max=%2d,row=%d,colum=%dn,max,i+1,c+1); 输出结果:max=11, row=1, colum=3max= 9, row=2, colum=2max=13, row=3, colum=27.4 字符数组与

18、字符串 C语言没有字符串变量、C编译以一维字符数组的方式处理字符串;字符数组的最后一个元素为0、作为字符串的结束标志。 第二章讨论过涉及字符操作的几个库函数,有控制台与流操作、单个字符与字符串操作之分。函数原型及功能简介如下:int getch(void); /控制台操作、无回显(单个字符输入操作)int getche(void); /控制台操作、有回显(单个字符输入操作)int getchar(void); /stdin流操作、有回显(单个字符输入操作)int putchar(char ch); /stdout流操作(单个字符输出操作) int scanf(“%c”); / stdin流操作

19、(单个字符输入操作)int printf(“%c”); / stdout流操作(单个字符输出操作)int scanf(“%s”); / stdin流操作(字符串输入操作)int printf(“%s”); / stdout流操作(字符串输出操作)7.4.1 字符数组的逐个字符操作例7.4 从键盘输入一个字符串(只看到*号),回车键结束,并将字符串在屏幕上输出。#include#includevoid main( )int i; static char str80; for(i=0;i80;i+) stri=getch(); /逐次给数组元素stri赋值,不回显 printf(*);/以星号代替

20、输入字符的个数 if(stri=x0d) break; /若输入回车则终止循环 printf(n);i=0; while(stri!=x0d) printf(%c,stri+); /逐次输出字符数组的各个元素 printf(“n”); 例7.4_a 字符数组初始化及用scanf(“%s”)输入字符串。#includevoid main( )int i;char str112=c,a,i, ,y,i, ,h,o,n,g;char str2=cai yi hong;char str35=cai ,yi ,hong;char str412;printf(%sn%sn%sn,str1,str2,str

21、3);printf(%sn%sn%sn,str30,str31,str32);printf(str111:%dnstr303:%dnstr304: %dn,str111,str303,str304);scanf(%s,str4); /输入cai yi hong回车printf(%sn,str4); 注意:用scanf(“%s”)输入字符串时、从第一个非空白字符开始,遇到第一个空白字符结束、并在末尾加上0。例7.4_b: printf(“%s”)是将数组中字符逐一插入stdout流、遇到0结束插入。#includevoid main( )char name13; int i; for(i=0;i

22、=12;i+) scanf(%c,&namei); /输入pear & apple回车 for(i=0;i=12;i+) printf(%c,namei); printf(%sn,name); /name13无结束标志 printf(name12:%dn,name12); /参考第二章 name12=0; printf(%sn,name);例7.4_c: 在二维数组中修改0。分析运行结果!#include#include void main( )int i; char name74=sun,mon,tue,wed, thu,wen,sat; printf(Result is:n); name0

23、3=&; name23=&; name53=&; for(i=0;i7;i+) printf(%sn,namei); getch();有几点要引起注意:由于系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。由于结束标志也要在字符数组中占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。控制台输入操作与stdin流提取操作的工作原理是不同的、详细介绍请参见第二章。7.4.2 常用字符串处理函数字符串标准函数的原型在头文件string.h中。1输入字符串gets()函数(1)调用方式:gets(字符数组)(2)函数功能:从标准输入流stdin,读

24、取1个字符串(可以包含空格),将其存储到字符数组中去并在末尾自动补上0。(3)使用说明 1)gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间、存放输入的字符串。 2)该函数输入的字符串中允许包含空格,而scanf()函数不允许。遇到回车输入结束!2输出字符串puts()函数(1)调用方式:puts(字符数组)(2)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用n取代字符串的结束标志0。所以用puts()函数输出字符串时,不要求另加换行符。(3)使用说明1)字符串中允许包含转义字符,输出时产生一个控制操作。2)该函数一次只能输出一个字符串,而pri

25、ntf()函数也能用来输出字符串,且一次能输出多个。例7.4_d:分析下面程序结果。 (去掉rewind(stdin);语句试一试)#include#include void main()static char str15,str25,str35,str15; scanf(%s%s%s, str1, str2,str3); /*输入 how are you回车*/ printf(%s%s%sn, str1, str2,str3); puts(str1);puts(str2);puts(str3); /*puts()将0转换为n*/ rewind(stdin); /*清除键盘缓冲区,內部位置指针

26、置首位*/ gets(str); /*输入 how are you回车*/ puts(str);例7.4_e:分析一“怪异”程序:从键盘按下面次序输入,分析程序结果: aa bb回车cc dd回车#include #include void main()char a15,a25,a35,a45; scanf(%s%s,a1,a2); gets(a3);gets(a4); puts(a1); puts(a2); puts(a3); puts(a4);例7.4_e:分析:输入流为一队列 aabbccddscanf(“%s”);从stdin流队列中一个一个地读字符,每读一个,标准输入设备文件stdi

27、n内部指针向右移动一个字符位置;以非空白字符开始,以第一个空白字符结束。gets();从stdin流队列中一个一个地读字符,每读一个,标准输入设备文件内部指针向右移动一个字符位置;以为串输入结束标志。则:a15:aa0 a25:bb0a35:0 a45:ccdd03字符串比较strcmp()函数(1)调用方式:strcmp(字符串1 ,字符串2)其中“字符串”可以是串常量,也可以是1维字符数组。(2)函数功能:比较两个字符串的大小。如果:字符串1=字符串2,函数返回值等于0; 字符串1字符串2,函数返回值正整数。(3)使用说明1)如果一个字符串是另一个字符串从头开始的子串,则母串为大。2)不能

28、使用关系运算符“”来比较两个字符串,只能用strcmp() 函数来处理。例7.4_f gets函数和strcmp函数的应用。 /*功能:简单密码检测程序*/#include#include#include#includevoid main()char pass_str80; /*定义字符数组pass_str*/ int i=0; /*以下为检验密码*/ while(1) rewind(stdout); /*清屏*/ printf(请输入密码n); gets(pass_str); /*输入密码*/ /*假定正确口令为password*/ if(strcmp(pass_str,password)!

29、=0) printf(口令错误,按任意键继续n); else break; /*输入正确的密码,中止循环*/ getch(); i+; if(i=3) exit(0); /*三次错误的密码,退出*/ /*以下为输入正确密码所进入的程序段*/ printf(“密码正确!欢迎你进入!n”);4拷贝字符串strcpy()函数(1)调用方式:strcpy(字符数组, 字符串)其中“字符串”可以是串常量,也可以是字符数组。(2)函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。(3)使用说明1)字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志0一起复制。

30、2)不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。5连接字符串strcat()函数(1)调用方式:strcat(字符数组, 字符串)(2)函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。(3)使用说明 1)由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。 2)连接前两个字符串都有结束标志0,连接后“字符数组”中存储的字符串的结束标志0被舍弃,只在目标串的最后保留

31、一个0。6求字符串长度strlen()函数(len是length的缩写)(1)调用方式:strlen(字符串)(2)函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。7将字符串中大写字母转换成小写strlwr()函数(1)调用方式:strlwr(字符串)(2)函数功能:将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换。8将字符串中小写字母转换成大写strupr()函数(1)调用方式:strupr(字符串)(2)函数功能:将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。7.5 数组作为函数参数 数组用作函数参数有两种形式:一种是把数组元素(又

温馨提示

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

评论

0/150

提交评论