问答题【说明】
本程序的功能是根据矩形左上角和右下角顶点坐标生成一个矩形对象,然后输出该矩形4个顶点的坐标,计算并输出该矩形的面积。
【C++代码】
#include<iostream>
using namespace std;
class MyPoint( //表示平面坐标系中的点的类
double x;
double y;
public:
MyPoint (double x,double y){this->x=x;this->y=y;}
double getX()const{{{U}} (1) {{/U}};}
double getY()const{ return y;}
void show()const{ cout<<'('<<x<<','<<y<<')';}
};
class MyRectangle{ //表示矩形的类
MyPoint upleft; //矩形的左上角顶点
MyPoint down right; //矩形的右下角顶点
public:
MyRectangle(MyPoint upleft,MyPoint downright);
MyPoint getUpLeft()const{return up_left;} //返回左上角坐标
MyPoint getDownRight()const{return down_right;} //返回右下角坐标
MyPoint getUpRight()const; //返回右上角坐标
MyPoint getDownLeft()const; //返回左下角坐标
double area()const; //返回矩形的面积
};
MyRectangle:: MyRectangle({{U}} (2) {{/U}}):
up left(p1),down_right(p2){}
MyPoint MyRectangle::getUpRight()const
{
return MyPoint(down_right.getX(),up_left.getY());
}
MyPoint MyRectangle::getDownLeft()const
{
return MyPeint({{U}} (3) {{/U}});
}
double{{U}} (4) {{/U}}::area()const
{
return (getUpLeft(),getX()-getDownRight().getX())*
(getDownRight().getY()-getUpLeft().getY());
}
int main( )
{
MyRectangle r(MyPoint(0,2),MyPoint(2,0));
r.getUpLeft(),show();
r.getUpRight().show();
r.getDown Right().show();
{{U}} (5) {{/U}};
cout<<r.area()<<end1;
return 0;
}
问答题[说明]本程序提供了查询景点票价信息的功能,查询包括两种方式:按景点名称查询以及白定义查询。程序界面如下图所示:其中,选择景点名称的组合框(Comobox)名为Combo1,单旋钮“旺季”和“淡季”分别名为Op-tion1和Option2,用于输入票价上限的文本框名为Texi1,两种查询方式的“提交”按钮分别名为Command1和Command2。已知Combol列表中第i个景点的旺季票价和淡季票价分别存放于数组元素P(i,0)和p(i,1)中。[VisualBasic代码]Dimp(20,2)AsSingle'通用声明PrivateSubForm_Load()Fori=0To9'对p赋值p(i,0)=........:p(i,1)=.......NextEndSubPrivateSubCommandl_Click()'查询方式一:按景点名称查询DimcboTcxtAsStringeboText=(1)Fori=0To(2)-1'对Combo1中各列表项循环If(3)=cboTextThenMsgBox"景点名称"&cboText&"旺季票价"&p(i,0)&_",淡季票价"&p(i,1)ExitSubEndIfNextiEndSubPrivateSubCommand2_Click()查询方式二:自定义查询DimpriceAsSingle,resultAsString,flagAsBooleanprice=Val((4))flag=Falseresult=""Fori=0To(2)-1'对Combo1中列表项循环,找出符合条件的景点If(Optionl.ValueAndp(i,0)<=price)Or((5))Then(6)result=result&"景点名称"&(3)&",旺季票价:"&_p(i,0)&",淡季票价:"&p(i,1)&vbCrLfEndIfNextiIfflagThenMagBoxresultElse:Msgaox"没有找到符合条件的景点信息!"EndIfEndSub
问答题【说明】设有3n+2个球互连,将自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数,如下图所示:其中填自然数的思想如下;(1)先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列;但若n为偶数,最后1次只排第1列中间一个数。(2)自右向左,先右第1列中间填数;若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。【程序】#include<stdio.h>#definesize10inta[3][size];voidmain(){inti,k,m,n;printf("imputthen:");scanf("%d",k=1;for(i=0;i<=n/2;i++){a[1][2*i]=k;k++;if((i==n/2)k++;{{U}}(2){{/U}}k++;}}if(n%2==1){{{U}}(3){{/U}}k++;m=n;}else{{U}}(4){{/U}}for(i=0;i<n/2;i++){a[1][m-2*i]=k;k++;{{U}}(5){{/U}}k++;a[2][m-2*i-1]=k;k++;}a[1][1]=k;printf("/n");printf("");for(i=1;i<=n;i++)printf("%6d",a[0][i]);printf("/n/n");for(i=0;i<=n+1;i++)printf("%6d",a[1][i]);printf("/n/n");printf("");for(i=1;i<=n;i++)printf("%6d",a[2][i]);printf("/n");}
问答题[说明]
函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。
[函数2.1]
void PrintPrime(int UpBound)
printf("2," );
for(i=3; i<UpBound; i+ =2) {
int k = sqrt(i);
for(j=3; j<= k;{{U}} (1) {{/U}}) /*检查i是否有3到k以入的奇因数*/
if({{U}} (2) {{/U}}) break;
fi({{U}} (3) {{/U}}) printf("%d", i);
[函数2.2说明]
递归函数invert(int a[],int k),int k)的功能是将数组a中的前k个元素逆置。
[函数2.2]
void invert(int a[ ], int k)
{ int t;
if ({{U}} (4) {{/U}}) {
invert({{U}} (5) {{/U}});
t=a[0];
a[0] =a[k-1];
a[k-l]=t;
}
}
问答题阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明]函数Combine(LinkListLa,LinkListLb)的功能是:将元素呈递减排列的两个含头结点单链表合并为元素值呈递增(或非递减)方式排列的单链表,并返回合并所得单链表的头指针。例如,元素递减排列的单链表La和Lb如图1所示,合并所得的单链表如图2所示。图1合并前的两个链表示意图图2合并后所得链表示意图设链表结点类型定义如下:typedefStructNode{intdata;structNode*next;}Node,*LinkList;[C函数]LinkListCombine(LinkListLa,LinkListLb){//La和Lb为含头结点且元素呈递减排列的单链表的头指针//函数返回值是将La和Lb合并所得单链表的头指针//且合并所得链表的元素值呈递增(或非递减)方式排列______Lc,tp,pa,pb;//Lc为结果链表的头指针,其他为临时指针if(!La)returnNULL;pa=La->next;//pa指向La链表的第一个元素结点if(!Lb)returnNULL;pb=Lb->next;//pb指向Lb链表的第一个元素结点Lc=La;//取La链表的头结点为合并所得链表的头结点Lc->next=NULL;while(______){//pa和pb所指结点均存在(即两个链表都没有到达表尾)//令tp指向pa和pb所指结点中的较大者if(pa->data>pb->data){tp=pa;pa=pa->next;}else{tp=pb;pb=pb->next;}______=Lc->next;//tp所指结点插入Lc链表的头结点之后Lc->next=______;}tp=(pa)?pa:pb;//设置tp为剩余结点所形成链表的头指针//将剩余的结点合并入结果链表中,pa作为临时指针使用while(tp){pa=tp->next;tp->next=Lc->next;Lc->next=tp;______;}returnLc;}
问答题【说明】函数countmonths(DATEstart,DATEend)的功能是:计算两个给定日期之间所包含的完整月份数。该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。规定两个相邻年份的同月同日之间的间隔为1年。例如,2007.5.30—2008.5.30的间隔为1年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.2.29—2009.2.28的间隔为1年。规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29—2007.2.28的间隔为1个月,同理,2007.1.30—2007.2.28、2007.1.31—2007.2.28的间隔都是1个月。计算起止日期间隔不足一年的完整月份数时,分如下两种情况。(1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.31—2008.9.20,通过月号算出月份数为6。修正时,通过调用函数makevalid将2008.9.31改为2008.9.30,与终止日期2008.9.20比较后,将月份数修正为5。(2)起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.25—2009.3.31,先计算2008.7.25—2008.12.25的月份数为5,再算出2008.12.25—2009.3.25的月份数为3,因此2008.7.25—2009.3.31之间的完整月份数为8。日期数据类型定义如下:typedefstruct{intyear;intmonth;intday;/*日期的年号(4位)、月和口号*/}DATE;程序中使用的函数cmp_date()、isLeapYear()和makevalid()说明如下。【C语言函数】intcount_months(DATEstart,DATEend){intyears=0,months=0;DATEr;if(cmp_date(start,end)>0){r=start;start=end;end=r;}years=end.year-start.year;/*计算年数*/r=start;r.year=end.year;if(cmp_date(r,end)>0){/*修正年数*/{{U}}(1){{/U}};r.year--;}if(r.year<end.year){/*跨年度时,先计算到12月的月份数*/months={{U}}(2){{/U}};r.month=12;}months+=(end.month+12-r.month)%12;r.year=end.year;r.month=end.month;makevalid({{U}}(3){{/U}});/*将日期r修正为有效日期*/if(cmp_date(r,end)>0)/*修正月份数*/{{U}}(4){{/U}};months+={{U}}(5){{/U}};/*计算总月份数*/returnmonths;}
问答题【说明】函数voidrcr(inta[],intn,intk)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标p,并将a[P]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[0]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至9[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。voidrcr(inta[],intn,intk)inti,j,t,temp,count;count=0;/*记录移动元素的次数*/k=k%n;if((1))/*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/i=0while(count<n)j=i;t=i;temp=a[1];/*备份a[i]的值*//*移动相关元素,直到计算出a[i]应移动到的目标位置*/while((j=(2))!=i)a[t]=a[j];t=(3);count++;(4)=temp;count++;(5);
问答题[说明]
下面程序的功能是将多个文件的内容同时输出在屏幕上,文件名都作为参数传入,命令执行为:cat file1 file2 file3,即同时输出file1、file2、file3的内容。
[程序]
#include <stdio.h>
#include <stdlib.h>
void fileeopy(FILE * ifp, FILE *ofp)
{ int c;
while((c=getc({{U}} (1) {{/U}}))!=EOF) pute(c, {{U}}(2) {{/U}}); }
int main(int arge, char *argv[])
{ FILE *fp;
while( {{U}}(3) {{/U}}>0)
if((fp=fopen( {{U}}(4) {{/U}},"r"))= =NULL){
printf("Can't open file/n");
return 1;
}
else {
filecopy(fp, stdout);
fclose({{U}} (5) {{/U}});
}
return 0;
}
问答题【说明】
用创建Thread类的子类的方法实现多线程,判断一个数是否是素数。如果是,打印“是素数”,如果不是,则打印“不是素数”;如果没有参数输入,显示“请输入一个命令行参数”。
【Java程序】
import java.io.* ;
public class TestThread{ //Java Application主类
public static void main(Sting args[ ]){
if (args length<l) { //要求用户输入一个命令行,否则程序不能进行下去
system.out.println("请输入一个命令行参数");
system.exit(0) ;
} //创建用户Thread子类的对象实例,使其处于NewBorn状态
primeThread getPrimes = new primeThread (Integer.parseInt(args[0]));
getPrimes.start () ; //启动用户线程,使其处于Runnable状态
while(getPrimes.isAlive() //说明主线程在运行
try {
Thread. sleep (500); //使主线程挂起指定毫秒数,以便用户线程取得控制权,
//sleep是static的类方法
}
Catch(InterruptedException e) { //sleep方法可能引起的异常,必须加以处理
return ;
}
} //while循环结束
System.out.println ("按任意键继续……") ; //保留屏幕,以便观察
try {
{{U}} (1) {{/U}};
}
Catch(IOException e) { }
} //main方法结束
}
class primeThread extends Thread {
//创建用户自己的Thread子类run()中实现程序子线程操作
boolean m_bContinue=true; //标志本线程是继续
int m_nCircleNum ; /循环的上限
prime Thread(int Num){ //构造函数
m_nCircleNum =Nam;
}
boolean ReadyToGoOn () { //判断本线程是否继续执行
return ({{U}} (2) {{/U}});
}
public void run () {
//继承并重载父类Thread的run ()方法,在该线程被启动时自动执行
int number =3;
boolean flag=true;
while (true) { //无限循环
for({{U}} (3) {{/U}}; i++) //检查number是否为素数
if(number %i==0)
{{U}} (4) {{/U}};
system, out. println (flag);
if (flag) //打印该数是否为素数的信息
system,out.print in (number+ "是素数") ;
else
sys rem.out.print In (number+ "是素数") ;
number++ ; //修改number的数值,为下一轮素数检查做准备
if (number> m_nCircleNum) { //到达要求检查数值的上限
m_bCont inue= false ; //则准备结束此线程
return ; //结束run()方法,结束线程
}
{{U}}(5) {{/U}};
try{ //经过一轮检查之后,暂时休眠一段时间
sleep(500); //使主线程挂起指定毫秒数,以便父线程取得控制权
}
Catch(InterruptedException e) {
Return;
}
} //for循环结束
} //while循环结束
} //run()方法结束
} //primeThread类定义结束
问答题阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明]设计RGB方式表示颜色的调色板,进行绘图,其类图如下图所示。该程序的C++代码附后。类图[C++代码]#include<iostream>#include<stdlib.h>#include<crime>usingnamespacestd;classMyColor{private:intred;intgreen;intblue;public:MyColor(){red=0;green=0;blue=0;}~MyColor(){}MyColor(intred,intgreen,intblue){this->red=red;this->green=green;this->blue=blue;}voidprint(){cout<<"Red:"<<red<<"\tGreen:"<<green<<"\tBlue"<<blue<<endl;}};classPalette{private:intnumber;MyColor**palette;public:Palette(){number=256;palette=(MyColor**)malloc(sizeof(MyColor*)*number);}~Palette(){for(inti=0;i<number;i++){deletepalette[i];}______;}Palette(MyColor**pale,intnumber){______=number;palette=(MyColor**)malloc(sizeof(MyColor*)*number);memcpy(palette,pale,sizeof(pale)*number);}//其他方法略voidprint(){for(inti=0;i<number;i++){cout<<i<<":";palette[i]->print();}}};classDrawing{public:______intCOLORNUMBER=16;public:~Drawing(){}voiddraw(){Palette*palette;intred,green,blue;MyColor*color[COLORNUMBER];srand((unsigned)time(0));for(inti=0;i<COLORNUMBER;i++){red=rand()%256;green=rand()%256;blue=rand()%256;color[i]=______(red,green,blue);}palette=newPalette(color,COLORNUMBER);palette->print();for(inti=0;i<COLORNUMBER;i++)deletecolor[i];}};intmain(){Drawing*d=______;d->draw();deleted;}
问答题【说明】
链表和栈对象的共同特征是:在数据上执行的操作与在每个对象中实体存储的基本类型无关。例如,一个栈存储实体后,只要保证最后存储的项最先用,最先存储的项最后用,则栈的操作可以从链表的操作中派生得到。程序6-1实现了链表的操作,程序6-2实现了栈操作。
import java.io.*;
class Node //定义结点
{ private String m_content;
private Node m_next;
Node(String str)
{ m_content=str;
m_next=null; }
Node(String str,Node next)
{ m_content=str;
m_next=next; }
String getData() //获取结点数据域
{ return m_content;}
void setNext(Node next] //设置下一个结点值
{ m_next=next; }
Node getNext() //返回下一个结点
{ return m_next; )
}
【程序6-1】
class List
{ Node Head;
List()
{ Head=null; }
void insert(String str) //将数据str的结点插入在整个链表前面
{ if(Head==null)
Head=new Node(str);
else
{{U}} (1) {{/U}}
}
void append(String str) //将数据str的结点插入在整个链表尾部
{ Node tempnode=Head;
it(tempnode==null)
Heed=new Node(str);
else
{ white(tempnode.getNext()!=null)
{{U}} (2) {{/U}}
{{U}}(3) {{/U}}}
}
String get() //移出链表第一个结点,并返回该结点的数据域
{ Srting temp=new String();
if(Head==null)
{ System.out.println("Errow! from empty list!")
System.exit(0); }
else
{ temp=Head.getData();
{{U}} (4) {{/U}} }
return temp;
}
}
【程序6-2】
class Stack extends List
{ void push(String str) //进栈
{ {{U}} (5) {{/U}} }
String pop() //出栈
{ return get();}
}
问答题试题二(15 分,每空3 分)
阅读下列函数说明和C 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
[函数说明]
函数sort(int a[],int n)的功能是对数组a 中的a[0]~a[n-1]这n 个元素进行排序。排序过程如下:第一趟对所有的偶数下标p,比较a[p]和a[p+1],若a[p]>a[p+1],则将两者交换;第二趟对所有的奇数下标q,比较a[q]和a[q+1],若a[q]>a[q+1],则将两者交换;第三趟对偶数下标,第四趟对奇数下标,...,依次类推,直至整个数组元素有序排列为止。
[函数]
void sort(int a[],int n)
{
int i,j,t,tag=1;
for(j=0; ja[i+1]) {t=a[i]; a[i]=a[i+1];a[i+1]=t; tag=0;}
}
tag++;
if ( (3) ) break;
}
}
对包含十个元素的数组a 采用上述方法排序时,元素间的比较次数最少为 (4) 次,最多为 (5) 次。
【说明】传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Closing(正在关闭)5种状态。触发状态的转换事件有click、complete和timeout3种,事件与其相应的状态转换如图6-18所示。下面的【C++代码1】与【C++代码2】分别用两种不同的设计思路对传输门进行状态模拟,请填补代码段中的空缺语句。【C++代码1】constintCLOSED=1;constintOPENING=2;constintOPEN=3;constintCLOSING=4;constintSTAYOPEN=5;//定义状态变量,用不同整数表示不同状态classDoorprivate:private:intstate;//传输门当前状态voidsetState(intstate)this->state=stale;//设置当前状态public:Door():state(CLOSED);voidgetState()//根据当前状态输出相应的字符串switch(state)caseOPENING:cout<<"OPENING"<<endl;break;caseCLOSED:cout<<"CLOSED"<<endl;break;caseOPEN:cout<<"OPEN"<<endl;break;caseCLOSING:cout<<"CLOSING"<<endl;break;caseSTAYOPEN:cout<<"STAYOPEN"<<endl;break;voidclick()//发生click事件时进行状态转换if((1))setState(OPENING);elseif((2))setState(CLOSING);elseif((3))setState(STAYOPEN);voidtimeout()//发生timeout事件时进行状态转换if(state==OPEN)setState(CLOSING);voidcomplete()//发生complete事件时进行状态转换if(state==OPENING)setState(OPEN);elseif(state==CLOSING)setState(CLOSED);;intmain()DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();aDoor.getState();return0;【C++代码2】classDoorpublic:DoorState*CLOSED,*OPENING,*OPEN,*CLOSING,*STAYOPEN,*state;Door();virtual~Door()...//释放申请的内存,此处代码省略;voidsetState(DoorState*state)this->state=state;voidgetState()//例如,当前状态为CLOSED时,输出字符串为"CLOSED";voidclick();voidtimeout();voidcomplete();;Door::Door()CLOSED=newDoorClosed(this);OPENING=newDoorOpening(this);OPEN=newDoorOpen(this);CLOSING=newDoorClosing(this);STAYOPEN=newDoorStayOpen(this);state=CLOSED;voidDoor::click()(4);voidDoor::timeout()(5);voidDoor::complete()(6);classDoorState//定义一个抽象的状态,它是所有状态类的基类protected:Door*door;public:DoorState(Door*door)this->door=door;virtual~DoorState(void);virtualvoidclick()virtualvoidcomplete()virtualvoidtimeout();classDoorClosed:publicDoorState//定义一个基本的closed状态public:DoorClosed(Door*door):DoorState(door)virtual~DoorClosed()voidclick();;voidDoorClosed::click()(7);//其他状态类的定义与实现代码省略ihtmain()DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.timeout();aDoor.getState();return0;
【说明】 1.HTTP ◆ HTTP请求消息示例 GET/index,htmlHTTP/1.1 Accept:image/gif,image/jpeg,*/* Accept-Language:zh-ch Accept-encoding:gzip,deflate User-Agent:Mozilla/4.0(compatible: MSIE6.0;Windows 2003) Host:localhost:8080 Connection:Keep-Alive ◆ HTTP响应消息示例 HTTP/1.1 200 OK Servert:Microsoft-IIS/6.0 Date:Mon,3 Jan 2008 13:13:33 GMT Content-Type:text/html Last-Modified:Mon,11 Jan 2008 13:23:42 GMT Contelit-Length:112 <html> ... </html> 2.相关类及主要成员函数 ◆ ServerSocket类 服务器端套接字,它监听固定端口,以接收来自客户端的连接请求,一旦建立连接就返回一个Socket类型的对象,类中的主要成员函数如表6-16所示。 表6-16 ServerSocket类的主要成员函数 函数名 功能说明 ServerSocket(PORT) 构造函数 Accept() 返回建立连接的Socket类型的对象 Close() 关闭当前的ServerSocket类型的对象 ◆Socket类 基于连接的套接字,类中的主要成员函数如表6-17所示。 表6-17 Socket类的主要成员函数 函数名 功能说明 GetnetAddress() 返回InetAddress类型的对象,该对象封装了与该套接字所关联的客房机的IP地址 GetInputSffeam 返回当前对象所关联的输入流 GetOutputStream 返回当前对象所关联的输出流 Close() 关闭当前对象 【Java源程序:一个简单的Web服务器】 /* WebScrvc.java */ packageobjclass; import java.net.*; import java.io.*; public class WebServer public static final int PORT=8080; //Web服务器侦听的端口号 public static final String WEB_ROOT= SyStem.getProperty("user.dir")+ File.separator+"webroot"; //WEB_ROOT变量存放Web服务器工作目录,HTML, GIF图片等静态文件资源 private static final String SHUTDOWN_COMMAND="/shutdown"; //SHUTDOWN_COMM_AND变量保存关闭服务器的命令 private Boolean shutdown=false; //是否收到关闭服务器命令的标志 public static void main(Sting[] args) WebServer server=new WebServer(); Server.await () public void await() ServerSocket serverSocket = null; try serverSocket = new (1) ; //创建侦听端口号为PORT的ServerSocket类型的对象 System.out.println ("WebServerStarted!"); catch(IOException e) e.printStackTrace (); SyStem. exit (1); while(!shutdown) //循环等待客房端连接 Socket socket = null; InputStream input = null; OutputStream output = null; try Socket = (2) ; //创建来自客房端的连接套接字 Input = socket. (3) ; //创建输入流 Output = socket. (4) ; //创建输出流 Request request = new Request (input); //创建request对象 Request. (5) ; //解析客户端HTTP请求 Response response = new ReSponse(output); //创建Response对象 response, setRequest (request); //将request对象传递给response对象 response. (6) ; //给客户端发送所请求的静态资源 (7) ; //关闭连接套接字 shutdown = request. (8) .equals (SHUTDOWN_COMMAND); //凑数当前HTTP请求中的URL是否是关闭服务器命令 Catch(Exception e) e.printStackTrace (); continue; /* Request.java */ package objclass; import java.io.InputStream; import java.iO.IOException; public Class Request private InputStream input; private String url; public Request(InputStream input)this.input = input; public void parse() ... parseUrl() ;... //解析客户端HTTP请求消息 private String parseUrl(String requestString)... //解析客户端HTTP请求中的URL public String getUrl()return url; /* Response.java */ package objclass; import java.io.*; public class Response private static final int BUFFER_ SIZE=1024; Request request; OutputStream output; public Response(Output Strearm output) this.output=output; public void setRequest(Request request)this.request=request; public void sendStaticResource()throwsIOmxception... //向客户端发送所请求的静态资源
【说明】如图6-13所示的程序流程图描述了对8位二进制整数求补的算法。该算法的计算过程如下:从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然后,对该“1”位左面的更高位(如果存在的话),逐位求反,所得的结果就是对原二进制数求补的结果。例如:对二进制整数10010110求补的结果时01101010。设8位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[8]中。例如,二进制整数10010110存放在数组BIT后,则有BIT[1]=0,BIT[2]=1,…,BIT[7]=0,BIT[8]=1。若流程图中存在空操作,则用NOP表示。以下待修改的【C程序】完成的功能是:对于给定的1个长正整数,从其个位数开始,每隔一位取1个数字(即取其个位、百位和万位等数字),形成1个新的整数并输出。例如,将该程序修改正确后,运行时若输入“9753186420”,则输出的整数为“73840”。【C程序】行号C代码01#include<stdio.h>02intmain()03longn,num;04inti;05do06printf("请输入一个正整数:");07scanf("%1d",n);08while(n<=0);09k=1;10for(i=1;n>=0;i++)11if(i%2=1)12num=num+(n%10)*k;13k=k*10;1415n=n/10;1617printf("新数据为:%d/n",num);18return0;19
填空题阅读以下说明和C++代码,将解答写入对应栏内。 [说明] 类Stock的定义中有三处错误,分别在代码的第04、06、10行。请补齐下述代码中的空缺(1)~(3),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。 [C++程序] 01 #include<iostream.h> 02 using namespace std; 03 class Stock 04 protected: 05 Stock()shares=0; share_val=0.0;Output(); 06 Stock(int n=0,double pr=3.5): (1) //初始化shares值为n 07 share_val=pr; 08 Output(); 09 ; 10 void~Stock(); 11 void Output()(cout<<shares<<';'<<share val<<endl; 12 public: 13 //成员函数 14 private: 15 //成员变量 16 int shares; 17 double share_val; 18 ; 19 20 void main() //构造三个Stock对象a,b,C 21 Stock a(1); 22 Stock b; 23 Stock C;Stock(); 24 //其他代码省略,且代码无输出 25 程序运行后的输出结果为: 1:3.5 (2) (3)
填空题【说明】 函数fun1 (int bb[])的功能是:在3位整数(100~999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,两位数字又相同,例如144、676等。 【函数2.11】 fun1 (int bb[]) int i, j, k=0, g, s, b; for (i=100; i<=999; i++) g=i%10; (1) b=i/100; if ((i== (int) sqrt (i) * (int) sqrt (i)) 【函数2.2说明】 函数void fun2()的功能是:数组a中有300个四位数,求出数组a千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数CNT,再把所有满足此条件的四位数依次存入数组bb中,然后对数组bb的四位数按小到大的顺序进行排序。例如:9123,9-1-2-3>0,则该数满足条件存入数组bb中,且个数CNT=CNT+1,9812,9-8-1-2<0,则该数不满足条件,忽略。 【函数2.2】 void fun2 ( ) int q,b,s,g,i,j; for (i=0;i<300;i++) q=a[i]/1000; b=a[i]/100%10; s=a[i]/10%10; g=a[i]%10; if (q-b-s-g>0) (3) for ( i=0;i<cnt-1;i++ ) for ( j=i+1;j<cnt;j++ ) if ( bb[i]>bb[j] ) (4) bb[i]=bb[j]; (5)
填空题1】 void sort(char *s,int num) int i,j--num; char t; while(j-->1) for(i=0;i<j;i++) if(s[i]>s[i+1]) t=s[i]; s[i]=s[i+1]; s[i+1]=t; void main() char *s="CEAedea"; sort(s,5); printf("%s",s); 上述程序的结果是 (1) 【函数2.2】 void main() union int ig[6]; Char s[12]; try; try. ig[0]=0x4542; try.ig[1]=0x2049; try. ig[2]=0x494a; try.ig[3]=0x474e; try. ig[4]=0x0a21; try.ig[5]=0x0000; pintf("%s",try, s); 上述程序的结果是 (2) 【函数2.3】 void main() char *letter[5]= "ab","efgh","ijk","nmop","st"; char **p; int i; p=letter; for(i=0;i<4;i++) . printf("%s",p[i]); 上述程序的结果是 (3) 【函数2.4】 main() int i=4,j=6,k=8,*p= int x,y,z; x=p== y=3*-*p/(*q)+7; z=*(r= printf("x=%d,y=%d,z=%d",x,y,z); 上述程序的结果是 (4) 【函数2.5】 int a[]=5,4,3,2,1 ; void main() int i; int f=a[0]; int x=2; for(i=0;i<5;i++) f+=f*x+a[i]; printf("%d",f); 上述程序的结果是 (5)
填空题[说明] 设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。 在Date类中设计如下重载运算符函数。 Date operator+(int days):返回某日期加上天数得到的日期。 Date operator-(int days):返回某日期减去天数得到的日期。 int operator-(Date &b):返回两日期相差的天数。 [C++程序] #include<iostream. h> int day_tab[2][12]=31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29, 31,30, 31, 30, 31, 31,30,31,30,31; //day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年 class Date int year,month,day;//年,月,日 int leap (int); //判断是否为闰年 int dton (Date&); Date ntod (int); Public: Date() Date(int y,int mint d)year=y;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 year; Date operator+(int days) //+运算符重载函数 static Date date; int number= (1) ; date=ntod (number); return date; Date operator-(int days) //-运算符重载函数 statis Date date; int number= (2) ; number-=days; date=ntod (number); return date; int operator-(Date &b) //-运算符重载函数 int days= (3) ; return days; void disp() cout<<year<<"."<<month<<","<<day<<endl; ; int Date::leap (int year) if( (4) ) //是闰年 return 1; //不是闰年 else return 0; int Date::dton (Date &d) //求从公元0年0月0日到d日期的天数 int y,m,days=0; for (y=1;y<=d.year;y++) if( (5) )days+=366; //闰年时加366天 else days+=365; //非闰年时加365天 for (m=0;m<d.mont.h-1;m++) if (leap (d.year) days+=day_tab [1] [m]; else days+=day__tab [0][m]; days+=d.day; return days; Date Date::ntod (int n) //将从公元0年0月0日的天数转换成日期 int y=1,m=1,d,rest=n,1p; while (1) if (leap (y)) if (rest<-366)break; else rest-=366; else //非闰年 if (rest=365)break; else rest-=365; y++; y--; 1p=leap (y); while (1) if (1p) //闰年 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 d1=now+1000,d2=now-1000; cout<<"now+1000:"; d1. disp(); cout<<"now-1000:"; d2. disp();
填空题阅读以下函数说明和C语言函数,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。 [说明] 该程序从正文文件test.txt中读入一批整数,并将它们按照递增的顺序存放在一个链表中。其中,函数struct Link*insertChain(struct Link*head,structLink*k)用来寻找结点k在链表head中的插入位置,并插入该结点。 [C程序] #include <stdio.h> #include <stdlib.h> struct Link { int number; struct Link *next; } struct Link *insertChain(struct Link *head,struct Link *k); VOid main() { struct Link *ptr, *head; FILE *fd; int hum; if((fd=fopen("test.txt","r"))==NULL) {print("Cannot open this file!/n"); return; } head=NULL; while(fscanf(fd,"%d",hum)==1) { ptr={{U}} (1) {{/U}}; if(!ptr) return; ptr->number=hum; ptr->next=NULL; head=insertChain(head,ptr); } {{U}} (2) {{/U}}; return; } struct Link *insertChain(struct Link *head,struct Link *k) { struct Link *ptr,*u; ptr=head; while(ptr && k && k->number>ptr->number) { u=ptr; {{U}}(3) {{/U}} } if(ptr == head) head=k; else {{U}}(4) {{/U}}; {{U}}(5) {{/U}}; return head; }
