第4章 基本控制结构与导出数据类型_第1页
第4章 基本控制结构与导出数据类型_第2页
第4章 基本控制结构与导出数据类型_第3页
第4章 基本控制结构与导出数据类型_第4页
第4章 基本控制结构与导出数据类型_第5页
已阅读5页,还剩182页未读 继续免费阅读

下载本文档

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

文档简介

1、12002 Shao xiuli南开大学计算机科学与技术系南开大学计算机科学与技术系22002 Shao xiuliC+语句概述语句概述1分支语句分支语句2循环语句循环语句3无条件转向语句无条件转向语句42导出数据类型和数组导出数据类型和数组5结构类型与联合类型结构类型与联合类型632002 Shao xiuli 导出数据类型概述导出数据类型概述 数组类型数组类型 指针类型(第指针类型(第6 6章)章) 引用类型(第引用类型(第6 6章)章)342002 Shao xiuli 导出数据类型导出数据类型 导出数据类型是在其它已定义类型的基础上定义的,而且其运算也是确定的 导出数据类型的分类 数组

2、类型数组类型 指针类型指针类型 引用类型引用类型 结构类型结构类型(C-StyleC-Style) 联合类型联合类型(C-StyleC-Style)Database & Information System Lab452002 Shao xiuli第四章 数 组 4.1 4.1 数组的概念数组的概念4.2 4.2 一维数组一维数组4.3 4.3 一维字符数组与字符串一维字符数组与字符串4.4 4.4 二维数组二维数组4.5 4.5 多维数组多维数组4.6 4.6 程序举例程序举例 62002 Shao xiuli程 序 设 计程 序 设 计 C C提供的数据类型有提供的数据类型有: :标准型和

3、构造型标准型和构造型。在遇到。在遇到的大量编程问题中仅用标准型是解决不了的。如的大量编程问题中仅用标准型是解决不了的。如: :排排序序, ,查询,统计,线性方程组求解,矩阵运算等等。查询,统计,线性方程组求解,矩阵运算等等。需要用构造类型,数组是其中之一。需要用构造类型,数组是其中之一。 在计算机所处理的数据中,最常见的,也是最在计算机所处理的数据中,最常见的,也是最需要由计算机高速处理的数据是需要由计算机高速处理的数据是成批成批出现的同一类出现的同一类型的数据,型的数据,C+C+语言中把语言中把这类数据称为数组这类数据称为数组。 72002 Shao xiuli程 序 设 计程 序 设 计数

4、组数组-具有相同类型数据的集合。数组中每一个数具有相同类型数据的集合。数组中每一个数据称为元素,每一个元素均用统一的数组名和相应据称为元素,每一个元素均用统一的数组名和相应的下标确定。的下标确定。 任何一种类型的一批数据,都可以组成数组,任何一种类型的一批数据,都可以组成数组,例如例如intint型,型,floatfloat型,型,charchar型数据可以组成数组;型数据可以组成数组;这些基本类型的派生类型这些基本类型的派生类型( (如如longlong型,型,doubledouble型,型,unsignedunsignedcharchar型型) )的数据,枚举、结构、联合类型的数据,枚举、

5、结构、联合类型的数据,以至由用户或系统定义的类的数据,以至由用户或系统定义的类( (类型类型) )的对象,的对象,都可以组成数组。循环语句的使用常常是与数组相都可以组成数组。循环语句的使用常常是与数组相联系。联系。 是用户定义的类型的若干变量(或对象)成组是用户定义的类型的若干变量(或对象)成组说明的一种形式说明的一种形式。82002 Shao xiuli4.1.1 为什么使用数组为什么使用数组用用5个变量来加个变量来加5个数个数void main()int num1, num2, num3, num4, num5,sum;cout num1;cout num2;cout num3;cout

6、num4;cout num5;sum=num1+num2+num3+num4+num5;cout“nthe sum of five number is:”sum;92002 Shao xiuli 上面问题解决方法的缺点是上面问题解决方法的缺点是 写程序的时候写程序的时候, ,这个程序最多能加多少个整这个程序最多能加多少个整数就已经定了下来数就已经定了下来, ,并且要声明很多变量并且要声明很多变量 接受每个值的代码重复接受每个值的代码重复, ,导致程序冗长导致程序冗长, ,大多大多数代码什么也没做数代码什么也没做, ,只是接受数据只是接受数据102002 Shao xiuli 为了加为了加5个数

