谭浩强高等教育出版社第3版_第5章 数组_第1页
谭浩强高等教育出版社第3版_第5章 数组_第2页
谭浩强高等教育出版社第3版_第5章 数组_第3页
谭浩强高等教育出版社第3版_第5章 数组_第4页
谭浩强高等教育出版社第3版_第5章 数组_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章第五章 数组数组 主讲人:韩维良 2021年7月9日 C语言程序设计 数组数组是相同类型的若干个数据的集合,用统一的数组名表 示这一组数,用下标来区别其中的每一个元素。 数组中的每一个个体称为数组的元素数组的元素,凡同类型的变量可 以使用的场合,均可以使用数组元素。 数组中的每一个元素都属于同一数据类型。 用统一的数组名和下标来唯一的确定数组中的元素,下标 相当于元素的序号(是一个大于等于0的整数),因此数组又称为 下标变量下标变量。 数组元素的类型可以是基本类型或复合类型。 通过下标的变化表示不同的元素,便于用循环来处理批量 的数据。 C语言程序设计 第一节第一节 一维数组一维数组 一

2、、一维数组定义及数组元素引用一、一维数组定义及数组元素引用 只有一个下标的数组。 类型类型 数组名数组名 元素个数元素个数 ; (1) “类型”是指数组元素的数据类型。 (2) 数组名,必须遵循标识符命名规则;存放的是一个存放的是一个 地址常量,它代表整个数组的首地址地址常量,它代表整个数组的首地址。 (3) “元素个数” 可以是常数和符号常量、不能包含 变量,其值为数组元素个数(又称数组长度,一经定义,长度不能 改变。) ,是一个正的整数值。 C语言程序设计 (4)数组元素下标,从0开始顺序编号,各元素按下标顺 序占用一段连续的存储单元。 每个数组第一个元素的下标固定为 0,称为下标的下界下

3、标的下界 ;最后一个元素的下标为元素个数减元素个数减 1 1,称为下标的上界下标的上界。 定义时,可用一个类型说明符来定义多个相同类型的数 组和变量,相互之间用逗号分隔。 如: int a5; 则定义了一个有5个元素的数组,名为a,其各个元素分 别为: a0, a1, a2, a3, a4. C语言程序设计 二、数组元素的引用方法二、数组元素的引用方法 即数组元素的使用。 格式: 数组名下标表达式 (1) “下标表达式”可以是任何非负整型数据,合法取 值范围是。 注意:在引用数组元素时,系统并不检验下标是否越界 。 C语言程序设计 (2) 1个数组元素,就是1个简单变量,具有和相同类型 变量一

