上机全真考题第二套

 

一、程序填空

1.题目描述

函数fun的功能是:将一副扑克牌编号为1,2,3,...,53,54,以某种特定的方式洗牌,这种方式是将这副牌分成两半,然后将它们交叉,并始终保持编号为1的牌在最上方,譬如第一次这样洗牌后的结果为:1,28,2,29,...,53,27,54。两次洗牌后的结果为:1,41,28,15,2,42,...,53,40,27,14,54。 程序的功能是:输出经过n次这样洗牌后的结果。 注意:部分源程序在文件Blank1.c中。 ​ 不得增行或删行,也不得更改程序的结构!

2.blank1.c内容

 

3.frop

(1)此空为变量的定义,根据描述,可以看出应该是一个数组,fun函数中能作为数组的除了a之外,就只有b了。因为在for循环中使用了一个数组b,用来存放交换位置后的扑克牌,所以只能填写b

(2)第二个for循环是将数组a中前一半元素(即编号为1-27的扑克牌)放入数组b的奇数位置,将数组a中的后一半元素(即编号为28-54的扑克牌)放入数组b的偶数位置,实现扑克牌的交叉洗牌。所以此空应该是数组b的起始位置为2的偶数下标,即2*k,所以只能填写2

(3)f由于数组b属于函数fun中定义的临时变量,所以将数组a的元素交叉存储到数组b后,还需要再将数组b的元素依次赋值给数组a。此处要填入对应下标为k的数组b的元素,所以只能填写b[k]

 

二、程序修改

1.题目描述

给定程序modi1.c中,函数fun的功能是:判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。若是,则输出所有可能的序列,否则输出“不能分解”。

例如:当输入100时,输出:

100=9+10+11+12+13+14+15+16

100=18+19+20+21+22

请改正函数fun中指定部位的错误,使它能得出正确的结果。 ​ 注意:部分源程序在文件modi1.c中,不要改动main函数,不得增行或删行,也不得更改程序的结构。

2.modi1.c的内容

 

3.frop

(1)因为m定义之后没有赋值,所以m的值为随机值。此处n=m很显然是错误的。根据后面while循环中用到了m的值,可以推断出m应该是临时存储了某个值。每次while循环,程序需要队n之星减去连续的正整数序列,来判断n是否刚好为0,即n是否是连续的正整数序列之和,所以需要把n的值找一个临时变量寄存一下,所以此处应该修改为:m = n;

(2)本行很明显的是语法错误,C语言中每个语句必须以分号结尾,所以此处应该修改为 m=m-c;c++;(此类错误建议打开题目之后,直接编译运行,一旦有语法错误,直接修改即可得分)

(3)根据上面while循环可以得知,当m为0时循环终止执行。题目判断n是否是连续的正整数序列之和,如果是,则输出所有序列。程序中m依次减去连续的正整数,当m为0时,表示m(即n)满足条件,再输出当前序列中的每个正整数,此处判断条件反了,所以此处应该修改为:if(m==0)(对于这种m!=0的,一般就是修改为m == 0,m>0的可以尝试m>=0或者m<0,运行校验哪种条件结果满足,即为要修改的正确答案)

三、程序设计

1.题目描述

请编写函数fun,该函数的功能是:判断t所指字符串中的字母是否由连续递增字母序列组成(字符串长度大于等于2)。

例如:字符串uvwxyz满足要求;而字符串uvxwyz不满足要求。

注意:部分源程序在文件prog1.c中。 ​ 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

2.prog1.的内容

 

3.frop

函数fun的功能是判断指针t所指向的字符串是否由连续递增的字母组成,返回值为整数。0代表不满足条件,非0值(一般用1来表示)表示满足条件。

题目中所提供的字符串长度大于等于2,所以无需对t所指向的字符串长度判断。对t所指的字符串进行逐个字符遍历,连续递增字母说明后面一个字母要比当前字母的ASCII值多1。如果字符串中除了最后一个字母之外,其他的均满足该条件,则返回1;否则一旦遇到某个字母不满足该条件,后面的也无需比较,直接跳出循环即可。

本题主函数中调用了一个NONO函数,该函数主要用于对数据文件进行读取,调用fun函数,然后把结果输出到对应的文件。评测时主要会用预期的输出文件和考生程序运行生成的输出文件进行对比,按照满足条件的百分比进行给分。

本题为2016-2017《计算机程序设计C(2-2)》期末考试A卷考题,1807次提交共有617个代码AC。

参考代码如下:

 

如有问题,可以QQ群531578731进行咨询。