早教吧 育儿知识 作业答案 考试题库 百科 知识分享
早教吧考试题库频道 --> 计算机类考试 -->软考中级 -->

●试题四 请补充函数fun(),该函数的功能是将字符串tt中的大写字母都改为对应的小写字母,其他字符

题目

●试题四

请补充函数fun(),该函数的功能是将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。例如,若输入"Are you come from Sichuan?",则输入"are you come from sichuan?"。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

#include<stdio.h>

#include<string.h>

#include<conio.h>

char *fun(char tt[])

{

int i;

for(i=0;tt[i];i++)

{

if((tt[i]>=′A′)&&( (1) ))

(2) ;

}

return ( (3) ) ;

}

main()

{

char tt[81];

printf("\nPlease enter a string:");

gets(tt);

printf("\nThe result string is: \n%s",

fun(tt));

}

参考答案
正确答案:

●试题四

【答案】(1p && p->data !e p && *p.data !e2p->Lchild *p.Lchild

3s->Rchild *s.Rchild4p->Lchild *p.Lchild

5p==pp->Lchild p *pp.Lchild

【解析】(1)程序的第一条语句是变量的声明及赋初值,p指向二叉查找树的根。接下来从while循环的注释部分可以看出,该循环的功能是查找键值为e的结点。当循环的判断条件e<p->data时,进入左子树查找,否则到右子树查找。程序中没有关于找到结点的处理代码,即循环内部只处理了没找到结点的情况,所以循环条件应该是当找到键值为e的结点时退出循环。另外,应注意一个隐含的限制条件"p=NULL"时,表示已经查找完毕,无需进入循环。通过分析,(1)应填p && p->data!=e。(2if程序段是处理第三种情况的,由循环中的语句"s=s->Rchild;"可看出,s用于要删结点的左子树中查找键值最大的结点,所以s的初值应是要删除结点的左子结点。可见,(2)应填写p->Lchild。(3)根据前面所述的二叉树规则可知,要找的结点s应是左子树中查找键值最大的结点,所以s的初值应是要删除结点的左子结点。可见,(3)应填p->Rchild。本题把①、②结合在一起进行处理,所以引入了一个中间变量c,用c来存储用于替换p的结点。现在的关键问题是什么条件可以使这两种情况和在一起,因为若删除的结点为叶子结点时,p->Rchildp->Lchild都为NULL;若删除的结点有一个子结点时,如果有左子结点,则p->Rchildp->Rchild;如果有右子结点,则p->LchildNULL。当p->Lchild不为NULL时,说明是第二种情况,p结点含左子结点,所以c=p->Lchild;当p->LchildNULL时,说明有两种可能:

第一:p->Rchild也为NULL,则p是叶子结点。

第二:p->Rchild不为NULL,则p是有右子结点的结点。

这两种情况都可以用c=p->Rchild,因为当p是叶子结点的时候用NULL代替p的位置即可,所以第(4)应填p->Lchild。在程序中很多地方都出现了变量pp,其实只要仔细看一下前面的程序就知道,pp一直指向的是p结点的前一个结点,即p的父结点,所以(5)的作用是判断p是其父结点的左子结点还是右子结点,(5)应填pp->Lchild=p