4、样的属性,可以对它进行赋值和参与各种运算。 (3) 数值数组(整型/实型)作为1个整体,不能参加数 据运算,只能对单个的元素进行处理。 C语言程序设计 例如:数组元素的输入输出。 main() int i,a10; printf(请输入 10 个数组元素值:); for(i=0;i=9;i+) scanf(“%d”, for(i=0;i=9;i+) printf(%d,ai); 便于用循环处理批量的数据便于用循环处理批量的数据 C语言程序设计 三、一维数组的初始化三、一维数组的初始化 格式: 类型 数组名元素个数=初值 1,初值 2,; 功能:在定义数组时对数组元素赋以初值,初值按顺序 与各元

5、素相对应。 初值可以是数值型、字符常量或字符串。 数组元素的初值必须依次放在一对花括号内。数组中有 若干个数组元素,可在中给出各数组元素的初值,各初值 之间用逗号分开。 例如: int a10=0,10,20,30,40,50,60,70,80,90; 可以只给一部分元素赋初值 。例如: int a10= 0,1,2,3,4; 则前5个元素为指定值。 如果想使一个数组中全部元素值为 0,可以写成: int a10= 0,0,0,0,0,0,0,0,0,0; 或者int a10= 0 在对全部数组元素赋初值时,可以不指定数组长度: int a= 1,2,3,4,5意味着共有5个元素。 C语言程序

6、设计 例:编写程序,定义一个含有30个元素的数组,依次给 数组元素赋奇数1,3,5,然后按每行10个数的顺序输 出,最后再按每行10个数逆序输出。 分析: 元素的下标与元素值之间的规律:2*下标+1 s0s0s1s1s2s2s3s3s4s4s5s5.s27s27s28s28s29s29 1357911555759 C语言程序设计 #include #define SIZE 30 main() int sSIZE,i,; for(i=0;iSIZE;i+) si=2*i+1; printf(“顺序输出如下:n”); C语言程序设计 for(i=0;i=0;i-) printf(“%4d”,si)

7、; if ( i % 10 = 0 ) printf(“n”); 如果换成每行输出7个元素,怎么办?逆序输出时,可 以设置一个计数器。 C语言程序设计 四、一维数组元素的查找与排序四、一维数组元素的查找与排序 在数据处理中,很多问题都是基于查找与排序进行的。 查找与排序算法是非数值算法中最常用的的两类算法。 C语言程序设计 例:有一个数组a10=14,6,15,3,17,5,8,23,13,7, 编程查找在该数组中有没有一个值为x的元素。 分析:扫描法查找,与数组中各元素逐一比对。 #include main() int a10=14,6,15,3,17,5,8,23,13,7,i,x; pr

8、intf(“请输入欲查找的数值:n”); scanf(“%d”, for(i=0;i10;i+) if(x=ai) break; C语言程序设计 if(i10) /*循环的条件仍然成立*/ printf(“找到值为%d元素,其下标为:%dn”,x,i); else printf(“没有找到指定值为%d的元素n”,x); 注意:结果的判断,查找有两种可能,找到了,循环提前中 止,则i的值小于10,反之,i等于10。 C语言程序设计 例:已知一个数组a10,找出其中数值最大的元素。 分析:算法是“打擂台”,非常典型的算法,先让一个 人在擂台上,然后第二个与他比武,胜者留在擂台上,下一 个人再上去比

9、武,如此继续,直到全部比完,最后留在擂台 上的人就是冠军。 如:14, 6, 15, 3, 17, 5, 8, 23, 13, 7 max 14151723 C语言程序设计 #include main() int a10,i,max; printf(“请按顺序输入各元素值:n”); for(i=0;i10;i+) scanf(“%d”, max=a0; for(i=1;i10;i+) if(maxai) max=ai; printf(“最大值元素为:%dn”,max); C语言程序设计 按上面的程序,仅找出了最大值元素的值,但不知道其下标是多少? 如果改用max变量记录最大值元素的下标,则既可

10、以找到最大值元素的下标 ,也可以知道其值。 #include main() int a10,i,max; printf(“请按顺序输入各元素值:n”); for(i=0;i10;i+) scanf(“%d”, max=0; for(i=1;i10;i+) if(amax=ai) max=i; printf(“最大值元素的下标为:%d,其值为:%dn”,max,amax); 7/9/20211919C语言程序设计 例:从键盘上输入10个数,用冒泡法按从小到大的顺 序对其进行排序。 用:8,4,6,9,3,5等6个数演示排序的过程。 第一轮两两比较: 初态:8,4,6,9,3,5 0、1号元素比较

11、结果:4,8,6,9,3,5 1、2号元素比较结果:4,6,8,9,3,5 2、3号元素比较结果:4,6,8,9,3,5 3、4号元素比较结果:4,6,8,3, 9,5 4、5号元素比较结果:4,6,8,3, 5,9 6个元素比较5次,其中最大的元素排在最后一个位置 上,位置固定下来。 7/9/20212020C语言程序设计 第两轮两两比较: 初态:4,6,8,3, 5,9 0、1号元素比较结果:4,6,8,3, 5,9 1、2号元素比较结果:4,6,8,3, 5,9 2、3号元素比较结果:4,6,3, 8,5,9 3、4号元素比较结果:4,6,3, 5,8,9 5个元素比较4次,其中次大的元

12、素排在倒数第二个位 置上,位置固定下来。 每轮比较确定一个元素的位置,共有6个元素,需要 比较5轮,5个元素的位置确定下来后,最后一个也确定。 依次类推。两两比较需要一个循环,多轮比较需要两 重循环。 7/9/20212121C语言程序设计 #include main() int a10,i,j,t; printf(“请按顺序输入各元素值:n”); for(i=0;i10;i+) scanf(“%d”, for(i=0;i9;i+) for(j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; 7/9/20212222C语言程序设计 printf(“该数组从小到大排序的结果为:”

13、); for(i=0;i=9;i+) printf(%4d,ai); printf(n); 7/9/20212323C语言程序设计 例:选择法排序。 用:8,4,6,9,3,5等6个数演示排序的过程。 初态:8,4,6,9,3,5 找最小值,让其与0号元素交换 :3,4,6,9,8,5 余下找最小,其与1号元素交换 :3,4,6,9,8,5 余下找最小,其与2号元素交换 :3,4,5,9,8,6 余下找最小,其与3号元素交换 :3,4,5,6,8,9 余下找最小,其与3号元素交换 :3,4,5,6,8,9 6个元素打擂台找5次即可。 7/9/20212424C语言程序设计 #include m

14、ain() int a10,i,j,k,t; printf(“请按顺序输入各元素值:n”); for(i=0;i10;i+) scanf(“%d”, 7/9/20212525C语言程序设计 for(i=0;i9;i+) k=i; for(j=i+1;jaj) k=j; /*k总是记录较小元素的下标*/ if(k!=i) t=ai; ai=ak; ak=t; 7/9/20212626C语言程序设计 printf(“该数组从小到大排序的结果为:”); for(i=0;ibut。 输入要查找的元素 top=0,bot=n-1 while(topamid xamid 输出找到信息 top=top+1

15、bot=bot-1 (3)程序编码)程序编码 /* 折半查找学生年龄折半查找学生年龄 */ #include #include #define N 19 int main ( ) int aN=2,5,6,7,8,13,25,17,19,21, 23, 25,26,27,28,35,41,52,63; int mid, top,bot,x; top=0; bot=N-1; printf(请输入要找的元素:请输入要找的元素:); scanf(%d, while(topamid) top=mid+1; else bot=mid-1; printf(没有找到该元素!没有找到该元素!n); retur

16、n 0; 下面是三次测试结果:下面是三次测试结果: (1)第一次测试边界处的元素)第一次测试边界处的元素 (2)第)第2次测试数列中有的元素次测试数列中有的元素 (3)第)第3次测试数列中没有的元素次测试数列中没有的元素 以上测试结果正确,没有发现程序中有错误。以上测试结果正确,没有发现程序中有错误。 7/9/20214141C语言程序设计 *例:定义一个有15个元素的数组,用随机函数产生15 个049的随机数给其元素赋值,最后将数组中的数按颠倒 的顺序重新存放。 说明:随机数函数rand(),用于产生一个0-32767之间的 随机整数,如果要将随机数限定在049之间,则与50求余 即可,因为