7、据个数据,我们可以只用一个变量我们可以只用一个变量,使用循环使用循环,如下所示如下所示:void main()int cnt = 0,num,sum =0;while(cnt 5)cout“Input the ” cnt+1num;sum+=num; cout“the sum of five number is:”sum; 112002 Shao xiuli 缺点在于当接收下一个数据时,前面输缺点在于当接收下一个数据时,前面输入的数据就丢失了入的数据就丢失了. 如果别的计算里用到这如果别的计算里用到这5个数个数,这种方法就这种方法就不能用了不能用了. 这时我们就应该向数组寻求帮助!这时我们就应

8、该向数组寻求帮助!122002 Shao xiulivoid main()int cnt,num5,sum;for(cnt=0,sum=0;cnt5;cnt+)coutenter the cnt+1 numcnt;sum+=numcnt;coutthe sum of the five numbers is :sum;例例 用数组实现用数组实现void main()int cnt = 0, num5,sum =0;while(cnt 5)cout“Input the ” cnt+1numcnt;sum+=numcnt; cout“the sum of five number is:”sum; 1

9、32002 Shao xiuli 在算法里声明了一个数组在算法里声明了一个数组 num5包括以下变量包括以下变量 num0,num1,num4. 5 称为数组的界限称为数组的界限 数组的界限设定这个数组能处理的元素数组的界限设定这个数组能处理的元素的最大的最大值值.142002 Shao xiuli 数组数组(Array)(Array) 数组是同类型元素(分量)的有序组合体。元素的类型可以是C+语言中允许使用的任何一种数据类型(包括任何用户自定义类型)。 数组中的每个元素都有与其对应的下标以标明该元素在数组中的位置。对数组元素的访问通常借助于下标来进行,元素也被称为下标变量。每个数组元素(即下

10、标变量)都可以当作单个变量来使用。14152002 Shao xiuli4.1.1 数组的定义数组的定义 数组要占用内存空间,只有在声明了数组元素的类型和数组要占用内存空间,只有在声明了数组元素的类型和个数之后编译器才能为该数组分配合适的内存,这种声明就个数之后编译器才能为该数组分配合适的内存,这种声明就是数组的定义。是数组的定义。162002 Shao xiuli有一个下标的数组叫一维数组,有一个下标的数组叫一维数组,它是由n个同一类型数据组成的一维序列。格式如下:。格式如下: = = 用于指出数组元素的类型,也称为数组类型用于指出数组元素的类型,也称为数组类型 是一个标识符,是为数组起的名

11、字,该名字还代表数是一个标识符,是为数组起的名字,该名字还代表数组首元素的地址组首元素的地址( (指针概念,在以后介绍指针概念,在以后介绍) ) 用于指定数组的大小,它用于指定数组的大小,它必须必须是一个整数或一个是一个整数或一个整型整型的的常量表达式。整型常量表达式表示该数组的大小,常量表达式。整型常量表达式表示该数组的大小,应该大于应该大于0 0。 =部分可有可无,若有的话,用于为数组元素置初部分可有可无,若有的话,用于为数组元素置初值;其中的值;其中的 由一批以逗号分割的常量值所构成。由一批以逗号分割的常量值所构成。下标表达式下标表达式172002 Shao xiuli 一维数组一维数组

