第六章数组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;