问答题
问答题[说明]某小型家电超市开发了下面的程序,用以实现商品提货信息的汇总和输出功能。程序的运行界面如下图所示:程序界面包含两个控件数组,分别是提货商品复选框控件数组Check1以及提货数量文本框控件数组Text1(相同下标的复选框和文本框相对应),提货清单的显示由List控件实现,按钮“打印清单”和“清除”分别名为Command1和Command2。[VisualBasic代码]’提货商品复选框的单击事件响应代码PrivateSubCheck1_Click(IndexAsInteger)IfCheck1(Index).Value=1Then{{U}}(1){{/U}}.SetFocusEndSub’按钮“打印清单”的单击事件响应代码PrivateSubCommand1_Click()Dimi,n,priceAsInteger,sumAsLong,titleAsStringsum=0Fori=OTo4SelectCaseiCase0:title="电视机":price=3580Case1:title="微波炉":price=660Case2:title="电冰箱":price=1850Case3:title="DVD":price=2880Case4:title="空调":price=2500EndSelectIf{{U}}(2){{/U}}=1AndTextl(i).Text<>""Then{{U}}(3){{/U}}title&Text1(i).Text&"台"n=n+Val(Textl(i))sum={{U}}(4){{/U}}EndIfNextiIfsum<>0Then{{U}}(3){{/U}}"共:"&n&"台,"&"合计金额:"&sum&"元。"EndIfEndSub’按钮“清除”的单击事件响应代码PrivateSubCommand2_Click(){{U}}(5){{/U}}EndSub
问答题
问答题[说明]
本程序使用类来管理员工的通讯地址信息。已知程序的输出为:
输出记录:5
姓名:王丽华
街道地址:中华路15号
市:襄樊市
省:湖北省
邮政编码:430070
[Java代码]
public class Employee{
protected String {{U}}(1) {{/U}};
protected String street;
protected String city;
protected String prov;
protected String post;
protected int no;
public Empbyee(){}
public Employee(String name,String street,String city,String prov,String post,{{U}} (2) {{/U}}){
this.name=name;
this.street=street;
this.city=city;
this.prov=prov;
this.post=post;
this.no=no;
}
public static void main(String[]args){
Employee emp=new Employee(“王华”,“中华路15号”,“武汉市”,“湖北省”,“430070”,1);
emp.changeName(“王丽华”);
{{U}} (3) {{/U}}(“襄樊市”);
emp.changeNo(5);
{{U}} (4) {{/U}};
}
void changeName(String name){this.name=name;}
void changeStreet(String street){this.street=street;}
void changeCity(String city){this.city=city;}
void changeProv(String prov){this.prov=prov;}
void changeNo(int no){{{U}} (5) {{/U}};}
void display(){
System.out.println(“输出记录:”+this.no);
System.out.Println(“姓名:”+this.name);
System.out.println(“街道地址:”+this.street);
System.out.println(“市:”+this.city);
System.out.println(“省:”+this.prov);
System.out.println(“邮政编码:”+this.post);
}
}
问答题
问答题[说明]某公司的服务器上为每位员工提供了一定大小的存储空间,用于数据的备份。下面的程序面向公司员工,提供了本地计算机与服务器端之间文件传输的功能。主要操作介绍如下:(1)连接服务器:员工需要输入用户名和口令才能连接到服务器端,checkUser函数用于检查用户名和口令是否合法,返回真假值。(2)上传文件:从本地计算机上传文件到服务器。员工可以在本地文件列表中选择一个或多个文件,这些文件通过上传操作被复制到服务器端指定的某个文件夹中;(3)下载文件:从服务器端下载文件到本地。在开发过程中,本地驱动器列表框名为Drive1,本地和服务器端目录列表框分别名为Dir1和Dir2,本地和服务器端文件列表框分别名为File1和File2,界面上有上至下四个按钮分别名为Command1至Command4。[VisualBasic代码]PrivateSubDrive1_Change()(1)’更新目录列表框的路径EndSubPrivateSubDir1_Change()File1.Path=Dir1.Path’更新文件列表框file1的路径EndSubPrivateSubDir2_Change()File2.Path=Dir2.Path’更新文件列表框file2的路径EndSub’连接服务器PrivateSubCommand1_Click()Dimuser,passwordAsStringuser=(2)(“请输入用户名:”)password=(2)(“请输入口令:”)IfcheckUser(user,password)Then’若用户名和口令正确Dir2.Path=……’打开服务器上某一指定目录Else:MsgBox“口令错误,请重试!”EndIfEndSub’上传文件PrivateSubCommand2_Click()DimfsoAsnewFileSystemObject,fAsFile,iAsIntegerIfFile1.FileName=""Then’判断是否已经选中文件MsgBox“请选择本地的文件!”ExitSubEndIf’创建文件系统对象Setfso=CreateObject(“Scripting.FileSystemObject”)’上传文件Fori=0To(3)’遍历文件列表框File1中的全体文件If(4)Then’若该文件被选中Setf=fso.(5)(Dir1.Path&“/”&File1.List(i))f.CopyDir2.Path&“/”&File1.List(i),True’复制文件至服务器端EndIfNextFile2.RefreshEndSub’下载文件PrivateSubCommand3_Click()……EndSub’退出程序PrivateSubCommand4_Click()EndEndSub
问答题[说明] 本程序接收输入的学生信息,包括学号、姓名、成绩,原样输出信息并计算学生的平均成绩。其中学生类Stud除了包括no(学号)、name(姓名)和grade(成绩)数据成员外,还有两个静态变量 sum和num,分别存放总分和人数,另有一个构造函数、一个普通成员函数disp()和一个静态成员函数avg()用于计算平均分。[Java代码]public class Stud public int no; public String name; public double grade; public (1) double sum=0; public static int num=0; public Stud(int no,String name,double grade) this.no = no; this.name = name; this.grade = grade; this.sum= (2) ; (3) ; public static double avg() return (4) ; public void disp() System.out.println(this.no+"/t"+this.name+"/t"+this.grade); public static void main(String[] args) Stud []students = new Stud (1,"Li", 81), new Stud(2,"Zhao",84.5), new Stud(3,"Zhang", 87); System.out.pfintln("no/tname/tgrade"); students[0].disp(); students[1].disp(); students[2].disp(); System.out.println("avg="+ (5) );
问答题【说明】 设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度 freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。 【函数】 void Locate( int while(p!=frist if(p! =first) /*链表中存在x*/ (2) ; <结点类型说明> * current = P; /*从链表中摘下这个结点*/ Current -> prior -> next = current -> next; Current -> next -> prior = current -> prior; P = current -> prior; /*寻找重新插入的位置*/ While(p! =first Current-> next = (4) ; /*插入在P之后*? Current -> prior = P; P -> next -> prior = current; P->next= (5) ; else printf("Sorry. Not find! /n"); /*没找到*/
问答题【说明】下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。【流程图】此流程图1中,比较“K(I)+K(J):M”最少执行次数约为{{U}}(5){{/U}}。
问答题[说明]下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数m和n,假定m大于等于n,算法的主要步骤为:(1)以n除m并令r为所得的余数;(2)若r等于0,算法结束;n即为所求;(3)将n和r分别赋给m和n,返回步骤(1)。[流程图][问题1]将流程图中的(1)~(4)处补充完整。[问题2]若输入的m和n分别为27和21,则A中循环体被执行的次数是{{U}}(5){{/U}}。
问答题【说明】
实现矩阵(3行3列)的转置(即行列互换)。
例如,输入下面的矩阵:
100 200 300
400 500 600
700 800 900
程序输出:
100 400 700
200 500 800
300 600 900
【函数】
int fun(int array[3][3])
{
int i,j,t;
for(i=0;{{U}} (1) {{/U}};i++)
for(j=0;{{U}} (2) {{/U}};j++)
{
t=array[i][j];
{{U}} (3) {{/U}};
{{U}} (4) {{/U}};
}
}
}
main()
{
int i,j;
int array[3][3]={{100,200,300},{400,500,600},{700,800,900}};
clrscr();
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("/n");
}
fun({{U}} (5) {{/U}});
printf("Converted array:/n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("/n");
}
}
问答题【说明】
以字符流形式读入一个文件,从文件中检索出6种C语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或'/t'、'/n'结束的字符串。其中6种关键字在程序中已经给出。
【程序】
#include <stdio.h>
#include <stdlib.h>
FILE *cp;
char fname[20], buf[100];
int NUM;
struct key
{ char word[10];
int count;
}keyword[]={ "if", 0, "char", 0, "int", 0,
"else", 0, "while", 0, "return", 0};
char *getword (FILE *fp)
{ int i=0;
char c;
while((c=getc(fp))!= EOF
if(c==EOF)
return (NULL);
else
buf[i++]=c;
while((c=fgetc(fp))!=EOF
buf[i]='/0';
return(buf);
}
void lookup(char *p)
{ int i;
char *q, *s;
for(i=0; i<NUM; i++)
{ q={{U}} (2) {{/U}};
s=p;
while(*s
break;
}
}
return;
}
void main()
{ int i;
char *word;
printf("lnput file name:");
scanf("%s", fname);
if((cp=fopen(fname, "r"))==NULL)
{ printf("File open error: %s/n", fname);
exit(0);
}
NUM=sizeof(keyword)/sizeof(struct key);
while({{U}} (5) {{/U}})
lookup(word);
fclose(cp);
for(i=0;i<NUM;i++)
printf("keyword:%-20s count=%d/n",keyword[i].word,keyword[i].count);
}
问答题[说明] 二叉树的二叉链表存储结构描述如下:lypedef struct BiTNode datatype data; street BiTNode *lchiht, *rchild; /*左右孩子指针*/ BiTNode, *BiTree; 下列函数基于上述存储结构,实现了二叉树的几项基本操作: (1) BiTree Creale(elemtype x, BiTree lbt, BiTree rbt):建立并返回生成一棵以x为根结点的数据域值,以lbt和rbt为左右子树的二叉树; (2) BiTree InsertL(BiTree bt, elemtype x, BiTree parent):在二叉树bt中结点parent的左子树插入结点数据元素x; (3) BiTree DeleteL(BiTree bt, BiTree parent):在二叉树bt中删除结点parent的左子树,删除成功时返回根结点指针,否则返回空指针; (4) frceAll(BiTree p):释放二叉树全体结点空间。[函数]BiTree Create(elemtype x, BiTree lbt, BiTree rbt) BiTree p; if ((p = (BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL; p->data=x; p->lchild=lbt; p->rchild=rbt; (1) ;BiTree InsertL(BiTree bt, elemtype x,BiTree parent) BiTree p; if (parent= =NULL) return NULL; if ((p=(BiTNode *)malloc(sizeof(BiTNode)))= =NULL) return NULL; p->data=x; p->lchild= (2) ; p->rchild= (2) ; if(parent->lchild= =NULL) (3) ; else p->lchild= (4) ; parent->lchild=p; return bt;BiTree DeleteL(BiTree bt, BiTree parent) BiTree p; if (parent= =NULL||parent->lchild= =NULL) return NULL; p= parent->lchild; parent->lchild=NULL; freeAll( (5) ); return bt;
问答题阅读以下说明和C函数,将应填入{{U}} (n) {{/U}}处的字句写在答题纸的对应栏内。 {{B}}[{{/B}}说明1{{B}}]{{/B}} 函数Counter(int n, int w[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。 例如,十进制数22的二进制表示为10110。对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)、w[2]中存入16(即24)。 {{B}}[{{/B}}C函数1{{B}}]{{/B}} int Counter(int n,int w[]) { int i =0,k=1; while({{U}} (1) {{/U}}) { if (n% 2) w[i ++] =k; n=n/2;{{U}} (2) {{/U}}; } return i; } {{B}}[{{/B}}说明2{{B}}]{{/B}} 函数Smove(int A[],int n)的功能是将数组中所有的奇数都放到所有偶数之前。其过程为:设置数组元素下标索引i(初值为0)和j(初值为n-1),从数组的两端开始检查元素的奇偶性。若A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与A[j]进行交换;若A[i]、A[j]都是偶数,则从后往前找出一个奇数,再与A[i]进行交换;若A[i]是偶数而A[j]是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。 {{B}}[{{/B}}C函数2{{B}}]{{/B}} void Smove(int A[],int n) { int temp,i=0,j=n-1; if(n<2) return; while (i<j){ if(A[i] % 2==1 } elseif(A[i]% 2 ==0 } else { if({{U}} (5) {{/U}}) { temp=A[i];A[i]=A[j];A[j]=temp; } i++, j--; } } }
问答题【说明】 实现连通图G的深度优先遍历(从顶点v出发)的非递归过程。 【算法】 第一步:首先访问连通图G的指定起始顶点v; 第二步:从V出发,访问一个与v (1) p,再从顶点P出发,访问与p (2) 顶点q,然后从q出发,重复上述过程,直到找不到存在 (3) 的邻接顶点为止。 第三步:回退到尚有 (4) 顶点,从该顶点出发,重复第二、三步,直到所有被访问过的顶点的邻接点都已被访问为止。 因此,在这个算法中应设一个栈保存被 (5) 的顶点,以便回溯查找被访问过顶点的未被访问过的邻接点。
问答题试题一(共15分)阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的对应栏内。[说明]本流程图用于计算菲波那契数列{a1=1,a2=l,…,an=an-1+an-2|n=3,4,…)的前n项(n≥2)之和S。例如,菲波那契数列前6项之和为20。计算过程中,当前项之前的两项分别动态地保存在变量A和B中。[流程图]
问答题【说明】 函数MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数n转换成 B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下: #define MAXSIZE 32 typedef struct int * elem; /*栈的存储区*/ int max; /*栈的容量,即栈中最多能存放的元素个数*/ int top; /*栈顶指针*/ Stack; 【代码】 int InitStack(Stack * S,int n) /*创建容量为n的空栈*/ S -> elem = (int*) malloc(n*sizeof(int)); if(S -> elem == NULL) return-1 S->max=n; (1) =0;return 0; int Push (Stack * s,int item) /*将整数item压入栈顶*/ if(S->top==S->max)printf("Stack is full! /n");return-1; (2) = item; return 0 int StackEmpty(Stack S) return(! S. top)? 1:0; /*判断栈是否为空*/ int Pop(Stack * S) /*栈顶元素出栈*/ if(! S->top) printf("Pop an empty stack! /n") ;return -1; return (3) ; void MultibaseOutput(long n,int B) int m;Stack S if (InitStack( return; do if( Push( return; n= (5) ; while(n!=0); while(!StackEmpty(S)) /*输出B进制的数*/ m = Pop( if(m<10) printf("%d",m) ;/*小于10,输出数字*/ else printf("%c",m+55); /*大于或等于10,输出相应的字符*/ printf( "/n") ;
问答题[说明] 以下程序的功能是实现堆栈的一些基本操作。堆栈类stack共有三个成员函数:empty判断堆栈是否为空;push进行人栈操作;pop进行出栈操作。[C++程序] #include "stdafx. h"#include <iostream, h>eonst int maxsize = 6;class stack float data[ maxsize]; int top;public: stuck(void); ~ stack(void); bool empty(void); void push(float a); float pop(void);;stack: :stack(void) top =0; cout < < "stack initialized." < < endl;stack:: ~stack(void) cout < <" stack destoryed." < < endl;bool stack:: empty (void) return (1) ;void stack: :push(float a) if(top= =maxsize) cout < < "Stack is full!" < < endl; return; data[top] =a; (2) ;float stack:: pop (void) if( (3) ) cout< < "Stack is undcrflow !" < < endl; return 0; (4) ; return (5) ;void main( ) stack s;coat < < "now push the data:";for(inti=l;i cout< <i< <" "; s. push(i);coat < < endl;cout< < "now pop the data:";for(i = 1 ;i < = maxsize ;i + + ) cout< <s. pop()< <" ";
问答题 阅读以下技术说明、Java源程序和运行测试部分,根据要求回答问题1和问题2。
【说明】 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所示。
{{B}}表6-16 ServerSocket类的主要成员函数{{/B}}
{{B}}函数名{{/B}}
{{B}}功能说明{{/B}}
ServerSocket(PORT)
构造函数
Accept()
返回建立连接的Socket类型的对象
Close()
关闭当前的ServerSocket类型的对象 ◆Socket类 基于连接的套接字,类中的主要成员函数如表6-17所示。 {{B}}表6-17
Socket类的主要成员函数{{/B}}
{{B}}函数名{{/B}}
{{B}}功能说明{{/B}}
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{{U}} (1)
{{/U}};
//创建侦听端口号为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 ={{U}} (2) {{/U}};
//创建来自客房端的连接套接字
Input = socket.{{U}} (3) {{/U}};
//创建输入流
Output = socket.{{U}} (4)
{{/U}};
//创建输出流
Request request = new Request (input);
//创建request对象
Request.{{U}} (5) {{/U}};
//解析客户端HTTP请求
Response response = new ReSponse(output);
//创建Response对象
response, setRequest (request);
//将request对象传递给response对象
response.{{U}} (6) {{/U}};
//给客户端发送所请求的静态资源
{{U}} (7) {{/U}};
//关闭连接套接字
shutdown = request.{{U}} (8) {{/U}}.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{...}
//向客户端发送所请求的静态资源 }
问答题【说明】
以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件word_xml.out中。
该C程序采用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立。然后中序遍历该二叉树,将遍历经过的二叉树上节点的内容输出。
程序中的外部函数
int getword(FILE *fpt,char *word)
从与fpt所对应的文件中读取单词置入word,并返回1;若已无单词可读,即到文件尾部时,则函数返回0。
【C程序】
#include <stdio.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
#define INF "TEXT_01.INI"
#define OUTF "WORD_XML.OUT"
typedef struct treenode {
char *word;
int count;
struct treenode *left, *right;
} BNODE;
int getword(FILE *fpt,char *word);
void binary tree(BNODE **t,char *word)
{ BNODE *ptr, *p;
int cmpres;
p = NULL;
{{U}} (1) {{/U}};
while (ptr) { /*寻找插入位置*/
cmpres = strcmp(word,{{U}} (2) {{/U}}); /* 保存当前比较结果*/
if (!cmpres) {
{{U}} (3) {{/U}}
return;
}
else {
{{U}} (4) {{/U}};
ptr = cmpres > 0 ? ptr->right : ptr->left;
}
}
ptr = (BNODE *)malloc(sizeof(BNODE));
ptr->right = ptr->left = NULL;
ptr->word = (char *)malloc(strlen(word)+1);
strcpy(ptr->word,word);
ptr->count = 1;
if (p == NULL)
{{U}} (5) {{/U}};
else
if (cmpres > 0)
p->right = ptr;
else
p->left = ptr; }
}
void midorder(FILE *fpt, BNODE *t)
{ if ({{U}} (6) {{/U}})
return;
midorder(fpt , t->left);
fprintf(fpt , " %s %d/n " , t->word , t->count);
midorder(fpt , t->right); }
void main()
{ FILE *fpt;
char word[40];
BNODE *root = NULL;
if ((fpt = fopen(INF , "r")) == NULL) {
printf("Can't open file %s/n",INF);
return;
}
while (getword(fpt,word) == 1)
binary_tree({{U}} (7) {{/U}});
fclose(fpt);
fopen(OUTF,"w");
midorder(fpt, root);
fclose(fpt);
}
