问答题试题一(共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);
}
问答题【说明】函数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({{U}}(1){{/U}}){/*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/i=0while(count<n){j=i;t=i;temp=a[1];/*备份a[i]的值*//*移动相关元素,直到计算出a[i]应移动到的目标位置*/while((j={{U}}(2){{/U}})!=i){a[t]=a[j];t={{U}}(3){{/U}};count++;}{{U}}(4){{/U}}=temp;count++;{{U}}(5){{/U}};}}}
问答题【说明】 魔方阵,又叫幻方,在我国古代称为“纵横图”。由1…N2共N2个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。 奇数阶魔方阵的生成方法如下: (1)第一个位置在第一行正中。 (2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。 (3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为: 8 1 6 3 5 7 4 9 2 了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m, n。其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了 MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。 【程序】 #include <stdio.h> #define MAX 15 void main() int n; int m=1; int i,j; int a[MAX][MAX]; printf("Please input the rank of matrix:"); scanf("%d", i=0; (1) while( (2) ) a[i][j]=m; m++; i--; j++; if((m-1)%n==0 if(j>(n-1)) //超出上界 (4) if(j>(n-1)) (5) for(i=0;i<n;i++) //输出魔方阵 for(j=0;j<n;j++) if(a[i][j]/10==0) printf("%d ",a[i][j]); //对程序无影响,只是使输出的数每一列对齐 else printf("%d ",a[i][j]); if(j==(n-1)) printf("/n");
问答题【说明】
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,则此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去,直到所有的人都出圈为止。
现要求按出圈次序,每10人一组,给出这n个人的顺序表。
设n=100,s=1,m=10。
(1)将1到n个人的序号存入一维数组p中;
(2)若第i个人报数后出圈,则将p置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置:
(3)重复第(2)步,直至圈中只剩下p[1]为止。
#include<stdio.h>
#define N 100
#define S 1
#define M 10
void main()
{
int p[100],n,s,m;
m=M;
n=N;
s=S;
int i,j,s1,w;
s1=s;
for(i=1;{{U}} (1) {{/U}};i++)
(2)=i;
for(i=n;i>=2;i--)
{
s1={{U}} (3) {{/U}};
if(s1==0)s1=i;
w={{U}} (4) {{/U}};
for(j=s1;j<i;j++)
p[j-1]=p[j];
p[i-1]={{U}} (5) {{/U}};
printf("%4d",p[i])}
}
问答题【说明】喜迎2008年北京奥运会!以下【C程序】能将一个给定汉字(例如,奥运会的“会”字)的点阵逆时针旋转90°,并输出旋转前后的点阵数据及字形。图1-15是汉字“会”字的16×16点阵字形,用数字0表示空白位置,用数字1表示非空白位置,“会”字的第1行即可表示成如下的{0,1}序列:0000000100000000如果把它看做一个字的16个位,“会”字的第1行可以用十六进制数0100来表示。同理,“会”字的第2行可以用十六进制数0240表示,第3行可以用十六进制数0420表示……依此类推,用16个双字节整型数即可存放一个汉字点阵字形。“会”字的点阵数据及字形如图1-15的左半部分所示。将一个汉字逆时针旋转90°,就是把该汉字点阵的最右列作为旋转后新点阵的第1行,次最右列作为旋转后新点阵的第2行……依此类推来形成一个旋转后的点阵字形。图1-15的右半部分就是将“会”字逆时针旋转90°后的点阵数据和字形(提示:读者可将书本顺时针旋转90°,以查看旋转90°后的点阵字形)。在【C程序】中,数组old存放着“会”字的16个双字节整型点阵数据。函数turnleft能将该点阵数据逆时针旋转90°,旋转后的点阵数据存放在数组new中。函数display能将旋转前后的点阵数据加以编辑,用字符“.”表示值为0的位,用字符“x”表示值为1的位,从而将旋转前后的点阵按行输出其十六进制的数据和字形,如图1-15所示。【C程序】#include<stdio.h>#defineEMPTY'.'#defineNONEMPTY'x'#defineLEFT0#defineRIGHT1main(){staticunsignedold[16]={0x0100,0x0240,0x0420,0x0810,0x1004,0x23c2,0x4001,0x8ff8,0x0100,0x0200,0x0400,0x0800,0xl000,0x2004,0x7ffe,0x0001};unsignednew[16];turnleft(old,new);display(old,new);}turnleft(old,new)unsignedold[],new[];{introw,k;for(row=0;row<16;row++)for({{U}}(1){{/U}};k<16;k++)new[row]|=((old[k]>>{{U}}(2){{/U}})}display(old,new)unsigned*old,*new;{charout[2][17],letter[2];introw,col;letter[O]=EMPTY;letter[1]=NONEMPTY;out[LEFT][16]=out[RIGHT][16]={{U}}(4){{/U}};for(row=0;row<16;row++,old++,new++){for(col=0;co1<16;++col){out[LEFT][col]=letter[({{U}}(5){{/U}})out[RIGHT][col]=letter[({{U}}(6){{/U}})}printf("/n%4x%s",*old,printf("%4x%s",*new,}}
问答题试题二(15 分,每空3 分)
阅读以下函数说明和C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[函数2.1 说明]
函数int fun1(int m,int n)的功能是:计算并返回正整数m 和n 的最大公约数。
[函数2.1]
int fun1(int m,int n)
{
while( (1) ) {
if ( m > n ) m = m - n;
else n = n - m;
}
(2) ;
}
[函数2.2 说明]
函数long fun2(char *str)的功能是:自左至右顺序取出非空字符串str 中的数字字符形成一个十进制整数(最多8 位)。
例如,若字符串str 的值为“f3g8d5.ji2e3p12fkp”,则函数返回值为3852312。
[函数2.2]
long fun2(char *str)
{ int i = 0;
long k = 0;
char *p = str;
while ( *p != '/0'
++i;
}
(5) ;
}
return k;
}
问答题[说明]设某单位Acess数据库中有一张员工信息表,其中记录了员工编号、姓名、性别等基本信息。下面的应用程序利用数据控件(Data)实现了对这张表中记录的增加、删除和修改操作。其运行界面如下:在开发过程中,数据控件Data1与员工数据表相连接,各文本框、“性别”组合列表框Combo1、“政治面貌”组合列表框Combo2都分别与数据表的相应字段绑定,界面上从左到右各操作按钮分别取名为CmdAdd、CmdDel、CmdUpdate和CmdExit。[VisualBasic代码]PrivateSubForm_Load()'加载窗体Combo1.(1)"男"Combo1.(1)"女"Combo2.(1)"党员"Combo2.(1)"团员"Combo2.(1)"群众"EndSubPrivateSubCmdAdd_Cliek()'增加记录Datal.Recordset.AddNewEndSubPrivateSubCmdDel_Click()'删除记录Datal.Recordset.(2)Datal.Recordset.MoveNextEndSubPrivateSubCmdUpdate_Click()'修改记录IfDatal.ReadOnly=(3)AndDatal.Recordset.UpdatableThenDatal.Recordset.EditDatal.Recordset.(4)ElseMsgBox"数据表不允许修改!"EndIfEndSubPrivateSubCmdExit_Click()'退出程序DimretAsLongret:MsgBox("真的要退出吗?",vbQuestion+vbYesNo,"退出")If(5)ThenDatal.Reeordset.CloseEndEndffEndSub
问答题[说明]设有一张学生成绩表scores存放在Access数据库Student中,其中包括学生编号、姓名以及各科目考试成绩。下面的应用程序利用ADOData和DataGrid控件实现了对成绩数据的基本管理,其操作包括:(1)添加新记录:单击“添加”按钮,光标将指向最后一条数据记录,在其后编辑好新的数据记录后,再单击“更新”按钮,该数据即被加入成绩表;(2)删除记录:单击“删除”按钮将删除当前所指记录,其后的数据记录依次上移;(3)更新记录:直接编辑某条已有记录,再单击“更新”按钮将更新成绩表;(4)记录排序:选中单列字段后,单击“排序”按钮,记录集将按该字段升序排列。程序的运行界面为:在开发过程中,数据库连接对象使用了名为Adodc1的ADOData控件,数据显示区域使用了名DataGnd1的DataGrid控件,界面上从左到右各操作按钮分别取名为CmdAdd、CmdDel、CmdUpdate、CmdRefresh、CmdSort和CmdExit。[VisualBasic代码]Dimconn,database,tableAsStringPrivateSubForm_Load()database="E:/Student.mdb"’设置要访问的数据库conn="Provider=Microsoft.Jet.OLEDB.4.0;DataSouse="&databaseAdodc1.ConnectionString=conn’设置连接字符串table="scores"Adode1.(1)=table’设置所要访问的数据表SetDataGrid1.(2)=Adodc1EndSubPrivateSubCmdAdd_Click()’“添加”按钮的单击事件响应过程Adodc1.Recordset.(3)EndSubPrivateSubCmdDel_Click()’“删除”按钮的单击事件响应过程Adodc1.Recordset.DeleteAdodc1.Reeordset.MoveNextEndSubPrivateSubCmdUpdate_Click()’“更新”按钮的单击事件响应过程Adode1.Reeordset.UpdateBatchadAffectAllEndSubPrivateSubCmdRefresh_Cliek()’“刷新”按钮的单击事件响应过程Adodc1.RefreshEndSubPrivateSubCmdSort_Cliek()’“排序”按钮的单击事件响应过程IfDataGrid1.SelStartCol<0OrDataGridl.SelStartCol(4)DataGrid1.SelEndColThenMsgBox“请选择某一字段(列)!”ExitSubEndIfAdodc1.RecordSource="SELECT*FROM"&table&"orderby"&_DataGrid1.Columns((5)).DataFieldAdodc1.RefreshEndSubPrivateSubCmdExit_Click()’“退出”按钮的单击事件响应过程EndEndSub
问答题[说明]
邻接表是图的一种顺序存储与链式存储结合的存储方法。其思想是:对于图G中的每个顶点 vi,将所有邻接于vi的顶点vj连成一个单链表,这个单链表就称为顶点vi的邻接表,其中表头称作顶点表结点VertexNode,其余结点称作边表结点EdgeNode。将所有的顶点表结点放到数组中,就构成了图的邻接表AdjList。邻接表表示的形式描述如下: #define MaxVerNum 100 /*最大顶点数为100*/
typedef struct node{ /*边表结点*/
int adjvex; /*邻接点域*/
struct node *next; /*指向下一个边表结点的指针域*/ }EdgeNode;
typedef struct vnode{ /*顶点表结点*/
int vertex; /*顶点域*/
EdgeNode *firstedge; /*边表头指针*/
}VertexNode;
typedef VertexNode AdjList[MaxVerNum]; /*AdjList是邻接表类型*/
typedef struct{
AdjList adjlist; /*邻接表*/
int n; /*顶点数*/
}ALGraph; /*ALGraph是以邻接表方式存储的图类型*/
深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。
下面的函数利用递归算法,对以邻接表形式存储的图进行深度优先搜索:设初始状态是图中所有顶点未曾被访问,算法从某顶点v出发,访问此顶点,然后依次从v的邻接点出发进行搜索,直至所有与v相连的顶点都被访问;若图中尚有顶点未被访问,则选取这样的一个点作起始点,重复上述过程,直至对图的搜索完成。程序中的整型数组visited[]的作用是标记顶点i是否已被访问。
[函数]
void DFSTraverseAL(ALGraph *G)/*深度优先搜索以邻接表存储的图G*/
{ int i;
for(i=0;i<{{U}} (1) {{/U}};i++) visited[i]=0;
for(i=0;i<{{U}} (1) {{/U}};i++)if({{U}} (2) {{/U}}) DFSAL(G,i);
}
void DFSAL(ALGraph *G,int i) /*从Vi出发对邻接表存储的图G进行搜索*/
{ EdgeNode *p;
{{U}} (3) {{/U}};
p={{U}} (4) {{/U}};
while(p!=NULL) /*依次搜索Vi的邻接点Vj*/
{ if(! visited[{{U}} (5) {{/U}}]) DFSAL(G,{{U}} (5) {{/U}});
p=p->next; /*找Vi的下一个邻接点*/
}
}
问答题【函数2.1说明】
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
【函数2.1】
Fun1 (int n)
{
int i;
for(i=2;i<=n;i++)
{
while ({{U}} (1) {{/U}})
{
if (n%i==0)
{
printf("%d*",i);
{{U}}(2) {{/U}};
}
else
break;
}
}
printf("%d",/n);
}
【函数2.2说明】
下面程序的功能是:海滩上有一堆桃子,5只猴子来分。第1只猴子把这堆桃子平均分为5份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第2只猴子把剩下的桃子又平均分成5份,又多了一个,它同样把多的一个扔入海中,拿走了一份。第 3、4、5只猴子都是这样做的,问海滩上原来最少有多少个猴子?
【函数2.2】
main()
{
int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{
count=0;
{{U}} (3) {{/U}};
for(k=0;k<5;k++)
{
{{U}} (4) {{/U}};
i=j;
if(j%4==0)
{{U}} (5) {{/U}};
else
break;
}
i=m;
if(count==4)
{
printf("%d/n",count);
break;
}
}
}
问答题[说明]设有一张学生成绩表存放在Acess数据库中,其中包括学生编号、姓名以及各科目考试成绩。下面的应用程序利用数据控件(Data)实现了对这张数据表中记录的增加、删除、修改、查找和刷新操作,其中,删除一条记录后,要求界面显示下一条记录;要查找记录,首先要求用户输入学生姓名,程序查找并显示匹配的第一条记录;执行刷新操作后,要求界面显示数据表的第一条记录。程序的运行界面如下:在开发过程中,数据控件Datal与成绩数据表相连接,各文本框与数据表相应字段绑定,界面上从左到右各操作按钮分别取名为CmdAdd、CmdDelete、CmdUpdate、CmdFind、CmdRefresh和CmdClose。[VisualBasic代码]PrivateSubCmdAdd_Click()’增加新记录Datal.Recordset.{{U}}(1){{/U}}EndSubPrivateSubCmdDelete_Click()’删除记录Data1.Recoldset.DeleleData1.Recoldset.{{U}}(2){{/U}}EndSubPnvateSubCmdUpdate_Click()’修改记录Data1.Reeordset.EditData1.Recordset.UpdateEndSubPrivateSubCmdFind_Click()’查找记录Dimname,searchAsStringname=InputBox("请输入要查询的姓名:")scarch="姓名='"&name&"'"’Data1.Recordset.MoveFirstDara1.Recordset.FindFirstscarchIfData1.Reeoldset.{{U}}(3){{/U}}ThenMsgBox"姓名为"&name&"的记录未找到!"EndIfEndSubPrivateSubCmdRefresh_Click()’刷新记录{{U}}(4){{/U}}EndSubPrivateSubCmdClose_Click()’退出程序Daral.Recordset.{{U}}(5){{/U}}EndEndSub
问答题[说明]信息处理过程中经常需要将图片或汉字点阵作旋转处理。一个矩阵以顺时针方向旋转90°后可以形成另一个矩阵,如下图所示。流程图a描述了对n*n矩阵的某种处理。流程图b是将矩阵A顺时针旋转90°形成矩阵B的具体算法。
问答题【函数1.1说明】 函数strcpy(char*to,char*from)将字符串from复制到字符串to。 【函数1.1】 void strcpy(char*to,char*from) while ( (1) ); 【函数1.2说明】 函数merge(int a[],int n,int b[],int m,int*c)是将两个从小到大有序数组a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。 【函数1.2】 void merge(int a[ ],int n,int b[ ] ,int m,int * c) int i,j; for(i=j=0;i<n ) *c++=a[i] <b[j]?a[i++]:b[j++]; while( (2) )*c++=a[i++]; while( (3) )*c++=b[j++]; 【函数1.3说明】 递归函数sum(int a[],int n)的返回值是数组a[]的前n个元素之和。 【函数1.3】 int sum(int a[] ,int n) if( n >0) return (4) ; else (5) ;
问答题[问题3]
在上述流程图2-1和图2-2的算法中,
(1)矩阵A第i行第j列的元素A(i,j)被复制到矩阵B中的哪个位置?
(2)A(i,j)后来又被复制到矩阵C中的哪个位置?
(3)填补流程图2-2中的空缺。
问答题【说明】 设计希赛IT教育研发中心的工资管理系统,该中心主要有3类人员:经理、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪8000元;销售员拿固定工资1000元,然后再按当月销售额的4%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售总额的5‰。 按要求设计一个基类employee,销售员类salesman,经理类manager,销售经理类 salesmanager。 程序5-1是类employee的模块内容,程序5-2是类salesman的类模块内容,程序5-3是类manager的模块内容,程序5-4是类salesmanager的模块内容。在主测试程序中,输入张三所管部门月销售量10000后的输出结果如下: 张三所管部门月销售量:10000 销售经理:张三 编号:1001 本月工资:5050 #include <iostream.h> #include <string.h> class employee protected: int no; char *name; float salary; public: employee(int num,char *ch) no=num; name=ch; salary=0; virtual void pay()=0; virtual void display() cout<<"编号:"<<no<<endl; cout<<"本月工资:"<<salary<<endl; ; 【程序5-2】 class salesman: (1) protected: float commrate, sales; public: salesman(int num,char *ch):employee(num,ch) commrate=0.04; void pay() cout<<name<<"本月销售额:"; cin>>saies; salary=sales*commrate+1000; void display() cout<<"销售员:"<<name<<endl; employee::display(); ; 【程序5-3】 class manager: (1) protected: float monthpay; public: manager(int num,char *ch):employee(num,ch) monthpay=8000; void pay() salary=monthpay; void display() cout<<"经理:"<<name<<endl; employee::display(); ; 【程序5-4】 class salesmanager: (2) public: salesmanager(int num,char *ch): (3) monthpay=5000; commrate=0.005; void pay() cout<<name<<"所管部门月销售量:"; cin>>sales; (4) void display() cout<<"销售经理:"<<name<<endl; (5) ; void main() //主测试函数 salesmanager p1 (1001,"张三"); p1.pay(); p1.display();
问答题[说明]若矩阵Am×n中存在某个元素aij满足:aij…是第i行中最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。下面程序的功能是输出A中所有鞍点,其中参数A使用二维数组表示,m和n分别是矩阵A的行列数。[程序]voidsaddle(intA[][],intm,intn){inti,j,min;for(i=0;i<m;i++){min:{{U}}(1){{/U}};for(j=1;j<n;j++)if(A[i][j]<min){{U}}(2){{/U}};for(j=0;j<n;j++)if({{U}}(3){{/U}}){p=0;while(p<mif(p>=m)printf("%d,%d,%d/n",i,j,min);}}}[问题1]将函数代码中的(1)~(4)处补充完整[问题2]在上述代码的执行过程中,若A为矩阵,则调用saddle(A,3,3)后输出是{{U}}(5){{/U}}。