问答题【说明】本应用程序是一个乘法计算器,其运行窗口如图2所示。在该界面中,“被乘数”、“乘数”以及“积”等文字为标签,相应的3个输入输出数据框为文本框,此外还有3个命令按钮。用户在“被乘数”和“乘数”相应的文本框内输入数据,再单击“运算”按钮,便能在“积”对应的文本框中看到相乘的结果;当用户单击“清除”按钮时,就会清除各文本框中的数据;当用户单击“关闭”按钮时就会关闭该窗口并退出应用程序。用户不能在“积”对应的文本框中输入数据。【属性设置】各个对象、有关的属性名以及需要修改的属性值设计如下:对象对象名属性名属性值窗体frmMultiplyCaption乘法计算器标签1Lbl1Caption被乘数:标签2Lbl2Caption乘数:标签3Lbl3Caption积:文本框1Txt1Text(空)文本框2Txt2Text(空)文本框3Txt3Text(空)Enabled{{U}} (1) {{/U}}按钮1{{U}} (2) {{/U}}Caption运算按钮2cmdClearCaption清空按钮3cmdCloseCaption退出【程序】PrivateSubcmdMultiply_Click()txt3.Text=Trim(Str$({{U}}(3){{/U}})'加法运算获得和数EndSubPrivateSub{{U}}(4){{/U}}(txt1.Text=""'空字符串赋值给文本框txt1的内容txt2.Text=""'空字符串赋值给文本框txt2的内容txt3.Text=""'空字符串赋值给文本框txt3的内容EndSubPrivateSubcmdClose_Click(){{U}}(5){{/U}}'退出应用程序EndSub
问答题[说明]以下[C程序]所完成的功能是在3X3方格中填入数字1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图3-18所示。图3-18系统的部分输出结果3×3方格从第1行左上角方格开始的序号分别为0、1、2,第2行左边方格开始的序号分别为3、4、5,第3行左下角方格开始的序号分别为6、7、8。以下[C程序]采用试探法,即从序号为0的方格(左上角)开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为8的方格(右下角)也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为8的方格所填的整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,C程序引入二维数组checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。[C程序]#include<stdio.h>#defineN12inta[9];/*用于存储方格所填入的整数*/intb[N+1];intpos;checkMatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1}{4,6,-1},5,7,-1}};voidwrite(inta[]){inti,j;for(i=0;i<3;i++)for(j=0;j<3;j++)printf("%3d",a[3*i+j]);printf("/n");}}intisPrime(intm){inti;if(m==2)return1;if(m==1||m%2==0)return0;for(i=3;i*i<=m;){if(m%i==O)return0;i+=2;}return1;}intselectNum(intstart){intj;for(j=start;j<=N;j++)if(b[j])returnj;return0;}intcheck()/*检查填入pos位置的整数是否合理*/{inti,j;for(i=0;(j={{U}}(1){{/U}})>=0;i++)if(!isPrime(a[pos]+a[j])){{U}}(2){{/U}};{{U}}(3){{/U}};}extend()/*为下一方格找一个尚未使用过的整数*/{a[{{U}}(4){{/U}}]=selectNum(1);b[a[pos]]=0;}voidchange()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/{intj;while(pos>=0if(pos<0)return;b[a[pos]]=1;a[pos]=j;b[j]=0;}find(){intok=1;pos=0;a[pos]=1;b[a[pos]]=0;de{if(ok)if({{U}}(7){{/U}}){write(a);change();}elseextend();elsechange();ok=check(pos);}while(pos>=0);}main(){inti;for(i=1;i<=N;i++)b[i]=1;find();}
问答题[说明]链式存储的队列称为链队。根据队列的FIFO原则,为了操作上的方便,可以使用带头指针front和尾指针rear的单链表来实现链队。若链队元素的数据类型为datatype,则链队结构描述如下:typedefstructnode{datatypedata;structnode*next;}QNode;/*链队结点的类型*/typedefstruct{QNnode*front,*rear;}LQueue;/*将头尾指针封装在一起的链队*/以下这种链队的几个例子:设q是一个指向链队的指针,即LQueue*q。下面各函数的功能说明如下:(1)LQueue*Init_LQueue():创建并返回一个带头尾结点的空链队;(2)intEmpty_LQueue(LQueue*q):判断链队q是否空;(3)voidIn_LQueue(LQueue*q,datatypex):将数据x压入链队q;(4)intOut_LQueue(LQuere*q,datatype*x):弹出链队q的第一个元素x,若成功则返回返回1否则返回0。[函数]LQueae*Init_LQueue(){LQueue*q,*p;q=malloc(sizeof(LQueue));/*申请链队指针*/P=malloc(sized(QNode));/*申请头尾指针结点*/p->next=NULL;{{U}}(1){{/U}}=p;returnq;}intEmpty_LQueue(LQueue*q){if(q->front{{U}}(2){{/U}}q>rear)return0;elsereturn1;}voidIn_LQueue(LQueue*q,datatypex){QNoda*p;p=malloc(sizeof(QNnode));/*申请新接点*/p->data=x;p->next=NULL;{{U}}(3){{/U}}=p;q->rear=p;}intOut_LQueue(LQueue*q,datatype*x){QNnode*p;if(Empty_LQueue(q))return0;/*队空,操作失败*/else{p=q->front->next;*x={{U}}(4){{/U}};{{U}}(5){{/U}}=p->next;free(p);if(q->front->next==NULL)q->rear=q->front;return1;}}
问答题[说明]本程序实现的功能是判断指定的文本文件中是否包含指定的字符串,并且如果包含则返回其第一次出现的位置(行号、列号)。程序运行界面如下图所示,用户只要通过驱动器列表框、目录列表框选定文件夹,文件列表框会自动列出该文件夹下所有文本文件名称,选中其中某个文件,再输入目标字符串并且单击“查找”按钮,就能看到查找的结果。在开发过程中,驱动器列表框名为Drive1,目录列表框名为Dirl,文件列表框名为File1,目标字符串输入框名为Text1,“查找”按钮名为Command1。[VisualBasic代码]PrivateSubDrivel_Change()Dirl.Path=(1)'更新目录列表框的路径EndSubPrivateSubDirl_Change()(2)=Dirl.Path'更新文件列表框的路径EndSubPrivateSubCommandl_Click()Dimfso,aAsObjectDimi,jAsIntegerIf(3)=""Then'判断是否已经选中某个文件MsgBox"请选择一个文件文件!"(4)'退出事件过程EndIf'创建文件系统对象以及文本流对象Setfso=CreateOhjecl("Scripting.FileSystemOhject")Seta=fso.OpenTextFile(Dirl.Path&"/"&(3))i=1DoWhile(5)<>True'逐行读取文件,直至文件末尾strLine=a.ReadLinej=InStr(1,(6))'返回目标字符串在文件这一行中的位置Ifj>0Then'如果目标字符串在这一行出现,则返回其位置MsgBox"字符串第一次出现的位置是"&"("&i&","&j&"),,"(4)'退出事件过程EndIfi:i+lLoopMsgBox"字符串在文件中不出现,"EndSub
问答题【说明】以下【C程序】能将自然数1,2,…,N2按蛇形方式逐个存入N阶矩阵。换言之,程序从anO开始到aOn。为止(n=N-1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。例如,当N=5时,程序输出结果如图2-12所示;当N=8时,程序输出结果如图2-13所示。【C程序】#include<stdio.h>#defineSIZE10inta[SIZE][SIZE],k;main(){inti,j,n,N;for(N=3;N<=SIZE;N++){k=1;makeArray(n=N-1);printf("/nN=%d;/n",n+1);for(i=0;i<=n;i++){for(j=0;j<=n;j++)printf("%4d",a[i][j]);printf("/n");}}}makeline(introw_start,intcol_start,introwend){/*完成矩阵一条斜线的整数填写*/inti,j,sign={{U}}(1){{/U}};for(i=row_start,j=colstart;{{U}}(2){{/U}};i+=sign,j+=sign)a[i][j]=k++;}makeArray(intn){/*完成矩阵每条斜线的整数填写*/intd;for(d=1;d<={{U}}(3){{/U}};d++)if(d<=n)if(d%2)makeline({{U}}(4){{/U}});elsemakeline({{U}}(5){{/U}});elseif(d%2)makeline({{U}}(6){{/U}});elsemakeline({{U}}(7){{/U}});
问答题
问答题[说明]某小型家电超市开发了下面的程序,用以实现商品提货信息的汇总和输出功能。程序的运行界面如下图所示:程序界面包含两个控件数组,分别是提货商品复选框控件数组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) 的顶点,以便回溯查找被访问过顶点的未被访问过的邻接点。