我有八盘苹果,你知道小明买了3千克梨和3千克苹果有多少个苹果吗

在前面的各个章节中已经介绍叻C++中的几种基本机构和基本数据类型,经过练习可以实现很多有意思的程序,完成了一些简单而有趣的程序但在程序设计中,仅依靠基本类型和单纯的三种基本程序结构并不能够实现更多更强大的功能所以做为程序设计者必须将更多更强大的构造数据类型和更为复杂嘚程序结构引入到程序设计当中,才能够让程序更强大更能够满足程序设计人员的需求。

复杂的数据类型有很多如结构体,指针等嘟将在后面的章节中介绍。在本章中将会详细介绍第一种构造数据类型——数组。

第一节  一维数组的定义与引用

经过对前面章节的学习可以了解到,在程序的编写过程中需要定义很多个变量来存储一系列在程序运行过程中需要存储和处理的数据,而独立的定义不同的變量在程序中使用会带来越来越的困惑。特别是在学习了循环以后循环变量的独立定义是可以理解和合理的,但是本来是一连串有規律的输入数据,却需要定义大量的变量来一个一个的读取或者利用一些技巧来避免存储这样的情况,似乎是给有强大功能的循环语句帶上了沉重的枷锁无法发挥其应有的能力。

为了解决这样的矛盾在程序设计中引入了数组的概念。把若干相同类型的变量以有序的形式组织起来而这个同类有序数据元素的集合被称为数组。正因为一个数组可以被分解为多个元素这个元素可以是基本类型或者是其它類型,所以数组是我们接触到的第一种构造类型

在C/C++中,数组的使用和基本类型的使用一样必须首先进行定义,然后才能够使用而按照数组的维数划分,数组可以划分为一维数组和多维数组一维数组的定义方式为:

类型说明符 数组名称[数组长度]

其中类型说明符是任意┅种数据类型,包括基本数据类型或构造数据类型;

数组名称是程序设计者定义的数组表示符;

方括号中的数组长度即为数组所包含的元素个数

在数组的定义中,有几点需要注意:

(1)数组的类型实际上是指数组元素的取值类型对于同一个数组,其所有元素的数据类型嘟是相同的

(2)数组名称的书写规则应符合标识符的书写规定。特别应当注意数组名称应能够表现出一定的存储意义,但不要过长

(3)允许在同一个类型说明中,说明多个数组和多个变量如上面的:

    (5)在C语言中,不能够在方括号中用变量来表示数组长度但C++中允許。如在turbo c中下面的程序是错误:

数组的基本组成单元是数组元素,每个数组元素也就是一个变量其标示方法为在数组名称后跟一个带方括号的下标。下标表示该元素在数组里的序号具体的形式如下:

其中的下标只能为整数或整数表达式。例如下面的表达形式都是正确嘚

【例3-1】数组的付值与调用

如【例3-1】所示,给数组“shu”付值时需要给它的一个指定数组元素付值而调用数组“shu”时也同样必须调用它嘚一个指定元素,所以shu[i]的含义其实和定义个变量n而调用变量n是没有太大区别的,只是在控制存储连续性上具有更多的优势所以在处理夶量数据,需要存储和调用时一般都需要使用数组。但需要大家注意的是因为main函数里定义的变量属于局部变量,所以其定义的变量多尐要受到一定的显示默认情况下是1M,以一个占4位大小的int类型举例:1M=字节int占4个字节,所以int变量不能够超过=262144个。所以在定义数组变量时要注意数组的大小限制,或者定义全局变量(在后面章节有相关介绍)

【例3-2】数组的初始化

如【例3-2】所示,数组和普通变量一样(如int zong=0)也可以在定义时进行初始化工作,格式即为:数组类型数组名称[数组元素数]={数组元素0初始值,数组元素1初始值,……}

陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果苹果成熟的时候,陶陶就会跑去摘苹果陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果嘚时候就会踩到板凳上再试试。

现在已知10个苹果到地面的高度以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目假设她碰到苹果,苹果就会掉下来

2、斐波纳契数列:请尝试输出数列11235813,…

3、约瑟夫问题:有N个人坐成┅圈从1开始报数,报到m报m的人出列,求出列的顺序如4个人报3,顺序为:3 2 4 1

在前面的内容中介绍了数组的最简单使用,但是在数组的使用上有很多变化性的内容需要处理将数组的环形化处理是数组变化的主要形式之一。很多经典的习题也都是围绕着这个知识点展开的下面介绍两个经典的例题:

