问答题
问答题【说明】
冒泡排序算法,作为Orderedlist<T,size>类的成员函数,last是有序表的元素个数。
template<typename T,int size>void Orderedlist<T,size>∷BubbleSort(){
bool noswap; //交换标志
int i,j;
T temp;
for(i=0;i<last;i++)
{
noswap={{U}} (1) {{/U}};
for(j={{U}} (2) {{/U}};{{U}} (3) {{/U}};{{U}} (4) {{/U}})
{//从下往上冒泡
if(slist[j]<slist[j-1])
{
temp=slist[j];
slist[j]=slist[j-1];
slist[j-1]=temp;
noswap={{U}} (5) {{/U}};
}
}
if(noswap)break;
}
}
问答题从下列3道试题(试题5至试题7)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。阅读以下应用说明及VisualBasic程序代码,根据要求回答问题1至问题4。【说明】某学期成绩管理系统的“增、删、改数据表中的记录”对话框如图1-19所示。图1-19对话框中共定义了6个标签、6个文本框、4个命令按钮和1个Data数据控件。其中Data数据控件是VisualBasic的标准控件。利用它能方便地创建应用程序与数据库之间的连接,并实现对数据资源的访问。【添加】(cmdAdd)按钮用于向学生成绩数据表添加一条空记录:【修改】(cmdEdit)按钮用于修改当前所显示的一条数据记录:命令按钮【删除】(cmdDelete)用于删除当前显示的一条数据记录;单击【退出】(cmdExit)按钮,系统将退出图1-19所示的对话框。表1-13是学生成绩表结构的示例;表1-14是学生成绩表的示例。图1-19将表1-14数据库中的记录信息显示到相应的文本框中。要在各文本框(txtStu(i),i=0,1,2,3,4,5)中显示Data数据控件所连接的数据表中的数据,必须将文本框与Data数据控件进行绑定。{{B}}表1-13学生成绩表结构{{/B}}字段名类型大小 字段名类型大小班级Text6语文Integer2(默认)学号Text8数学Integer2(默认)姓名Text10英语Integer2(默认) {{B}}表1-14学生成绩示例表{{/B}}班级学号姓名语文数学英语AA40001张薇958690BB40001谢新677181AA40002刘红948986CC40001张斌788886………………【VisualBasic程序】PrivateSubForm_Load()Fori=0To5txtStu(i).Locked=TrueNextiEndSubPrivateSubcmdAddClick()cmdEdit.Enabled=NotcmdEdit.Enabled{{U}}(1){{/U}}Fori=0To5txtStu(i).Locked=NottxtStu(i).LockedNextiIfcmdAdd.Caption="添加"Then{{U}}(2){{/U}}Datal.Caption="新记录"cmdAdd.Caption="保存"cmdExit.Caption="取消"txtStu(0).SetFocusElseDatal.Recordset.Update{{U}}(3){{/U}}cmdAdd.Caption="添加"EndIfEndSubPrivateSubcmdEdit_Click()cmdAdd.Enabled=NotcmdAdd.EnabledcmdDelete.Enabled=NotcmdDelete.EnabledFori=0To5txtStu(i).Locked=NottxtStu(i).LockedNextiIfcmdEdit.Caption="修改"ThenDatal.Recordset.EditcmdEdit.Caption="保存"cmdExit.Caption="取消"Else{{U}}(4){{/U}}cmdEdit.Caption="修改"EndIfEndSubPrivateSubcmdDelete_Click()answer=MsgBox("确实删除该记录吗?",vbYesNo+vbQuestion,"警告")Ifanswer=vbYesThenDatal.Recordset.Delete{{U}}(5){{/U}}IfDatal.Recordset.EOFThen{{U}}(6){{/U}}EndIfEndIfEndSubPrivateSubcmdExit_Click()IfcmdExit.Caption="退出"ThenEndElse{{U}}(7){{/U}}cmdAdd.Enabled=TruecmdEdit.Enabled=TruecmdDelete.Enabled=TrueFori=0To5txtStu(i).Locked=NottxtStu(i).LockedNexticmdExit.Caption="退出"cmdAdd.Caption="添加"cmdEdit.Caption="修改"{{U}}(8){{/U}}EndIfEndSubPrivateSubDatal_Reposition()Datal.Caption="第"&{{U}}(9){{/U}}.AbsolutePosition+1&"条记录"EndSub
问答题[说明]本程序将自然数1,2,……,N2(N=5)按蛇形方式逐个顺序存入N阶矩阵。令n=N-1,则矩阵中的每一元素可用aij标记,其中i,j(0≤i,j≤n)分别为其所在行的行号和所在列的列号。蛇形方式顺序存放的方法是从an0开始、到a0n为止,依次填入由1递增的自然数,交替地对每一斜列从左上角向右下角或从右下角向左上角排列。程序的输出为:[程序]#include<stdio.h>#include<math.h>#defineSIZE.10inta[SIZE][SIZE],k;voidwrite(intn)/*输出矩阵*/{inti,j;for(i=0;i<=n;i++){for(j=0;j<=njj++)printf("%4d",a[i][j]);printf("/n");}}voidmakeline(introw_start,intcol_start,introw_end)/*完成矩阵一条斜线的整数填写*/{inti,j,sign;sign=({{U}}(1){{/U}}>=0)?1:-1;for(i=row_start,j=col_start;(row_end-i)*sign>=0;i+=sign,j+=sign)a[i][j]={{U}}(2){{/U}};}voidmakeArray(intn)/*完成矩阵每条斜线的整数填写*/{intd;for(d=1;d<={{U}}(3){{/U}};d++)if(d<=n+1)if(d%2)makeline({{U}}(4){{/U}});elsemakeline(n+1-d,0,n);elseif(d%2)makeline({{U}}(5){{/U}});elsemakeline(0,d-n-1,2*n-d+1);}voidmain(){intn,N=5;k=1;n=N-1;makeArray(n);write(n);}
问答题[说明]某银行新近开通外汇定期存款业务。为方便用户查询不同存款方式下的日利率、计算本利,特开发了日利率查询及本利计算程序,其运行窗口如下图所示。用户只要在界面上选择相应的存款方式(包括外汇币种、存期等),便可单击按钮一查询存款日利率。若输入一定数量的本金。程序还会根据所选择的存期计算并输出本利和。在开发过程中,选择币种和存期的组合框(ComboBox)名分别为Combo1和Combo2,单旋钮(CommandButton)“个人单位”和“金融机构”分别名为Option1和Option2,用于输入本金的文本框(TextBox)名为Price,“输出日利率”和“计算本利和”按钮(CommandButton)分别名为Command1和Command2。且已知,第i类币种、第j类存期之下,个人单位与金融机构的存款日利率分别存放于数组元素interestRate(i,j,0)和interestRate(i,j,1)中,其中i,j从0开始计数。[VisualBasic代码]DiminterestBate(50,10,2)AsSingle’通用声明PrivateSubForm_Load()……’为数组interestRate赋初值EndSub’根据所选择的币种、存期等信息确定日利率FunctiongetInterestRate()DimstrCurrency,strTimeAsString,i,j,k,intDaysAsIntegerstrCurrency=Combo1.TextstrTime=Combo2.TextFori=0ToCombol.ListCount-1IfCombol.List(i)=strCurrencyThen(1)NextForj=0ToCombo2.ListCount-1IfCombo2.List(j)=strTimeThen(1)NextIf(2)=TrueThenk=0Else:k=1EndIf(3)=interestRate(i,j,k)EndFunction’输出日利率PrivateSubCommund1_Click()MsgBox"日利率为"&getInterestRate()EndSub’输出本利和PrivateSubCommand2_Click()DimstrTimeAsString,intDaysAsInteger,sngCorpus,sngResultAsSinglestrTime=Combo2.TextsngCorpus=CSng(Text1.Text)(4)’计算存款天数(以每月30天计)Case"一个月":intDays=30Case"三个月":intDays=90Case"六个月":intDays=120EndSelect’计算并输出本利和sngResult=sngCorpus+(5)MsgBox"本利之和为:"&sngResultEndSub
问答题【说明】该应用程序是用来修改文本框中的字体属性,其运行窗口如图4所示。窗口由1个标签(Labell)、1个文本框(txtPassage)和4个选择框(chkFont,chkltalic,chkSize,chkColor)组成。程序运行后,用户在文本框内输入一段文字,然后按需要单击各选择框,用以改变文本的字体、字型、颜色及大小。文本框的Mulitine属性已经设为True。当不选择“黑体”时,文字应是“宋体”。当不选择“大小16”时,字号为9。当不选择“紫色”时,字色为黑色。当不选择“斜体”时,文字采用正常字型。【程序代码】PrivateSubchkFontClick()If(1)ThentxtPassage.FontName="黑体"ElsetxtPassage.FontName="宋体"EndIfEndSubPrivateSub(2)()IfchkColor.Value=1ThentxtPassage.ForeColor=QBColor(13)ElsetxtPassage.ForeColor=QBColor(0)EndIfEndSubPrivateSubchkltalic_Click()Ifchkltalic.Value=1ThentxtPassage.Fontltalic=(3)ElsetxtPassage.Fontltalic=(4)EndIfEndSubPrivateSubchkSizeClick()If(5)ThentxtPassage.Font.Size=16ElsetxtPassage.Font.Size=9EndIfEndSub
问答题[说明]本程序提供了查询景点票价信息的功能,查询包括两种方式:按景点名称查询以及白定义查询。程序界面如下图所示:其中,选择景点名称的组合框(Comobox)名为Combo1,单旋钮“旺季”和“淡季”分别名为Op-tion1和Option2,用于输入票价上限的文本框名为Texi1,两种查询方式的“提交”按钮分别名为Command1和Command2。已知Combol列表中第i个景点的旺季票价和淡季票价分别存放于数组元素P(i,0)和p(i,1)中。[VisualBasic代码]Dimp(20,2)AsSingle'通用声明PrivateSubForm_Load()Fori=0To9'对p赋值p(i,0)=........:p(i,1)=.......NextEndSubPrivateSubCommandl_Click()'查询方式一:按景点名称查询DimcboTcxtAsStringeboText={{U}}(1){{/U}}Fori=0To{{U}}(2){{/U}}-1'对Combo1中各列表项循环If{{U}}(3){{/U}}=cboTextThenMsgBox"景点名称"&cboText&"旺季票价"&p(i,0)&_",淡季票价"&p(i,1)ExitSubEndIfNextiEndSubPrivateSubCommand2_Click()查询方式二:自定义查询DimpriceAsSingle,resultAsString,flagAsBooleanprice=Val({{U}}(4){{/U}})flag=Falseresult=""Fori=0To{{U}}(2){{/U}}-1'对Combo1中列表项循环,找出符合条件的景点If(Optionl.ValueAndp(i,0)<=price)Or({{U}}(5){{/U}})Then{{U}}(6){{/U}}result=result&"景点名称"&(3)&",旺季票价:"&_p(i,0)&",淡季票价:"&p(i,1)&vbCrLfEndIfNextiIfflagThenMagBoxresultElse:Msgaox"没有找到符合条件的景点信息!"EndIfEndSub
问答题[说明]
Kruskal算法是一种构造图的最小生成树的方法。设G为一无向连通图,令T是由G的顶点构成的于图,Kmskal算法的基本思想是为T添加适当的边使之成为最小生成树:初始时,T中的点互相不连通;考察G的边集E中的每条边,若它的两个顶点在T中不连通,则将此边添加到T中,同时合并其两顶点所在的连通分量,如此下去,当添加了n-1条边时,T的连通分量个数为1,T便是G的一棵最小生成树。
下面的函数void Kruskal(EdgeType edges[],int n)利用Kruskal算法,构造了有n个顶点的图 edges的最小生成树。其中数组father[]用于记录T中顶点的连通性质:其初值为father[i]=-1 (i=0,1,…,n-1),表示各个顶点在不同的连通分量上;若有father[i]=j,j>-1,则顶点i,j连通;函数int Find(int father[],int v)用于返回顶点v所在树形连通分支的根结点。
[函数]
#define MAXEDGE 1000
typedef struct
{ int v1;
int v2;
}EdgeType;
void Kruskal(EdgeType edges[],int n)
{ int father[MAXEDGE];
int i,j,vf1,vt2;
for(i=0;i<n;i+ +) father[i]=-1;
i=0;
j=0;
while(i<MAXEDGE
vf2=Find(father,edges[i].v2);
if({{U}} (2) {{/U}})
{ {{U}}(3) {{/U}}=vf1;
{{U}}(4) {{/U}};
printf("%3d%3d/n",edges[i].v1,edges[i].v2);
}
{{U}} (5) {{/U}};
}
}
int Find(int father[],int v)
{ int t;
t=v;
while(father[t]>=0) t=father[t];
return(t);
}
问答题阅读下列说明、图和Java代码,回答问题1至问题3。【说明】已知四个类之间的关系如图2-4所示,分别对每个类的方法进行编号,例如Shape的perimeter()为1号,表示为1:perimeter(),Rectangle类的perimeter()为2号,表示为2:perimeter(),依此类推,其中,每个类的perimeter方法签名相同。【Java代码】Triangletr=newTriangle();Squaresq=newSquare();Shapesh=tr;
问答题【应用说明】某交通灯演示程序启动后,其运行窗口中包括红绿灯标志以及当前红绿灯状态剩余秒数的动态显示(如下图)。红灯与绿灯持续的时间分别为30秒与40秒。持续时间结束时,立即变更红绿灯,并重新显示剩余秒数。【VisualBasic开发说明】在开发过程中,先在窗体内制作形状“红绿灯框架”(长方形,透明),在该框架中,上部制作形状“红灯”(ShpRed,圆形),默认属性为透明;下部制作形状“绿灯”(ShpGreen,圆形),初始设置其填充方式属性FillStyle为实心,填充颜色属性FillColor为绿色。再设置两个图像框(Image1在左,Image2在右),使其能分别装入数字图像文件,以显示当前红绿灯状态剩余的秒数。10个数字图像文件N0.bmp~N9.bmp分别用于显示数字0、1、…、9,这些文件存放在该应用程序所在目录中,以便在程序运行时按需要选择装入这两个图像框。为使图像文件装入图像框时能自动改变大小以适应图像框,这些图像框的Stretch属性都应设置成{{U}}(1){{/U}}。为使这些数字能每秒变化一次,开发窗体中设置了计时器Timcr1,其Enable属性设置成True,其Interval属性设置成1000。程序中,全局变量Light用以标志当前红灯(0)或绿灯状态(1),RedT和GreenT分别表示红灯或绿灯状态剩余的秒数。计时器Timer1的定时过程是在该程序启动1秒后首次执行的,以后每隔1秒执行1次。开发者应考虑对以下四种情况的处理:绿灯持续、绿灯转红灯、红灯持续、红灯转绿灯。过程LoadNumber的功能是:将红绿灯剩余秒数N(2位整数)分离出两个一位数i与i,再将其变换成字符,删除前面可能产生的空格,再将数字图像文件Ni.bmp与Nj.bmp装入两个图像框(其中i与j应以相应的数字字符代替)。【VisualBasic程序代码】PublicLightASInteger,RedTAsInteger,GreenTAsIntegerPrivateSubForm_Load()Light=1:GreenT=40:RedT-0'初始化设置EndSubPrivateSubTimer1_Timer()'计时器定时过程IfLight=1Then'绿灯状态时{{U}}(2){{/U}}IfGreenT>0Then'绿灯持续时CallLoadNumber(GreenT)'调用过程,显示数字GreenTElse'绿灯转红灯时ShpRed.FillStyle=0'置红灯形状实心ShpRed.FillColor=vbRed'为红灯形状填充红色ShpGreen.FillStyle=1'置绿灯形状透明CallLoadNumber(30)Light=0:RedT=30EndIfElse'红灯状态时RedT=RedT-1IfRedT>0Then'红灯持续时CallLoadNumber(RedT)Else'红灯转绿灯时ShpRed.FillStyle=1ShpGreen.FillStyle=0ShpGreen.FillColor=vbGreen{{U}}(3){{/U}}Light=1:GreenT=40EndIfEndIfEndSubSubLoadXumber(NAsInteger)'根据剩余秒数N将数字图象装入图像框DimiAsInteger,jAsIntegeri=Int({{U}}(4){{/U}})j={{U}}(5){{/U}}Image1.Picture=LoadPicture("N"&Trim(Str(i))&".bmp")'显示十位上的数字Image2.Picture=LoadPicture("N"&Trim(Str(j))&".bmp")'显示个位上的数字EndSub
问答题[说明]本程序提供了三阶矩阵加、减及乘运算的功能。用户单击“生成操作数”按钮将随机生成两个矩阵(即操作数1和操作数2),再单击某一矩阵运算按钮后,程序将输出相应运算的结果。程序运行界面如下:开发过程中,界面上从左至右三个文本框分别取名为Text1至Text3,“生成操作数”按钮名为CmdNew,“+”、“-”和“*”构成按钮控件组,分别名为CmdOperate(0)、CmdOperate(1)和CmdOperate(2)。已知n阶矩阵加、减法运算法则是对应位置的元素相加、减;n阶矩阵的乘法C=AB有公式:Cij=AilBij+AilBij+…+An1Bnj其中记号Xij表示矩阵X第i行第j列上的元素。程序使用的主要变量是三维数组matrix(3,3,3),其元素matrix(i,j,k)代表第i个矩阵j行k列上的元素,这里i,j,k均从0开始计数,第0、1、2个矩阵分别表示操作数1、操作数2和结果矩阵。代码中用到的子过程及其功能说明如下:(1)SubnewMatrices():随机产生矩阵运算的两个操作数;(2)SubprintOut(txtAsTextBox,iAsIntegcr):定义矩阵i向文本框txt的输出格式;(3)Suboperate(operationAsString):计算并输出矩阵运算结果。[VisualBasic代码]Dimmatrix(3,3,3)AsIntegerSubnewMatrices()………EndSubSubprintOut(txtAsTextBox,iAsInteger)………EndSubSuboperate(operationAsString)Dimi,j,kAsIntegerFori=0To2Forj=0To2{{U}}(1){{/U}}Case"+":matrix(2,i,j)=matrix(0,i,j)+matrix(1,i,j)Case"-":matrix(2,i,j)=matrix(0,i,j)-matrix(1,i,j)Case"*"matrix(2,i,j)=0Fork=0To2matrix(2,i,j)=matrix(2,i,j)+{{U}}(2){{/U}}NextEndSelectNextNextprintOut{{U}}(3){{/U}}EndSubPrivateSubCmdNew_Cliek()’“生成操作数”按钮的单击事件响应代码{{U}}(4){{/U}}printoutText1,0printoutText2,1EndSubPrivateSubCmdOperale_Click(IndexAsInteger)’矩阵运算按钮组的单击事件响应代码operateCmdOperate(Index).{{U}}(5){{/U}}EndSub
问答题[说明]
本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宜布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9:重复上述步骤,再取走最小数3,宣布它为素数,井取走3的倍数,于是留下5、7。反复重复上述步骤,直至筛中为空时,工作结束,求得2至 10中的全部素数。
程序中用数组sieve表示筛子,数组元素sieve[i]的值为1时,表示数i在筛子中,值为-1时表示数i已被取走。
[程序]
#include < stdio, h >
#define MAX 22500
main( )
{ unsigned int i , range , factor , k;
int sieve[MAX];
prinff( "please input the 'range:" );
scanf(" %d" , /* range 指出在多大的范围内寻找素数* /
for(i=2 ;i<=range; i++){{U}} (1) {{/U}}; /*筛子初始化*/
factor = 2 ;
while (factor < = range) {
if({{U}} (2) {{/U}}= = 1)l /*筛子中最小数是素数*/
pfinff( "% d/t" ,factor);
k = factor;
while (k < =range) { /* 取走素数的倍数*/
{{U}}(3) {{/U}};
k={{U}} (4) {{/U}};
factor + +;
}
}[问题1]将程序代码中的(1)~(4)处补充完整。
[问题2]在上述代码的执行过程中,若factor为5,从筛子中取走的头两个数是5和{{U}} (5) {{/U}}。
问答题【说明】
函数print(BinTreeNode*t; DateType DateType int i, top; top = 0;//置空栈
while(t! = NULL
ST[top]. ptr = t;
ST[top]. tag = 0;
{{U}}(2) {{/U}};
}
if(t!= Null {{U}}(3) {{/U}};i ++)
printf("%d" ,ST[top]. ptr ->data);
else {
while({{U}} (4) {{/U}})
top--;
if(top>0)
{
ST[top]. tag = 1;
{{U}} (5) {{/U}};
}
}
}
问答题【说明】
字符串在程序设计中扮演着重要角色。现需要设计字符串基类string,包含设置字 符串、返回字符串长度及内容等功能。另有一个具有编辑功能的串类edlt_string,派生于string,在其中设置一个光标,使其能支持在光标处的插入、删除操作。
【程序】
#include <iostream.h>
#include <stdio.h>
#include <string.h>
class string
{
int length;
char *data;
public:
int get_length() {return length;}
char *get_data() {return data;}
~string() {delete data;}
int set data(int in_length, char *in_data);
int set_data(char *data);
void print() {cout<<data<<endl;}
};
class edit_string: public string
{
int cursor;
public:
int get_cursor() {return cursor;}
void move_cursor(int dis) {cursor=dis;}
int add_data(string *new_data);
void delete_data(int num);
};
int string::set_data(int in_length,char *in_data)
{
length=in_length;
if(!data)
delete data;
{{U}} (1) {{/U}}
strcpy(data,in_data);
return length;
}
int string::set data(char *in_data)
{
{{U}} (2) {{/U}}
if(!data)
delete data;
{{U}} (1) {{/U}}
strcpy(data,in_data);
return length;
}
int edit_string::add_data(string *new_data)
{
int n,k,m;
char *cp,*pt;
n=new_data->get_length();
pt=new_data->get_data();
cp=this->get_data();
m=this->get_length();
char *news=new char[n+m+1];
for(int i=0; i<cursor; i++)
news[i]=cp[i];
k=i;
for(int j=0; j<n; i++,j++)
news[i]=pt[j];
cursor=i;
for(j=k; j<m; j++,i++)
{{U}} (3) {{/U}}
news[i]='/0';
{{U}} (4) {{/U}}
delete news;
return cursor;
}
void edit string::delete_data( int num)
{
int m;
char *cp;
cp=this->get_data();
m=this->get_length();
for(int i=cursor; i<m; i++)
{{U}} (5) {{/U}}
cp[i]='/0';
}
问答题【说明】对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合a,b,c,d及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。表6-14结构数组Ht数组下标chweightparentlchildrchild1 a 2 5 0 02 b 7 7 0 03 c 4 5 0 04 e 5 6 0 05 6 6 1 36 11 7 4 57 18 0 2 6结构数组Ht的类型定义如下:#defineMAXLEAFNUM20structnodecharch;/*扫当前节点表示的字符,对于非叶子节点,此域不用*/Intweight;/*当前节点的权值*/intparent;/*当前节点的父节点的下标,为0时表示无父节点*/intlchild,rchild;/*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/)Ht[2*MAXLEAFNUM];用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数voidLeafCode(introot,intn)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。函数voidDecode(char*buff,introot)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。【函数4.1】char**HC;voidLeafCode(introot,intn)/*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/intI,p=root,cdlen=0;charcode[20];Hc=(char**)malloc((n+1)*sizeof(char*));/*申请字符指针数组*/For(i=1;i<=p;++I)Ht[i].weight=0;/*遍历最优二叉树时用做被遍历节点的状态标志*/While(p)/*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/If(Ht[p].weight==0)/*向左*/Ht[p].weight=1;If(Ht[p].lchild!=0)p=Ht[p].lchild;code[cdlen++]='0';elseif(Ht[p].rchild==0)/*若是叶子节点,则保存其前缀编码*/Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));(1);strcpy(Hc[p],code);elseif(Ht[p].weight==1)/*向右*/Ht[p].weight=2;If(Ht[p].rchild!=0)p=Ht[p].rchild;code[cdlen++]='1';else/*Ht[p].weight==2,回退/Ht[p].weight=0;p=(2);(3);/*退回父节点*//*while.结束*/【函数4.2】voidDecode(char*buff,introot)intpre=root,p;while(*buff!='/0')p=root;while(p!=0)/*存在下标为p的节点*/pre=p;if((4))p=Ht[p].lchild;/*进入左子树*/elsep=Ht[p].rchild;/*进入右子树*/elsebuff++;/*指向前缀编码序列的下一个字符*/(5);printf("%c",Hr[pre].ch);
问答题【说明】 设计一个类模板SamPle用于对一个有序数组采用二分法查找元素下标。 【C++程序】 #include < iostream. h > #define Max 100 //最多元素个数 template < class T > class Sample T A[Max]: //存放有序数序 int n: //实际元素个数 public Sample( ) //默认构造函数 Sample(T a[] ,int i); //初始化构造函数 int seek(T c); void disp( ) for(int i=0;i <n;i ++) cout<<A[i] <<" "; cout<<endl: template < class T > Sample <T>: :Sample(T a[ ],int i) n=i: for( intj =0;j < i;j ++ ) (1) ; template < class T > int Sample < T >:: seek( T c) int low =0,high = n-1 ,mid; while( (2) ) mid = (low + high)/2; if( (3) ) return mid; else if( (4) ) low=mid+|; else (5) ; return-1; void main( ) char a[ ] ="acegkmpwxz"; Sample < char > s(a, 1); cout<<"元素序列:" ;s. disp( ); cout<<"元素'g'的下标:"<<s. seek('g') <<endl;
问答题【说明】
已知窗体上有两个名为cmdGene和cmdSort的命令按钮。单击cmdCene按钮时,随机产生10个[1,100]范围内的整数并将它们放在数组intA中;单击cmdSort按钮时,用选择法排序这10个数并输出。
【程序代码】
Dim intA(1 To 10)As integer
Private Sub cmdGene_Click( )
Dim intl As Integer
Randomize
For intl = 1 To 10
intA(intl) = {{U}}(1) {{/U}}
Next intl
End Sub
Private Sub cmdSort_Click( )
Dim intl, intJ,intMin, intTemp As Integer
For intl = 1 To 9
intMin = intA(intl)
For intJ={{U}} (2) {{/U}}To 10
If intA(intJ) < intMin Then
Temp = intA(intJ)
intA(intJ)={{U}} (3) {{/U}}
intMin = intTemp
End If
Next intJ
{{U}} (4) {{/U}}
{{U}} (5) {{/U}}
For intl = 1 To 10
Print Str(intA(intl))+" ";
Next intl
Next lntl
Print
End Sub
问答题试题二(共15 分)
阅读以下说明和C 函数,将应填入(n) 处的字句写在答题纸的对应栏内。
[说明]
某单位准备进行一次选举,对指定的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),从有效选票中统计每位候选者的得
char str[80]; /* str 保存读入的一张选票数据 */
int i,tag = 0; /* tag 用于判断每张选票是否有效 */
int q = 0; /* q 用于计算有效选票数 */
for(i = 0; i < n; i++)
candidate[i] = 0;
while ( (1) ) {
fgets(str,80,fp); /* 读入一张选票数据 */
for(tag = 0,i = 0; (2) ; i++)
if (str[i] == '1') tag++;
if ( (3) ){ /* 若是有效选票,则进行统计 */
(4) ;
for(i = 0; i < n; i++)
if (str[i] == '1') (5) ;
}
}
return q;
}/* statistic */
票数并存入candidate[],函数返回有效选票数*/
问答题【说明】某机动车驾驶员模拟考试系统的“交通禁令标志识别”窗体中,共有1个按钮(CmdTest)、6个标签、1个包含10个单选按钮的控件数组(OptPicture),如图2-15所示。其中,标签(LblPrompt1)“禁令标志”与标签(LblTest)相对应,标签(LblPrompt2)“图片答案”与标签(LblAnswer)相对应,标签(LblEvaluate)为结果提示。窗体(Frm001)对象和单选按钮控件数组(OptPicture)对象的部分属性及属性值如表2-15所示。表2-15窗体、单选按钮控件数组的部分属性及属性值对 象属 性属性值窗体(名称)Frm001Icon变通标识MaxButton(1)MinButton(2)单选按钮控件数组(名称)optPictureIndex(3)Style1-GraghicsPicture(装入相应图片)该程序运行时,单击【测试】按钮(CmdTest),在标签(LblTest)中随机显示一个交通禁令标志名称,用户单击控件数组(OptPicture)相应单选按钮后,程序在标签(LblAnswer)给出用户所击单选按钮对应的交通禁令标志名称,在标签(LblEvaluate)给出正确或错误的提示结果,如图2-15和图2-16所示。【VisualBasic程序】Dim(4)AsStringPrivateSubcmdTest_Click()DimiAsIntegerFori=0To9(5)NextilblPrompt2.Visible=FalselblAnswer.Visible=FalselblEvaluate.Visible=Falsei=Int(Rnd*10)lblTest.Caption=tname(i)EndSubPrivateSubForm_Load()DimiAsIntegerFori=0To9optPicture(i).Value=False(6)lblPrompt2.Visible=FalselblAnswer.Visible=FalselblEvaluate.Visible=Falsetname(0)="禁止向左向右转弯"tname(1)="禁止直行和向右转弯道"tname(2)="禁止直行和向左转弯"tname(3)="禁止驶入"tname(4)="禁止掉头"tname(5)="禁止车辆长时停放"tname(6)="禁止机动车通行"tname(7)="禁止非机动车通行"tname(8)="禁止超车"tname(9)="禁止车辆临时或长时停放"EndSubPrivateSuboptPicture_Click(IndexAsInteger)lblPrompt2.Visible=TruelblAnswer.Visible=(7)lblEvaluate.Visible=TruelblAnswer.Caption=(8)If(9)ThenlblEvaluate.ForeColor=vbRedlblEvaluate.Caption="恭喜你!回答正确!"ElselblEvaluate.ForeColor=vbBluelblEvaluate.Caption="很遗憾,回答错误。"EndIfEndSub1.【问题1】请根据图2-15和图2-16的显示效果和【VisualBasic程序】,将表2-15中窗体对象、单选按钮控件数组对象的(1)~(3)空缺处的属性值填写完整。
问答题【说明】已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。图2-1(a)、(b)是经函数compress()处理前后的链表结构示例图。链表的结点类型定义如下:typedefstructNode{intdata;structNode*next;}NODE;【C语言函数】voidcompress(NODE*head){NODE*ptr,*q;ptr={{U}}(1){{/U}};/*取得第一个元素结点的指针*/while({{U}}(2){{/U}}&&ptr->next){q=ptr->next;while(q&&{{U}}(3){{/U}}){/*处理重复元素*/{{U}}(4){{/U}}q->next;free(q);q=ptr->next;}{{U}}(5){{/U}}ptr->next;}/*endofwhile*/}/*endofcompress*/