12、举例:声明数组 int a10;说明了一个一维数组,数组名为说明了一个一维数组,数组名为a a,具有,具有1010个元素,元素类型个元素,元素类型为为intint。每一个下标变量。每一个下标变量aiai 的作用与一个的作用与一个intint型简单变量所能型简单变量所能起的作用相同。既是说,对起的作用相同。既是说,对intint型简单变量可施加的运算与操作型简单变量可施加的运算与操作同样可施加到同样可施加到intint型数组元素(分量)上。型数组元素(分量)上。在内存中开辟在内存中开辟1010个整型数据的空间(个整型数据的空间(4 4字节字节1010)通过下标访问数组中的每一个元素通过下标访问数

13、组中的每一个元素下标的范围:下标的范围:0 0 9 9下标可以是值为整数的表达式,如下标可以是值为整数的表达式,如a3+5a3+5、aiai* *22等等,但表达等等,但表达式的值不能超出范围式的值不能超出范围超出范围为超出范围为“数组下标溢出数组下标溢出”错误错误数组中的每一个元素都等同于一个与数组类型相同的变量数组中的每一个元素都等同于一个与数组类型相同的变量17182002 Shao xiuli 一维数组一维数组 存储方式 数组的首地址为第一数组的首地址为第一个元素的地址个元素的地址 数组的首地址为数组的首地址为0 x0012ff580 x0012ff58 根据数组的类型为数根据数组的类

14、型为数组分配相应规模的空组分配相应规模的空间间 整型分配整型分配L LN N个字节,个字节,L L为数据字长,为数据字长,N N为数为数组的大小组的大小Database & Information System Lab18 在程序中定义了一维数组;编译时在内存开辟连续一批单元,存放数在程序中定义了一维数组;编译时在内存开辟连续一批单元,存放数组各元素的值组各元素的值。192002 Shao xiuli 数组中的每个元素都有与其对应的下标以标明该元素在数数组中的每个元素都有与其对应的下标以标明该元素在数组中的位置。对数组元素的访问通常借助于下标来进行,组中的位置。对数组元素的访问通常借助于下标来

15、进行,元素也被称为下标变量。每个数组元素都可以当作单个变元素也被称为下标变量。每个数组元素都可以当作单个变量来使用。量来使用。 要访问要访问a a数组的各元素(分量),可通过使用下标变量数组的各元素(分量),可通过使用下标变量a0a0,a1a1,a2a2,.,a9a9来实现(注意,规定下标总从来实现(注意,规定下标总从0 0开开始)。除整数外,下标处还可以使用一个整型表达式,表始)。除整数外,下标处还可以使用一个整型表达式,表达式的值正是要指定的下标。如,达式的值正是要指定的下标。如,a2a2* *4+14+1,ai+1ai+1,aa1-3aa1-3都是合法的下标变量。都是合法的下标变量。20

16、2002 Shao xiuli 变量用来在存储器里存储一个信息变量用来在存储器里存储一个信息 如果要存储大量数据如果要存储大量数据,要记住每个变量名是要记住每个变量名是很麻烦的很麻烦的 每个变量都需要在程序前面声明每个变量都需要在程序前面声明 数组有助于存储大量数据数组有助于存储大量数据 一群同样大小和数据类型的元素有相同的一群同样大小和数据类型的元素有相同的名字名字212002 Shao xiuli 指出要被访问的数组元素的位置指出要被访问的数组元素的位置. 也称数组的维数也称数组的维数. 记为下面的格式记为下面的格式:数组名数组名 下标下标 下标通常从下标通常从 0开始开始. 对于对于an

17、的元素个数为的元素个数为n,下标从下标从0开始开始-n-1。 n在使用之前必须是一常数!在使用之前必须是一常数! 例如:例如: int n=10; int an; const n=10;int an;222002 Shao xiuli 在定义数组时,在定义数组时, 需要注意的是:需要注意的是: 1 1)表示数组长度的常量表达式,必须是)表示数组长度的常量表达式,必须是正的整型常量正的整型常量表达式。表达式。 2 2)相同类型相同类型的数组、变量可以在一个类型说明符下一起说明,的数组、变量可以在一个类型说明符下一起说明,互相之间用逗号隔开。例如,互相之间用逗号隔开。例如,intint a a5

18、5, b, b1010, i, i; 3 3)C C语言不允许定义动态数组,语言不允许定义动态数组, 即数组的长度不能依赖于程序即数组的长度不能依赖于程序运行过程中变化着的量,下运行过程中变化着的量,下面这种数组定义方式是不允许的。面这种数组定义方式是不允许的。 int i; cini; int ai; define M 20 char chM+6;可以!可以!232002 Shao xiuli 数组元素的序号数组元素的序号用方括号用方括号括起来。方括括起来。方括号又被称为下标运算符,具有最高的优先级。号又被称为下标运算符,具有最高的优先级。下标必须是一个整数,如下标必须是一个整数,如a2,或

19、一个整型表,或一个整型表达式,如达式,如i=1,j=2,则,则ai+j就表示就表示a3。 带了下标的数组名在这里就相当于该类型带了下标的数组名在这里就相当于该类型的一个变量,因此可以作为赋值语句的左值,的一个变量,因此可以作为赋值语句的左值,如如: a4+=3; 242002 Shao xiuliv一维数组一维数组 一维数组的初始化一维数组的初始化 在说明数组时,对其进行初始化在说明数组时,对其进行初始化 带有带有 的情况的情况 全部赋初值全部赋初值 部分赋初值,未赋值的数组元素也会被自动初始化部分赋初值,未赋值的数组元素也会被自动初始化 数值型赋值为数值型赋值为0 0或或0.00.0 字符型

20、赋值为空字符字符型赋值为空字符00,ASCIIASCII码为码为0 0 不带不带 的情况的情况24int B3= 4,3,2;/B0=4,B1=3,B2=2int B10 = 4,3,2;/B3=0,为自动赋值为自动赋值int B=4,3,2;/数组数组B的大小为的大小为3252002 Shao xiuli 数组元素赋值 可以按照给变量赋值的方法给数组元素赋值,左值可以按照给变量赋值的方法给数组元素赋值,左值为数组元素,右值为常量或表达式。例如:为数组元素,右值为常量或表达式。例如:a6=123; 可以利用循环语句为数据元素赋值,以下标为循环可以利用循环语句为数据元素赋值,以下标为循环控制变量