17、某个数除以50,其所得余数只可能比其小。 a0a1a2a3a4a5a6a7a8a9 颠倒前 0102013401546173019 颠倒后 1930174615401320100 7/9/20214242C语言程序设计 前后两个数组:前者偶数个元素,后者奇数个元素。 实际上顺序的颠倒,表现为将数组中两侧的对应元素对 称交换位置即可,注意交换的一对元素下标的规律注意交换的一对元素下标的规律。 交换次数交换次数:元素个数/2(取整),元素数为奇数时,居 中的元素不需要交换。 a0a1a2a3a4a5a6a7a8 颠倒前 01020134015461730 颠倒后 30174615401320100

18、 7/9/20214343C语言程序设计 #include #include #define SIZE 15 main() int aSIZE,i,j,t; for(i=0;iSIZE;i+) ai=rand() % 50; printf(“颠倒前各元素为:”); for(i=0;iSIZE;i+) printf(“%d,”,ai); for(i=0;iSIZE/2SIZE/2;i+) t=ai;ai=aSIZE-1-i;aSIZE-1-i=t; 7/9/20214444C语言程序设计 printf(“颠倒后各元素为:”); for(i=0;iSIZE;i+) printf(“%d,”,ai)

19、; 可以改变SIZE的值,使其为偶数,再验证程序的运行结 果。 C语言程序设计 五、数组与函数五、数组与函数 数组作为函数的参数,主要有两种体现形式: 元素形式:以逐个元素形式体现。 数组整体:以数组名为代表,作为一整体体现。 1 1、数组元素作为函数实参、数组元素作为函数实参 以一个个元素的形式作为实参传递,就是一个某类型的 具体的数据,属于值传递。 适合于传递少数元素或一个数组的部分元素的情况,当 要传递数组的多个元素时,不方便。 C语言程序设计 例:求数组中任意指定的三个元素之和。 #include int sum(int x,int y,int z) return(x+y+z); ma

