阅读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
下面的流程图,用来完成计算一组数组中的中值,其方法是:将数组中的一个值与其他值比较,并计算大于等于被比较数的数值的个数,以及小于等于被比较数的数值的个数,如果两数都大于n/2,则已经找到了中值,否则继续之前的步骤。
注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述;
[问题]
将流程图的(1)~(5)处补充完整。
第1题
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。
[说明]
已知r[1...n]是n个记录的递增有序表,用折半查找法查找关键字为k的记录。若查找失败,则输出“failure",函数返回值为0;否则输出“success”,函数返回值为该记录的序号值。
[C函数]
int binary search(struct recordtype r[],int n,keytype k)
{ intmid,low=1,hig=n;
while(low<=hig){
mid=(1);
if(k<r[mid].key) (2);
else if(k==r[mid].key){
printf("succesS\n");
(3);
}
else (4);
}
printf("failure\n");
(5);
}
第2题
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。
[说明1]
函数void fun(char*w,char x,int*n)用来在w数组中插入x,w数组中的数已按由小到大顺序存放,n指存储单元中存放数组中数据的个数,插入后数组中的数仍有序。
[C函数1]
void fun(char*W,char x,int*n)
{ int i,P;
p=0;
w[*n]=x;
while(x>w[p]) (1) ;
for(i=*n,i>p;i--)w[i]=(2);
w[p]=x;
++*n;
}
[说明2]
函数void revstr(char*s)将字符串s逆置。例如:字符串“abcde”,经过逆置后变为“edcba”。
[C函数2]
void revstr(char*s)
{ char*p,c;
if(s==NULL)return;
p=(3); /*p指向字符串s的最后一个有效字符*/
while(s<p){ /*交换并移动指针*/
C=*s;
(4)=*p;
(5)=c;
}
}
第3题
阅读以下说明及Visual Basic程序代码,将应填入(n)处的字句写在对应栏内。
[说明]
下面的程序演示了根据随机产生的奖牌数,生成金银奖牌榜的过程。程序使用的排序法是简单排序法。以金牌得数为例,其思想是选择最大的元素,将它交换到最前面;然后对剩下的部分采用同样的方法,直到全部排序完成。
程序界面中,左右两个文本框分别用于存放随机产生的奖牌数以及生成的奖牌榜,名为Text1和Text2,上下两个按钮分别名为Command1和Command2。代码中使用的量主要有:一维数组 cntries,用于存储10个国家的名称,二维数组medals,其元素medals(i,0)和medals(i,1)分别用于存放第i个(i从0开始)国家的金、银牌数目。
[Visual Basic代码]
Dim cntries(10) As String, medals(10,2) As Integer
’随机产生奖牌数
Sub newMedals()
…… ’为数组cntries和medals赋值
End Sub
’输出奖牌榜
Sub printOut(txt As (1) )
Dim strResuh As String, i As Integer
strResult=“国家”& Chr(9) &“金牌数”& Chr(9) &“银牌数”& vbCrLf
For i=0 To 9
strResult = strResult & cntries(i) & Chr(9) & medals(i,0) & Chr(9) & medals(i,1) & vbCrLf
Next
txt.Text = strResult
End Sub
’交换两变量的值
Sub exchange( (2) a As Variant, (2) b As Variant)
Dim temp As Variant
temp = a: a = b: b = temp
End Sub
’随机产生并输出奖牌数
Private Sub Command1_Click()
newMedals
printOut Text1
End Sub
’生成并输出奖牌榜
Private Sub Command2_Click()
Dim i,j, k As Integer, temp As String
For i = 0 To 9 ’按金牌数排序
j = i ’找到自第i个位置起全部数据中金牌得数最多者,记其下标为j
For k = i + 1 To 9
If (3) Then j=k
Next
If i < > j Then ’若i,j不等,则交换对应位置的国家名、金银牌数目
exchange cntnes(i), entries(j)
exchange medals(i, 0), medals(j, 0)
exchange medals(i, 1), medals(j, 1)
End If
Next
For i = 0 To 9 ’按银牌数进行二次排序
j = i
For k = i + 1 To 9
If medals(k,0) <> medals(j, 0) Then (4)
If (5) Then j = k
Next
If i < > j Then
exchange cntries(i), cntries(j)
exchange medals(i, 1), medals(j, 1)
End If
Next
printOut Text2
End Sub
第4题
阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。
[函数2.1说明]
下面程序的功能是计算x和y的最小公倍数。
[函数2.1]
main()
{ int m,n,d,r;
seanf("%d %d",&m,&n);
if(m<n) {r=m;m=n;n=r;}
(1);
while (d%n! =0) (2);
printf("%d\n",d);
}
[函数2.2说明]
下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。
[函数2.2]
include <stdio.h>
main()
{ char c,preChar='\0';
c = getchar();
while(c! = '.'){
if((3)) putchar(c);
else if(preChar! =' ') putchar(c);
(4);
c=(5);
}
}
第5题
阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内[说明]
本程序在3×3方格中填入1到10以内9个互不相等的整数,使所有相邻两个方格内的两个整数之和为质数。程序的输出是全部满足条件的方格。
方格的序号如下图所示。程序采用试探法,从序号为0的方格开始,依次为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数;如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的填入整数;当序号为8的方格也填入合理的整数后,就找到了一个解。
为检查当前方格所填整数的合理性,程序引入数组CheckMatrix,存放需要进行合理性检查的相邻方格的序号。事实上,CheckMatrix中只要求第i个方格中的数向前兼容,即填写第4个方格时,只检查在它之前、与之相邻的第1,3个方格是否满足和为素数的条件。
[程序]
include <stdio.h>
int pos,a[9],b[11]; /*用于存储方格所填入的整数*/
void write(int a[]) /*方格输出函数*/
{ ……}
int isPrime(int m) /*素数判断函数,若m为素数则返回1,否则返回0*/
{ ……}
int selectNum(int start) /*找到start到10之间尚未使用过的最小的数,若没有则返回0*/
{ int j;
for(j=start;j<=10;j++) if(b[j]) return j;
return0;
}
int check() /*检查填入pos位置的整数是否合理*/
{ int i,j
int checkMatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,- 1},{4,6,-1},{5,7,-1}};
for(i=0;(j=(1))>=0;i++)
if(! isPrime((2)))return 0;
return 1;
}
void extend() /*为下一方格找一个尚未使用过的整数*/
{ (3)=selectNum(1);
b[a[pos]]=0;
}
void change() /*为当前方格找下一个尚未使用过的整数,若找不到则回溯*/
{ int j;
while(pos>=0&&(j=selectNum(a[pos]+1))= =0) b[a[pos- -]]=1;
if(pos<0)return;
(4);a[pos] =j;b[j]=0; }
void find()
{ int k=1;
pos=0;a[pos]=1;b[a[pos]]=0;
do{
if(ok)
if( (5) ){
write(a);change();
}
else extend();
else change();
k=check(pos);
}while(pos>=0);
}
void main()
{ int i;
for(i=1;i<=10;i++)b[i]=1;
find();
}
第6题
阅读以下说明和流程图,回答问题1-2,将解答填入对应的解答栏内。
[说明]
下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数m和 n,假定m大于等于n,算法的主要步骤为:
(1)以n除m并令r为所得的余数;
(2)若r等于0,算法结束;n即为所求;
(3)将n和r分别赋给m和n,返回步骤(1)。
[流程图]
[问题1] 将流程图中的(1)~(4)处补充完整。
[问题2] 若输入的m和n分别为27和21,则A中循环体被执行的次数是(5)。
第7题
象函数,程序中的第14行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,当程序运行到第22行且尚未执行第22行语句时成员变量i的值,最后给出程序运行后的输出结果。
[Java代码]
行号 代码
01 public class UainJava{
02 public static void main(String[]args){
03 SuperClass s=new SubClass();
04 System.out.printin(s.getValue());
05 System.out.printIn(s.getSum()):
06 }
07 }
08 abstract class SuperClass {
09 private int i;
10 public SuperClass(){i=5;}
11 public int getValue(){
12 return i:
13 }
14 public final abstract int getSum():
15 }
16 class SubClass extends SuperClass{
17 int j;
18 public SubClass(){
19 this(-3);
20 }
21 public SubClass(int j){
22 (1) .j=j;
23 }
24 publiC int getValue()(return j;}
25 public int getSum(){
26 return (2) .getValue()+j;
27 }
28
第8题
阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。
[说明]
本程序将自然数1,2,……,N2(N=5)按蛇形方式逐个顺序存入N阶矩阵。令n=N-1,则矩阵中的每一元素可用aij标记,其中i,j(0≤i,j≤n)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从an0开始、到a0n为止,依次填入由1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:
[程序]
include <stdio.h>
include <math.h>
define SIZE.10
int a[SIZE] [SIZE],k;
void write(int n) /*输出矩阵*/
{ int i,j;
for(i=0;i<=n;i+ +){
for(j=0; j<=nj j+ +)
printf("%4d",a[i][j]);
printf("\n");
}
}
void makeline(int row_start, int col_start, int row_end) /*完成矩阵一条斜线的整数填写*/
{ int i,j, sign;
sign=((1)> =0)? 1:-1;
for(i = row_start,j = col_start; (row_end-i) * sign>=0; i+=sign,j+=sign)
a[i][j]=(2);
}
void makeArray(int n) /*完成矩阵每条斜线的整数填写*/
{ int d;
for(d=1;d<=(3);d+ +)
if(d< =n+1)
if(d%2)
makeline((4));
else
makeline(n+1-d,0,n);
else
if(d%2)
makeline((5));
else
makeline(0,d-n-1,2*n-d+1);
}
void main()
{ int n, N=5;
k=1; n=N-1;
makeArray(n);
write(n);
}
第9题
阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。
[说明]
二叉树的二叉链表存储结构描述如下:
lypedef struct BiTNode
{ datatype data;
street BiTNode *lchiht, *rchild; /*左右孩子指针*/ } BiTNode, *BiTree;
下列函数基于上述存储结构,实现了二叉树的几项基本操作:
(1) BiTree Creale(elemtype x, BiTree lbt, BiTree rbt):建立并返回生成一棵以x为根结点的数据域值,以lbt和rbt为左右子树的二叉树;
(2) BiTree InsertL(BiTree bt, elemtype x, BiTree parent):在二叉树bt中结点parent的左子树插入结点数据元素x;
(3) BiTree DeleteL(BiTree bt, BiTree parent):在二叉树bt中删除结点parent的左子树,删除成功时返回根结点指针,否则返回空指针;
(4) frceAll(BiTree p):释放二叉树全体结点空间。
[函数]
BiTree Create(elemtype x, BiTree lbt, BiTree rbt) { BiTree p;
if ((p = (BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL;
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
(1);
}
BiTree InsertL(BiTree bt, elemtype x,BiTree parent)
{ BiTree p;
if (parent= =NULL) return NULL;
if ((p=(BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL;
p->data=x;
p->lchild= (2);
p->rchild= (2);
if(parent->lchild= =NULL) (3);
else{
p->lchild=(4);
parent->lchild=p;
}
return bt;
}
BiTree DeleteL(BiTree bt, BiTree parent)
{ BiTree p;
if (parent= =NULL||parent->lchild= =NULL) return NULL;
p= parent->lchild;
parent->lchild=NULL;
freeAll((5));
return bt;
第10题
阅读下列函数说明和C函数,将应填入(n)处的字句写对应栏内。
[说明]
二叉树的二叉链表存储结构描述如下:
typedef struct BiTNode
{ datatype data;
struct BiTNode *lchild, * rchild; /*左右孩子指针*/
}BiTNode,* BiTree;
对二叉树进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从队首取出一个元素,执行下面两个操作:
(1) 访问该元素所指结点;
(2) 若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
此过程不断进行,当队列为空时,二叉树的层次遍历结束。
下面的函数实现了这一遍历算法,其中Visit(datatype a)函数实现了对结点数据域的访问,数组queue[MAXNODE]用以实现队列的功能,变量front和rear分别表示当前队首元素和队尾元素在数组中的位置。
[函数]
void LevelOrder(BiTree bt) /*层次遍历二叉树bt*/
{ BiTree Queue[MAXNODE];
int front,rear;
if(bt= =NULL)return;
front=-1;
rear=0;
queue[rear]=(1);
while(front (2) ){
(3);
Visit(queue[front]->data); /*访问队首结点的数据域*/
if(queue[front]—>lchild!:NULL)
{ rear++;
queue[rear]=(4);
}
if(queue[front]->rchild! =NULL)
{ rear++;
queue[rear]=(5);
}
}
}
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!