21、控制变量for( int i=0;iai;25262002 Shao xiuli 在在C+C+中,只能对中,只能对已定义已定义的数组元素的数组元素逐个逐个的操作的操作( (赋值、赋值、 输出等),输出等),不可不可对整个数组对整个数组一次一次进行赋值进行赋值 , ,输出等。输出等。变量可出现的地方数组元素也可出现变量可出现的地方数组元素也可出现。4.3 一维数组元素的引用一维数组元素的引用 引用数组元素的一般形式是:引用数组元素的一般形式是: 例如,对上节定义的数组例如,对上节定义的数组a,可以用可以用a2、ai+1、ai+j等来表示等来表示a的某的某个元素个元素(其中其中i,j为已取值的整型

22、变量为已取值的整型变量)。 要要注意注意整型表达式的取值范围:整型表达式的取值范围: 0元素个数元素个数-1272002 Shao xiuli对对于于下下标标变变量量可可进进行行下下列列操操作。作。 (1 1)赋值。可以三种方式进行:)赋值。可以三种方式进行: 初始化:初始化: intint A A4 411,2 2,3 3 ;相当于一次为相当于一次为A0A0,A1A1,A2 A2 赋值为赋值为1 1,2 2,3 3。 赋值语句赋值语句: A3= 4A3= 4* * A1 A1 ;/相当于把相当于把4 4* *2=82=8赋值赋值A3A3。 输入语句:输入语句: cincinA0 A0 ;或或

23、 forfor(intint i=0 i=0;i i4 4;i+i+) cincinAiAi;后者可通过键盘操作,为数组的四个元素依次赋值。后者可通过键盘操作,为数组的四个元素依次赋值。282002 Shao xiuli4.1.2 4.1.2 一维数组的初始化一维数组的初始化 可以在程序运行后用可以在程序运行后用赋值语句赋值语句或或输入语句输入语句使数组中的元素使数组中的元素得到值,也可以在定义一个数组变量的同时就给它赋值,这称得到值,也可以在定义一个数组变量的同时就给它赋值,这称为数组的初始化。数组初始化有以下两种方法实现为数组的初始化。数组初始化有以下两种方法实现: : (1) 对全部数组

24、元素初始化: 在定义数组时对数组元素赋以初值在定义数组时对数组元素赋以初值,如:,如: intint s s5 5=78, 87,77,91,60; =78, 87,77,91,60; (2)只只给一部分给一部分数组元素赋元素赋初值值。例如:。例如: intint s s5 5=78, 87,0; =78, 87,0; 其结果是:其结果是:s0=78s0=78, s1=87s1=87, s2=0,s2=0,即花括号内即花括号内的值只的值只赋给了数组的前几个元素赋给了数组的前几个元素赋值赋值。 需要为一些元素需要为一些元素赋值为0的地方应写0(对数值型数组)。292002 Shao xiuli数

25、组初始化时的数组初始化时的常见错误常见错误有以下两种:有以下两种: 在实际数值之间留有空位,如:在实际数值之间留有空位,如: int a5=1,3,5; 是错误的,即在是错误的,即在1和和3之间、之间、3和和5之间必之间必须有具体数值,即使是须有具体数值,即使是0也必须写上。也必须写上。 初始值的个数大于元素的个数,如:初始值的个数大于元素的个数,如: int a=1,2,3,4,5,6; 也是错误的,因为数组只有也是错误的,因为数组只有5个元素,个元素,而提供了而提供了6个初值,这会造成编译错误。个初值,这会造成编译错误。302002 Shao xiuli 一个数组中的元素在内存中是连续存放

26、的,一个数组中的元素在内存中是连续存放的,数组名代表了这个数组第数组名代表了这个数组第1个元素的地址,如个元素的地址,如a也代表了也代表了&a0,b也代表了也代表了&b0。 定义数组变量时定义数组变量时最常见的错误有两种最常见的错误有两种: (1)将下标运算符写成圆括号,如:将下标运算符写成圆括号,如: int a(10); (2)定义成动态数组,即数组的大小依赖于定义成动态数组,即数组的大小依赖于程序运行时变量的取值,如:程序运行时变量的取值,如: int n; cinn; int an;312002 Shao xiuliint a10,i=1;a3=123;cina9;ai-1=a3+2*

