C++大学基础教程第五章.ppt
《C++大学基础教程第五章.ppt》由会员分享,可在线阅读,更多相关《C++大学基础教程第五章.ppt(108页珍藏版)》请在三一办公上搜索。
1、C+大学基础教程,第5章 数组北京邮电大学电信工程学院 计算机技术中心,数组是具有一定顺序关系的若干相同类型变量的集合,组成数组的变量称为该数组的元素。数组属于构造类型。数组是实际编程中经常使用的一种数据结构。,5.1 数组基本概念5.2 数组元素的下标5.3 数组初始化5.4 数组的大小和越界数组5.5 字符数组 5.6 向函数传递数组5.7 多维数组,第5章 数组,5.1 数组基本概念,5.1数组基本概念,数组是具有一定顺序关系的若干相同类型元素的集合。组成数组的变量称为该数组的元素。数组元素都有相同的变量名(数组名),但是有不同的下标。例:04级110班30名同学“C+程序设计”课程的成
2、绩 int Cscore30;实验,测得一组电阻R随温度T变化的值 float Ri10;short Tc10;,一维数组,定义格式 类型说明符 数组名常量表达式;例:统计1000位10岁儿童的体重,定义数组 float weight1000;数组名的命名规则和变量名相同。常量表达式表示数组元素的个数,即数组长度。,例,定义一个字符数组:char a5;存储该数组需5个字节。每个元素的类型是字符型。数组下标从0开始,分别是a0,a1,a2,a3,a4。注意:数组元素的下标从0开始。并且,a5不属于该数组的空间范围。,数组在内存中的存放,数组元素都是存放在一段连续的内存单元中的。例 char n
3、ame=”Ray Krebbs”的内存情况,数组的定义,数组名标识符的选取和简单变量相同,数组必须先定义,后引用。定义数组的一般格式是:类型 数组名常量表达式1.常量表达式n;例:int ages30;char gray512512;注意:数组ages和gray的各元素此时的内容是随机的,编程中不能认为全是0。,定义数组应考虑的几个方面,确定数组元素的类型整型、浮点型等简单类型,结构体、类等用户自定义类型。确定数组的名称由“标识符”指定,数组名是一个地址常量,代表着数组元素在内存中的起始地址。确定数组的结构包括数组的维数(有几个常量表达式),维的大小等,也就是常量表达式的具体形式。常量表达式的
4、值必须是正整数。,例5.1 定义一个含10整数,以ARRAY命名的数组,用100至109对数组元素赋值,并对其求和。,分析:需要在一个循环中使用数组。这是使用数组最经常的方式。void main()int ARRAY 10;int sum=0;for(int i=0;i10;i+)ARRAYi=100+i;sum+=ARRAYi;,错误的数组定义语句,void VoidArray10;/void不可以做数组类型int a=9;float floatArraya;/下标表达式不可以是变量char charArray1.5+1.5;/3.0不是整数,数组的作用域和单个变量相同。,#includeu
5、sing namespace std;short g64;void fun()double d32;/void main()int a128;/,作用域问题,5.2 数组元素的下标,数组的元素是由下标来区分的。使用数组时,一般是对数组的各个元素操作。对于一个已经声明过的数组,其元素的使用形式为:数组名下标表达式例如,5.2数组元素的下标,void main()int array10;array0=1;array1=1;for(int k=2;k10;k+)arrayk=arrayk-1+arrayk-2;/,/k=10?,注意:访问数组元素不能越界,c+编译器不检查访问数组元素越界错误。,注意
6、,在使用数组元素时需要注意:数组元素的下标表达式其结果必须为正整数。数组元素的下标值不得超过声明时所定义的上下界。,数组的下标,数组元素的下标是数组元素到数组开始地址的偏移量。第1个元素的偏移量是0个数组元素大小,第2个元素的偏移量是1个数组元素大小,依次类推。因此,数组元素是一系列大小相同的连续项,每项到公共基点(数组起始地址)的偏移量是固定的。,#include using namespace std;void main()int A10,B10;int i;for(i=0;i10;i+)Ai=i*2-1;B10-i-1=Ai;for(i=0;i10;i+)coutAi=Ai;cout B
7、i=Biendl;,-A0 x0012ff580-11123354759611713815917,5.3 数组初始化,给数组元素赋值的方法,在使用数组元素之前,必须先对它们赋值。有以下两种赋值方法:在定义数组时初始化在程序中对数组赋值,数组的初始化,数组初始化时,用以初始化数组元素的值放在一个大括号中。例如:int a3=1,1,l;数组的初始化就是在定义数组时给部分或全部元素赋初值。例:int a10=0,1,2,3,4,5,6,7,8,9;在对全部数组元素赋初值时,可以不指定数组长度。例:int a=1,2,3,4,5;,数组的初始化,对于简单数据类型的数组,就是给数组元素赋值;对于对象数
8、组,每个元素都是某个类的一个对象,初始化就是调用该对象的构造函数。我们会在后面单独详细介绍。,注意,初始化值的个数可少于数组元素个数。没有被初始化的元素将赋值为0。例 int a1024=0;/可以将数组元素初始化为0初始化数组的值的个数不能多于数组元素个数,也不能使用逗号来省略对部分元素的初始化,这种做法在C中是允许的,但在C+中不允许。,错误例子,例如下面的代码对数组进行初始化是错误的:int array15=0,1,2,3,4,5;/error初始化值个数多于数组元素个数int array25,1,2,3;/error不能加入“,”来跳过不赋值的元素。int array25=0,2,3,
9、4;/error不能加入“,”来跳过不赋值的元素。int array35=;/error语法格式错误,全局数组初始化,C+自动将全局数组变量中的所有元素初始化为0或NULL。如果未赋初值,那么一个全局的字符数组中的所有元素将为NULL(空),一个全局的数字数组中的所有元素将为0。程序中应尽量限制全局数组变量的使用。如果要用,也最好在程序中用语句将其显式初始化为0,以明确表示编程者的意图。,例5.2初始化全局和局部数组,#include using namespace std;int array15=1,2,3;static int array25=1;void main()int arr15=
10、2;static int arr25=1,2;int n;cout global:“endl;for(n=0;n5;n+)cout array1n;coutendl;,例5.2初始化全局和局部数组,coutglobal static:”endl;for(n=0;n5;n+)cout array2n;coutendl;cout local:”endl;for(n=0;n5;n+)cout arr1n;coutendl;cout local static:“endl;for(n=0;n5;n+)cout arr2n;cout endl;,运行结果为:global:1 2 3 0 0global s
11、tatic:1 0 0 0 0local:2 0 0 0 0local static:1 2 0 0 0,5.3.2 数组元素的赋值,大多数情况下,在定义数组时并不知道它的内容,需要在程序中,由用户输入或读磁盘文件数据对数组元素赋值。这时,for循环语句是一个强有力的工具。例:int k,a10,b20;for(k=0;kak;for(k=0;k10;k+)bk=2*k;,例:测得铜导线在温度Ti时的电阻Ri如下,求电阻R和温度T的关系。,0,R,T,R=k*T+b,分析:采样最小二乘法拟合多项式R=k*T+b 求使 最小的k、b。令,#includeusing namespace std;v
12、oid main()int i,n(7);float sumT(0),sumR(0),sumTR(0),sumT2(0);float Ti7,Ri7;float k,b;coutTiiRii;,for(i=0;in;i+)sumT+=Tii;sumR+=Rii;sumTR+=Tii*Rii;sumT2+=Tii*Tii;k=(n*sumTR-sumT*sumR)/(n*sumT2-sumT*sumT);b=(sumR-k*sumT)/n;coutk=k,b=bendl;,注意,在数组使用中,数组名不能出现在赋值语句中等号的左边。不能直接把一个数组赋给另一个数组。假设要将数组total的值拷贝到
13、数组save中,save=total;/error 应使用一个循环语句将total中的元素的值逐个赋给数组save中的每个元素。for(int i=0;iSIZE;i+)/oksavei=total i;,5.3.3 数组省略初始化方法,初始化数组的全部元素时可以省略方括号中的数组大小。例:int array=0,1,2,3,4;,数组的大小,编译时必须知道数组的大小。通常,声明数组时方括号内的数字决定了数组的大小。初始化数组的全部元素省略方括号中的数组大小时,编译器统计花括号之间的元素个数,以求出数组的大小。例如,下面的代码产生相同的结果:int array15=0,1,2,3,4;int
14、array2=0,1,2,3,4;,大括号的使用,通过使用大括号,可初始化任何一种类型的数组。例如,要记录前三年的销售总额,则可以如下定义并初始化一个数组:double sales=4323.43,122355.32,343324.96注意:上面这种使用大括号来初始化数组的方法只能在定义数组时使用。在数组定义之后,就不能用这种方法了,而只能逐个元素地赋值。,元素赋0,如果在数组定义时,只对其中部分元素赋了初值,C+会自动将其余的元素赋0。如果希望将一个大数组中的所有元素同时初始化为0,则可以在定义这个数组时,只将数组的第一个元素赋初值0。这样,系统会自动把其余的元素都赋为0。例:int a10
15、0=0;,例5.5,假设你希望得到刚学完的六门课的平均分。下面的程序将存放校名的数组和存放六门课分数的数组在定义时初始化。程序中计算六门课的平均分。在计算平均值之前,先将六门课的分数打印出来。,#include using namespace std;void PrintScores(float scores6)coutHere are your scores:“endl;/显示成绩 for(int i=0;i6;i+)coutscoresiendl;,void main()char name=BUPT;float scores6=88.7,99.4,76.0,97.0,100.0,86.7;
16、float average=0.0;PrintScores(scores);/调用函数来显示成绩 for(int i=0;i6;i+)/计算总成绩 average+=scoresi;average/=6;/计算平均成绩 coutAt name,your average score is averageendl;,例,循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止。每组连续输入5个答案,每个答案可以是a.d。,#include using namespace std;void main(void)char key=a,c,b,a,d;char c;int q
17、ues=0,numques=5,numcorrect=0;cout Enter the numques question tests:endl;,while(cin.get(c)if(c!=n)else ques+;,if(c!=n)if(c=keyques)numcorrect+;cout;else cout*;else coutScorefloat(numcorrect)/numques*100%;ques=0;/reset variables numcorrect=0;cout endl;continue;,5.4 数组的大小和越界数组,5.4数组的大小和数组越界,定义数组时,编译器必须
18、知道数组的大小。如果数组定义时省略了大小,只是由初始化的值来决定其大小。在程序中怎么知道数组的大小呢?sizeof操作解决了该问题。,sizeof,sizeof()能够返回传递给它的数据类型所占用内存的字节数。如果将一个数组变量传给sizeof(),则它将返回系统为此数组在内存中预留的字节数。因此,数组的大小可用用以下公式来计算:数组大小=sizeof(数组名)/sizeof(数组类型),例5.7 用sizeof确定数组的大小,#include using namespace std;void main()int a=1,2,4,8,16;int size=sizeof(a)/sizeof(i
19、nt);for(int i=0;isize;i+)cout ai;cout endl;运行结果为:1 2 4 8 16,数组和字符串,对于字符串的初始化,要注意数组实际分配的空间大小是字符串中字符个数加上末尾的0结束符。,数组和字符串,例5.8 比较字符串数组大小和字符串长度的差别。解:用sizeof计算数组大小,用strlen函数计算字符串长度。,#include using namespace std;void main()char ch=“how are you”;cout“数组大小是:”sizeof(ch)endl;cout“字符串长度是:”strlen(ch)endl;,结果:数组大
20、小是:12字符串长度是:11,5.5 字符数组,5.5字符数组,数组的类型为 char,每个元素存放一个字符;字符串可以用字符型数组存放。字符串常量是用一对双引号括起来的字符序列,每个字符占一个字节,并在末尾添加0作为结尾标记。,字符数组定义,例:char ch80;C+的基本数据类型变量中,却没有字符串变量,而是使用字符型数组来存放字符串。如果我们对数组进行初始化赋值时,在末尾放置一个0,便构成了C+字符串。字符数组的声明和引用方法与其他类型的数组相同。,例5.9 字符数组的初始化和使用。,#include#includevoid main()char str18=112,114,111,1
21、03,114,97,109,0;char str28=P,r,o,g,r,a,m,0;char str38=program;char str4=program;for(int i=0;i8;i+)coutstr1i;coutstrlen(str1)endl;/验证str1结尾的0是结束符空 coutstr2endl;coutstr3endl;coutstr4endl;,结果:program 7Programprogramprogram,注意,字符串整体输入/输出时,要注意:输出字符不包括0。输出字符串时,输出项是字符数组名,输出时遇到0结束。输入多个字符串时,以空格分隔;输入单个字符串时其中不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 大学 基础教程 第五

链接地址:https://www.31ppt.com/p-6153953.html