20、in() int i,a10,s1,s2,s3; printf(请输入 10 个数组元素值:); for(i=0;i=9;i+) scanf(“%d”, s1=sum(a1, a3, a5); s2=sum(a2, a4, a6); s3=sum(a7, a8, a9); printf(%dt%dt%dtn,s1,s2,s3); 2 2、函数对数组操作、函数对数组操作 用函数实现冒泡排序,并将数组定义为外部的。 /* 冒泡排序冒泡排序 */ #include #define N 8 void disp(void); /函数声明函数声明 void bubbleSort(void); /函数声明函

21、数声明 int aN=9,8,3,7,5,2,6,1; /定义外部数组定义外部数组 int main (void) bubbleSort(); /调用函数调用函数bubbleSort disp() /调用函数调用函数disp return 0; /* 冒泡排序函数冒泡排序函数 */ void bubbleSort(void) int i,j,temp; for(j=0;j=N-2;j+) for(i=0;iai+1) temp=ai;ai=ai+1;ai+1=temp; void disp(void) /* 输出函数输出函数 */ int i; printf(n排序结果:排序结果:); for

22、(i=0;i=N-1;i+) printf(%3d, ai); printf(n); 运行结果:运行结果: 将数组定义为全局(外部)的目的,是让几个函数都能对同 一个数组进行操作。但由于外部数据容易引起副作用,为减少副作 用,最好用static将其定义为静态的: #define N 8 static int aN=9,8,3,7,5,2,6,1; 3 3、 向函数传递数组名向函数传递数组名 向函数传送数组名,就是以数组名作参数。这时,并不是把 想整个数组全部元素的值通过“值传送”方式传送给形参,而是传 送数组首元素的地址,即采用“地址传送”方式。这是数组参数与 简单变量参数的不同之处。用传送数

23、组形式改写的冒泡排序程序。 #include #define N 8 void disp(int ); /* 声明中可以没有参数名字和数组大小声明中可以没有参数名字和数组大小 */ void bubbleSort(int dN); /* 声明中也可以有参数名字和数组大小声明中也可以有参数名字和数组大小*/ int main ( ) char xN=9,8,3,7,5,2,6,1; bubbleSort(x);/* 用函数名作实参用函数名作实参 */ disp(x); /* 用函数名作实参用函数名作实参 */ return 0; /* 冒泡排序函数冒泡排序函数 */ void bubbleSor

24、t(int aN)/* 函数定义中数组可以写出大小函数定义中数组可以写出大小*/ int i,j,temp; for(j=0;j=N-2;j+) for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp; /* 输出函数输出函数 */ void disp(int c )/* 函数定义中数组也可以不写出大小函数定义中数组也可以不写出大小*/ int i; printf(n排序结果:排序结果:); for(i=0;i=N-1;i+) printf(%3d, ci); printf(n); 运行结果:运行结果: 由该程序可以得到如下结论: (1)如果在函数中使形参数组元素的值改

25、变了, 也意味着实参数组元素值发生变化。原因是实参向形参 传送的是数组首元素的地址,使被调函数可以对主调函 数建立的数组中的元素进行读写。下页中的图是变量参 数与数组名参数的比较。 (a1)主调函数的代码读写 变量 被调函数实体不存在 (a21)主调函数的代码读写数 组元素 被调函数实体不存在 变量 代码 读写 主调函数 被调函数 实体不存在 数组名 代码 读写 主调函数 被调函数 实体不存在代码代码 (a)函数调用前)函数调用前 (b)函数调用时)函数调用时 实参 代码 主调函数数组名 代码 主调函数 被调函数被调函数 代码代码 数组名 传变量值传地址值 形参形参 实参 (b1)系统创建函数

26、实体, 主调向函数传送变量值 (b2)系统创建函数实体, 主调向函数传送数组名(地 址) (c)流程转到被调函数中)流程转到被调函数中 代码 主调函数数组名 代码 主调函数 被调函数 代码 数组名 (c1)流程转到被调函数 被调函数读写函数中变量 (c2)被调函数按照数组名 指示 直接读写主雕函数建立的数 组元素 被调函数 代码 变量 读写 读写 (d)函数返回)函数返回 (d1)流程转到主调函数 被调函数中实体被撤销 主调函数中的变量未被改变 (d2)流程转到主调函数 被调函数中实体被撤销 主调函数中的数组元素可被改变 变量 代码 读写 主调函数数组名 代码 读写 主调函数 被调函数 变量

27、被调函数 数组名 代码代码 (2)以数组名作参数时,有如下几点规则: 函数原型必须指明数组类型(指明数组元素的 类型,也要用一对方括号说明它是数组),而数组的大 小不是必须的; 实参可以只写数组名,而这个数组名必须是已 经定义为具有确定长度的数组名。 C语言程序设计 数组名作为参数传递,实际上传递的是数组元素的起始 地址,对应的形参也应该是一个地址或指针。 知道地址,自然可以对数组中的所有元素进行访问。 例:用一个数组存放10个学生某一门课的成绩,求平均 成绩。 设计两个函数: in_score()用于输入学生的成绩。 average()求平均成绩。 5959C语言程序设计 #include

28、#define SIZE 10 void in_score(float aSIZE) int i; for(i=0;iSIZE;i+) printf(“请输入第%d个学生的成绩:”,i+1); scanf(“%f”, return; C语言程序设计 float average(float bSIZE) int i; float sum=0; for(i=0;iSIZE;i+) sum+=bi; return sum/SIZE; main() int i; float sSIZE; in_score(s); /*在mian前定义,不用声明*/ printf(“这%d个学生的成绩分别为:n”,SI