27、a2*4+1;couta0=a0a9) couta9a9)”进行下标变量的比较运算等。322002 Shao xiuli char arr120, arr280; float fa115, fa26=1.2,35.6,-22,0.1,66,30; 说明了两个char型一维数组arr1与arr2,大小分别为20和80;又说明两个float型一维数组fa1与fa2,大小分别为15和6,且为fa2数组赋了初值。 332002 Shao xiuli 若对数组定义时赋初值,则可以不指定数组的长度。若对数组定义时赋初值,则可以不指定数组的长度。例如:例如: intint s s5 5=1, 2, 3, 4

28、, 5; =1, 2, 3, 4, 5; 可以写成可以写成: int: int s s =1, 2, 3, 4, 5; =1, 2, 3, 4, 5; 一维数组元素是按一维数组元素是按下标递增的顺序连续存放下标递增的顺序连续存放的,的, 即数组即数组占有连续的存贮空间。如占有连续的存贮空间。如s s数组在数组在内存中的存贮示意如图内存中的存贮示意如图1 1所示。所示。 S0S1S2S3S4图 1 s数组存贮示意图 float fa115, fa26=1.2, 35.6, -22, 0.1, 66, 30; 说明了两个float型一维数组fa1与fa2,大小分别为15和6,且为 fa2数组赋了初

29、值。data : unknown sizeint data ;342002 Shao xiuli例例3 3 从键盘输入从键盘输入1515个整数,并检查整数个整数,并检查整数1010是否是否包含在这些数包含在这些数据中,若是的话,它是第几个被输入的。据中,若是的话,它是第几个被输入的。 main()int i,flag,data15; flag=0; coutInput numbersn; for (i=0; idatai; for (i=0; i15; i+) if (datai=10)cout10 is inputed in the position %d. i+1endl; flag=1;

30、 / 标记10在输入数据中 break; if(flag=0) cout10 is not in numbers;main()int i,flag,data; for (i=0; i15; i+)coutInput numbers datai; if (datai=10) cout10 is inputed in the position %d. i+1endl;352002 Shao xiuli有无有无static的区别:试试的区别:试试#includevoid main()int i;static a4;/ static a3=18;for (i=0; i4; i+) coutai ;0

31、0 0 18 Press any key to continue#includevoid main()int i;int a4;/ static a3=18;for (i=0; i4; i+) coutai ;-858993460 -858993460 -858993460 18 Press any key to continue若用到数组元素的初值为若用到数组元素的初值为0,最好定义为,最好定义为static,或者先给数组,或者先给数组元素逐一地赋值元素逐一地赋值0!for(cnt=0;cnt5;cnt+) numcnt=0;362002 Shao xiuli 给数组中的某一个数组元素赋值给

32、数组中的某一个数组元素赋值.例如例如:num2 = 10这样数组的第三个元素就存放数值这样数组的第三个元素就存放数值10 给一个字符数组赋值给一个字符数组赋值例如例如:char var 5 ; var0=L;var1=o;var2=g;var3=i;var4=c;数组元素同变量一样,没有赋值数组元素同变量一样,没有赋值则最好不要用其值!则最好不要用其值!372002 Shao xiuli (2)一般运算)一般运算:下标变量可与同一类型的一般变量一样参加它所允许的运算。下标变量可与同一类型的一般变量一样参加它所允许的运算。如:如: A0+= A2+; coutA0” ”A1*A2; 等等。等等。

33、 下标也可以是一个表达式,如:下标也可以是一个表达式,如: intA41,2,3,4; A3AA2-A1*4; 下标表达式应注意其值应保持在下标表达式应注意其值应保持在0n-1范围之内。范围之内。 382002 Shao xiuli 从数组中取出数值从数组中取出数值: i = num5 内存中的数组元素内存中的数组元素: 计算机中的内存按字节分配计算机中的内存按字节分配. num 是一个数组,有是一个数组,有5个元素。个元素。 num5 是一个整数是一个整数 含有5个整型元素的数组所占的内存大小为:52字节=10字节 数组元素保存在连续的内存空间中.392002 Shao xiuli通常情况下

34、常用通常情况下常用for结构来操作数组,其一般格式是:结构来操作数组,其一般格式是: for(i=0;i=0; i-) ai 以此来以此来顺序或逆序顺序或逆序地地遍历遍历一维数组中的所有元素。一维数组中的所有元素。 逐个地!逐个地!402002 Shao xiuli main( ) int num10, i; for (i=0; i=9; i+) numi=i+1; / 给各元素赋值给各元素赋值 for(i=0; i10; i+) numi *= 10; for (i=0; i=9; i+) coutnumi = numi endl; / 输出各元素的值输出各元素的值 main( ) int

