问答题【问题2】
设“程序员考试大纲”标准书号前9个数字为7-302-08493,请写出其校验码。
问答题【说明】设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值后跟用“()”括起来的各子树的列表(若有子树的话),各子树的列表间用“,”分隔。例如,如下图所示的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。本程序根据输入的列表生成一棵M叉树,并由M叉树再输出列表。【函数】#include#include#defineM3/*三叉树*/typedefstructnodeintval;structnode*subTree[M];NODE;charbuf[255],*str=buf;NODE*d=NULL;NODE*makeTree()/*由列表生成M叉树*/intk;NODE*s;s=(1);s->val=*str++;for(k=0;k<M;k++)s->subTree[k]=NULL;if(*str=='(')k=0;dostr++;s->subTree[k]=(2);if(*str==')')str++;break;k=k+1;while((3));returns;voidwalkTree(NODE*t)/*由M叉树输出列表*/inti;if(t!=NULL)(4);if(t->subTree[0]==NULL)return;putchar('(');for(i=0;i<M;i++)(5);if(i!=M-1putchar(')');voidmain()printf("Enterexp:");scanf("%s",str);d=makeTree();walkTree(d);putchar('/n');
问答题阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。[说明]两个包含有限个元素的非空集合A、B的相似度定义为|A∩B|/|A∪B|,即它们的交集大小(元素个数)与并集大小之比。以下的流程图计算两个非空整数集合(以数组表示)的交集和并集,并计算其相似度。已知整数组A[1:m]和B[1:n]分别存储了集合A和B的元素(每个集合中包含的元素各不相同),其交集存放于数组C[1:s],并集存放于数组D[1:t],集合A和B的相似度存放于SIM。例如,假设A={1,2,3,4},B={1,4,5,6},则C={1,4},D={1,2,3,4,5,6},A与B的相似度SIM=1/3。[流程图]
问答题试题七(共15分)阅读以下应用说明以及用VisualBasic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]某应用程序用于监测某种设备的工作温度(20~200度),其运行窗口中,包括一个温度计(矩形形状shpMeter)以及其中指示当前设备温度的水银柱(矩形形状shpT),文字标签标记了温度刻度;另有一个图片框picCurve,用于动态描述检测到的温度曲线(用户见到的曲线与水银柱等高变化);命令按钮“开始检测”(cmdStart)用于启动温度检测,命令按钮“暂停检测”(cmdStop)用于暂停检测。矩形形状shpT(水银柱)属性visible初始设置为不可见,属性Filltype设置为solid(实心),FillColor设置为红色;图片框picCurve的属性AutoRedraw设置为True;再创建一个定时器TimT,属性Enabled初始设置为False(不起作用),属性Interval(定时间隔)设置为500毫秒。为模拟设备温度的检测,程序中利用了(0,1)之间均匀分布的伪随机数获得[20,200]之间的随机温度T。为了便于在图片框picCurve中绘制曲线,程序中对该图片框建立了坐标系统,左上角为原点(0,0),水平向右方向为X轴,垂直向下方向为Y轴,右下角坐标为(50,180)。为了便于观察记录的温度值,图片框中从上到下创建了5条水平线Ls(i),i=0,1,…4,并在程序中按等间隔排列进行位置设置。程序中每隔半秒算出曲线点(x,y),其中x=0,1,2,…,再用直线段连接各相邻曲线点形成温度曲线。[VisualBasic程序代码]Dim(1)AsInteger'声明全局变量PrivateSubCmdStart_Click()TimT.Enabled=TrueShpT.Visible=TrueEndSubPrivateSubCmdStop_Click()TimT.Enabled=FalseEndSubPrivateSubForm_Load()Dimi,HAsIntegerPicCurve.Scale(0,0)-(50,180)'设置图片框坐标系:左上角-右下角H=30'H等于图片框高度的六分之一Fori=0To4'设置5条水平线Ls(i)的位置Ls(i).X1=0'Ls(i)起点横坐标Ls(i).Y1=H*(2)'Ls(i)起点纵坐标Ls(i).X2=50'Ls(i)终点横坐标Ls(i).Y2=Ls(i).Y1'Ls(i)终点纵坐标Ls(i).BorderColor=&HC0C0C0'设置水平线颜色Nextix=0'设置曲线坐标初值EndSubPrivateSubtimT_Timer()DimT,HAsInteger'T为即时温度,H为图片框中温度点显示高度T=Int(Rnd*181)+20'模拟随机产生设备温度(20~200度)'按当前温度显示水银柱H=ShpMeter.Height*(3)'算出水银柱的高度ShpT.Top=(4)-H'设置水银柱顶部位置ShpT.Height=H'设置水银柱的高度'绘制温度曲线y=(5)'算出曲线上当前点的纵坐标Ifx=51Then'当超出图片框时PicCurve.Cls'清除图片框内以前画的曲线x=0'设置重画曲线的初值ElseIfx>0Then'除左边点外PicCurve.Line(x-1,Lasty)-(x,y),vbRed'由前1点到当前点画红色线段EndIfx=x+1'准备下一点坐标Lasty=y'保存当前坐标供下次使用EndSub
问答题试题八(15 分,每空3 分)
阅读以下说明和Java 源程序,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
以下程序的功能是计算三角形、矩形和正方形的面积并输出。
程序由5 个类组成:AreaTest 是主类,类Triangle、Rectangle 和Square 分别表示三角形、矩形和正方形,抽象类Figure 提供了一个计算面积的抽象方法。
【程序】
public class AreaTest{
public static void main(String args[]) {
Figure[] figures={
new Triangle(2,3,3), new Rectangle(5,8), new Square(5)
};
for (int i=0; i
问答题【函数2.1说明】
有1、2、3、4四个数字,输出由这些数字组成的互不相同且无重、复数字的三位数。
【函数2.1】
main()
{
int i,j,k;
printf("/n");
for({{U}} (1) {{/U}}) /*以下为三重循环*/
for(j=1; j<5;j++)
for (k=1;k<5;k++)
{
if ({{U}} (2) {{/U}}) /*确保i, j, k 三位互不相同*/
printf("%d,%d,%d/n",i,j,k);
}
}
【函数2.2说明】
计算并输出100之内的素数,每行输出10个,超过10个则换行。
【函数2.2】
#include <stdio.h>
#include "math.h"
#define N 101
main()
{
int i,j,line,a[N];
for(i=2;i<N;i++){{U}} (3) {{/U}};
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
if(a[i]!=0
}
printfC/n");
for(i=2,line=0;i<N;i++)
{
if(a[i]!=0)
{
prinff("%5d",a[i]);
{{U}} (5) {{/U}};
}
if(line==10)
{
prinff("/n");
line=0;
}
}
}
问答题[说明]
本程序接收输入的学生信息,包括学号、姓名、成绩,原样输出信息并计算学生的平均成绩。其中学生类Stud除了包括no(学号)、name(姓名)和grade(成绩)数据成员外,还有两个静态变量 sum和num,分别存放总分和人数,另有一个构造函数、一个普通成员函数disp()和一个静态成员函数avg()用于计算平均分。
[Java代码]
public class Stud {
public int no;
public String name;
public double grade;
public {{U}}(1) {{/U}} 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={{U}} (2) {{/U}};
{{U}} (3) {{/U}};
}
public static double avg(){
return {{U}}(4) {{/U}};
}
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="+{{U}} (5) {{/U}});
}
}
问答题[说明]
函数encode()和decode()分别通过参数传递实现对字符串的变换和复原,返回值均为处理以后的字符串长度。变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:
(1)若已知字符串的当前字符不是数字字符,则复制该字符于新字符串中;
(2)若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中;
(3)若已知字符串的当前字符是一个数字字符,并且还有后继字符,设该数字值为n,则将其后继字符重复复制n+1次到新字符串中;
(4)以上述一次变换为一组,在不同组之间另插入一个下划线‘_’用于分隔。
例如:encode()函数对字符中26a3t2的变换结果为666_a_tttt_2。
函数decode()用于经函数encode()处理的字符中,即复制不连续相同的单个字符,而将一组连续相同的字符(不超过10个)变换成一个用于表示重复次数的数字符和一个重复出现的字符,并在复原过程中掠过变换函数为不同组之间添加的一个下划线字符。
注:假定调用变换函数encode()时的原始字符串中不包含下划线字符。
[函数]
int encode(char *instr,char *outstr)
{ char *ip, *op,c;
int k,n;
ip=instr;
op=outstr;
while ( * ip) {
if(*ip>='0'
c={{U}} (1) {{/U}};
for (k=0;k<n;k++) *op++=c;
}
else *op++=*ip;
{{U}}(2) {{/U}};
ip++;
}
if (op>outstr) {{U}}(3) {{/U}};
*op='/0';
{{U}}(4) {{/U}};
}
int decode(char *instr,char *outstr)
{ char *ip,*op,c;
int n;
ip=instr; op=outstr;
while ( *ip) {
c=*ip;
n=0;
while( *ip==c n++; }
if(n>1) *op+ + ='0'+n-1;
* op++=c;
if(*ip=='_') ip++;
}
*op='/0';
{{U}} (4) {{/U}};
}
问答题[说明] 以下程序的功能是统计学生成绩,包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对前百分之七十的学生定为合格(PASS),而后百分之三十的学生定为不合格(FAIL)。例如,当输入4名学生的姓名和成绩“Alice 67 Mary 90 Tom 56 John 88”后,程序的执行结果如下: 姓名 成绩 合格否 Mary 90 PASS John 88 PASS Alice 67 FAIL Tom 56 FAIL[C++程序]#include <stdio.h>#include <string.h>#define N 10class student protected: char name[10]; int deg; public: void setname(charna[]) strcpy(name,na); char * getname() return name; void setdeg(int d) deg= d; int getdeg()return deg;;class compute int ns; student na[N]; public: void getdata(); void sort(); void disp();;void compute::getdata() int i,tdeg; char tname[10]; printf("输入学生人数:"); scanf("%d", printf("输入学生姓名和成绩:/n"); for(i=0;i<ns;i+ +) scanf("%s%d",tname, (1) ; na[i].setdeg(tdeg); void compute::sort() int i,j,pick; (2) ; for(i=0;i<ns-1;i+ +) pick=i; for(j=i+1;j<ns;j+ +) if(na[j].getdeg()>na[pick].getdeg()) (3) ; temp=na[i]; na[i]=na[pick]; na[pick]=temp; void compute::disp() int cutoff,i; printf("RESULT/n"); printf("姓名 成绩 合格否/n"); cutoff=ns*7/10-1; for(i=0;i<ns;i+ +) printf("%-6s%3d", (4) ); if( (5) ) printf("/tPASS/n"); else printf("/tFAIL/n");void main() compute obj; obj.getdata(); obj.sort(); obj.disp();
问答题[说明]我国现行使用的公民身份证号码有两种,分别遵循两个国家标准:〖GB11643-1989〗和〖GB11643-1999〗。〖CB11643-1989〗中规定的是15位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。〖GB11643-1999〗中规定的是18位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其中,校验码C由本体码按如下过程求得:(1)计算校验码和S=a18W18+a17W17+…+a2w2,其中i表示18位身份证号,码每一位的序号,从右至左,最左侧为18,最右侧为1;ai表示身份证号码第i位上的号码;wi表示第i位上的权值,其值为2i-1模11的结果;(2)计算校验码值R,其值为校验和模11的结果;(3)根据下面对应关系找出校验码C:R012345678910C10X98765432由上述计算过程可以看出,18位身份证号码中可能包含非数字的字母X(代表数字10)。下面的应用程序基于这一算法实现了身份证号码的升位查询:在开发过程中,显示新旧两种身份证号码的文本框(TextBox)分别名为Text1和Text2,“号码升位”按钮(CommandButton)名为Command1。代码中使用到的字符串函数及功能说明如下:(1)Len(s):获取字符串s的长度;(2)Left(s,1):返回字符串s左端长度为1的子串;(3)Right(s,1):返回字符串s右端长度为1的子串;(4)Mid(s,p,1):返回字符串s从第P个字符开始长度为1的子串。[VisualBasic代码]’计算18位身份证号码PrivateSubCommandl_Click()DimcodeAsStringDimSAsIntegercode=Textl.Text'提取15位身份证号码IfLen(code)<>15ThenMsgBox"ID号码长度不正确,请检查!"{{U}}(1){{/U}}EndIfcode=Left(code,6)+"19"+{{U}}(2){{/U}}(code,9)'年份升位S=0Fori=18To2Step-1'计算校验码和S=S+Clnf({{U}}(3){{/U}})*(2^(i-1)Mod11)Nexti{{U}}(4){{/U}}'计算校验码值SelectCaseS'确定校验码Case0:code=code+"1"Case1:code=code+"0"Case2:code=code+"X"CaseElse:code=code+CStr({{U}}(5){{/U}})EndSelectText2.Text=code'显示18位身份证号码EndSub
问答题[C语言函数]
intB_s[DAYS+1]; /*记录成本最小的生产计划,B_s[0]不用,DAYS定义为天数*/
double find_a_plan(FILE *int)
{ iht P_nm[DAYS+1],acc_req[DAYS+1];
int i,tag = 0,acc_qty = 0;
double mincost = 1.0e20,cost_Produce,cost_Keep;
for(i = 1;i <= DAYS; i++) { /*第i天时的累计零件需求量存入acc rcq[i] */
acc_qty += data[i].Qty_req;
acc_req[i] = acc qty;
}
while (!feof(int)) {
for(i = 1; i <= DAYS; i++ )/*读入一个生产计划,第i天的产量存入P_num[i]*/
if (!feof(inf))
fseant[inf,"%d",
tag = 0; cost_Produce = 0; cost_Keep = 0;
for(i = 1,{{U}} (1) {{/U}};i <= DAYS; i++){ /*考查当前的生产计划*/
acc qty += P_num[i]; /* acc_qty 计录到第i天时的累计零件生产量*/
if (acc_qty < acc_req[i]) {/*当前生产计划不能满足需求*/
tag = 1; break;
}/*if*/
cost_Produce += {{U}}(2) {{/U}}; /*计算当前生产计划的总需件价格*/
cost_Keep += ({{U}} (3) {{/U}}) * data[i],Keeping_fee;
}/*for*/
if({{U}} (4) {{/U}}) /* 若当前生产计划不可行,则继续读取下一计划*/
continue;
if({{U}} (5) {{/U}}) { /*记录成本更小的生产计划*/
mincost = costProduce + cost_Keep;
for(i = 1; i <=DAYS; i++)
B_s[i] = P num[i];
}/*if*/
}/*while*/
return mincost;
}
问答题试题三(15分,每空3分)阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。[函数说明]函数movetoend(LinkedListLa,inti)的功能是:将线性表A的第i个元素移到表尾。若移动成功,则返回0,否则返回-1。线性表A采用带头结点的单链表表示,La为表A的头指针,如下图所示。链表结点的类型定义为:typedefstructnode{intkey;structnode*next;}*LinkedList;[函数]intmovetoend(LinkedListLa,inti){LinkedListp,q,prep;intk=1;p=La->next;prep=La;while((1)){/*查找第i个元素并使指针p指向该结点*/prep=p;p=p->next;k++;}if(!p||k>i)return-1;if((2))/*第i个元素结点已经是表尾结点,则无需移动*/return0;q=p;while((3))q=q->next;/*查找表尾并使q指向表尾结点*/(4)=p->next;p->next=NULL;(5);return0;}
问答题试题三
以下是与Visual Basic 开发应用有关的5 个问题。对每一个问题,请将解答填入答题纸的对应栏内。
(1) 在Visual Basic 中,工程文件、窗体文件和标准模块文件的扩展名是什么?请从下列选项中选择:
prg、prj、exe、vbp、form、frm、win、fra、std、bas、vbs、vbm
(2) 设某窗体上有一个命令按钮,其名称为CmdSave,运行时该按钮上显示有“保存(S)”字样的信息。为使热键ALT+S 与该命令按钮相关联,应该对按钮CmdSave 的Caption 属性设置什么样的属性值?
(3) 设某窗口内有一个图像框Image1,以及两个命令按钮“放大”和“缩小”。单击“放大”按钮就会使该图像框的长和宽都放大10%;单击“缩小”按钮就会使该图像框的长和宽都缩小10%(该图像框的左上角不动)。请分别写出这两个命令按钮的单击事件过程中的程序代码。
(4) 为使某个单选按钮初始时默认被选中,在开发时应怎样做?
(5) 若有语句Tmpval=MsgBox("非法操作!", vbOKCancel + vbCritical, "提示"),请简要描述程序运行时弹出的消息框的主要特征。
问答题试题一(共15分)阅读以下说明和算法,完善算法并回答问题,将解答写在答题纸的对应栏内。[说明]假设以二维数组G[1..m,1..n]表示一幅图像各像素的颜色,则G[i,j]表示区域中点(i,j)处的颜色,颜色值为0到k的整数。下面的算法将指定点(i0,j0)所在的同色邻接区域的颜色置换为给定的颜色值。约定所有与点(i0,j0)同色的上、下、左、右可连通的点组成同色邻接区域。例如,一幅8×9像素的图像如图1-1所示。设用户指定点(3,5),其颜色值为0,此时其上方(2,5)、下方(4,5)、右方(3,6)邻接点的颜色值都为0,因此这些点属于点(3,5)所在的同色邻接区域,再从上、下、左、右四个方向进行扩展,可得出该同色邻接区域的其他点(见图1-1中的阴影部分)。将上述同色区域的颜色替换为颜色值7所得的新图像如图1-2所示。[算法]输入:矩阵G,点的坐标(i0,j0),新颜色值newcolor。输出:点(i0,j0)所在同色邻接区域的颜色置换为newcolor之后的矩阵G。算法步骤(为规范算法,规定该算法只在第七步后结束):第一步:若点(i0,j0)的颜色值与新颜色值newcolor相同,则(1);第二步:点(i0,j0)的颜色值→oldcolor;创建栈S,并将点坐标(i0,j0)入栈;第三步:若(2),则转第七步;第四步:栈顶元素出栈→(x,y),并(3);第五步:1)若点(x,y-1)在图像中且G[x,y-1]等于oldcolor,则(x,y-1)入栈S;2)若点(x,y+1)在图像中且G[x,y+1]等于oldcolor,则(x,y+1)入栈S;3)若点(x-1,y)在图像中且G[x-1,y]等于oldcolor,则(x-1,y)入栈S;4)若点(x+1,y)在图像中且G[x+1,y]等于oldcolor,则(x+1,y)入栈S;第六步:转(4);第七步:算法结束。[问题]是否可以将算法中的栈换成队列?回答:(5)。
问答题【说明】 本程序输出10000之内的所有完全数。完全数是指等于其所有因子和(包括1,但不包括这个数本身)的数。例如:6=1×2×3,6=1+2+3,则6是一个完全数。 【程序】 public class PerfectNum Public static void main(String args[]) int count=1; for(int i=1; i<10000; i++) int y=0; for(int j=1; j<i; j++) if( (1) ) y= (2) if( (3) ) System.out.print( (4) +String.valueOf('/t')); (5) If(count%3==0) System.out.printin();
问答题[Java代码]
问答题
问答题阅读以下说明和C函数,将解答填入答题纸的对应栏内。
[说明]
函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T,否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型SString定义如下:
typedef struct {
char* ch; /*串空间的首地址*/
int length; /*串长*/
}SString;
[C函数]
void del_substr(SString* S, SString T)
{
iht i, j;
if(S->length<1 ||T.length<1 ||S->length<T.length)
return;
i=0; /* i为串S中字符的下标*/
for (;;) {
j =0; /*j为串T中字符的下标*/
while(i<S->length j++;
}
else {
i={{U}} (1) {{/U}};j=0; /*i值回退,为继续查找T做准备*/
}
}
if({{U}} (2) {{/U}}){ /*在s中找到与T相同的子串*/
i={{U}} (3) {{/U}}; /*计算s中子串T的起始下标*/
for(k=i+T.length;k<S->length;k++)/* 通过覆盖子串T进行删除*/
S->ch[{{U}} (4) {{/U}}] =S->ch[k];
S->length={{U}} (5) {{/U}}; /* 更新S的长度*/
}
else break; /* 串S中不存在于串T*/
}
}
问答题【函数2.1说明】 函数palindrome(char s[])的功能是,判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:“LEVEL”是回文字符串,而“LEVAL”不是。 【函数2.1】 int palindrome( char s[ ] ) char * pi, * pj; pi=s; pj=s+strlen(s)-1; while( pi<pjpj -- if( (2) )return -1; else return 0; 【函数2.2说明】 函数f(char * str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。 例如若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”、“4”和“5”。 【函数2.2】 void f( char * str, char del) int i ,j ,len; len = strlen (str) i=0; while(i < len) while( (3) )i++; /*忽略连续的标志字符*/ /*寻找从str[i]开始直到标志字符出现的一个子字符串*/ j=i+1; while(str[j] != del /*给找到的字符序列置字符串结束标志*/ printf("%s/t", (5) ;
问答题[函数2.1说明] 下面程序的功能是计算x和y的最小公倍数。[函数2.1]main() int m,n,d,r; seanf("%d %d", if(m<n) r=m;m=n;n=r; (1) ; while (d%n! =0) (2) ; printf("%d/n",d);[函数2.2说明] 下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。[函数2.2]#include <stdio.h>main() char c,preChar='/0'; c = getchar(); while(c! = '.') if( (3) ) putchar(c); else if(preChar! =' ') putchar(c); (4) ; c= (5) ;