29、ZE); for(i=0;iSIZE;i+) printf(“%4.0f,”,si); printf(“n平均成绩为:%6.2fn”,averag(s); C语言程序设计 由于传递给a的是s数组的首地址,因此,a0与s0操 作的是同一个数据,依次类推,进而对数组中的所有元素进 行操作。 ss065a0 a s173a1 s295a2 s387a3 s490a4 C语言程序设计 第二节第二节 字符串字符串 C语言中字符串的存储通过字符数组来实现。 字符数组是用来存放字符的数组,字符数组中的一个元 素存放一个字符。如果用于存放一个字符串,则字符串末尾字符串末尾 须以须以00作为结束标志作为结束标志

30、。 一维字符数组用于存储1个字符串(每个元素存放1个字 符),二维字符数组用于同时存储多个字符串(每一行存储 1个字符串)。 C语言程序设计 C语言中,字符型数据是指单个字符(包含转义字符) ,在使用时用单引号括起来。而字符串是用双引号括起来的 字符序列。 对于字符数组的处理有两种方式两种方式:逐个字符方式和整体 方式。 逐个字符处理方式与数值数组一样,整体处理方式只有 字符数组才被允许。 整体引用时,实际上是通过其首地址进行的。 C语言程序设计 一、字符数组与字符串一、字符数组与字符串 1 1、字符数组的定义、字符数组的定义 格式: char char 数组名常量表达式;数组名常量表达式;

31、如:char mingwen500, miwen500; 2 2、字符数组元素的引用、字符数组元素的引用 格式: 数组名下标数组名下标 C语言程序设计 3 3、字符数组的初始化、字符数组的初始化 (1 1)逐个字符赋值)逐个字符赋值 例:char name20=Z,h,a,n,g,L, e,i; char str10=H,e,l,l,o,!,0; 注意:第一句name只能是一个字符数组,不是一个字符串,而第二 句则是一个字符串,人为地加了一个结束符。 (2 2)以字符串方式赋值)以字符串方式赋值 例:char name20=“ZhangLei”; char name20 =“ZhangLei”

32、; 注意:存储时,在末尾自动添加0作为字符串结束标志。 C语言程序设计 二、字符串的输入二、字符串的输入/ /输出输出 1 1、输入、输入 1 1)逐个字符输入)逐个字符输入 以以%c%c格式符逐个输入字符数组中的各元素。格式符逐个输入字符数组中的各元素。 如:如: for(i=0;i10;i+) scanf(“%c”, 2 2)一次性整体输入)一次性整体输入 以以%s%s格式符输入一个字符串。格式符输入一个字符串。 如:如: scanf(“%s”,score); /*以数组名*/ C语言程序设计 2 2、输出、输出 1 1)逐个字符输出)逐个字符输出 以以%c%c格式符逐个输出字符数组中的各

33、元素。格式符逐个输出字符数组中的各元素。 如:如: for(i=0;i10;i+) printf(“%c”,scorei); 2 2)一次性整体输出)一次性整体输出 以以%s%s格式符输出一个字符串。格式符输出一个字符串。 如:如: printf(“%s”,score); /*以数组名*/ C语言程序设计 说明: (1)用scanf( )函数整体输入,或用printf( )函数整 体输出一个字符串时,类型转换符必须使用“%s”。 (2)在scanf( )函数的输入项首地址表,或printf( ) 函数的输出项表中,直接使用数组名数组名。 由于C语言中没有专门存放字符串的变量,字符串存放 在一个

34、字符型数组中,数组名表示第一个字符的首地址,以 0作为字符串结束标志,因此可以对字符数组采用整体操 作,且在输入或输出字符串时可直接使用数组名。 C语言程序设计 但下列赋值语句是错误的。 char str130,str230; str1=“Hello!”; str2=str1; C语言程序设计 例字符数组的整体输入与输出。 main( ) char name9; printf(“Whats your name?n”); scanf(“%s”, name); printf(“Welcome, %s !n, name); C语言程序设计 例从终端键盘输入一字符串,复制到另一字符数组, 并显示出来。

35、 分析:字符串不能直接整体赋值,但两个字串对应元素 逐一赋值,直到碰到字串结束符为止。 str1str2 0WW 1ee 2ll 3cc 4oo 5mm 6ee 70 C语言程序设计 程序如下: #include main() char str130,str230; int i; printf(input a string:); scanf(%s, str1); i=0; C语言程序设计 while(str1i!=0) /*特别注意条件的巧妙*/ str2i=str1i ; i+ ; str2i=0 ; /*加结束标记*/ printf(%s , str2); 运行结果: input a st

36、ring :ABC ABC C语言程序设计 三、字符串处理函数三、字符串处理函数 C语言编译系统提供了大量处理字符串的库函数,专门 用于处理字符串。 使用字符串输入函数gets()和输出函数puts()时,要用 #include命令将头文件包含到源文件中。 使用其他的字符串处理函数时,要用#include命令将 “string.h”头文件包含到源文件中。 C语言程序设计 1 1、字符串输入函数、字符串输入函数gets()gets() 格式: gets(gets(字符数组字符数组) ); 功能:从终端输入一个字符串(包括空格)赋给从字符数组起始的存 储单元中,直到读入一个回车符为止。 回车符读入

37、后,不作为字符串的内容,系统将自动用0替换,作 为字符串结束的标志。 如: char c20; gets(c); 执行上面的语句,如果输入:How are you! 则将读入的12个字符依次存入到c0开始的存储单元中,并在其后 自动加入一个字符串结束标志0。 C语言程序设计 2 2、字符串输出函数、字符串输出函数puts()puts() 格式: puts(puts(字符数组字符数组) ); 功能:将字符数组起始地址开始的一个字符串(以0结束的字符 序列)输出到终端,并将字符串结束标志0转化成n,自动输出一 个换行符。 如: char c = Hownarenyou!; puts(c); 输出结

