问答题【说明】函数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; }
填空题[说明] 设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。从环上的某两粒珠子问剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠子中取走所有连续的同色珠子,两者之和为该剪开处可取走珠子的粒数。在不同位置剪开,能取走的珠子也不尽相同。 本程序所求的是在环上哪个位置剪开,按上述规则可取走的珠子粒数最多。程序中用数组存储字符串。例如,10粒珠子颜色对应字符串为aaabbbadcc,在0号珠子前剪开,序列为aaabbbadcc,从左端取走3粒a色珠子,从右端取走2粒c色珠子,共取走5粒珠子。若在3号珠子前剪开,即bbbadccaaa,共取走6粒珠子。 [C函数] int count(char *s,int start,int end) int i,c=0,color:s[start],step=(start>end)?-1:1; for(i=Start;s[i]==color;i+=step) if(step>0 return c; void main() char t,s[120]; int i,k,c,len,maxc,cut=0; printf("请输入环上代表不同颜色珠子字符串:"); scanf("%s”,s); len=strlen(s); for(i=maxc=0; i<len;i++)( /*尝试不同的剪开方式*/ c=count(s,0,len-1); if(c<len) c+=count( (3) ); if(c>maxc) cut=i;maxc=c;) /*数组s的元素循环向左移动一个位置*/ t=s[0]; for(j=1;j<len;j++) (4) ; (5) ; printf("在第%d号珠子前面剪开,可以取走%d个珠子.\n",cut,maxc);
填空题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);
}
上述程序的结果是{{U}} (1) {{/U}}
【函数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);
}
上述程序的结果是{{U}} (2) {{/U}}
【函数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]);
}
上述程序的结果是{{U}} (3) {{/U}}
【函数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);
}
上述程序的结果是{{U}} (4) {{/U}}
【函数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);
}
上述程序的结果是{{U}} (5) {{/U}}
填空题[说明] 求树的宽度,所谓宽度是指在二叉树的各层上,具有结点数最多的那一层的结点总数。本算法是按层次遍历二叉树,采用一个队列q,让根结点入队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。 [函数] int Width ( BinTree *T int front=-1, rear=-1; /*队列初始化*/ int flag=0, count=0, p; /*p用于指向树中层的最右边的结点, flag 记录层中结点数的最大值*/ if ( T!=Null) rear++; (1) ; flag=1; p=rear; while ( (2) ) front++; T=q [front]]; if (T->lchild!=Null ) roar+-+; (3) ; count++; if ( T->rchild!=Null ) rear++; q[rear]=T->rchild; (4) ; if (front==p ) // 当前层已遍历完毕 if( (5) ) flag=count; count=0; p=rear, //p 指向下一层最右边的结点 return ( flag );
填空题
阅读以下说明和C函数,将应填入{{U}} (n) {{/U}}处的字句写在答题纸的对应栏内。 [说明]
某单位准备进行一次选举,对指定的n名(n<80)候选人进行投票。为了简化选举工作,事先印制了写有这n名候选人姓名的选票,投票者只需将选中者名下的圆圈涂黑即可。规定每张选票上被涂黑的圆圈数不得超过3个,也不得少于1个,否则视为无效选票。投票结束后,所有选票经计算机扫描处理,形成了描述选票状态的文本文件。例如,n=8时所形成的文件如下:
01011000 10010100 10011000
11111111 00000000 00111000
其中,每行表示一张选票的数据,每列代表一位候选者的得票情况。第i行第j列为1,表示第i张选票上投了第j名候选人1票。函数statistic()的功能是读入选票数据,并统计每位候选者的得票数,函数返回有效选票数。
[C语言函数] int statistic (FILE *fp, int candidate[], int
n) { /*从文件中读入选票数据,n为候选人数量(n<80),
从有效选票中统计每位候选者的得票数并存入candidate[],函数返回有效选票数*/
char str[80]; /*str保存读入的一张选票数据*/
int i, tag=0;/* tag用于判断每张选票是否有效*/ int
q=0;/* q用于计算有效选票数*/ for (i=0;i<n;i++)
candidate[i]=0;
while ({{U}} (1) {{/U}}) {
fgets (str,80,fp); /*读入一张选票数据*/
for (tag=0,i=0; ({{U}} (2)
{{/U}});i++)
if (str[i]=='1') tag++; if
({{U}} (3) {{/U}}) {/*(若是有效选票,则进行统计*/
({{U}} (4) {{/U}});
for (i=0;i<n;i++)
if (str[i]=='1'){{U}} (5) {{/U}};
} } return
q; } /*statistic*/
填空题[说明]以下是一账号和密码输入的检验程序。对输入的账号和密码规定如下所述。(1)账号为不超过6位的数字,密码为4位字符,在本题中,密码假定为“Pass”。(2)密码输入时在屏幕上不显示输入的字符,而以“*”代替。(3)当输入不正确,如账号为非数字字符或密码不正确时,显示有关信息。(4)当输入正确时,关闭密码窗口,显示记事本窗口。按要求完成有关控件的其他属性的设置,编写确定按钮的单击事件过程。相关界面如下:(可能要用到的单词:MultiLlne,ScrollBars,PasswordChar,MaxLength)密码窗口frmPass控件设置如下表所示。控件控件名(Name)标题(Caption)其他属性帐号标签1blNo账号密码标签1blNo密码帐号文本框txtNo无定义密码文本框txtPas无定义确定按钮comOk确定记事本窗口frmNotepad控件设置如下表所示。控件控件名(Name)标题(Caption)其他属性文本框TxtNotepad无定义清除按钮CmdClear清除返回按钮cmdBack返回在密码窗口的属性窗口,对密码文本框设置属性MuniLine为False。[VisualBasic代码]PrivateSubcmdOK_Click()IftxtPas.Text="Pass"ThenLoadfrmNotePadfrmNotePad.ShowfrmPass.HideElseMsgBox"密码错误!",vbExclamation+vbRetryCancel,"重输入密码"txtPas.Text=""txtPas.SetFocus(1)EndSubPrivateSubForm_Load()txtPas.PasswordChar="*"xtNo.MaxLength=6EndSubPrivateSubtxtNoLostFocus(DimiAsInteger,sAsString*1Fori=1To(2)s=Mid(txtNo.Text,i,1)If(3)Or(4)ThenMsgBox"账号有非数字符号!",vbExclamation+vbRetryCancel,"1输入账号"(5)txtNo.SetFocusExitSubEndIfNextiEndSub
