下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 章 数组,问题的引入,例:输入10个学生某门学科的成绩,求平均成绩。,1、当读入下一分数时,前一分数值是否还能找到? 2、如何将低于平均成绩的分数打印出来?,在程序设计中存储单个数据时,需要根据数据的类 型定义相应的变量来保存。如存储一个整数时需要定义 一个整数变量来保存,存储一个实数时需要定义一个单 精度或双精度变量来保存,存储含有多个成分的一个记 录数据时,需要定义该类型的一个结构变量来保存。,若在程序设计中需要存储同一数据类型的、彼此相 关的多个数据时,如存储数学上使用的一个数列或一个 矩阵中的全部数据时,显然采用定义简单变量的方法是 不行的,这就要求定义出能够同时存储多个值的变量,
2、 这种变量在程序设计中称为数组(相同类型的若干个元 素所组成的有序集合)。,在实际应用中,一组相关的数据之间可能存在着一 维关系,也可能存在着二维关系,等等。如下表:,概述,C+数据类型: 基本类(简单类)字符型/整型/实型/枚举型 构造类(组合类)数组/结构体/共用体 指针类 空类型(void) 基本类型单个出现的变量,每个变量可以代表一个确定的数据(变量值),且具有一定属性。如 static int x,y;但变量间不存在确定的相互关系。 构造类型由基本类型按一定规则组成。其中数组 :由一组有序数据(数组元素)组成,这些数据保存在连续的内存空间,每个元素具有相同类型,因此占有相同大小的存储
3、单元,具有统一数组名,用下标确定其顺序,但可以取各自值。,如 static int a5;其中: 1. 表示a是个数组,而不是一个简单变量a 2. 5表示该数组共有5个元素 3. 元素编号即下标从0开始,a0表示第一个元素,a4表示第5个元素(最后一个) 一般化:假设m和n是常量,则数组am的第一个元素是a0,最后一个元素是am-1;数组amn的第一个元素是a00,最后一个元素是am-1n-1,以此类推。,数组的用处很多。简单例子:要读入某班全体50位同学某科学习成绩,然后进行简单处理(求平均成绩、最高分、最低分),分析:若用简单变量,需50个不同变量名,如stu1,stu2,stu50,要用
4、很多个cin命令。而用数组,可共用一个cin命令,并利用循环结构读取。,同变量一样,数组也必须先定义,后使用。 定义内容: 数组名 :必须是合法标示符 类型(存储属性/数据类型) 大小(维数/元素个数) 定义的一般形式: 存储属性 数据类型 数组名常量表达式常量表达式 常量表达式:常量或符号常量,其值必须为正,不能为变量 !如:int n=5;int an;这样定义是错误的,如下为正确的:int a10,b54; char name8, ch23; static float x8*2+1, table234; #define NUM 40 int aNUM,bNUM+2;,数组定义,数组的初始
5、化,可以在定义数组的同时赋初值,如:,可以省略第一维数组大小,如: int a =, b3=;,省略元素值,如:,int a5=0; int b32=0;(全部元素初始化为0 ),int a 3=1,2,3,4,5,6,7 ; (思考第一维的大小?),静态/外部数组未初始化,默认初值是0(数值)或0(字符). auto数组未初始化,初值为不可预料的数。,只能逐个引用数组元素,不能一次引用整个数组 .引用数组元素要注意下标不要越界(编译程序不检查是否“越界”).引用示例 : a23 a2-12*3-1 ax(x为整型表达式或变量) int a5; for (i=0;i5;i+) (注意下标不要越
6、界) coutai;,数组元素的引用,用一维数组来处理Fibonicci数列的前20项。 f1 = 1 n = 1 f2 = 1 n = 2 fn = fn-1 + fn-2 n 3,void main()int i; int f20 = 1,1; /* f1、f2已知 */ for(i=2; i20; i+) fi = fi-1 + fi-2; for(i=0; i20; i+) if (i%5 = 0) coutendl; coutsetw(12)fi; ,#include #include ,【例】以下程序的运行结果是什么? #include void main()int a3=1,2,
7、3,4,5,6,0; couta11a21a31; ,结果:500,1 2 3 4 5 0 6 0 0 0 0 0,【例】显示如下图形:1 0 0 0 0 2 1 0 0 0 3 2 1 0 0 4 3 2 1 0 5 4 3 2 1,a55分析: a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24 a30 a31 a32 a33 a34 a40 a41 a42 a43 a44,void main()int a55=1,2,1,3,2,1,4,3,2,1,5,4,3,2,1,i,j; for(i=0;i=4;i+) for(j
8、=0;j=4;j+) coutaij; coutn; ,例:读入某班全体50位同学某科学习成绩,然后进行简单处理(求平均成绩、最高分、最低分),例:找出一个二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点.,【例】有一34矩阵,编程求其元素最大值并输出其行、列号。 void main() int i,j,x,y,max; int a 4=3,5,8,1,6,9,7,12,-6; max=a00; for (i=0;imax) max=aij; x=i; y=j; coutmax is a x y = max n; ,3 5 8 1 6 9 7 12 -6 0 0 0,
9、结果:max is a13=12,用数组元素作函数实参此时可把数组元素看作普通变量(单向值传递).特点:主调函数中的实参数组元素(带下标) 被调函数中的形参普通变量 调用结果:形参值的变化对实参值无影响(二者分占不同内存),数组作为函数参数,【例】void main() int a=1,2,3,4,5,6; static int b6=2,3,0,4; int i; sum(int,int,int);for (i=0;i6;i+) sum(ai,bi,i); couta=ai,b=bi; void sum(int x,int y,int z) x=z;y=z; ,结果: a=1,b=2 a=2
10、,b=3 a=3,b=0 a=4,b=4 a=5,b=0 a=6,b=0,用数组名作函数实参若int a6;则数组名a表示数组的起始地址.此时,是把实参数组的起始地址“传给”形参数组 .本质:对应的数组元素(不是形参与实参)共享同一内存单元(所谓“双向的地址传送”).特点:主调函数中的实参数组名(不带下标) 被调函数中的形参数组名或数组定义式 调用结果:两数组同下标者为同值 .,数组作为函数参数,【例】void main() int a=1,2,3,4,5,6; static int b6=2,3,0,4; int i; sum(int ,int ,int);for (i=0;i6;i+) s
11、um(a,b,i); couta=ai,b=bi; void sum(int x ,int y ,int z) xz=z+2;yz=z; ,传址,结果: a=2,b=0 a=3,b=1 a=4,b=2 a=5,b=3 a=6,b=4 a=7,b=5,例:下面的程序定义了一个3x4的数组,表示3个学生,每个学生有4门成绩,求所有学生中的最好成绩。 int maximum(int4,int,int); void main()int sg34=68,77,73,86,87,96,78,86,90,70, 81,86; coutmax) max=gradeij; return max;,字符数组的初始
12、化 char c5=a,b,c; c3和c4自动定为0 字符串在内存中以字符数组存放,因此可以用字符串直接初始化字符数组. char c5=“abc”;思考:char c =“abc”; 数组c的数组长度? 字符串以字符串结束标志0(即空字符)结束(可以思考A和“A”在内存中存放的区别),因此 char c =“abc”;等价于 char c =a,b,c,0);既数组c的数组长度为4,当然char c5=“abc”;的数组长度仍为5.,字符数组和字符串,字符数组char c5;的输入 法一(逐字符输入):int i; for(i=0;ici; 法二(字符串输入):cinc; 注意:此法输入的
13、字符串以空格或回车结束,即输入的字符串不可能包括空格!如输入:abc def回车后,c对应的字符串为“abc”,而不是“abc def”.另外此法输入的字符串串长有可能比数组长度要长,应引起注意! 要想输入带空格的字符串,可使用函数cin.get或者cin.getline. 此例对应cin.get(c,6,n) 或者cin.getline(c,6,n),字符数组char c5;的输出法一:int i; for(i=0;i5;i+) coutci;法二:coutc; 输出一个字符串,直到遇到0为止,因此输出的字符串有可能和数组不一样。,【例】比较以下字符数组长度是否相同: char a =”AB
14、CD”; char b = “ABCD”; char c =A,B,C,D;,(5),(5),(4),【例】下列程序段的运行结果是: char a5=a,b, 0,d,0; couta;,(ab),二维数组可以看成特殊的一维数组,这个特殊的一维数组的元素又是一个一维数组。即a34可看成数组长度为3的一维数组,而此一维数组的每个元素又是一个数组长度为4的一维数组。如下图所示:,所以a0对二维数组a来说是元素名,但对一维数组a00,a01,a02,a03来说却是数组名.,【例】分析以下程序的运行结果: void main()char word310;int i;for (i=0;iwordi; c
15、outwordi-2;运行时,输入:12345(回车)abcdef (回车)ABCDEFG(回车),结果:abcdef,将一个字符串直接给一个字符数组只能够出现在初始化中,不能够出现在赋值语句中!也不能把一个字符数组直接赋值给另一个字符数组,如:char c5,d5;c=“abc”;d=c;是错误的! 要使用string.h的函数strcpy(to字符数组1,from字符数组2)如:strcpy(c,”abc”); strcpy(d,c);,字符串处理函数,【例】以下程序的输出结果是 。 #include “string.h” void main( ) char s10,sp =”HELLO”
16、; strcpy(s,sp); s0=h; s6=!; couts; ,hELLO,strcat( ) 字符串连接函数形式:strcat(目的字符数组,源字符串);作用:将源字符串连接到目的字符数组后面。函数返回值:目的字符数组的地址。注意:目的字符数组要定义得足够大。,【例】以下程序的输出结果是 _。 #include string.h void main() char a =abcde; char b =12345; strcat(b,a); couta , b; ,abcde,12345abcde,【例】以下程序的输出结果是 _。 #include string.h void main(
17、) char a80=”AB”,b80=”LMNP”; int i=0; strcat(a,b); while (ai+!=0) bi=ai; coutb; ,LBLMNP,比较两个字符串(字符数组)的大小要使用string.h的函数 strcmp(字符数组1,字符数组2)不能直接使用关系运算符( = 0时,字符串1字符串2;strcmp函数返回值0时,字符串1字符串2; 思考:如何判断str1是否等于str2?,要写成 if(strcmp(str1,str2)=0) .不可写成 if(str1=str2) .,#include “string.h” void main() int i; ch
18、ar str10,temp10=”Control”; for ( i=0; istr; if(strcmp(temp,str)0) strcpy(temp,str); couttemp;,【例】运行以下程序时,从键盘输入:BOOKCUTGAMEPAGE(表示回车),则运行结果是什么?,变量跟踪: temp str 比较,i=0,Control,BOOK,0,i=1,Control,CUT,0,i=2,Control,GAME,0,GAME,i=3,GAME,PAGE,0,PAGE,求字符串实际长度可使用string.h的函数strlen(字符数组),它不包括字符串的结束符0.如: char a
19、10=“abcde”; 则strlen(a)=5 ,sizeof(a)=10,【例】以下程序段的运行结果是什么? char a =”tr0willn”; coutsizeof(a)tstrlen(a);,结果:10 3,数组元素的排序,一 输入10个数,用“冒泡法”对10个数排序(由小到大)。 “冒泡法”算法:以六个数9、8、5、4、2、0为例。第1趟比较,第一次:8、9、5、4、2、0,第二次:8、5、9、4、2、0,第三次:8、5、4、9、2、0,第四次:8、5、4、2、9、0,第五次:8、5、4、2、0、9,第1趟比较产生第一个最大数:9,对剩下的五个数: 8、5、4、2、0进行第2趟比
20、较,第一次:5、8、4、2、0,第二次:5、4、8、2、0,第三次:5、4、2、8、0,第四次:5、4、2、0、8,第2趟比较产生第二个最大数:8依此类推,便可实现排序。,第1趟比较后,剩5个数未排好序;两两比较5次 第2趟比较后,剩4个数未排好序;两两比较4次 第3趟比较后,剩3个数未排好序;两两比较3次 第4趟比较后,剩2个数未排好序;两两比较2次 第5趟比较后,全部排好序; 两两比较1次,算法结论:对于n个数的排序,需进行n-1趟比较,第i趟比较需进行n-i次两两比较。,for(i=1;iaj+1) t=aj; aj=aj+1; aj+1=t; ,改进后的算法for(i=1;iaj+1)
21、 t=aj; aj=aj+1; aj+1=t; flag=1; if(flag=0) break;,二 输入10个数,用“选择法”对10个数排序(由小到大)。 “选择法”算法:以六个数9、8、5、4、2、0为例。第1趟比较,第一次:8、9、5、4、2、0,第二次:5、9、8、4、2、0,第三次:4、9、8、5、2、0,第四次:2、9、8、5、4、0,第五次:0、9、8、5、4、2,第1趟比较产生第一个最小数:0,对剩下的五个数: 9、8、5、4、2进行第2趟比较,第一次:8、9、5、4、2,第二次:5、9、8、4、2,第三次:4、9、8、5、2,第四次:2、9、8、5、4,第2趟比较产生第二个
22、最小数:2依此类推,便可实现排序。,算法总结:对于n个数的排序,需进行n-1趟比较,第i趟比较时要将第i+1个开始的元素依次与第i个元素进行两两比较,后者小于前者就进行交换。,for(i=0;in-1;i+) for(j=i+1;jn;j+) if(ajai) t=ai; ai=aj; aj=t; ,for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; if(k!=i) t=ai; ai=ak; ak=t; ,改进后的选择排序算法,三 插入排序基本思想:(假定从小到大排序)依次从后面拿一个数和前面已经排好序的数进行比较,比较的过程是从已经排好序的数中最后一个数开始比较,如果比这个数,继续往前面比较,直到找到比它大的数,然后就放在它的后面,如果一直没有找到,肯定这个数已经比较到了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 30269.801-2017信息技术 传感器网络 第801部分:测试:通 用要求》
- 深度解析(2026)《GBT 30071-2013细颗粒高密度特种石墨产品》
- 深度解析(2026)《GBT 29999-2013 铜矿山酸性废水综合处理规范》
- 深度解析(2026)《GBT 29876-2013非发酵豆制品生产管理规范》:构建从原料到成品的全链条品质与安全管控体系专家视角解读
- 深度解析(2026)《GBT 29771.1-2013工业机械数字控制器 第1部分:通 用技术条件》
- 深度解析(2026)《GBT 29839-2013额定电压1kV(Um=1.2kV)及以下光纤复合低压电缆》
- 深度解析(2026)《GBT 29677-2013化妆品中硝甲烷的测定 气相色谱-质谱法》
- 《GBT 731-2008黄麻布和麻袋》(2026年)合规红线与避坑实操手册
- 《DLT 615-2013高压交流断路器参数选用导则》(2026年)合规红线与避坑实操手册
- 2026年生物传感器开发合同
- 2026年交管12123驾照学法减分完整版练习题库及1套完整答案详解
- 江苏交通控股有限公司笔试内容
- (二模)温州市2026届高三第二次适应性考试地理试卷(含答案)
- 《公路水运工程施工安全标准化指南》
- 社区公共充电设施便民化改造建设方案
- 2026年中考《语文》作文10大主题抢分万能模板
- 社区信息化网络建设推广与应用项目可行性研究报告
- 阿里员工绩效考核制度
- 厨房设备施工安全措施
- 2025+NICE指南:跌倒风险评估与预防解读课件
- 2025年上海电机学院公开招聘11人备考题库附答案详解
评论
0/150
提交评论