提示:内容已经过期谨慎付费,点击上方查看最新答案
程序设计基础(C语言)进阶篇
下面函数的作用是:( )。
青蛙过河问题
该题是2000年全国青少年信息学奥林匹克竞赛的一道试题。叙述如下:
一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用1,2,…,n编号。规定初始时这队青蛙只能趴在左岸的石柱L上,当然是按号排一个落一个,小的落在大的上面。不允许大的在小的上面。在小溪中有S个石柱,有 y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求按号排一个落一个,大的在下,小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱R,与左岸的石柱L一样 ,允许多个青蛙按号排一个落一个,小的在上,大的在下。当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸R上的青蛙也不允许再离开。问在已知溪中有S根石柱和y片荷叶的情况下,最多能跳过多少只青蛙?
经分析可得如下程序,请为空白处选择合适的语句。
下面为快速排序的函数,请为空白处选择合适的语句( )。
有下列程序,程序运行后的输出结果正确的是( )。
输入N个整数,按照输入的顺序建立单链表存储。在空链表头结点之后插入第一个结点时,需要执行的操作是:
请为空白处选择合适的答案。( )
从键盘输入任意一个大于等于0的整数n,然后计算n的阶乘,并把它输出。
参考程序如下:
请为空白处选择合适的答案。( )
小明是个非常无聊的人,他每天都会思考一些奇怪的问题,比如爬楼梯的时候,他就会想,如果每次可以上一级台阶或者两级台阶,那么上 n 级台阶一共有多少种方案?
经分析,可得参考程序如下:
请为空白处选择合适的答案。( )
事件序列问题——活动选择问题。
已知N=12个事件的发生时刻和结束时刻(见表15-7,其中事件已经按结束时刻升序排序)。一些在时间上没有重叠的事件,可以构成一个事件序列,如事件2、8和10,可以写成序列{2,8,10}。事件序列包含的事件数目,称为事件序列的长度。请编程找出一个最长的事件序列。
根据贪心准则分析,可得程序如下,请为空白处选择合适的代码。( )
删数问题
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
经分析,可得如下程序。请为空白处选择合适的语句( )。
汉诺(Hanoi)塔问题
(1)相传在古代印度的一个寺庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把64只一个比一个小的盘子从柱子A上借助柱子B移到柱子C上去。
(2)移动过程恪守下述规则:每次只允许移动一只盘子,且大盘子不得落在小盘子上面。
(3)有人觉得这很简单,但真的动手才发现,如以每秒移动一只盘子,按照上述规则将64只盘子从柱子A移到柱子C上,所需时间也是很多年。
经分析,程序如下,请为空白处选择合适的语句。
有下列程序,运行后的输出结果是( )。
以下代码运行结果是:( )。
- 区间覆盖问题。
用i来表示x坐标轴上坐标为[i–1,i]的长度为1的区间,并给出M(1≤M≤200)个不同的整数,表示M个这样的区间。现在要求画几条线段覆盖住所有的区间,条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,并且线段的数目不超过N(1≤N≤50)。
如果要覆盖的区间数M= 5
5个要覆盖的区间为:1 3 4 8 11
可使用的线段的总数n= 3
那么最小线段总长为: ( ) 以下程序的运行结果是:( )。
对于如下斐波那契数列:
经分析,可得如下程序,请为空白处选择合适的答案。( )
一个简单的计算,你需要计算f(m,n),其定义如下:
本题目是典型的递归算法。根据题目描述,我们可以很容易确定递归边界和递归函数,其中递归的边界为:( )
错排公式
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况?
经分析得到如下的程序,请为空白处选择合适的语句( )。
以下程序企图把从键盘输入的字符存到test.txt文件中,直到从键盘读入字符‘*’号时结束操作,但程序有错。出错的原因是()。
最长上升子序列。
对于数列bi,当b1 < b2 <…< bS的时候,称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1≤i1 < i2 < … < iK≤N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。对于给定的序列,求出最长上升子序列的长度。( )
经动态规划分析,可得程序如下:
- 以下叙述中,不正确的是( )。
有下列程序,程序运行后的输出结果不正确的是( )。
- 在C语言的函数调用中,以下正确的描述是( )。
- 贪心法就是用局部解构造全局解,即从问题的某一个初始解逐步逼近给定的目标,以尽可能快地求得更好的解。当某个算法中的某一步不能再继续前进时,算法停止。当确认问题可以用贪心法求解之后,贪心实现的基本过程可以分为三步,这三步为:( )。
下面说法错误的是:( ).
- 以下不正确的说法是( )。
- 在C编译系统中,枚举值是常量,不能在程序中用赋值语句对它赋值。( )
- 计算机处理数据的类别有各种各样,如数字、文字、图像、声音和视频等,这些数据都可以直接存储。( )
- 一个指针变量用于指向一个结构体类型变量时,称之为结构体类型指针变量。结构体类型指针变量中的值是所指向的结构体类型变量的首地址,通过结构体类型指针可以访问该结构体类型变量。( )
- 单链表中的每个结点占据一个内存空间,多个结点所占的存储空间是离散的,结点之间通过专门的指针相互链接构成一个整体。从本质上看,链表就是一个结点的序列。( )
- 用typedef可以声明各种类型名,也可以用来定义变量。( )
- 定义结构体类型变量后,系统在内存中为该变量分配连续的内存单元。( )
- 单链表是用地址离散的空间存放元素的,不能直接指向每一个结点的存放地址,只能从头指针所指结点开始逐个往后找到要访问的结点,因此也称单链表是一种“顺序存取”的结构。( )
- 文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。( )
- 错排公式
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况?
经分析可知,题目的递推关系式为:f[n]=(n-1)*(f[n-1]+f[n-2]) (n>2)。( ) - 语句array=(int*)malloc(i*sizeof(int));中“(int*)”即把返回的地址类型强制转换为整型类型指针,与array的类型相一致。( )
- fgets(str,n,fp);表示从fp所指的文件中读出n-1个字符存入字符数组str中。( )
- 在共用体类型变量中,各成员共享一段内存单元,一个共用体类型变量占用的内存单元的长度是各成员所占用内存单元长度之和。( )
- 链表中结点的插入并不需要元素的移动,只需要作指针域的修改即可。( )
- 递归调用是以牺牲存储空间为基础的,递归本身不会加快程序执行速度,由于反复调用函数,还会增加时间开销。( )
- 兔子繁殖问题(经典Fibonacci数列)
如果有一对刚出生的小兔,第三个月开始可以每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第三个月也都生下一对小兔。那么,由一对兔子开始,满一年时一共可以繁殖成多少对兔子?
题目中的递推边界为:F0=0。( ) - 如果将字符串赋值给了一个一维数组,那么这个一维数组的名字就代表这个字符串的首地址。( )
- 同一个存储空间可以用于存放共用体的不同类型成员,但共用体的成员不能同时在该存储空间。( )
- 下面枚举类型的定义
enum weekday{sun,mon,tue,wed,thu,fri,sat};
weekday为枚举变量的名字,枚举值为sun、mon、tue、wed、thu、fri、sat共7个,即一周中的7天,说明weekday类型的变量取值只能是7个枚举值中的一个。( ) - 字符串比较函数strcmp(字符数组1,字符数组2)按照ASCII码顺序比较两个数组中的对应位置上的字符,并由函数返回值返回比较结果。( )
- 下面代码可以修改字符串中第2个字符的值。
( )
A:单链表的归并 B:单链表的拆分 C:逆序建立单链表 D:顺序建立单链表
AI参考:正确选项是“逆序建立单链表”。根据题目中的函数描述,该函数的作用是用于逆序建立单链表。单链表是一种数据结构,其中每个元素包含一个数据项和一个指向下一个元素的指针。逆序建立单链表是指将一个有序数组逆序转换为单链表,即将数组中的元素按照它们在数组中的顺序依次添加到单链表中。这种操作通常需要遍历整个数组并将元素添加到单链表中,以创建链表的所有节点。因此,答案为C,逆序建立单链表。'
A:k=2*Jump(r,z-1); B:k=2*Jump(r-1,z-1); C:k=2*Jump(r,z); D:k=2*Jump(r-1,z);
答案:k=2*Jump(r-1,z);
A: B: C: D:
AI参考:正确选项是【B】。这段代码中缺少一个比较语句,用于确定排序的方向(升序或降序)。根据代码中的函数名“quickSort”,可以推测这个函数应该是用来实现快速排序的,那么在函数中需要有一个比较语句来确定排序的方向。选项B中的语句“if (pivot > arr[i])”符合快速排序的逻辑,表示将数组按照升序排序。因此,选项B是正确的。选项A、C、D中的语句不符合快速排序的逻辑,因此不正确。'
A: B: C: D:
AI参考:正确选项是【C】。程序中定义了一个二维数组,并对其进行了初始化。在输出该数组时,使用了循环语句和索引变量来遍历数组并输出每个元素的值。在题目给出的选项中,只有选项C的输出结果符合程序要求,即先输出第一行,再输出第二行,依次类推,直到最后一行。选项A、B、D的输出结果都存在错误,不符合程序要求。具体来说,选项A和B都只输出了第一行的元素,而选项D则输出了多个不连续的元素。因此,选项C是唯一正确的选项。'
A: B: C: D:
AI参考:根据给定的选项和链表的操作,应该选择D,即先建立一个空的链表,然后向链表中插入一个节点。这个选项与给定的图片和描述最为匹配,因此答案是D。'
A: B: C: D:
AI参考:正确答案是D:直接输入即可。参考程序中已经给出了从键盘输入任意一个大于等于0的整数n,然后计算n的阶乘并输出。因此,空白处应该填写一个合适的语句,让程序能够从键盘输入一个整数n。选项D中的“直接输入即可”符合题意,因为直接输入一个整数即可作为n的值,程序会自动计算n的阶乘并输出结果。其他选项不符合题意,因为它们不能实现从键盘输入并计算n的阶乘的功能。'
A: B: C: D:
答案:f[i]=f[i-1]+f[i-2]
A:begin[i]>=timestart B:end[i]>=timestart C:begin[i]>=0 D:begin[i]>=end[i]
AI参考:正确选项是C:begin[i]>=0。根据题目描述,事件序列问题需要找出一个最长的事件序列,即需要找到一个从开始时刻到结束时刻的事件序列。根据贪心准则,我们应该选择开始时刻最早的事件,即begin[i]>=0。因此,选项C是正确的。选项A和B是错误的,因为它们要求end[i]>=timestart,这与题目要求相反。选项D也是错误的,因为begin[i]和end[i]应该是不同的,否则可能会出现重叠的事件序列。'
A: B: C: D:
答案:错
A:move(m-1,q,p,r) B:move(m-1,q,r,p) C:move(m-1, r,p, q) D:move(m,q,p,r)
答案:move(m-1,q,p,r)
A:0,1,2,3,4,5,6,7,8,9 B:0,9,8,7,6,5,4,3,2,1 C:1,2,3,4,5,6,7,8,9,0, D:2,1,4,3,6,5,8,7,0,9
答案:0
A: B: C: D:
A:5 B:7 C:6 D:4
A: B:0 C:1 D:
AI参考:通过对题目中的代码进行分析,其结果应该为"C: 1"。在程序中,变量A、B、D的初始值并未明确给出,所以它们的具体值并不影响程序的结果。但是变量C在程序中通过加法运算得到一个值,该值应该是一个具体的数值。具体来说,该程序执行了“A = 2 * C; B = C + 3;”这两行代码,根据题目中的公式和常数,我们可以得到C = 2 + 3 = 5,然后将5乘以2得到10,再赋值给变量A。因此,变量C的值是10,再通过加法运算得到B的值是13。所以,程序的运行结果是C: 1。'
A:n>=3 B:n<=3 C:n>3 D:n<3
AI参考:答案选D:n<3,原因是在斐波那契数列中,每一个数字都是由前两个数字相加得到,且随着数列的增大,数值逐渐增大,所以空缺处应为小于3。'
A:当m>1,n>1时,f(m,n)= f(m-1,n)+ f(m,n-1) B:当m=1时,f(m,n)=n;当n=1时,f(m,n)=m; C:当n=1时,f(m,n)=m; D:当m=1时,f(m,n)=n;
AI参考:正确选项:D:当m=1时,f(m,n)=n;解析:根据题目描述,这是一个递归算法,其边界条件应该是递归结束的条件。在给定的选项中,D选项符合递归结束的条件,即当m=1时,递归终止,此时f(m,n)=n。而其他选项都没有明确指出递归的结束条件。因此,D选项是正确的边界条件。'
A: B: C: D:
A:输入文件没有关闭 B:文件指针stdin没有定义 C:函数fopen调用形式有误 D:函数fgetc 调用形式有误
AI参考:正确选项是:D:函数fgetc 调用形式有误。 解释:在程序中,使用了fgetc函数从标准输入(stdin)中读取字符,并将其存储到test.txt文件中。但是,fgetc函数的调用形式有误,它应该使用文件指针作为参数,而程序中没有定义文件指针。因此,需要在使用fgetc函数之前,先使用fopen函数打开文件,并将返回的文件指针赋值给一个变量,然后再使用该变量作为fgetc函数的参数。"
A: B: C: D:
AI参考:正确选项是“C:”。根据题意,我们需要求出给定序列的最长上升子序列的长度。根据给出的动态规划分析图,我们可以看出,该问题可以通过填充一个长度为N的动态规划表格来解决。表格中第i行的最小值即为从第i个元素开始的子序列的最小长度。最后,我们找到最右下角的最小值所对应的子序列长度,即为最长上升子序列的长度。因此,选项C是正确的。'
A:C语言中对二进制位的访问速度比文本文件快 B:C语言中,顺序读写方式不适用于二进制文件 C:C语言中的文本文件以ASCII码形式存储数据。 D:C语言中,随机读写方式不适用于文本文件
A:zyx B: wxyz C:xyz D: zyxw
AI参考:程序输出结果不正确的是选项B。程序中,根据输入的字母序列拼接“wxyz”得到输出结果。由于选项B中字母序列为“wxyz”,因此不满足程序的要求,导致输出结果不正确。选项A、C和D中的字母序列都可以通过拼接“wxyz”得到正确的输出结果。'
A:出现在一个表达式中 B:做为一个函数的形参 C:做为一个函数的实参 D:出现在执行语句中
AI参考:在C语言的函数调用中,以下正确的描述是(B:做为一个函数的形参)。函数调用中,函数形参是指函数定义中声明的参数,而函数实参是指函数调用时传递的参数。在函数调用中,形参用于接收实参的值,以便在函数内部进行操作。因此,选项B描述了在函数调用中作为函数的形参是正确的。选项A、C、D都与函数调用中的正确描述不符。选项A出现在一个表达式中,但在函数调用中,表达式通常涉及实参的计算结果,而不是形参。选项C做为一个函数的实参,实际上是实参的概念,而不是形参。选项D出现在执行语句中,也是不准确的描述,因为函数调用本身就是一个执行语句。'
A:While(能朝给定目标前进一步) 求出可行解的一个解元素; B:由最后部分的解确定问题的一个可行解。 C:从问题的某个初始解出发。 D:由所有部分解组合成问题的一个可行解。
A:与结构体类型变量一样,对于一个共用体类型变量,在某一时刻可以赋给多个成员值。 B:用typedef可以声明各种类型名,也可以用来定义变量。 C:共用体类型变量中所谓的共享不是把多个成员同时装入一个共用体类型变量中,而是该共用体类型变量能被赋予任一成员值,每赋予一个成员值,同时覆盖原成员值。 D:共用体类型变量的地址只和它的第一成员的地址一样。
AI参考:正确选项是:D:共用体类型变量的地址只和它的第一成员的地址一样。解释:D选项中提到“共用体类型变量的地址只和它的第一成员的地址一样”,这个说法是不准确的。因为共用体类型的变量包含了多个成员,它们的地址可能并不完全相同。在C语言中,共用体类型的变量可以同时包含多个不同类型的数据成员,这些数据成员的地址可能并不相同。因此,共用体类型变量的地址并不只是和它的第一成员的地址一样。'
A:用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括 B:用户可以重新定义标准库函数,若如此,该函数失去原有含义。 C:系统不允许用户重新定义标准库函数。 D:用户若需调用标准库函数,调用前必须重新定义。
A:错 B:对
A:对 B:错
A:对 B:错
A:对 B:错
A:错 B:对
A:错 B:对
A:错 B:对
AI参考:正确答案是B:对。单链表是用地址离散的空间存放元素的,只能从头指针所指结点开始逐个往后找到要访问的结点,因此也称单链表是一种“顺序存取”的结构。所以这个说法是正确的。'
A:对 B:错
AI参考:答案是B:错。文件指针是用于指向文件的一个位置,用于在程序中读取或写入文件的数据。它需要在程序中定义和说明,但是其值是会随着文件的读取和写入而改变的。如果想要在程序中多次使用同一个文件指针,可以通过重新赋值来让它指向文件的新位置。因此,这个说法是不正确的。'
A:错 B:对
A:错 B:对
A:错 B:对
A:对 B:错
AI参考:B:错在共用体类型变量中,各成员共享一段内存单元,但是一个共用体类型变量占用的内存单元的长度不是各成员所占用内存单元长度之和。这是因为共用体变量只占用了内存中的一个位置,这个位置的大小只取决于它所包含的最长成员的大小。其他成员在共用体变量所占用的内存中是连续存放的,但是它们各自占用独立的内存空间。所以,共用体类型变量的内存布局是按照其成员的顺序和大小来组织的。因此,这个说法是错误的。'
A:错 B:对
AI参考:正确答案是【B:对】。链表中结点的插入只需要修改指针域即可,不需要移动元素,因此判断题表述正确。'
A:错 B:对
AI参考:B:对。这是因为递归调用需要在函数调用之间保留函数调用信息的栈空间,所以需要占用更多的存储空间,从而降低了代码的运行效率。此外,递归调用需要进行多次函数调用,每次调用都会增加一定的时间开销,因此递归本身不会加快程序执行速度。所以这个判断题的正确答案是B:对。'
A:错 B:对
AI参考:答案是B:对。根据Fibonacci数列的定义和性质,可以得出结论:一对兔子开始,满一年时可以繁殖成2^10对兔子。具体来说,第一个月出生的一对小兔,第二个月又生下一对小兔,加上原来的那一对,共有两对兔子。接下来的每个月,新出生的小兔都会增加一对,因此一年后总共有2^10对兔子。所以答案是B:对。'
A:对 B:错
AI参考:答案:B:错。解释:在C/C++中,数组名实际上是一个指向数组第一个元素的指针,而不是数组的首地址。因此,将字符串赋值给一维数组后,数组名指向的是字符串的第一个字符的地址,而不是整个字符串的首地址。所以这个说法是错误的。'
A:对 B:错
AI参考:正确答案是B:错。共用体是一种特殊的数据类型,它允许在同一存储空间中存放不同类型的数据成员。因此,同一个存储空间可以用于存放共用体的不同类型成员。但是,共用体的成员可以同时在该存储空间中存在,因为它们共享同一个存储空间。所以,这个说法是错误的。'
A:对 B:错
A:错 B:对
A:对 B:错
AI参考:答案:B:错。根据题目描述,需要修改字符串中第2个字符的值,而一般情况下字符串是不可变的,因此修改字符串中的某个字符的值是不可能的。如果需要修改字符串中的某个字符,可以使用其他方法,例如替换或截取字符串。所以该题错误。'