当前位置:文档之家› 2017年计算机学院研究生复试上机考试真题

2017年计算机学院研究生复试上机考试真题

2017年硕士学位研究生招生复试上机试题考试科目: C语言与数据结构算法上机测试考试时间120分钟注意事项:1、源程序都在D:\TEST文件夹下,请先将该“TEST”文件夹改名为“准考证号_姓名”,其中准考证号是初试时的15位准考证号;2、考试结束后,首先删除VC++ 6.0自动生成的debug文件夹,然后使用压缩软件将上述考生文件夹中所有内容打包(包括里面所有文件,比如工程文件等。

除上述debug文件夹外,不得删除任何考试过程中产生的文件),文件名为“准考证号_姓名.rar”,然后将该文件通过教学系统的学生端的“传文件给教师”功能上传到服务器。

注意:文件上传后,需到监考老师处确认方可离开考场。

如果未经监考老师确认,并且文件由于某种原因上传未成功,考试成绩以0分计。

3、如果已经上传,需要修改然后再上传的,在压缩包的文件名后加编号2、3、4等,形如:“考号_姓名2.rar”、“考号_姓名3.rar”。

在监考老师处确认时,请求监考老师将老文件删除。

4、所有提供的文件(包括C源文件),不得更改文件名,也不得更改其内部结构(详见题目中的红字)。

5、所有程序需要在VC++6.0环境中运行,结果正确方可。

比如,程序填空,不能仅将空填好,而是需要运行程序,进行测试,确保正确。

6、本考试共包括1道程序改错、2道程序填空、3道程序编写题,分数分别为:20、 15、 15、 15、15、20。

7、考试题文字描述见下,C程序见考生文件夹下相应文件。