38、果: How are you! C语言程序设计 3 3、字符串长度函数、字符串长度函数strlen()strlen() 格式: strlen(strlen(字符数组或字符串字符数组或字符串) ); 功能:求出字符串有效长度(以0结束的字符序列) 。 函数值为字符数组或字符串的有效字符个数,不包括0在 内。 如: char surname15=“Zhang”; strlen(surname)测量的是字符串所占的实际长度,为5. char c20 = Hownarenyou!; printf(%dn,strlen(c); 输出结果:12 C语言程序设计 4 4、字符串连接函数、字符串连接函数str

39、cat()strcat() 格式: strcat(strcat(字符串字符串1,1,字符串字符串2)2); 功能:将字符数串2(字符串)连接到字符串1的后面, 函数值为字符数组1的地址。 如:char c130 = How are you!n; char c2 = I am fine!; printf(%s ,strcat(c1,c2); 输出结果:How are you! I am fine! C语言程序设计 char surname15=“Zhang”; char firstname =“Lei”; 连接前连接前 Strcat(surname, firstname); 连接后的结果连接后的

40、结果 Zhang0 Lei0 ZhangLei0 C语言程序设计 注意: (1)连接前字符数组1和字符数组2的尾部都有一个 0,连接时将字符数组1后的0自动取消,字符数组2后 的0一并连接到字符数组1后。 (2)字符数组1必须有足够长度,以便在其有效字符后 能够容纳下字符数组2中的字符串。 C语言程序设计 5 5、字符串复制函数、字符串复制函数strcpy()strcpy()、strncpy()strncpy() 格式: strcpy (strcpy (字符串字符串1,1, 字符串字符串2)2); strncpy (strncpy (字符串字符串1,1, 字符串字符串2,n)2,n); 功能:

41、 strcpy将字符串2复制到字符串1中去, strncpy 将字符串2中的前n个字符复制到字符串1中去。 函数值为字符数组1的起始地址。 如:char c130 ,c2=How are you!n; printf(%s ,strcpy(c1,c2); 输出结果:How are you! C语言程序设计 注意: (1)字符数组1的长度足够容纳数组2中的字符串。 (2)将字符串2的结束标志0一起复制到字符数组1 中。 (3)strcpy()函数能够将字串2中前n个字符复制到字 符数组1中。 如:strcpy(c1,c2,4);即截取一部分截取一部分。 是将c2中前面的4字符复制到c1 中去,并在

42、串尾自动添 加串结束标志0。 C语言程序设计 6 6、字符串比较函数、字符串比较函数strcmp()strcmp() 格式: strcmp(strcmp(字符串字符串1,1,字符串字符串2)2); 功能:将两个字符串自左向右对应的字符逐个进行比较 (按ASCII码值大小比较),直到出现不同字符或遇到0 字符为止,函数值为一个整型数(1,0,-1)。 当字符串中的对应字符完全相同时,则两个字符串相等 ,否则,以第一个不相同的字符的比较结果作为整个字符串 的比较结果,比较结果由函数值带回,如果小于0(或者-1) ,前者小于后者;等于0,则相等;大于0(1),则前者大 于后者。 C语言程序设计 两字

43、串比较大小往往用于字串的排序。 char surname15=“Zhang”; char firstname =“Lei”; 比较的结果大于比较的结果大于0,实际返回值为,实际返回值为1 strcmp(surname, firstname); C语言程序设计 7 7、将大写字母转换成小写、将大写字母转换成小写strlwr()strlwr()函数函数 格式: strlwr(strlwr(字符串字符串) ) 功能:将字符串中的大写字母转换成小写,其它字符( 包括小写字母和非字母字符)不转换。 如: char str120=“How Are You!”,str220; strcpy(str2,str

44、lwr(str1); puts(str2); C语言程序设计 8 8、将小写字母转换成大写、将小写字母转换成大写strupr()strupr()函数函数 格式: strupr(strupr(字符串字符串) ) 功能:将字符串中小写字母转换成大写,其它字符(包 括大写字母和非字母字符)不转换。 如: char str120=“How Are You!”,str220; strcpy(str2,strupr(str1); puts(str2); C语言程序设计 第三节第三节 二维数组与多维数组二维数组与多维数组 一、二维数组及其定义一、二维数组及其定义 有两个下标的数组,两个下标分别称为行下标、列

45、下标。 类型 数组名行数列数; (1)类型即数组元素的数据类型;数组名为合法的标识符。 (2)相当于一个行列结构,行数和列数是两个整型常量表达式。 (3)下标值均从 0 开始的。 (4)数组各元素占有连续的存储空间,各元素按行的顺序排列。 C语言程序设计 例如:int a34 (1)定义a为34(三行四列)的二维数组,其元素类 型是 int。 注意不能写成int a3,4; (2)a数组共有34=12个数组元素。 (3)a数组行下标为 0,1,2,列下标为 0,1,2,3 。a数组的数组元素是: a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22,a23 C

46、语言程序设计 (4)定义了int型数组a,编译程序将为 a数组在内存中 开辟 34= 12 个连续的存储单元,用来存放 a数组的12个 元素,如图所示。 数组名a代表 a数组的首地址。 a00, a01 ,a02, a03 a10, a11, a12 ,a13 a20, a21, a22, a23 C语言程序设计 二、二维数组的初始化二、二维数组的初始化 类型 数组名行数列数=常量列表, 功能:定义二维数组的同时,给每个数组元素赋初值。 在中给出各数组元素的初值,各初值之间用逗号分开 。把中的初值依次赋给各数组元素。 几种初始化方式: (1)初值按行的顺序依次排列,每行都用一对花括号 括起来,

47、各行之间用逗号隔开。 如:int a23=1,2,3,4,5,6; C语言程序设计 (2)不分行的初始化。二维数组可以像一维数组那样, 将所有元素的初值写在一对花括号内。 编译系统将会为这些有序数据按数组元素在内存中排列 的顺序按行依次为各元素赋初值。如: int a23=1,2,3,4,5,6; (3)对二维数组中部分元素初始化。如: int a23=1,2,4; C语言程序设计 (4)如果对二维数组的全部元素都初始化,可以省略第 一维的定义,但不能省略第二维的定义。如: int a 4=1,2,3,4,5,6,7,8,9,10,11,12; (5)如果只对部分数组元素提供初值,又省略了第一

48、维 的长度,那么应分行赋初值,既使某行没有对应的初值,也 必须保留对应该行的一对花括号。如: int a 4=1,3, ,5,6,7,8,9,10,11; C语言程序设计 三、二维数组元素的引用三、二维数组元素的引用 数组名行下标列下标 (1)下标值可以是整型常量或是整型表达式。 (2)对基本数据类型的变量所能进行的各种操作,也都适合于同 类型的二维数组元素 (3)在使用数组元素时,应该注意下标值应在已定义的数组大小 的范围内。 (4)a(1)(2)是错误的,下标应放在中括号里。 (5)可从键盘上输入二维数组的元素,一般要使用二重循环。 C语言程序设计 例:二维数组的输入输出。 #includ

49、e main() int a34,i,j; printf(“请按顺序输入二维数组各元素的值:”); for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”, for(i=0;i3;i+) printf(“第%d行:”,i); for(j=0;j4;j+) printf(“%4d”,aij); printf(“n”); C语言程序设计 由于呈现出行列结构,所以二维数组元素的输入,应用 二重循环来控制。 C语言程序设计 【例】输入4名学生3门课程的成绩,算出每位学生的平 均分,打印出成绩表。然后再分别统计出每门课程的平均分 。 课程1 课程2 课程3 平均分 学生1 75

50、 82 92 83 学生2 93 95 91 93 学生3 83 93 85 87 学生4 67 65 78 70 平均分 79.5 83.7 86.5 C语言程序设计 课程课程 1 1 课程课程 2 2 课程课程 3 3 平均分平均分 学生学生1 1 a00 a01 a02 a03 学生学生2 2 a10 a11 a12 a13 学生学生3 3 a20 a21 a22 a23 学生学生4 4 a30 a31 a32 a33 平均分平均分 79.5 83.7 86.5 最后一列用于存放各行即每一个学生的平均分。最后一列用于存放各行即每一个学生的平均分。 C语言程序设计 #include mai

51、n( ) int a44;/*定义一个44 的二维数组a存放成绩单*/ int i,j,t; float x; printf(请输入成绩:n); printf(课程 1 课程 2 课程 3 n); for( i=0; i4; i+) for(j=0; j3; j+) scanf(%d, C语言程序设计 for( i=0; i4; i+) /*求每位学生的平均分*/ t=0; for(j=0; j3; j+) t=t+aij; ai3=t/3; /*最后一列存放平均分*/ printf( 课程 1 课程 2 课程 3 平均分n); for(i=0; i4; i+) /*按行、列形式输出成绩单*/

52、 for(j=0; j4; j+) printf(%6d,aij); printf(n); C语言程序设计 for(i=0; i3; i+) x=0; for(j=0; j4; j+) x=x+aji; /*先列后行地变化*/ printf(第%d 门课的平均分是:%4.1fn, i+1, x/4.0); C语言程序设计 程序的运行情况如下: 请输入成绩: 课程 1 课程 2 课程 3 75 82 92 93 95 91 84 93 85 67 65 78 课程 1 课程 2 课程 3 平均分 75 82 92 83 93 95 91 93 83 93 85 87 67 65 78 70 第1

53、门课的平均分是:79.5 第2门课的平均分是:83.7 第3门课的平均分是:86.5 四、向函数传送二维数组四、向函数传送二维数组 向函数传送数组的两点规则: 函数原型必须指明数组类型(指明数组元素的 类型,还要用一对方括号说明它是数组),而数组的大 小是可以写也可以不写; 实参可以写数组名,而这个数组名必须是已经 定义为具有确定长度的数组名。 例:学生成绩分析。有4个学生,每个学生学3门课 ,已知所有学生的各门课的成绩。为了分析教学情况, 需要分别求每门课的平均成绩和每个学生的平均成绩。 设各学生成绩如表示。 课程课程1 1课程课程2 2课程课程3 3 学生学生1 1897856 学生学生2

54、 28899 100 学生学生3 3728061 学生学生4 4607075 (1)选择数据结构 对于本题来说,将数据组织成二维数组最为合适,因为所有的 数据都是数值数据,如果考虑有小数点可以将数据组织成二维浮点 数组,如果考虑不带小数点可以将数据组织成二维整型数组。 考虑灵活性,可以这样定义数组: #define STDNUM #define STDNUM 4 /STDNUM4 /STDNUM表示学生数表示学生数 #define COURNUM#define COURNUM3 /COURNUM3 /COURNUM表示课程数表示课程数 double scoreSTDNUM COURNUM=89

55、,78,56, double scoreSTDNUM COURNUM=89,78,56, 88,99,100,72,80,61,60,70,75;88,99,100,72,80,61,60,70,75; scorescore是成绩数组,它是二维数组。是成绩数组,它是二维数组。score12score12表示序号为表示序号为1 1的学生的的学生的 序号为序号为2 2的课程的成绩。的课程的成绩。 (2)算法设计 对于二维数组的操作,一般要采用二重循环结构。 当固定一个行时,对列进行循环,可以穷举一行的各列 元素。当固定一个列时,对行进行循环,可以穷举一列 的各列元素。 对于本题来说,分别固定一个学

56、生所在行(外层循 环),依次加各列成绩(内循环),可以分别计算各学 生的总成绩,按课程数除得该生的平均成绩。即 #include #include void StudAveSccre(double aCOURNUM)void StudAveSccre(double aCOURNUM) int row,col;int row,col; double SumScreCour;double SumScreCour; for(row=0;row=STDNUM-1;row+)for(row=0;row=STDNUM-1;row+) SumScreCour=0; SumScreCour=0; for(co

57、l=0;col=COURNUM-1;col+) for(col=0;col=COURNUM-1;col+) SumScreCour += arowcol; SumScreCour += arowcol; printf(“n printf(“n学生学生%d%d的平均成绩是:的平均成绩是:%fn”,row+1, %fn”,row+1, SumScreCour/COURNUM);SumScreCour/COURNUM); 分别固定一门课程所在列(外层循环),依次加各行成绩( 内循环),可以分别计算各门课程的总成绩,按学生数除得该门课 程的平均成绩。即 #include #include void C

58、ourAveSccre(double bCOURNUM)void CourAveSccre(double bCOURNUM) int row,col;int row,col; double SumSoreStud=0;double SumSoreStud=0; for(col=0;col=COURNUM-1;col+)for(col=0;col=COURNUM-1;col+) SumSoreStud=0; SumSoreStud=0; for(row=0;row=STDNUM-1;row+) for(row=0;row=STDNUM-1;row+) SumScreStud+=browcol;

59、SumScreStud+=browcol; printf(“n printf(“n课程课程%d%d的平均成绩是:的平均成绩是: %fn”,col+1,SumScreStud/STDNUM);%fn”,col+1,SumScreStud/STDNUM); 下面,按照前面已介绍的向函数传送数组的规则, 来说明上面的二维数组参数:函数原型必须指明数组类 型(指明数组元素的类型,要用一对方括号说明它是数 组,而数组的大小可以写也可以不写)。在C语言中, 只定义了一维数组,二维数组是按照以一维数组作为元 素的一维数组的方法处理的。所以这里,double aCOURNUM或double bCOURNUM都

60、被看作由大小 为COURNUM的一维double数组组成的一维数组。即类型 是大小为COURNUM的一维double数组。参数中第1维下标 空,说明形参数组第1维的大小可以不写。 (3)设计主函数 主函数的功能有: 定义并初始化成绩数组; 调用计算函数; 其他。 / /* * * * * * * 文件名:文件名:ex051101.c ex051101.c * * * * * * */ / / /* * * * * * * 成绩分析成绩分析 * * * * * * */ / #define STDNUM #define STDNUM 4 4 #define COURNUM#define COUR

温馨提示

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

评论

0/150

提交评论