《应用技术题型及样题解答.docx》由会员分享,可在线阅读,更多相关《应用技术题型及样题解答.docx(14页珍藏版)》请在第一文库网上搜索。
1、应用技术题型及样题解试题一(必选样题)阅读以下说明和流程图,填补流程图中的空缺(1)-(9),将解答填入对应栏内。【说明】假设数组A中的各元素A(I),A(2)A(M)已经按从小到大排序(M21);数组B中的各元素B(I),B(2),.B(N)也已经按从小到大排序(N21)。执行下面的流程图后,可以将数组A与数组B中所有的元素全都存入数组C中,且按从小到大排序(注意:序列中相同的数全部保留并不计排列顺序)。例如,设数组A中有元素:2,5,6,7,9;数组B中有元素2,3,4,7:则数组C中将有元素:2,2,3,4,5,6,7,7,9。【流程图】【解析】这是最常见的种合并排序方法。为对较大的序列
2、进行排序,先将其分割成容量相当的几个部分,分别进行排序,最后再合并在一起。当然,这些排序要么都是升序,要么都是降序。木题全部是按升序排序的。例如,为了将整副扑克牌按升序进行排序,先将其分割成两个部分(数量大致相当),对每个部分完成升序排序后,就形成了两叠已排序的牌。如何将其合并呢?办法如下。每次都比较各叠最上面的两张牌,取出比较小的,放入新堆,再继续比较。直到其中一堆空了,就将另堆剩余的牌逐张放入新堆。新堆就是合并后的已完成排序的序列。在数据排序时,遇到相同的数比较时,任取个就可以了。对本题来说,i、j、k是数组A、B、C的下标,初始时,都应该是1。因此,空(1)处应填写1。将A(i)与B(j
3、)进行比较后,如果A(i)B(j),那么应该将A一C(k)。这是升序的要求。因此,空(2)处应填A。如果A(i)B(j),则应将BO)TC(k)。因此,空(3)处应填B(j),在A(i)-C(k)后,i应增加1,为下次取A再比较做准备(k也需要增加1,为下次存入C(k)做准备)。这时,需要比较数组A是否已经取完,即判断iM是否成立。如果iM,则表示数组A中的元素已经全部取出,需要将数组B中剩余的元素逐个移入C(k)。因此,空(4)处应填i,空(6)处应填B(j)数组B处的元素何时移完呢?这就需要判断iN是否成立。因此,空(8)处应填j。同样,空(3)处将Bo)存入C(k),直到,jN时数组B中
4、的元素取完。此时,需要将数组A中剩余的元素逐个移入C(k),直到iM时全部完成。因此,空(5)处应填j,空(7)处应填A(i),空(9)处应填i。【参考答案】(1)1A(i)(3)B(j)(4)i(5)j(6)B(j)A(i)(8)j(9)i试题二(必做的C语言样题)阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。【说明】函数COUmmOn1hS(DATESIaIDATEend)的功能是:计算两个给定日期之间所包含的完整月份数。该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。规定两个相邻年份的同月同日之间的间隔为1年。例如,20075302008.5.30的间隔为1
5、年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.2.292009.2.28的间隔为1年。规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.292007.2.28的间隔为1个月,同理,2007.1.302007.2.282007.1.312007.2.28的间隔都是1个月。计算起止日期间隔不足一年的完整月份数时,分如下两种情况。(1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.312008.9.20,通过月号算出月份数为6。修正时,
6、通过调用函数makeva1id将2008.9.31改为2008.9.30,与终止日期2008.9.20比较后,将月份数修正为5。起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.252009.3.31,先计算2008.7.252008.12.25的月份数为5,再算出2008.12.252009.3.25的月份数为3,因此2008.7.252009.3.31之间的完整月份数为8。日期数据类型定义如下:typedefstructintyear;intmonth;iniday;/*日期的年号(4位)、月和口号*/(DATE;程序中使用的函数cmp_date()is1eapYear()和m
7、akeva1id()说明如下。函敷名参长返回值说明cmpdatcDATEstart,DATEend-Isstartcnd比较两个日期的大小,例如:2007.1.31小于2007.5.15,2008.11.23T2008.11.23.2008.1.31大于2007515Is1eapYcarintyear1:year表示的年号是由年O:year表示的年号不是用年判断给定年号处否为闰年若日期r是非法的,即r不是闺年时makcva1idDATE*r无其日期为2月29日,或者共4、6、8、IO等月份出现了31日,则将其日期改为当月最后一天的日期【C语言函数】intcoun1_months(DATEsta
8、rt,DATEend)(intyears=0,months=0;DATEr;if(CmP_da1e(S1art,end)0)r=start;start=end;end=r;)years=end.year-start.year;*计算年数*/r=start;r.year=end.year;if(cmp_date(r,end)O)*修正年数*/(1);r.year-;if(r.yearO)(4);returnmonths;【解析】根据题目的说明,函数count_months(DATEstart,DATECnd)的功能是计算两个给定日期之间所包含的完整月份数。计算月份数时,可以从起始日期开始,到终止
9、日期结束,逐月计算;也可以先算出完整年份数,再计算剩余的完整月份数,最后用完整年份数乘以12再加上剩余的完整月份数。题目中采用后者。先用end的年号减去start的年号,得到一个年份值,如下所示:years=end.year-start.year;/*计算年数*/显然,上式算出的年份数可能产生误差(多算一年,即end的月号和日期要小于Start的日期),因此可能需将years减去1后进行修正。因此,空(1)处应填入“years-”。接下来计算月份数。由题目中的说明,计算起止日期间隔不足一年的完整月份数时,分如下两种情况。起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.252009
10、331,先计算2008.7.252008.12.25的月份数为5,再算出2008.12.252009.3.25的月份数为3,因此2008.7.252009.3.31之间的完整月份数为8。以下代码处理该情况:if(r.year0)/*修正月份数*/(4);根据函数makeva1id的接口说明,其实参应取变量!的地址,因此空(3)处填入简单地用两个月份号相减可能产生的误差是多算了一个月,因此将months减1进行修正,所以空(4)处填入“months-。最后计算总月份数,年份数乘以12再加上不足一整年的月份数即可得到月份总数。因此空(5)处填入“years*12。【参考答案】(1)years-,或
11、其等价形式(2)12-r.month,或其等价形式(3)&r(4)months-,或其等价形式years*12试题三(必做的C语言样题)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。【说明】若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图23所示。为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图2-3所示的矩阵M相应的三元组顺序表如表2-1所示,其转置矩阵MT的三元
12、组顺序表如表22所示。表27矩阵M行号列号元素值01-304513102012311434-7表2-2M的转置矩阵MT行号列号元素值021210-31314311040543-7函数TranSPOSeMatriX(MatriXM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以卞关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置。cpot0j=0cpotj=cpotj-1)+nu
13、mj-1*j为列号*/类型E1emTypesTrip1e和Matnx定义如下:typedefintE1emType;typedefstruct/*三元组类型*/intr,c:/*矩阵元素的行号、列号*/E1emTypee;/*矩阵元素的值*/(Trip1e;typedefstruct/*矩阵的三元组顺序表存储结构*/introws,co1s,e1ements;/*矩阵的行数、列数和非零元素数目*/Trip1edataMAXSIZE;(Matrix;【C函数】intTransposeMatrix(MatrixM)(intj,q,t;int*num,*spot;MatrixMT;*MT是M的转置矩阵字/num=(int*)ma11oc(M.co1s*sizeof(int);