问答题阅读以下说明和C函数代码,回答问题并将解答写在对应栏内。【说明】著名的菲波那契数列定义式为f1=1f2=1fn=fn-1+fn-2(n=3,4,…)因此,从第1项开始的该数列为1,1,2,3,5,8,13,21,…。函数fibl和fib2分别用递归方式和迭代方式求解菲波那契数列的第n项(调用fib1、fib2时可确保参数n获得一个正整数)。【C函数代码】
问答题试题五(共15 分)
阅读以下说明和C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
二叉排序树或者是一棵空树,或者是具有如下性质的二叉树:若它的左子树非空,则左子树上所有结点的值均小于根结点的值;若它的右子树非空,则右子树上所有结点的值均大于根结点的值;左、右子树本身就是两棵二叉排序树。
函数insert_BST (char *str)的功能是:对给定的字符序列按照ASCII 码值大小关系创建二叉排序树,并返回指向树根结点的指针。序列中重复出现的字符只建一个结点,并由结点中的Count 域对字符的重复次数进行计数。
二叉排序树的链表结点类型定义如下:
typedef struct BSTNode{
char Elem; /*结点的字符数据*/
int Count; /*记录当前字符在序列中重复出现的次数*/
struct BSTNode *Lch,*Rch; /*结点的左、右子树指针*/
}*BiTree;
[函数]
BiTree insert_BST(char *str)
{ BiTree root,parent,p;
char (1) ; /* 变量定义及初始化 */
root = (BiTree)malloc(sizeof(struct BSTNode));
if (!root || *s=='/0') return NULL;
root->Lch = root->Rch = NULL; root->Count = 1; root->Elem = *s++;
for(; *s != '/0'; s++) {
(2) ; parent = NULL;
while (p) { /* p 从树根结点出发查找当前字符*s 所在结点 */
parent = p;
if (*s == p->Elem) /*若树中已存在当前字符结点,则当前字符的计数值加1*/
{ p->Count++; break; }
else /*否则根据字符*s 与结点*p 中字符的关系,进入*p 的左子树或右子树*/
if (*s > p->Elem) p = p->Rch;
else p = p->Lch;
}/*while*/
if ( (3) ) { /* 若树中不存在字符值为*s 的结点,则申请结点并插入树中 */
p = (BiTree)malloc(sizeof(struct BSTNode));
if (!p) return NULL;
p->Lch = p->Rch = NULL; p->Count = 1; p->Elem = *s;
/*根据当前字符与其父结点字符值的大小关系,将新结点作为左子树或右子树插入*/
if (p->Elem > parent->Elem ) (4) = p;
else (5) = p;
}
}/*for*/
return root;
}
问答题[说明1] 函数int factors(int n)的功能是判断整数n(n>=2)是否为完全数。如果n是完全数,则函数返回0,否则返回-1。 所谓“完全数”是指整数n的所有因子(不包括n)之和等于n自身。例如,28的因子为1,2,4,7,14,而28=1+2+4+7+14,因此28是“完全数”。 [C函数1] int factors(int n) int i,s; for(i=1,s=0;i<=n/2;i++) if(n%i=0) (1) ; if( (2) )return 0; rerurn-1; [说明2] 函数int maxint(int a[],int k)的功能是用递归方法求指定数组中前k个元素的最大值,并作为函数值返回。 [C函数2] int maxint(int a[],int k) int t; if( (3) ) return (4) ; t=maxint(a+1, (5) ); return(a[0]>t)?a[0]:t;
问答题【Java代码】
class usethread implements{{U}} (1) {{/U}}{
int num
usethread(int n){
num=n;
}
public void{{U}} (2) {{/U}}{
for(int i=0;i<3;i++)
System.out.println("running:"+num);
System.out.println("finished:"+num);
}
public class multhread{
public static void main(String args[]){{U}} (3) {{/U}}InterruptedException{
Thread m1=new Thread(new usethread(1));
Thread m2=new Thread(new usethread(2));
m1.start();
m2.start();
m1.join();
m2.join();
}
}
【问题1】
补充完整上面Java代码中{{U}} (n) {{/U}}处。
【问题2】
写出上面Java代码运行的结果。
问答题【说明】 字符串在程序设计中扮演着重要角色。现需要设计字符串基类string,包含设置字 符串、返回字符串长度及内容等功能。另有一个具有编辑功能的串类edlt_string,派生于string,在其中设置一个光标,使其能支持在光标处的插入、删除操作。 【程序】 #include <iostream.h> #include <stdio.h> #include <string.h> class string int length; char *data; public: int get_length() return length; char *get_data() return data; ~string() delete data; int set data(int in_length, char *in_data); int set_data(char *data); void print() cout<<data<<endl; ; class edit_string: public string int cursor; public: int get_cursor() return cursor; void move_cursor(int dis) cursor=dis; int add_data(string *new_data); void delete_data(int num); ; int string::set_data(int in_length,char *in_data) length=in_length; if(!data) delete data; (1) strcpy(data,in_data); return length; int string::set data(char *in_data) (2) if(!data) delete data; (1) strcpy(data,in_data); return length; int edit_string::add_data(string *new_data) int n,k,m; char *cp,*pt; n=new_data->get_length(); pt=new_data->get_data(); cp=this->get_data(); m=this->get_length(); char *news=new char[n+m+1]; for(int i=0; i<cursor; i++) news[i]=cp[i]; k=i; for(int j=0; j<n; i++,j++) news[i]=pt[j]; cursor=i; for(j=k; j<m; j++,i++) (3) news[i]='/0'; (4) delete news; return cursor; void edit string::delete_data( int num) int m; char *cp; cp=this->get_data(); m=this->get_length(); for(int i=cursor; i<m; i++) (5) cp[i]='/0';
问答题【说明】
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
【函数】
main()
{
int number[20],n,m,i;
printf("the total numbers is:");
scanf("%d",
printf("back m:");
scanf("%d",
for(i=0;i<=n-1;i)
scanf("%d,",
{{U}} (1) {{/U}};
for(i=0;i<=n-1;i)
printf("%d,",number[i]);
}
move(array,n,m)
int n,m,array[20];
{
int *p,array_end;
array_end={{U}} (2) {{/U}};
for(p=array[n-1];{{U}} (3) {{/U}};p--)
*p={{U}} (4) {{/U}};
*array=array_end;
m--;
if(m>0){{U}} (5) {{/U}};
}
问答题【说明】
设计一个类模板SamPle用于对一个有序数组采用二分法查找元素下标。
【C++程序】
#include < iostream. h >
#define Max 100 //最多元素个数
template < class T >
class Sample
{
T A[Max]: //存放有序数序
int n: //实际元素个数
public
Sample( ) { } //默认构造函数
Sample(T a[] ,int i); //初始化构造函数
int seek(T c);
void disp( )
{
for(int i=0;i <n;i ++)
cout<<A[i] <<" ";
cout<<endl:
} } template < class T >
Sample <T>: :Sample(T a[ ],int i)
{
n=i:
for( intj =0;j < i;j ++ )
{{U}} (1) {{/U}};
}
template < class T >
int Sample < T >:: seek( T c)
{
int low =0,high = n-1 ,mid;
while({{U}} (2) {{/U}})
{
mid = (low + high)/2;
if({{U}} (3) {{/U}})
return mid;
else if({{U}} (4) {{/U}})
low=mid+|;
else
{{U}} (5) {{/U}};
}
return-1;
}
void main( )
{
char a[ ] ="acegkmpwxz";
Sample < char > s(a, 1);
cout<<"元素序列:" ;s. disp( );
cout<<"元素'g'的下标:"<<s. seek('g') <<endl;
}
问答题【说明】
计算n的合数。一个整数n可以有多种划分,使其划分的一列整数之和为n。例如,整数5的划分为:
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1
共有7种划分。这种划分的程序如下所示。
【程序】
#include <stdio.h>
int n[1000],m,k;
void output sum()
{
int j;
for(j=0;n[j]!=0;j++)
printf("%d/t",n[j]);
printf("/n");
}
void sum(int i)
if(m-n[i]<n[i])
{ m=m-n[i];
{{U}}(1) {{/U}}
i++;
n[i+1]=0;
}
else
{
{{U}} (2) {{/U}}
m-=n[i];
i++;
}
if(m!=n[i])
sum(i);
else
output_sum();
if(n[i]>1)
{
n[i]--;
{{U}}(3) {{/U}}
}
else
{
while((n[i]==1)
{{U}} (4) {{/U}}
}
if(i!=0)
{
{{U}} (5) {{/U}}
sum(i);
}
}
}
void main()
{
int i;
scanf("%d",
m=k=n[0];
for(i=1;i<=k;i++)
n[i]=0;
while(n[0]!=1)
{
n[0]--;
i=0;
sum(0);
m=k;
}
}
问答题【说明】 java.util库中提供了Vector模板类,可作为动态数组使用,并可容纳任意数据类型。该类的部分方法说明如下表所示:
方法名
含 义
add(k)
向vector对象的尾部添加一个元素k
removeElementAt(i)
删除序号为i的元素(vector元素序号从0开始)
isEmpty()
判断vector对象是否含有元素
size()
返回vector对象中所包含的元素个数【Java代码】 import {{U}}(1) {{/U}}; public class JavaMain { static private final int {{U}}(2) {{/U}} = 6; public static void main(String[] args){ Vector<Integer> theVector = new Vector<{{U}} (3) {{/U}}>(); // 初始化 theVector, 将theVector的元素设置为0至5 for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++) theVector.add({{U}} (4) {{/U}}); showVector(theVector); // 依次输出theVector中的元素 theVector.removeElementAt(3); showVector(theVector); } public static void showVector(Vector<Integer> theVector if (theVector.isEmpty()) { System.out.println("theVectcr is empty."); return; } for (int loop = 0; loop < theVector.size(); loop++) System.out.print(theVector.get(loop)); System.out.print(", "); } System.out.println(); } } 该程序运行后的输出结果为: 0,1,2,3,4,5 {{U}} (5) {{/U}}
问答题阅读以下应用说明、图和C++代码,根据要求回答问题1至问题3。
[说明] 已知以下C++程序运行时的输出结果如下。
1:1 1:1 1:1
[C++程序] 01 #include <iostream> 02
using namespace std; 03 class Stock{
04 protect: 05 {{U}} (1)
{{/U}}{ }; 06 Stock(int n, int pr=1)
{ 07 shares = n;
share_val=pr; 08 }; 09
void ~Stock() { }; 10
public: 11 //成员函数 12
void output() { 13
{{U}} (2) {{/U}} << shares << ":" << share_val <<
endl; 14 } 15
private: 16 //成员变量 17
int shares; 18 int
share_val; 19 }; 20 21
void main() { 22 Stock a(1);
a.output 23
Stock b;
b.output 24 Stock c = Stock ();
c.output 25 }
问答题【说明】下列流程图用泰勒(Taylor)展开式y=ex=1+x+x2/2!+x3/3!+…+xn/n!+…计算并打印ex的近似值,其中用ε(>0)表示误差要求。【流程图】
问答题【说明】下列流程图用泰勒(Taylor)展开式y=ex=1+x+x2/2!+x3/3!+…+xn/n!+…计算并打印ex的近似值,其中用ε(>0)表示误差要求。【流程图】
问答题【说明】 下面的程序构造一棵以二叉链表为存储结构的二叉树。 【函数】 BitTree *createbt(BitTree *bt) BitTree *q; struct node *s[30]; int j,i; char x; printf("i,x="); scant("%d,%c", while(i!=0 //生成一个结点 (1) ; q->lchild=NULL; q->rchild=NULL; (2) ; if ( (3) ) j=i/2; // j为i的双亲结点 if(i%2==0) (4) ; //i为j的左孩子 else (5) ; //i为j的右孩子 printf("i,x="); scanf("%d,%c", return s[i];
问答题[函数2.1说明]Fibonacci数列中头两个数均为1,从第三个数开始,每个数等于前两个数之和。下述程序计算Fibonacci数列中前15个数,并以每行5个数的格式输出。[函数2.1]#include<stdio.h>main(){inti,f,f1=1,f2=1;printf("%5d%5d",f1,f2);for(i=3;i<=15;i++){f={{U}}(1){{/U}};printf("%5d",f);if({{U}}(2){{/U}}==0)printf("/n");f1=12;{{U}}(3){{/U}};}}[试题一流程图][函数2.2说明]函数fun(char*str1,char*str2)的功能是将字符串str2拼接到str1之后。[函数2.2]fun(char*str1,char*str2){inti,j;for(i=0;str1[i]!='/0';i++);for(j=0;str2[j]!='/0';j++){{U}}(4){{/U}};{{U}}(5){{/U}};}
问答题【程序2.1说明】 已知一个排好序的数组,现输入一个数,要求按原来的顺序规律,将它插入到数组中。 【程序2.1】 #include <stdioh> #define N 100 void main() float a[N+l],x; int i,p; printf("输入已经排好序的数列: "); for(i=0; i<N; i++) scanf(%f", printf("输入要插入的数:"); scanf("%f", for(i=0,p=N; i<N; i++) if(x<a[i]) (1) break; for(i=N-1; i>=p; i--) (2) (3) for(i=0; i<=N; i++) prinff("%f/t",a[i]); 【程序2.2说明】 本程序用变量count统计文件中字符的个数。 【程序2.2】 #include <stdio.h> #include <stdlib.h> void main() FILE *fp; long count=0; if((fp=fopen("letter.txt","r"))==NULL) printf("can not open file/n"); exit(0); while(!feof(fp)) (4) count++; printf("count=%d/n",count); (5)
问答题【问题2】
设“程序员考试大纲”标准书号前9个数字为7-302-08493,请写出其校验码。
问答题【说明】设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值后跟用“()”括起来的各子树的列表(若有子树的话),各子树的列表间用“,”分隔。例如,如下图所示的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。本程序根据输入的列表生成一棵M叉树,并由M叉树再输出列表。【函数】#include#include#defineM3/*三叉树*/typedefstructnodeintval;structnode*subTree[M];NODE;charbuf[255],*str=buf;NODE*d=NULL;NODE*makeTree()/*由列表生成M叉树*/intk;NODE*s;s=(1);s->val=*str++;for(k=0;k<M;k++)s->subTree[k]=NULL;if(*str=='(')k=0;dostr++;s->subTree[k]=(2);if(*str==')')str++;break;k=k+1;while((3));returns;voidwalkTree(NODE*t)/*由M叉树输出列表*/inti;if(t!=NULL)(4);if(t->subTree[0]==NULL)return;putchar('(');for(i=0;i<M;i++)(5);if(i!=M-1putchar(')');voidmain()printf("Enterexp:");scanf("%s",str);d=makeTree();walkTree(d);putchar('/n');
问答题阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。[说明]两个包含有限个元素的非空集合A、B的相似度定义为|A∩B|/|A∪B|,即它们的交集大小(元素个数)与并集大小之比。以下的流程图计算两个非空整数集合(以数组表示)的交集和并集,并计算其相似度。已知整数组A[1:m]和B[1:n]分别存储了集合A和B的元素(每个集合中包含的元素各不相同),其交集存放于数组C[1:s],并集存放于数组D[1:t],集合A和B的相似度存放于SIM。例如,假设A={1,2,3,4},B={1,4,5,6},则C={1,4},D={1,2,3,4,5,6},A与B的相似度SIM=1/3。[流程图]
问答题试题七(共15分)阅读以下应用说明以及用VisualBasic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]某应用程序用于监测某种设备的工作温度(20~200度),其运行窗口中,包括一个温度计(矩形形状shpMeter)以及其中指示当前设备温度的水银柱(矩形形状shpT),文字标签标记了温度刻度;另有一个图片框picCurve,用于动态描述检测到的温度曲线(用户见到的曲线与水银柱等高变化);命令按钮“开始检测”(cmdStart)用于启动温度检测,命令按钮“暂停检测”(cmdStop)用于暂停检测。矩形形状shpT(水银柱)属性visible初始设置为不可见,属性Filltype设置为solid(实心),FillColor设置为红色;图片框picCurve的属性AutoRedraw设置为True;再创建一个定时器TimT,属性Enabled初始设置为False(不起作用),属性Interval(定时间隔)设置为500毫秒。为模拟设备温度的检测,程序中利用了(0,1)之间均匀分布的伪随机数获得[20,200]之间的随机温度T。为了便于在图片框picCurve中绘制曲线,程序中对该图片框建立了坐标系统,左上角为原点(0,0),水平向右方向为X轴,垂直向下方向为Y轴,右下角坐标为(50,180)。为了便于观察记录的温度值,图片框中从上到下创建了5条水平线Ls(i),i=0,1,…4,并在程序中按等间隔排列进行位置设置。程序中每隔半秒算出曲线点(x,y),其中x=0,1,2,…,再用直线段连接各相邻曲线点形成温度曲线。[VisualBasic程序代码]Dim(1)AsInteger'声明全局变量PrivateSubCmdStart_Click()TimT.Enabled=TrueShpT.Visible=TrueEndSubPrivateSubCmdStop_Click()TimT.Enabled=FalseEndSubPrivateSubForm_Load()Dimi,HAsIntegerPicCurve.Scale(0,0)-(50,180)'设置图片框坐标系:左上角-右下角H=30'H等于图片框高度的六分之一Fori=0To4'设置5条水平线Ls(i)的位置Ls(i).X1=0'Ls(i)起点横坐标Ls(i).Y1=H*(2)'Ls(i)起点纵坐标Ls(i).X2=50'Ls(i)终点横坐标Ls(i).Y2=Ls(i).Y1'Ls(i)终点纵坐标Ls(i).BorderColor=&HC0C0C0'设置水平线颜色Nextix=0'设置曲线坐标初值EndSubPrivateSubtimT_Timer()DimT,HAsInteger'T为即时温度,H为图片框中温度点显示高度T=Int(Rnd*181)+20'模拟随机产生设备温度(20~200度)'按当前温度显示水银柱H=ShpMeter.Height*(3)'算出水银柱的高度ShpT.Top=(4)-H'设置水银柱顶部位置ShpT.Height=H'设置水银柱的高度'绘制温度曲线y=(5)'算出曲线上当前点的纵坐标Ifx=51Then'当超出图片框时PicCurve.Cls'清除图片框内以前画的曲线x=0'设置重画曲线的初值ElseIfx>0Then'除左边点外PicCurve.Line(x-1,Lasty)-(x,y),vbRed'由前1点到当前点画红色线段EndIfx=x+1'准备下一点坐标Lasty=y'保存当前坐标供下次使用EndSub
问答题试题八(15 分,每空3 分)
阅读以下说明和Java 源程序,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
以下程序的功能是计算三角形、矩形和正方形的面积并输出。
程序由5 个类组成:AreaTest 是主类,类Triangle、Rectangle 和Square 分别表示三角形、矩形和正方形,抽象类Figure 提供了一个计算面积的抽象方法。
【程序】
public class AreaTest{
public static void main(String args[]) {
Figure[] figures={
new Triangle(2,3,3), new Rectangle(5,8), new Square(5)
};
for (int i=0; i