35、num10, i; for (i=0; inumi; for (i=0; i10; i+) cout numi = numi =0; i-) cout numi = numi endl; 程序定义整型数组程序定义整型数组a,有有10个个元素,通过元素,通过for循环对数组循环对数组元素赋以连续的数:元素赋以连续的数:1,2,3,11,然后输出。,然后输出。在第一个在第一个for循环头的第二个循环头的第二个表达式中写上数组的最大表达式中写上数组的最大下标可以预防下标可以预防“丢一错丢一错误误”,即,即最好写最好写成成i=9而而不 要 写 成不 要 写 成 i 9 这 种 形这 种 形式式,(i1

36、0)。412002 Shao xiuli 1. 1. 从键盘输入从键盘输入1010个个intint型数,而后按输入的相反型数,而后按输入的相反顺序输出它们。顺序输出它们。 实现方式:使用实现方式:使用intint型数组存放数据,通过下标变型数组存放数据,通过下标变化来处理这些数据化来处理这些数据 。 例如,程序执行后的输入输出界面可设计为例如,程序执行后的输入输出界面可设计为: :Input 10 integers:Input 10 integers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10- The result - The result -10 9

37、8 7 6 5 4 3 2 1 10 9 8 7 6 5 4 3 2 1 422002 Shao xiuli#include iostream.h#include void main()void main()intint a10,i; a10,i; / /说明说明intint型一维数组型一维数组a acoutInput 10 integers:endlcoutInput 10 integers:endl; ; / /输入输入1010个整数,依次放入各下标变量中个整数,依次放入各下标变量中for (i=0; i10; i+)for (i=0; iaicinai;cout- The result

