第六章数组

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章数组

6.1 问题导引与分析

到目前为止,我们所接触的变量类型(除文件类型外)为简单数据类型,其特点是对单一的变量进行数据处理和操作。在解决实际问题时,常需要处理大量的数据,如对1000个学生的成绩排序、对一批数据进行各种处理等问题,如果用简单变量来存储这些数据,要用到大量的简单变量,无论从存储还是处理都很不现实。Pascal语言引入了数组类型,能方便地解决批量数据处理问题。

数组是程序设计中最常用的结构数据类型,用来描述由固定数目的同一类型的元素组成的数据结构。

从形式上看,Pascal语言数组元素书写格式为:变量名[下标1,下标2,下标3,……],数组的每个元素和下标相关联,根据下标指示数组的元素。

只有一个下标的变量集合称为一维数组。

如:a[1],a[2],a[3],a[4],a[5],……,俗称a数组。

使用数组的方便之处在于数组的下标可以用变量来表示,如上述的a数组元素可以写成a[i]形式,通过灵活控制下标变量i,达到对数组元素进行批量处理和操作的目的。

6.1.1 问题导引

问题6.1 选票统计(Votes)

【问题描述】

国际运动协会组织了一个评选N佳运动员的活动,评选方式很特殊,先由网民投票选举,各国的网民可以任选自己喜爱的运动员,然后从中选出得票高于100万张的运动员N个,对他们用1到N进行编号,重新投票,根据不同的得票值,颁发不同的奖项,现在组织者想知道重新投票后,这N个运动员的票数,请你帮他完成。

【输入格式】

第一行,一个数,表示N个运动员;(1≤N≤1000)

第二行开始为一组以空格隔开的选票,选票值为1到N间的数,以-1为数据结束标志。选票数量不超出长型范围。

【输出格式】

按编号顺序输出编号和票数。

【输入样例】

3

3 1 2 3 2 1 2 3 1 2 2 1 3 3 1 2 3 3 -1

【输出样例】

1 5

2 6

3 7

问题6.2 质数(prime.pas)

【问题描述】

求1到N间的质数。

【输入格式】

一个数N。(1

【输出格式】

以空格隔开的质数。

【输入样例】

10

【输出样例】

2 3 5 7

问题6.3 查找(Find)

【问题描述】

中考成绩出来了,许多考生想知道自己成绩排名情况,于是考试委员会找到了你,让你帮助完成一个成绩查找程序,考生只要输入成绩,即可知道其排名及同名次的人有多少。

【输入格式】

第一行一个数N;

第二行一个数K;

第三行开始N个以空格隔开的从大到小排列的所有学生中考成绩。接着K个待查找的考生成绩。

【输出格式】

K行,每行为一个待查找的考生的名次、同名次的人数、比考生高分的人数。查找不到输出“fail!”。

【输入样例】

10

2

580 570 565 564 564 534 534 534 520 520

564 520

【输出样例】

4 2 3

6 2 8

6.1.2 问题分析

分析问题6.1

对于选票统计问题,如果用人工来统计会是如何统计呢?通常的一种方法是,先写上每个人选的标识符,如:本题中用编号标识,然后一边唱票,一边在对应人的标识符

的下方打上增加票数的标志,如:用“正”字,每增加一票,增加“正”字的一个笔划,当唱票完毕,统计一下每个人选得到的“正”字的笔划数即为每个人选的票数。然而,本题中,N值可以达到1000,且每人的得票值很大,人工完成统计是不可能的,但人工的统计方法是可以借鉴的,将人工的统计方法转换为算法,描述如下。

算法描述:

1.开辟每个人选的票数值存放空间;

2.读入参选人数N值;

3.读入第一张投票号X;

4.当X<>-1时,即读票未结束,反复执行下列操作:

(1)对应X号人选的票数加1;

(2)读入下一张投票号X;

5.当读完投票,输出参选人的票数。

分析问题6.2

关于质数判断问题,在第四章的例4.4中做过讨论。其算法思想基于数学对质数的定义,因此,在例4.4基础上,我们比较容易得到求1~N之间的质数的一种算法,描述如下。

1.读入N;

2.输出质数2;

3.对3~N间的每个数进行质数判定,为质数的输出。

该算法的时间复杂度为O(n2),当N比较大时,需要一定时间才能出解。

变换角度分析,2是质数,2的倍数一定不是质数,这些数就无需进行质数判定,同理,3是质数,3的倍数一定不是质数,……。于是,先把N个自然数按次序排列起来,1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

这种按顺序输出质数的同时,将质数的倍数筛去的算法,称为筛法。用筛法求质数是一种比较快的算法,算法时间复杂度为O(n2)。

这里用到一个名词:算法复杂度。算法复杂度包括时间复杂度和空间、复杂度,时间复杂度指执行算法所需的时间(执行多少次赋值、比较等操作),空间复杂度指执行算法需要消耗多少存储空间。算法的时间和空间复杂度是算法设计和选择一个很重要的考量参数。

分析问题6.3

由于给出的原始数据是有序的,在读入数据过程中可以得到的有效信息有:

1.当读入数与前一个数不同时,名次增1;

相关文档
最新文档