填空题[说明] 已知类SubClass的getSum方法返回其父类成员i与类SubClass成员j的和,类SuperClass中的getSum为抽象函数,程序中的第14行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,当程序运行到第22行且尚未执行第22行语句时成员变量i的值,最后给出程序运行后的输出结果。 [Java代码] 行号 代码 01 public class Mainjava 02 public static void main(String[] args) 03 SuperClass s = new SubClass () ; 04 System. out .println (s. getValue ()) ; 05 System. out .println (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
填空题[说明] 编写一个函数,输入为偶数时,调用函数求1/2+?/+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n (利用指针函数)。[函数] #include "stdio. h", main() float peven (),podd (),dcall (); float sum; int n; while (1) scanf("%d",&n); if (n>1) break; if(n%2==0) printf("Even="): (1); else pfinff("Odd="); (2) ; printf("%f",sum); float peven (int n) float s; int i s=1; for(i=2;i<=n;i+=2) (3) ; return (s); float podd (n) int n; float s; int i; s=0; for(i=1 i<=n;i+=2) (4) ; return (s); float dcall(fp,n)float (*fp) ();int n;float s; (5) ;returu (s);
填空题[说明]某绘图系统中有两个画矩形的程序DP1和DP2。程序DP1用函数drawaline(x1,y1,x2,y2)画一条直线,程序DP2则用函数drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。若将“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)和具体实现不同,则将这种应用称为Bridge(桥接)模式。图8-9显示了该系统与矩形绘制相关的各个类之间的关系。系统始终只处理3个对象:Shape对象、Drawing对象,以及DP1或DP2对象。以下是C++语言的实现过程,能够正确编译通过。[C++程序]classDP1public:staticvoiddrawaline(doublex1,doubley1,doublex2,doubley2)…//省略具体实现;classDP2public:staticvoiddrawline(doublex1,doublex2,doubley1,doubley2)//省略具体实现;ClassDrawingPublic:virtualvoiddrawLine(doublex1,doubley1,doublex2,doubley2)=0;;classV1Drawing:publicDrawingpublic:voiddrawLine(doublex1,doubley1,doublex2,doubley2)DP1::draw_a_line(x1,y1,X2,y2);;classV2Drawing:publicDrawingpublic:voiddrawLine(doublex1,doubley1,doublex2,doubley2)(1);;classShapePrivate:(2)_dp;Public:Shape(Drawing*dp);(3)voiddraw()=0;voiddrawLine(doublex1,doubley1,doublex2,doubley2);;Shape::Shape(Drawing*dp)_dp=dp;voidShape::drawLine(doublex1,doubley1,doublex2,doubley2)//画一条直线(4);classRectangle:public(5)private:double_x1,_y1,_x2,_y2;public:Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2);voiddraw();;Rectangle::Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2):(6)_x1=x1;_y1=y1;_x2=x2;_y2=y2;voidRectangle::draw()…//省略具体实现
填空题阅读以下函数说明和C语言函数,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。
[说明]
函数int psort(int a[],int n)实现将含n个整数的数组a[]的不同元素按从小到大顺序存于数组a[]中。实现方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。
[C函数]
int psort(int a[],int n)
{int i,J,k,P;
for(i=0,k=0;i<{{U}} (1) {{/U}};i++){
for(j=i+1, {{U}}(2) {{/U}};j<n; j++)
if(a[p]>a[j])
p=j;
if(p!=i){
t=a[p];
a[p]=a[i];
a[i]=t;
}
if({{U}} (3) {{/U}}) k++;
else if({{U}} (4) {{/U}}<a[i])
{{U}} (5) {{/U}}=a[i];
}
return k;
}
int a[]={5,7,5,6,4,3,4,6,7};
main()
{int k,n;
for(k=0;k<(Sizeof a)/Sizeof(int);k++)
printf("%5d",a[k]);
printf ("/n/n");
n=psort(a,(sizeof(a))/sizeof(int));
for(k=0;k<n;k++)
printf("%5d",a[k]);
printf("/n/n");
}
填空题【说明】
以下程序的功能是计算三角形、矩形和正方形的面积并输出。
程序由4个类组成:类Triangle、Rectangle和Square分别表示三角形、矩形和正方形;抽象类Figure提供了一个纯虚拟函数getArea(),作为计算上述3种图形面积的通用接口。
【C++程序】
#include<iostream.h>
#include<math.h>
class Figure {
public:
virtual double getArea()=0; //纯虚拟函数
};
class Rectangle:{{U}} (1) {{/U}}{
protected:
double height;
double width;
public:
Rectangle() {};
Rectangle(double height,double width) {
this->height=height;
this->width=width;
}
double getArea() {
return{{U}} (2) {{/U}};
}
};
class Square:{{U}} (3) {{/U}}{
public:
Square(double width){
{{U}} (4) {{/U}};
}
};
class Triangle:{{U}} (5) {{/U}}{
double la;
double lb;
double lc;
Public:
Triangle(double la, double lb, double lc) {
This->la=la; this->lb=lb; this->lc=lc;
}
double getArea() {
double s = (la+lb+±c)/2.0;
return sqrt(s,(s-la)*(s-lb)*(s-Ic));
}
};
void main() {
Figure*figures[3]={
new Triangle(2,3,3), new Rectangle(5,8), new SqUare(5));
for(int i=0;i<3;i++){
cout<<"figures["<<i<<"]area="<<(figures[i])->getArea()<<endl;
}
}
填空题[说明] 下面程序实现十进制向其他进制的转换。 [C++程序] #include "iostream.h" #include "math.h" #include <conio.h> typedef struct node int data; node *next; Node; class Transform public : void Trans (int d,int i) ; //d为数字;i为进制 void print () ; private : Node *top; void Transform::Trans(int d,int i) int m,n=0; Node *p; while (d>0) (1) ; d=d/i; p=new Node; if(!n) p->data=m; (2) ; (3) ; n++; else p->data=m; (4) ; (5) ; void Transform: :print () Node *p; while (top ! =NULL) p=top; if (p->data>9) cout<<data+55 ; else cout<<data; top=p->next ; delete p;
填空题[说明]某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点AP(AccessPoin)。假设每个无线AP覆盖范围的半径是6米,因此必须使得每台笔记本计算机上的无线网卡到某个无线AP的直线距离不超过6米。为了简化问题,假设所有无线网卡都在同一直线卜,并且无线AP沿该直线放置。该问题可以建模为如图8-1所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现采用贪心策略来实现用尽可能少的无线AP覆盖所有的无线网卡。基于贪心算法实现以上应用需求的基本思想是:问题的规模为N,从第1个无线网卡(最左端)开始布局无线AP,把第1个无线AP放置在该无线网卡右方的6米处,此时该无线AP会覆盖从第1个无线网卡到该无线网卡右方直线长度为12米的所有无线网卡,假设覆盖了N1个无线网卡。此时间题规模变成了N-N1,接着把第1个无线AP覆盖的无线网卡去掉,再从N-N1中选择第1个(最左端)无线网卡开始布局无线AP,将第2个无线AP放置在该无线网卡右方的6米处。依此布局,直到覆盖所有的无线网卡为止。图8-2是问题解的模型,其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡,实心圆形表示无线AP,虚线圆对应无线AP为圆心,虚线圆的直径为相应无线AP的覆盖范围(12米)。实现以上贪心算法的流程如图8-3所示。其中,①d[i](1≤i≤N)表示第i张无线网卡到通道A端的距离,N表示无线网卡的总数,无线网卡的编号按照无线网卡到通道A端的距离从小到大进行编号;②s[k]表示第k(k≥1)个无线AP到通道A端的距离。算法结束后,k的值为无线AP的总数。
填空题[说明] 设有一个带头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现在它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。 [函数] void Locate(int &x) <结点类型说明> *p=first->next; while(p!=first && (1) )p=p->next; if(p!=first) (2) ; <结点类型说明> *current=p; current->prior->next=current->next; current->next->prior=current->prior; p=current->prior; while(p!=first && (3) )p=p->prior; current->next= (4) ; curren->prior=p; p->next->prior=current; p->next= (5) ; else printf("sorry.Not find! /n");
填空题阅读以下说明和Java程序,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。
[说明]
下面程序实现十进制向其它进制的转换。
[Java程序]
ClasS Node{
int data;
Node next;
}
class Transform{
private Node top;
public void print(){
Node p;
while(top!=null){
P=top;
if(P.data>9)
System.out.print((char)(P.data+55));
else
System.out.print(p.data);
top=p.next;
}
}
public void Trans(int d,int i){//d为数字;i为进制
int m;
{{U}} (1) {{/U}}n=false;
Node p;
while(d>0){
{{U}} (2) {{/U}};
d=d/i;
p=new Node();
if({{U}} (3) {{/U}}){
p.data=m;
{{U}} (4) {{/U}};
top=P;
n=true;
}
else{
p.data=m;
{{U}} (5) {{/U}};
top=P;
}
}
}
}
填空题【说明】 为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1.n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置(假设R[]中的元素互不相同)。 【算法】 1.变量声明 X:DataType i,j,low,high,mid,R[0..n]) 2.每循环一次插入一个R[i] 循环:i以1为步长,从2到n,反复执行 ①准备 X<-R[i]; (1) ;high<-i-1; ②找插入位置 循环:当 (2) 时,反复执行 (3) ; 若X.key<R[mid].key 则high<-mid-1 否则 (4) ③后移 循环:j以-1为步长,从 (5) ,反复执行 R[j+1]<-R[j] ④插入 R[low]<-X 3.算法结束
填空题[说明] 用输入/输出写一个程序,让用户输入一些姓名和电话号码。每一个姓名和号码将加在文件里。用户通过点“Done”按钮来告诉系统整个列表已输入完毕。 如果用户输入完整的列表,程序将创建一个输出文件并显示或打印出来。格式如:555,1212,Tom 123-456-7890,Peggy L.234-5678,Marc 234-5678,Ron 876-4321,Beth byte [] name=new byte [lineLength]; int i; try fos= new FileOutputStream ("phone. numbers"); catch (FileNotFoundException e) while (true) (1) ("Enter a name (enter 'done' to quit)"); (2) (name); if ("done". equalsIgnoteCase (new String (name,0,0,4))) break; System.err.println ("Enter the phone number"); readLine (phone); for (int i=0;phone [i]!=0;i++) (3) ; fos.write (','); for (int i=0 (4) ;i++) fos. write (name [i]); fos. write ('/n'); fos. close(); private static void readLine (byte line []) throws IOException int i=0,b=0; while ((i< (5) ) line[i]= ( byte ) 0;
填空题[说明]字符组合:程序界面如图示,在文本框Text1中输入若干个任意字符,单击“颠倒”按钮,将这些字符按相反的顺序显示在标签Lable1中,并在标签Labs12处显示字符的个数。例如:输入abcabc2,显示为2cbabca,组成字符数为4。[VisualBasic代码]PrivateSubcmdshow_Click(DimnAsIntegerDimIAsIntegerDimstr1AsStringN=Len(Text1.Text)ForI=nToStep-1Str1=(1)NextILabe11.Caption=Str1EndSubPrivateSubcmdcount_Click()DimnAsIntegerDiminAsIntegerDimiAsIntegerDimjAsIntegerDimflagAsIntegerDimstr1AsIntegerDimstr2AsIntegerN=(2)Str1=Mid$(Text1.Text,i.1ForI=2TonStr2=mid$(Text1,Text,I,1M=Len(str1)(3)Forj=1TomIf(4)Thenflag=1;ExitForNextjIfflag<>1thenstr1=str1&str2NextILable2.Caption=(5)EndSub
填空题阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。 [说明] 这是一个求解Josephus问题的函数。用整数序列1,2,3…,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。Josephus问题描述,设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,…如此反复直到所有的人全部出局为止。 [C函数] void Josephus(int A[],int n,s,m) (int i,j,k,temp; if(m==O) printf("m=0是无效的参数!/n"); return; for(i=0;i<n;i++) A[i]=i+1; /*初始化,执行n次*/ i= (1) /*报名起始位置*/ for(k=n;k>1;k-) if( (2) ) i=0; i= (3) /*寻找出局位置*/ if(i!=k-1) tmp=A[i]; for(j=i;J<k-1;j++) (4) ; (5) ; for(k=0;k<n/2;k++) tmp=A[k];A[k]=A[n-k+1];A[n-k+1]=tmp;
填空题【说明】 下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。 public (1) class cube_Root public static void (2) main(String args[]) System. out. println ("个、十、百位数字的立方和等于该数本身的三位数有:"); for(int n=100;n<1000;n++) int a,b,c; (3) b=n/10%10; (4) if( (5) ) System.out.println(n);
填空题【说明】下列流程图(如图4所示)用泰勒(Taylor)展开式sinx=x-x3/3!+x5/5!-x7/7!+…+(-1)n×x2n+1/(2n+1)!+…【流程图】计算并打印sinx的近似值。其中用ε(>0)表示误差要求。
填空题[说明] 以下程序的功能是计算三角形、矩形和正方形的面积并输出,程序由5个类组成:AreaTest是主类,类Trianlge、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; 1 System. out .println (figures [i] +"area=" +figures [i]. getArea ()); public abstract class Figure public abstract double getArea() ; public class Rectangle extends (1) double height; double width; public Rectangle(double height, double width) this .height=height; this.width=width; public String toString () return "Rectangle: height= "+height+" , width= "+width+":"; public double getArea () return (2) ; class Square extends (3) public Square(double width) (4) ; public string toString () return "Square: width= "+width+" : " ; class Triangle extends (5) double la; double lb; double lc; public Triangle(double la,double lb, double lc) this.la=la; this.lb=lb; this.lc=lc; public String toString() return "Triangle : sides= "+la+" , "+lb+" , " +lc+" : " ; public double getArea () double s= (la+lb+lc)/2.0; return Math. sqrt (s* (s-la) * (s-lb) * (s-lc)) ;
填空题阅读以下说明和流程图回答问题,将解答填入对应栏。 [说明] “直接插入法”排序是一种N2运算量的例程,只能用在N较小的时候,其方法是:挑出第二个数将它按与第一个数大小的顺序插入,然后挑出第三个数将它按大小顺序插入到前两个数中,如此下去,一直到最后一个也插入。 注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述。 [问题] 将流程图的(1)~(5)处补充完整。
填空题【说明】
设计一个日期类Date包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。
在Date类中设计如下重载运算符函数:
Date operator + (int days) : 返回某日期加上天数得到的日期。
Date operator - (int days) : 返回某日期减去天数得到的日期。
int operator - (Date
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年class Date
{
int year, month, day //年,月,日
int leap(int); //判断是否闰年
int dton(Date month = m; day = d;}
void setday(intd){day = d;}
void setmonth(int m) {month = m;}
void setyear(int y) {year =y;}
int getday() {return day;}
int getmonth() {return month:}
int getyear() {return yea;}
Date operator + (int days) //+运算符重载函数
{
static Date date;
int number ={{U}} (1) {{/U}}
date = ntod(number)
return date
}
Date operator - (int days) //-运算符重载函数
{
staffs Date date;
int number={{U}} (2) {{/U}};
number - = days;
date = ntod(number)
return date;
}
int operator - (Date
return days;
}
void disp()
{
cout<<year<<"."<<month<<". "<<day<<endl;
}
};
int Date: :leap( int year)
if({{U}} (4) {{/U}}) //是闰年
return 1; //不是闰年
else
return0:
}
int Date:: dton( Date
for(y=1;y<=d. year;y++)
if({{U}} (5) {{/U}})days+ =366; //闰年时加366天
else days + = 365; //非闰年时加365天
for(m =0;m<d. month-1;m++)
if( (6) )
days += day_tab[1] [m];
else
days +=day_tab[0] [m];
days + = d. day;
return days;
}
Date Date::ntod(intn) //将从元0年0月0日的天数转换成日期
{
int y=1,m = 1,d,rest = n,lp;
while(1)
{ if(leap(y))
if(rest<= 366) break;
else rest - = 366;
else //非闰年
if(rest = 365 ) break;
else rest-=365;
y++;
}
y--;
Ip = leap(y);
while(1)
{
if(lp) //闰年
if(rest>day_tab[1] [m - 1]) rest -= day_tab[1] [m-1];
else break;
else //非闰
if(rest>day_tab[0] [m -1]) rest -= day_tab[0] [m-1];
else break;
m++;
}
d = rest;
return Date(y;m,d);
}
void main()
{
Date now(2003,10,1) ,then(2005,6,5);
cout<<" now:";now. disp();
cout<<" then:";then. disp();
cout<<"相差天数:"<<(then-now)<<endl;
Date dl = now + 1000,d2 = now - 1000;
cout<<"now + 1000:" ;d1. disp();
cout<<" now - 1000:" :d2. disp();
}
填空题[函数2.1说明] 求任意两个正整数的最大公约数的欧几里德算法。用辗转相除法求正整数m和n的最大公约数,并返回该公约数。[函数2.1] void func1(int m, int n) r=m% n;while(r<>0) (1) ; n=r; (2) ; return n; [函数2.2说明] 判断101~200之间有多少个素数,并输出所有素数。用一个数分别去除2到sqrt (这个数),如果能被整除,则表明此数不是素数,反之是素数。[函数2.2]void func2 ( ) int m, i, k, h=0,leap=1; printf ( "/n" ); for ( m=101;m<=200;m++ ) (3) ; for (i=2;i<=k; i++ ) if( (4) ) leap=0;break; if ( leap ) printf ( "%-4d",m ); (5) ; if ( h%10==0 ) printf ( "/n" ); leap=1; printf ( "/n The total is %d", h );
填空题【说明】]开发一个五笔编码查询系统,界面如图所示。五笔编码存放在word.txt文件中,它的格式是:<汉字>,<编码>。程序的任务需要以<汉字>为关键字去查询它所对应的编码。根据前面的设计,用两个ComboBox来完成。m_cmbZi存放单字,m_cmbWord存放<汉字>,<编码>序列。当用户输入汉字的时候,在m_cmbZi中查找到相应的序号,然后再对应到mcmbWord中,这样就完成了查找动作。把查找出来的序列显示出来,之后再把这个序列送到列表框中,在列表框中保存着最近几次查找的结果,以方便浏览。【VisualC++代码】//在m_cmbWord中查找位置、显示并加主到列表框voidCWMPropDlg::OnSelchangeCombozi()intnSel=m_cmbZi.GetCurSel();//获得输入汉字的序号if(-1!=nSel)(1);//查找mcmbWord中五笔编码m_cmbWord.GetWindowText(m_strLastHit);(2);//显示到标签上CRectrect;(3);intnCount=rect.Height()/m_listHitHist.GetltemHeight(0);if((4))m_listHitHist.DeleteString(0);m_listHitHist.InsertString(-1,m_strLastHit);m_cmbZi.SetEditSel(0,-1);(5);