38、-endlcout- The result -=0; i-) /for (i=9; i=0; i-) /下标下标i i从从9 9起,递减变化到起,递减变化到0 0coutaicoutai ; ;coutendlcoutendl; ; for (i=0; i10; i+) /下标下标i从从9起,递减变化到起,递减变化到0couta9-i ;432002 Shao xiuli例一例一. N. N个任意数按大到小排序个任意数按大到小排序. . main( )main( ) int numN,i,j,tem int numN,i,j,tem; ; for (i=0;i for (i=0;inumi;

39、/numi; /* * 输入输入100100个数个数 * */ / for (i=0;i for (i=0;iN-1;i+);i+) for (j=i+1;j for (j=i+1;jN;j;j+)+) if (numinumj if (numinumj) tem=numi; tem=numi; numi=numj; numj=tem; numi=numj; numj=tem; for (i=0; i for (i=0; iN; i+); i+) coutnumi ; 从小到大呢?从小到大呢?排序排序任意任意输入输入的的100个数个数442002 Shao xiuli例一例一.对数组中的N个整

40、数按由小到大顺序排序输出#define N 10main( )main( ) int num int numN,i,j,tem,i,j,tem; ; for (i=0;i for (i=0;inumi; /numi; /* * 输入输入100100个数个数 * */ / for (i=0;i for (i=0;i N-1;i+);i+) for (j=i+1;j for (j=i+1;jnumj if (numinumj) tem=numi; tem=numi; numi=numj; numj=tem; numi=numj; numj=tem; for (i=0; i for (i=0; i

41、N; i+); i+) coutnumi ; 从小到大呢?从小到大呢?排序排序任意任意输入输入的的100个数个数452002 Shao xiuli4 程程 序序 举举 例例 例例2 2 用选择排序法对数组中的N个整数按由小到大顺序排序输出。 #include #define N 10void main() int arrayN,i, j, k, t; coutInput N number endl; for (i=0; iarrayi; for (i=0; iN-1; i+) / 外循环, 控制N-1轮比较, 即找N-1遍 k=i; for (j=i+1; jN; j+) / 内循环,用k记住

42、所找数中最小数的下标 / if(arrayjarrayk) k=j; if (i!=k) / 将最小数换至最前面 t=arrayk;arrayk=arrayi;arrayi=t; coutThe sorted numbers: endl; for (i=0; iN; i+) coutsetw(5)arrayi; 运行结果: Input 10 numbers: 4 6 7 10 13 2 1 9 20 3The sorted numbers: 1 2 3 4 6 7 9 10 13 20 462002 Shao xiuli 例例8 将数组a的内容倒置重放。要求不得另外开辟数组, 只能借助于一个临

43、时存贮单元。 分析: 假定a数组有8个元素, 它们原始存放的内容如下: 编程思路:设数组a有n个元素,求其中间元素的下标n/2,为实现前后倒置,只要把数组前后元素逐个地进行交换即可,如上图所示。472002 Shao xiuli完成以上操作,只需按以下箭头所指的形式,将两个元素中完成以上操作,只需按以下箭头所指的形式,将两个元素中的内容对调就行了。若用的内容对调就行了。若用i i,j j分别代表进行对调的两个元素分别代表进行对调的两个元素的下标,则首先需要确定的下标,则首先需要确定i i和和j j的关系,其次需要确定的关系,其次需要确定i i变变化的化的范围。范围。 如果如果n为偶数,则要对换

44、为偶数,则要对换n/2对元素;如果对元素;如果n为奇数,则要对为奇数,则要对换换(n-1)/2对元素,处于正中间的那个元素对元素,处于正中间的那个元素(下标为下标为(n-1)/2)不需与不需与任何元素对换。但不管任何元素对换。但不管n是偶数还是奇数,都要进行是偶数还是奇数,都要进行n/2次对换。次对换。可以定义两个整型变量可以定义两个整型变量i和和j,分别作为数组前部元素和后部元,分别作为数组前部元素和后部元素的下标,素的下标,i的初值为的初值为0,j的初值为的初值为n-1,它们随着操作的进行,它们随着操作的进行不断向中间收缩,直至进行完不断向中间收缩,直至进行完n/2次交换。次交换。4820

45、02 Shao xiuli#include #define N 8main() int aN,i,j,p,t; coutInput N number to the array:endl; for(i=0; iai; p=N/2-1; for (i=0; i=p; i+) j=N-i-1; t=ai; ai=aj; aj=t; coutThe array has been inverted:endl; for(i=0; iN; i+) coutai ; 将N该为奇数,程序需要改变?试试7等。492002 Shao xiuli例二例二. 8. 8名运动员参加名运动员参加100100米短跑决赛米短跑

46、决赛, ,按成绩排名次按成绩排名次, ,并并输出名次输出名次, ,运动员号和成绩运动员号和成绩. . #include main( ) int num8, i, j, tem; float s8, tem1; for (i=0; inumisi; /* 输入运动员号和成绩输入运动员号和成绩 */ for (i=0; i7; i+) for (j=i+1; jsj) tem1=si; si=sj; sj=tem1; tem=numi; numi=numj; numj=tem; couti+1 numi siendl; couti+1 numi siendl;为什么有这条语句呢?为什么有这条语句呢

47、?为什么这样控制呢?为什么这样控制呢?502002 Shao xiuli 【例4.32】使用Eratosthenes 筛法求1000以内的素数 将将1 110001000放在放在数组数组sievesieve(看成是一个筛子)中(看成是一个筛子)中 首先首先“留下留下”2 2(第一个素数),而后把(第一个素数),而后把2 2的倍数的倍数统统从数组统统从数组sievesieve(筛子)中删去(筛子)中删去 再再“留下留下”3 3(第二个素数),而后把(第二个素数),而后把3 3的倍数统的倍数统统从数组统从数组sievesieve中删去;中删去; 再往下是再往下是5,7,.5,7,.。好象是一个筛子

48、,把不需要。好象是一个筛子,把不需要的数逐步筛去,留下的正是所需要的各素数的数逐步筛去,留下的正是所需要的各素数 所谓所谓将某数将某数从数组从数组sievesieve(筛子)中(筛子)中删去删去,本程,本程序实现时,是将数组中的该数序实现时,是将数组中的该数“改写改写”为为0 0Database & Information System Lab50512002 Shao xiuliDatabase & Information System Lab51522002 Shao xiuli#include#includeusing namespace std;int main() const int

49、 n=1000;int sieven+1;/筛子筛子sievefor(int j=1; jn+1; j+) sievej=j;/放入数据放入数据int i=1, count=0;while(in+1) i+;if(sievei!=0 )/尚在筛中尚在筛中 coutsetw(5)sievei; count+;if(count%15=0)coutendl;/每行每行15数数 for(int k=i;kn+1; k+=i)/消去倍数消去倍数sievek=0; /if/ while coutendl;return 0;/mainDatabase & Information System Lab5320

50、02 Shao xiuli程序执行后的输出结果为(在 VC6.0 环境下): 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 36

51、7 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 85

52、7 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997542002 Shao xiuli#include #include void main() const int n=1000; int i=1,j,count=0,sieven+1; /数组数组sieve即上述的即上述的筛子筛子for(j=1; jn+1; j+) sievej=j; for(j=1; jn+1; j+)if(j%15=0) /每输出每输出15个素数换一行个素数换一行coutendl;coutsetw(4)sieve

53、j; coutendl;while (in+1) while(sievei=1 & in+1)i+; if(i!=n+1) coutsetw(4)sievei; /将最小素数将最小素数I输出输出 count+; if(count%15=0) /每输出每输出15个素数换一行个素数换一行coutendl;for(j=i; jn+1; j+=i) /找到素数后,其后的倍数都置为找到素数后,其后的倍数都置为0sievej=1; coutendl;for(j=1; jn+1; j+)if(j%15=0) /每输出每输出15个素数换一行个素数换一行coutendl;coutsetw(4)sievej;co

54、utendl;552002 Shao xiuli例例3一头母牛,一年生一头小母牛,小母牛从第一头母牛,一年生一头小母牛,小母牛从第4年开始又生育年开始又生育小母牛,问小母牛,问20年之内,每年有多少头牛年之内,每年有多少头牛? 编程思路:首先列出年数和牛数的对照表,以便发现其编程思路:首先列出年数和牛数的对照表,以便发现其中的规律:中的规律: 从表中可以看出,从第从表中可以看出,从第4年起,每一年的头数年起,每一年的头数是前一年和前三年的头数之和,即:是前一年和前三年的头数之和,即: (n4) 可以建立一个数组来记录每年的头数:年数作可以建立一个数组来记录每年的头数:年数作为下标,头数作为数组

55、值。为下标,头数作为数组值。年数年数 0123456牛数牛数 12346913 tn=tn-1+tn-3 562002 Shao xiulimain() int i,ncow21; ncow1=2,ncow2=3,ncow3=4; for(i=4;i20;i+) ncowi=ncowi-1+ncowi-3;for(i=1;i=20;i+) coutncowi; if(i%5=0) cout“n”; 程序有点错误?程序有点错误? for(i=4;i=20;i+)572002 Shao xiuli#include main() int i,ncow21; ncow1=2,ncow2=3,ncow3

56、=4; for(i=4;i=20;i+) ncowi=ncowi-1+ncowi-3;for(i=1;i=20;i+) cout.width(10); coutncowi; if(i%5=0) coutn;582002 Shao xiuli#include main() int i,ncow20; ncow0=2,ncow1=3,ncow2=4; for(i=3;i20;i+) ncowi=ncowi-1+ncowi-3;for(i=0;i20;i+) cout.width(10); coutncowi; if(i%5=0) coutn;下标不同下标不同592002 Shao xiuli Fi

57、bonacci数列数列:求求Fibonacci数列数列: 1,1,2,3,5,8,.的前的前20项。项。计算公式如下计算公式如下:F = 1 (n=1)F = 1 (n=2)F = F + F (对任意大于对任意大于2的的n)#include void main()int i, f20=1,1;for (i=2; i20; i+) fi=fi-2+fi-1; cout- The result -;for (i=0; i20; i+) /输出输出Fibonacci数数 if(i%5=0) /每每5个数占个数占1行行coutendl; coutsetw(10)fi;coutendl;602002

58、Shao xiuli Fibonacci数列数列:程序执行后的输出结果为程序执行后的输出结果为(在在 VC6.0 环境下环境下):- The result - 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765612002 Shao xiuli例三例三. 已有已有 10 个按升序整数按从小到大排序个按升序整数按从小到大排序, 现键入某现键入某整数整数, 将此数插入后仍为升序排列。将此数插入后仍为升序排列。#include void main( ) static int a11=1,4,6,9,12,15,18,2

59、1,25,30; int num, i, j; cinnum; if (num = a9) a10=num; else for (i=0; inum) for(j=9; j=i; j-) aj+1=aj; ai=num; break; coutai; for (i=0; i11; i+) cout ai=a9?yainum ?num继续查找要插入的位置num插在ai,原第i个及i后的元素均后移i=i程序有错误吗?程序有错误吗?上机试试上机试试!有用吗?有用吗?622002 Shao xiuli#include void main( ) static int a11=1,4,6,9,12,15,

60、18,21,25,30; int num, i, j; cinnum; if (num = a9) a10=num; else for (i=0; inum) for(j=9; j=i; j-) aj+1=aj; ai=num; break; coutai; for (i=0; i11; i+) cout ain;632002 Shao xiuli例四例四. 插入法实现排序(从小到大)插入法实现排序(从小到大)#include main( ) int i,a5,x,j;for(i=0;iai;for (i=1; i=0 & xaj ) aj+1=aj; j=j-1; aj+1=x; for (

温馨提示

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

评论

0/150

提交评论