浙江高考信息技术 · 浙江普通高等学校招生全国统一考试2017A 信息技术 第 17 题

阅读程序 · 答案 7ads=sxA(sscore(i))=A(sscore(i))+1mc=A(i)+B(i)mc=mc+A(i)

← 整套速查表 浙江高考信息技术 全部真题

题目

【加试题】小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。 ![](http://luogu-ipic.oss-cn-shanghai.aliyuncs.com/youti/78.png) 程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。 ![](http://luogu-ipic.oss-cn-shanghai.aliyuncs.com/youti/79.png) 实现上述功能的VB程序如下,请回答下列问题: (1)如表所示,若分数93的个数为2,则该分数对应的名次为_____________。 (2)请在划线处填入合适的代码。

Dim sName(1 To 50) As String      '存放学生姓名
Dim sScore(1 To 50) As Integer    '存放学生分数
Dim recCount As Integer           '存放学生人数
Private Sub Form_Load()
  '本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示
 '代码略
End Sub
 '整数转换成长度固定的字符串
Function ads(x As Integer, n As Integer) As String
  Dim sx As String, nx As Integer, i As Integer
  sx = Str(x): nx = Len(sx)
  For i = 1 To n - nx


(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
答案:7ads=sxA(sscore(i))=A(sscore(i))+1mc=A(i)+B(i)mc=mc+A(i)

解题思维

这题核心是理解‘名次累加’的递推关系:先统计各分数人数,再从高分向低分扫描,遇到有人的分数,名次等于当前累计人数,然后把这个人数加到累计值里,下一分数的名次自然就是新的累计值。

常见错误

最容易把名次当成固定值,忘记名次是随着分数降低而累加的;或者在统计人数时写错数组下标(比如用i而不是score),导致A数组全为0;还有人在填空③时只写mc=mc+A(i)却忘了把当前分数的人数先加到A里,这样后续分数的人数统计就错了。

详细解析(节选)

这道题考查的是‘名次计算’这一经典算法思想,属于基础但容易因细节出错的高频考点。命题人喜欢让学生先理解‘统计频次’再‘递推名次’的两步流程,并在代码中挖空关键语句,看学生能否把算法逻辑翻译成正确的VB代码。同时,题目还涉及字符串格式化函数ads的调用,考察对函数参数的理解。

先说概念:名次计算的核心是‘累计人数’。最高分如果有k个人并列,那他们的名次都是1;下一个有人的分数,名次就是1+k;再下一个就是1+k+上一个分数的人数……这样依次类推。程序中用数组A记录每个分数的人数,用B记录每个分数的名次,变量mc就是当前的累计人数。

看命题视角:这道题的坑主要在三个地方。第一,统计人数时,循环变量i代表的是学生的序号(1到recCount),而分数是sScore(i),所以必须用sScore(i)去给A计数,而不是直接用i。第二,计算名次时,要先判断A(i)是否大于0,然后B(i)=mc,接着要把mc加上A(i),这样下一个分数才能拿到正确的名次。第三,填空③其实有两个等价的写法:一种是在循环里实时维护mc,另一种是在循环结束后用A和B反推mc。命题人给出的参考答案里,第二个空是ads=sx,这是函数ads内部的一个关键语句,负责把整数转成固定长度的字符串,如果这里写错,后面显示名次时就会错位。

现在一步步推演代码。

第一个空①在函数ads里:sx=Str(x)会把整数转成字符串,但Str会在正数前加空格,比如x=7时sx=" 7",长度是2。我们需要的是去掉前导空格后的纯数字字符串,所以必须用Right(sx, nx),nx=Len(sx),这样Right(" 7",2)得到"7"。这是VB里处理Str输出的经典技巧,学生如果直接写sx=sx去掉空格,容易漏掉Str的格式特性。

第二个空②在统计人数的循环里:for i=1 to recCount,我们要把第i个学生的分数sScore(i)对应的人数加1,所以应该是A(sScore(i))=A(sScore(i))+1。注意这里下标是sScore(i),不是i。很多学生会写成A(i)=A(i)+1,结果A数组全为0,后面名次计算就全错。

第三个空③在计算名次的循环里:for i=100 to 0 step -1,如果A(i)>0,说明这个分数有人,那么B(i)=mc,然后mc=mc+A(i)。这样下一个分数(i-1)的名次就是新的mc。命题人给出的参考答案里,第二个空是ads=sx,这是函数ads内部的一个关键语句,负责把整数转成固定长度的字符串,如果这里写错,后面显示名次时就会错位。

再看考频与趋势:根据历年真题统计,名次计算这类‘统计+递推’的算法题在浙江高考信息技术试卷中出现频率较高,尤其是填空题中常考数组计数和名次累加的组合。2017年这道题就是典型代表,后续几年也多次在模拟考中出现类似变形,比如改为计算排名、分组排名等。因此,这类考点在未来几年仍会保持较高热度,命题人可能会继续用‘统计频次+递推名次’作为基础框架,然后叠加其他操作(如排序、筛选)来增加难度。

最后提醒避坑:做题时一定要先理清算法的主线——先统计,再递推。遇到填空,先看上下文变量名,确认下标是否正确,再想逻辑是否完整。对于函数调用,务必注意VB内置函数的特性,比如Str的格式问题,不能想当然地认为它会返回纯数字字符串。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断