首页 理论教育 C++语言:一维数组操作及实例

C++语言:一维数组操作及实例

时间:2023-08-13 理论教育 版权反馈
【摘要】:当数组中的元素只有一个下标时,称之为一维数组,这是最简单的一类数组。程序清单:4.一维数组的操作对一维数组的操作有求和、求平均值、排序、求最大/最小值、插入、删除等。

C++语言:一维数组操作及实例

数组中的元素只有一个下标时,称之为一维数组,这是最简单的一类数组。

1.一维数组的定义

要定义数组,需要声明三件事:

(1)数组中每个元素的数据类型。

(2)数组名。

(3)数组的大小或长度(即数组中元素的个数)。

一维数组的定义格式:

类型标识符 数组名[整型表达式]

说明:

(1)类型标识符可以是C++允许的任何一种数据类型,表示数组中所有元素共同的数据类型。

(2)数组名的命名规则与变量名的命名规则完全一致,应该是C++合法的标识符。

(3)整型表达式表示这个数组中元素的个数。可以是常量,也可以是变量,但使用变量时要提前赋值。整型表达式必须写在“[]”中。

例如:

上面的两个例子做了同一件事:定义一个包含50个浮点型数据元素的一维数组。

其中,float是数组类型标识符,即这个数组中每个数组元素的数据类型都是float型;a是数组名,是这个数组的唯一标识;float a[50]中的50表示这个数组有50个元素,分别为a[0],a[1],a[2],…,a[49]。在程序的说明部分定义了一个数组之后,C++编译程序会为所定义的数组在内存中开辟一串连续的存储空间,用于存储数组的每一个元素。数组元素的下标标明了元素在数组中的位置,数组元素的下标总是从0开始。

(4)语句末尾的分号不能省。

2.一维数组元素的引用

对于一维数组的元素,使用数组名和数组元素的下标,即可在程序中引用这个元素。引用格式如下:

数组名[下标]

例如:对于上面的数组a,引用a[0]表示数组的第一个元素,a[10]表示其第11个元素,若定义了整型变量i,则a[i]表示数组a的第i+1个元素。

说明:

(1)下标必须是整型表达式,这个表达式可以包含常量、变量以及函数调用

(2)下标既然可以是变量,就可以对其进行灵活的控制,从而灵活地处理数组元素。

(3)数组的每一个元素都是一个单独的变量,都可以像使用其他普通变量一样,进行单独的赋值、运算等操作。

例如:对于上面的数组a,定义整型变量int i,j;那么a[i]、a[j]、a[i+j]都是合法的数组元素;语句“a[10]=87;”实现了给数组a中第11个元素赋值为87。

(4)数组下标值不能超出定义元素个数的下标范围。

例如:float a[50];对于这个数组a,其元素下标不能小于0,也不能大于或等于50。

然而,程序中即使下标超出了范围,程序编译时也不会报错。例如,对于上面的数组a,以下这些语句的语法都是正确的:a[-5]=78.3;a[50]=96;a[100]=0。

但是它们要访问的数组元素不存在于数组的存储空间,这种现象叫数组越界。

数组越界访问,编译器不会报错。在程序运行时,系统通常也不会给出任何提示,也就是说,程序会超出本数组的边界进行读或写,从而造成混乱,这时候可能会运行出结果,但结果是错误的,也可能会异常终止。

3.一维数组的初始化

数组的初始化就是给数组元素赋初值,是在定义数组时一并完成的。

格式:

类型标识符 数组名[整型表达式]={值1'值2'值3'…}

说明:

(1)“{}”中的各数据值就是各元素的初值,各值之间必须用逗号间隔。

(2)在C++11里,此处的等号可以省略。例如下面两条语句都是正确的:

(3)初始化只能在定义数组时使用,之后就不能再用,也不能将一个数组整个赋给另一个数组。例如:

(4)数组初始化时,“{}”中提供的值的个数可以少于数组元素的个数。即数组定义只对一部分元素进行初始化,此时编译器会将其他元素赋值为0。例如:

这条语句定义了一个包含12个元素的整型数组months,但是只提供了7个值,所以只对数组中前面7个元素即“months[0],months[1],…,months[6]”赋初值,分别为1,3,5,7,8,10,12。编译器将其余5个元素分别赋值为0。

这条语句定义了一个长度为500的整型数组score,并把数组中所有元素赋初值为0。

(5)在初始化数组时,“[]”中可以为空,此时C++编译器会计算元素的个数。例如:

这条语句定义了数组day,包含4个元素。

(6)C++11中,初始化数组时,“{}”内也可以为空,此时C++编译器会把数组所有元素设置为0。例如:

这条语句定义了一个5个元素的整型数组,并将数组所有5个元素初始化为0。

但下面的语句是不正确的:

现在,可以把例6-1的数据规模扩大到50、100甚至更大了。

例6-2 输入一个班中50个学生的数学成绩,打印出高于平均分的学生成绩。

思路分析:

(1)用循环输入50个学生成绩。

(2)求学生平均成绩:可以先用一个循环累加求成绩和,再用这个和除以50。(www.xing528.com)

(3)打印高于平均分的学生成绩:用一个循环,把每一个学生成绩与平均分比较,高于平均分的就打印输出。

程序清单:

4.一维数组的操作

对一维数组的操作有求和、求平均值、排序、求最大/最小值、插入、删除等。

例6-3 输入一个班50个学生的成绩,输出最高分和获得最高分的学生的序号

思路分析:

解决这个问题需要4个步骤:

(1)定义一个一维数组,用于存储50个学生的成绩。

(2)输入50个学生的成绩,存放到数组中。

(3)从成绩数组中找到最大值,并记录最大值的序号。

(4)输出最大值及其序号。

这里关键的难点是怎样从数组中找到最大值。

在古代,国家经常会设擂台比武挑选武状元。这个打擂台挑选武状元的过程就是一个求数组最大值的过程。打擂台通常这样做:把所有报名选手编号,排出顺序,然后按顺序一个一个上台,可以假设第一上台的就是目前的状元,其他选手按顺序逐个上台进行比试,如果后来上台的选手被打败了,那就下台,换下一个选手上台即可,如果后来上台的某个选手把台上的状元打败了,他就是新的状元,留在台上等待和后来上台的选手进行比试,就这样,每次胜者留在台上,败者下台,等到所有的选手都上台比试完后,留在台上的就是最终的武状元。

同理,这里也先假设数组最大值就是第一个元素,后面的元素按顺序逐个和它进行比较,如果不比最大值大,那就直接换下一个元素来与之比较,如果比最大值大,那就把最大值换成这个更大的,并记下这个元素的序号,这样逐个地比下来,直到所有的元素都比过了,最后留下来的就是真正的最大值了。

程序清单:

例6-4 从键盘输入10个整数,从小到大排序并输出结果。(冒泡排序)

思路分析:

(1)定义一个数组a用于存储这10个数。

(2)采用一种比较简单的方法调整10个数的顺序:从第一个数a[0]开始,相邻的两数进行比较,如果不符合从小到大的顺序,前面的比后面的大,则将这两个数进行交换。例如下面的10个数:12,25,13,8,19,20,3,7,9,90。

从第一个数12开始,相邻两数两两比较,见表6-1。

表6-1 第一轮比较

这一轮比较下来,一共比较了9次,结果并没有达到我们的要求,但是,最后的数已经是最大的了。这是因为,每一次比较之后,总是把大数往后放,每一次放到后面的大数又和后面的数比较,大的数继续往后放,所以大数逐渐往后放,比较到最后,最大的数当然就排到了最后。也就是说,第一轮比较下来,最大的数已经站好了自己的位置。

接下来进行第二轮比较,仍然从第一个数a[0]开始,相邻两数两两比较,当然,这一轮最后一个数a[9]就可以不用参加比较了,因为它已经是最大的了。所以这一轮要比较8次,可以推想比较的结果是倒数第二个数就是第二大的数。第二轮比较过程见表6-2。

表6-2 第二轮比较

以此类推,可以进行第三轮、第四轮、第五轮……比较,也可以进行九轮比较。比较的次数逐轮减1。每一轮比较的结果是第三大的数、第四大的数、第五大的数……逐渐站好了位置。所以九轮比较结束时,10个数就全部按要求排好了。

在程序中,需要用两层循环,外层循环控制比较的轮数:

内层循环进行相邻两数的两两比较,如第i轮比较:

其中,a[j]与a[j+1]的交换使用库函数swap()。

程序清单:

运行结果:

例6-5 有10个整数已经由小到大排好顺序,要求输入一个数,把它插入到原有数组中,形成一个新的有序数组,即仍然保持由小到大的顺序。

思路分析:

定义一个数组a,存储10个整数和要插进来的新数x,那么a数组的大小应该是11。接下来应该解决两个问题:一要找到插入点k,二要把新数x插入到k的位置。

(1)找插入点:用新数从前往后与原数组中的数逐个去比较,找到第一个不小于新数的数,这个数的下标就是插入点k,即新数应该插入在它之前。

比如:10个数分别为3、5、8、15、19、23、35、45、68、90,要插入的数是59。把59和数组中的数逐一比较找到第一个不小于它的数68,那么59应该插入到68之前,k=8。

那么,如果数组中所有的数都比这个新数小呢?那就把新数放在最后,也就是k=10。

(2)把插入点之后的数向后平移:要从最后一个元素开始向后平移。

(3)把新数插入进去。

程序清单:

运行结果:

例6-6 从给定的有序数组中删除一个特定值。

思路分析:

(1)要从数组中删除特定值,首先要把等于这个特定值的元素找到,记下它的位置。从数组中查找特定值,可以按顺序从头逐个进行对比。

(2)从所找到的位置开始,逐个用后一个元素覆盖前一个元素。

程序清单:

运行结果:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