(1) 给定程序modi.c中,函数fun的功能是:用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止(该项不包括在结果中):例如,程序运行后,输入0.0001,则程序输出3.1414。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!(2) 给定程序blank1.c中,函数fun的功能是:找出100至x(x≤999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。

例如,当x值为500时,各位数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492。

共有26个。

所以,程序运行后,输入500,则输出 The result is: 26。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!(3) 给定程序blank2.c中,函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只包含数字字符。

例如,主函数main中输入字符串:32486和12345,在主函数中输出的函数值为:44831。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!(4) 有n(n很大)个范围为0~32767数字,其中有大量重复的数,在main函数中已读入到data 数组中,请编写函数fun,计算剔除重复数字之后,还剩下几个数。

fun函数的功能是:传入两个形参,一个是数组data,一个是n的值,经过计算,返回剔除重复数字后剩下的数字的个数。

比如,程序运行时输入:51 1 3 1 3则程序输出:2要求:请衡量时间复杂度和空间复杂度,尽量设计高效算法。

请在prog1.c最前面的注释部分介绍自己的算法。

注意:部分源程序存在文件prog1.c中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

(5)计算所需要最少拦截系统的数目:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能达到前一发的高度。

某天,雷达捕捉到敌国的导弹来袭,如果系统数量太少,将导致有可能不能拦截所有的导弹。

所以,根据雷达捕捉到的导弹高度(导弹总数目不超过1000),需要预先准备相应数量的拦截系统。

比如导弹的高度依次为:5 3 4 2 4 1则一个拦截系统的第一发炮弹必须打到高度5的地方,第二发炮弹打到高度3的地方。

但第三发炮弹打不到高度4的地方(因为每一发炮弹不能达到前一发的高度),所以要使用第二套拦截系统。

第二套拦截系统发射的炮弹高度打到4和2的高度(实际上,要拦截高度为2的炮弹,使用第一套拦截系统或者第二套都可以)。

第三套拦截系统发射的炮弹高度打到4和1的高度(实际上,要拦截高度为1的炮弹,三套拦截系统都可以)。

因此,总共需要三套拦截系统。

再比如导弹的高度依次为:5 3 4 2 3 1则一个拦截系统的第一发炮弹必须打到高度5的地方,第二发炮弹打到高度3的地方。

但第三发炮弹打不到高度4的地方(因为每一发炮弹不能达到前一发的高度),所以要使用第二套拦截系统。

第二套拦截系统发射的炮弹高度打到4的高度。

再要拦截高度为2的炮弹,使用第一套拦截系统或者第二套都可以,但考虑到后面还需要拦截炮弹,我们这里使用第一套拦截系统(为什么不能用第二套,自己想啦)。

再要拦截高度为3的炮弹,我们使用第二套拦截系统。

再拦截高度为1的炮弹,第一套和第二套系统都可以,我们使用第一套。

因此,总共仅需要两套拦截系统,第一套拦截的是5 3 2 1,第二套拦截的是4 3。

请根据给定的高度数据,帮助计算一下最少需要多少套拦截系统。

在main函数中,首先输入n,表示共有n个导弹,然后读入导弹的高度到数组a中。

fun函数接受a数组和n两个参数,计算需要的拦截系统的数目,并返回该结果。

请完成fun 函数。

比如,程序运行时输入:65 3 4 2 3 1则程序输出:“The number is: 2”注意:部分源程序存贮在文件prog2.c中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

(6)从数据结构中树的定义可知,除根结点外,树中的每个结点都有唯一的一个双亲结点。

根据这一特性,可用一组连续的存储空间(一维数组)存储树中的各结点。

树中的结点除保存结点本身的信息之外,还要保存其双亲结点在数组中的位置(即在数组中的下标。

双亲的信息为-1则表示该结点为根结点),树的这种表示法称为双亲表示法。

树的每个结点的数据类型定义如下:struct PTNode{char data; //结点数据域int parent; //结点双亲在数组中的位置};树的数据类型定义如下:#define MAX_TREE_SIZE 100struct PTree{struct PTNode nodes[MAX_TREE_SIZE]; //存储树中所有结点int n; //树中共有n个结点,n不超过100};则下图1所示的树,按照双亲表示法存储结构,存储为图2所示形式(n为10)。

序号 data parent图1 树的示意图图2 双亲表示法存储已知一棵树已存储为以上形式,请编写函数GetNearestCommonGrand,查找给定的两个(不相同的)结点最近的共同祖先。

GetNearestCommonGrand的函数原型为:char GetNearestCommonGrand(struct PTree T, char nodeData1, char nodeData2) 函数形参:T:保存了树中结点数目及图2所示的结点数组nodeData1,nodeData2:给定的两个结点的数据(输入时保证这两个结点存在)。

函数返回值:两个结点最近的共同祖先。

比如,nodeData1为’G’,nodeData2为’H’,则函数返回’A’。

说明:输入保证nodeData1和nodeData2在树中能找到。

部分代码在prog3.c中,请仅在GetNearestCommonGrand函数中填入内容,完成程序。

要求:尽量优化算法的时间复杂度与空间复杂度,并在GetNearestCommonGrand函数前的注释部分简要介绍自己的算法,同时指出该算法具有什么样的时间复杂度与空间复杂度。

请勿改动主函数main和其它已有函数中的任何内容,可以在函数GetNearestCommonGrand的花括号中填入你编写的若干语句,允许增加自定义函数。

prog3.c中,struct PTree CreateTree()函数用于从键盘输入树的双亲表示法的信息,创建一棵树。

输入的第一个数n表示树中结点数,此后有n行输入,每行表示一个结点的信息,其中第一个信息为结点的数据,第二个信息为结点的双亲结点在数组中的位置。

在main函数中还需要输入两个结点的字符数据,查询这两个结点的最近共同祖先。

如输入(第一行为n,表示共有10个结点,后面10行,为10个结点的信息,最后一行为g和h,表示查询结点g和结点h的最近共同祖先):10a -1b 0c 0d 0e 1f 1g 1h 2i 3j 3g h则将创建图b所对应的树。

输出结果为’a’如输入:8a -1b 0e 1h 6c 0d 0f 5g 5g h输出结果为’d’。

相关主题