一、问答题
1、阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
[说明]
下面流程图的功能是:在给定的一个整数序列中查找最长的连续递增子序列。设序列存放在数组A[1:n](n≥2)中,要求寻找最长递增子序列A[K:K+L-1](即A[K]<A[K+1]<…<A[K+L-1])。流程图中,用Kj和Lj分别表示动态子序列的起始下标和长度,最后输出最长递增子序列的起始下标K和长度L。
例如,对于序列A={1,2,4,4,5,6,8,9,4,5,8},将输出K=4,L=5。
[流程图] 
注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为1,格式为:循环控制变量=初值,终值
参考答案:
n-1 Lj+1→Lj Lj>L Kj i+1
2、阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
下面的代码运行时,从键盘输入一个四位数(各位数字互不相同,可以有0),取出组成该四位数的每一位数,重组成由这四个数字构成的最大四位数max4和最小四位数min4(有0时为三位数),计算max4与min4的差值,得到一个新的四位数。若该数不等于6174,则重复以上过程,直到得到6174为止。
例如,输入1234,则首先由4321-1234,得到3087;然后由8730-378,得到8352;最后由8532-2358,得到6174。
[C代码]
#include<stdio.h>
int difference(int
a[])
( int
t,i,j,max4,min4;
for(i=0; i<3; i++){/*用简单选择排序法将a[0]~a[3]按照从大到小的顺序排列*/
t=i;
for(j=i+1; ______;
j++)
if(a[j]>a[t]) ______;
if(t!=i){
int temp=a[t];
a[t]=a[i]; a[i]=temp;
}
}
max4=______;
min4=______;
return max4-min4;
}
int main()
{ int
n,a[4];
printf("input
a positive four-digit number:");
scanf("%d",&n);
while(n!=6174){
a[0]= ______;
/*取n的千位数字*/
a[1]=n/100%10;
/*取n的百位数字*/
a[2]=n/10%10;
/*取n的十位数字*/
a[3]= ______;
//取n的个位数字*/
n=difference(a);
}
return 0;
}参考答案:
j<4或等价形式 t=j a[0]*1000+a[1]*100+a[2]*10+a[3] 或等价形式 a[3]*1000+a[2]*100+a[1]*10+a[0] 或等价形式 n/1000 或等价形式 n%10
3、阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。
函数quicksort(int a[],int n)实现了快速排序,其中,n个整数构成的待排序列保存在数组元素a[0]~a[n-1]中。
[C代码]
#inclLade<stdi0.h>
void quicksort(int
a[], int n)
{
int i,j;
int pivot=a[0];
//设置基准值
i=0; j=n-1;
while (i<j){
while (i<1 && ______) j--; //大于基准值者保持在原位置
if (i<j) { a[i] =a[j]; i++;}
while(i<j&& ______) i++; //不大于基准值者保持在原位置
if (i<1) { a[j] =a[i]; 1--;}
}
a[i]=pivot;
//基准元素归位
if (i>1 )
______;
//递归地对左孔序列进行快速排序
if (n-i-1>1 )
______;
//递归地对右孔序列进行快速排序
}
int main()
{
int i, arr[]
={23,56,9,75,18,42,11,67};
quicksort(______);
//调用quicksort对数组arr[]进行排序
for( i=0;
i<sizeof(arr)/sizeof(int);
i++ )
printf("%d\t",arr[i]);
return 0;
}参考答案:
a[j]>pivot 或 a[j]>=pivot 或等价形式 a[i]<=pivot 或 a[i]<pivot 或等价形式 quicksort(a,i) 或 quicksort(a,j) 或等价形式 quicksort(a+i+1,n-i-1) 或 quicksort(a+j+1,n-j-1) 或等价形式 注:a+i+1可表示为&a[i+1],a+j+1可表示为&a[j+1] arrsizeof(arr)/sizeof(int) 注:sizeof(arr)/sizeof(int)可替换为8
4、
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
函数GetListElemPtr(LinkList L,int i)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。
函数DelListElem(LinkList L,int i,ElemType *e)的功能是删除含头结点单链表的第i个元素结点,若成功则返回SUCCESS,并由参数e带回被删除元素的值,否则返回ERROR。
例如,某含头结点单链表L如下图(a)所示,删除第3个元素结点后的单链表如下图(b)所示。
#define SUCCESS 0 #define ERROR -1 typedef int Status; typedef int ElemType;
链表的结点类型定义如下:
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*LinkList;
[C代码]
LinkList
GetListElemPtr(LinkList L,int i)
{ /*L是含头结点的单链表的头指针,在该单链表中查找第i个元素结点;
若找到,则返回该元素结点的指针,否则返回NULL
*/
LinkList p;
int k;
/*用于元素结点计数*/
if(i<1 || !L || !L->next) return NULL;
k=1; p=L->next; /*令p指向第1个元素所在结点*/
while(p &&
______){ /*查找第i个元素所在结点*/
______; ++k;
}
return p;
}
Status
DelListElem(LinkList L,int i,ElemType *e)
{ /*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/
LinkList p,q;
/*令P指向第i个元素的前驱结点*/
if(i==1)
______;
else
p=GetListElemPtr(L,i-1);
if(!P || !p->next) return ERROR; /*不存在第i个元素*/
q=______;
/*令q指向待删除的结点*/
p->next=q->next; //从链表中删除结点*/
______;
/*通过参数e带回被删除结点的数据*/
free(q);
return
SUCCESS;
}
参考答案:
k<i p=p->next p=L p->next *e=q->data
5、阅读以下说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
在股票交易中,股票代理根据客户发出的股票操作指示进行股票的买卖操作。其类图如下图所示,相应的C++代码附后。
类图
[C++代码]
#include<iostream>
#include<string>
#include<vector>
using namespace
std;
class Stock {
private:
string name;
int quantity;
public:
Stock(string
name,int quantity) {this->name=name;
this->quantity
=quantity;}
void buy() {cout<<"[买进]股票名称:"<<name<<",数量:"<<quantity<<
endl;}
void sell() {cout<<"[卖出]股票名称:"<<name<<",数量:"<<quantity
<<endl;}
};
clasS order{
public:
virtual void
execute()=0;
};
class
BuyStock:______ {
private:
Stock* stock;
public:
BuyStock(Stock*
stock){______ =stock; }
void execute(){
stock一>buy();
}
};
//类SellStock的实现与BuyStock类似,此处略
class Broker{
private:
vector<Order*> orderList;
public:
void
takeOrder(______ order)( orderLiSt.push back(order);}
void placeorders()
{
for(int i=0;i<orderList.Size(); i++){______ ->execute();}
0rderLiSt.clear();
}
};
class
StockCommand{
public:
VOid main(){
Stock* aStock=new
Stock("股票A",10);
Stock*bStock=new
Stock("股票B",20);
Order*buyStockOrder=new BuyStock(aStock);
Order*
sellStockOrder=new SellStock(bStock);
Broker* broker=new
Broker();
broker->takeOrder(buyStockorder);
broker->takeOrder(sellStockOrder);
broker-> ______ ();
}
};
int main(){
StockCommand*
stockCommand=new StockCommand();
StockCommand->main();
delete
StoCkCommand;
}
参考答案:
publicOrder this->stock 或(*this).stock Order* orderList[i] 或 *(orderList+i) placeOrders
6、阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
在股票交易中,股票代理根据客户发出的股票操作指示进行股票的买卖操作。其类图如下图所示。相应的Java代码附后。
类图
[Java代码]
import
Java.util.ArrayList;
import
java.util.List;
ClaSS Stock{
private String
name;
private int
quantity;
public
Stock(String name,int quantity){
thiS.name=name;this.quantity=quantity;
}
public void buy(){
System.out.println("[买进]:"+name+",数量:"
+quantity);}
public void sell()
{System.out.println("[卖出]:"+name+",数量:"
+quantity);}
}
interface Order {
VOid execute();
}
class BuyStock
______ Order {
private Stock
Stock;
public
BuyStock(Stock stock){______=stock; }
public void
execute(){ stock.buy(); }
}
//类SellStock实现和BuyStock类似,略
clasS Broker{
private List<Order>orderList=new ArrayList<Order>();
Dublic void
takeOrder(______ Order){ orderList.add(order); }
public void
placeorders(){
for {______
order:orderList) {order.execute(); }
orderLiSt.clear();
}
}
public class
StockCommand {
public static void
main(String[]args){
Stock aStock:new
Stock("股票A",10);
Stock bStock=new
Stock("股票B",20);
Order
buyStockorder=new BuyStock(aStock);
Order
sellStockOrder=new SellSt0Ck(bStoCk);
Broker broker=new
Broker();
broker.takeOrder(buyStockorder);
broker.takeOrder(sellStockOrder);
broker.______;
}
}
参考答案:
implements this.stock Order Order placeOrders()
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!