【例3-3】 围坐成一圈的12个小朋友,每个人身上都有若干个苹果老师要选出哪5个挨着做的小朋友手中的苹果总數最多,你能帮助老师们编写一个程序来确定吗

从例题中可以看出,好象没有处理环的问题其实这其中是使用了一个技巧。用延长了嘚线性结构代替了环型结构在程序中,人工的将shu[12]shu[13] ,shu[14 ]shu[15] 变成了shu[0],shu[1]shu[2],shu[3]这样在计算从shu[11]开始的连续五个数时,就不用特殊处理后面的数楿应的就把程序简化了。

【例3-4】杨辉三角与二维数组

上面就是所说的杨辉三角形从表面来看,这一行的值就是上一行对应的值和前面一個值之和根据题意设计,实现程序如下:

在程序中定义了一个数组:int yh[100][100],这就是二维数组只是在形式上比一维数组多了一个维度,在赋徝和调用时都没有什么太大的差异。

第二节 简单排序算法

数组的基础知识是数组应用的前提条件在熟悉了数组的使用方法之后,可以使用数组来完成非常多的应用在这些应用中,最重要的就是排序

排序即是把若干无规则排列的数或值按照一定的规则,重新排列为新嘚有序的数或值的过程经过很多年的推敲和演变,形成了很多的排序算法选择法和冒泡法排序就是其中的典型代表。

【例3-5】选择法排序

选择法排序的原理非常简单以6个数为例,过程如下图所示:

开始时若干没有排序的数字输入到数组中,分别存在a[0]a[1]…a[5]中,比较法排序的原理就是拿a[0]中的数和后面所有的数进行比较,发现比第一个数大的就进行交换在一轮结束就会挑出最大的数存放在第一位中。然後拿a[1]中的数和它后面的数进行比较,这样在第二轮结束后就能够第二大的数存放在a[1]中,经过N轮的比较就可以把这N个数以从大到小的順序存储在数组中了。

【例3-6】冒泡法排序

冒泡法排序的基本思路就是:依次比较相临的两个数将大数放在前面,小数放在后面即从a[0]开始和a[1]比较,将大数放在前面的a[0]里将小数放在后面的a[1]里。然后再将a[1]和a[2]比较将大数放在前面的a[1]里,将小数放在后面的a[2]里如此继续,直到仳较到最后两个数时将大数放在前面,将小数放在后面此时内循环结束一次,此时最后的数必定是整个数组中的最小数重复上面的過程,仍从第一个数a[0]开始比较重复至最后一个数的前面一对相邻数,将大数放前小数放后,内循环再次结束在倒数第二个数中一定存储着整个数组中的第二小数。如此重复直到最后一趟,只比较第一对数将大数放前,小数放后从而最终完成排序。

由于在排序过程中总是大数(类似于大气泡)往前放小数(类似小气泡)往后放,就像水中的气泡一样所以得名冒炮法排序。

仍以6个数为例冒泡法排序的过程如下图所示:

1、程序设计课进行了一次测试,一共有6名同学参加这次测试请编写程序将这6名同学的成绩进行排序并输出。茬输入时依次输入这6名同学的学号和成绩。输出时按照由大到小的顺序输出学号和对应学号的学生成绩(如相同依输入顺序输出)

在掌握了选择法排序后,那么思考一下如何对选择法进行改进以提高它的运行效率呢看一下选择法的运行过程,由于每次交换两个元素需偠执行3个语句过多的交换必定要花费许多时间。改进方案是在内循环的比较中找出最大值元素的下标在内循环结束后再考虑是否要交換,程序如下:

【例3-8】优化的冒泡法排序

对于冒泡法在很多的情况下,在经过几次交换后数组已经被排列好了,如上面的6个数的排序為例在第二轮结束时,序列就已经排序完成了但程序仍将进行下一轮的比较,不管在下一轮中是否会发生交换事件程序都将会把比較进行到结束为止。而实际上第三轮中并为发生任何的交换事件应该可以认为排序已经结束。依照这样的情况可以对冒泡法做相应的優化。

为了标志在比较中是否进行了数据的交换可以设定一个变量对交换进行记次,此变量每轮都恢复初值为0在这轮比较中每发生一佽比较就对这个变量做加1的操作。在每轮结束后判断这个值如果它仍为零,代表没有发生交换则可以认为排序已经结束。

第三节 字符數组

    字符数组(又称字符串)其实与其他数组没有什么本质上的差别它是由字符类型的元素组成的。在程序设计中字符数组有着很大嘚应用,为了方便程序员的编程在各种语言中都针对字符数组(字符串)提供了相关的函数。熟练的掌握这类函数和字符数组特定的操莋方式对程序设计来说是非常必要的。

【例3-9】字符数组的输入及输出

    如上面程序所示字符串数组的输入和输出似乎跟得到一个整数没囿什么区别,而其实程序内部存储和编译的原理都大相径庭在定义整数型数组的时候,可能没有人会考虑int a[10]中的数组名称a到底是什么因為在程序调用的时候,使用的是数组中特定的a[0]a[1]……而没有使用过a+1这样的形式。但是在字符数组中我们输出整个数组时,是可以写cout<<s1<<endl;的那么就必须要求程序员在这里明白,到底s1是什么

如图3-3中所示,s1其实就是我们这个数组在内存中的起始地址而不是一个跟内容有关的特萣的数或者值。而C/C++中为了标记这个字符数组的终止定义了一个特定的结束标志符“\0”。这是一个非常重要的标志在很多的时候我们可能要人为的使用“\0”去干预字符数组的结束以达到程序设计的要求。和整数数组类似在图3-3中还可以看出s1[0]就代表值‘c’,它本身是一个字苻类型的值

根据字符数组的存储原理,如果在程序中需要对s1和s2两个数组进行连接、比较、复制等一系列操作的时候就不能够简单使用if (s1==s2)戓者s1=s1+s2这样的语句来进行。

【例3-10】字符数组的基本操作

【例3-10】中对字符数组的操作是比较全面的其中涉及到几个关于字符串的函数需要解釋一下:

测长函数:strlen(字符数组),这个函数将返回字符串的实际长度

连接函数:strcat(字符数组1,字符数组2),这个函数将把字符数组2接到字符数组1嘚后面结果放在字符数组1中。这个函数将会返回字符数组1的地址

复制函数:strcpy(字符数组1,字符数组2),这个函数将字符数组2复制到字符数组1Φ

(1)字符数组1必须定义的足够大,以便容纳被复制的字符数组;

(2)字符数组1必须写成数组名形式(如s1),字符数组2可以是字符数组名吔可以是一个字符串常量如strcpy(s1,"China");

(3)复制时连同字符串后面的'\0'一起复制到字符数组1中;

(4)可以用strcpy函数将字符串2中前面若干个字符复制到字苻数组1中。例如:strcpy(s1,s2,2);其作用是将s2中前2个字符复制到s1中然后再加一个'\0'。

比较函数:strcmp(字符数组1字符数组2),作用是比较字符数组1和字符数组2

     字符数组的比较规则与其它语言中的规则相同,即对两个字符数组自左至右逐个字符相比(按ASCII码值大小比较)直到出现不同嘚字符或遇到'\0'为止。如全部字符相同则认为相等;若出现不同的字符,则以第一个不同字符的比较结果为准例如:"B"<"C","b">"B""computer">"compare","123"<"321"等等

转换尛写函数:strlwr(字符数组),将字符数组中的所有大写字母转换成小写;

转换答谢函数:strupr(字符数组)将字符数组中的所有小写字母转换成大写。

從键盘任意得到一个单词通过加密,将它变成另外一个单词加密方法为:将字母转变为其后面的第5个字母,如a变为fb变为g……y变为d,z變为eA变成F,B变成G……Y变成DZ变成E。然后输出

有两个50位以内的正整数,请比较他们的大小提示:分为不同长度和相同长度比较。

3、依佽删掉字符数组中的最后一个字符然后输出

如,字符数组为abcd则输出

【例3-11】统计单词数

    通过前面的学习,在得到字符串时我们一般使鼡的是cin语句。但是cin语句是以非可视字符表示结束但是有的时候我们需要得到的是一个包含空格的句子时,使用cin语句就不合适了这个时候我们需要使用的就是gets(字符数组);语句,然后再按照需求对字符数组进行分析相应的,如果我们需要输出的是一个含空格(或其他非可视芓符)的句子时也需要使用puts(字符数组);语句来完成。

【例3-12】字符数组的地址操作

    为了更好的利用一下s是字符数组的内存地址这个条件,峩们可以用上述方法依次删除字符数组的首字母输出。

我要回帖

更多关于 小明买了3千克梨和3千克苹果 的文章

 

随机推荐