问答题【说明】该应用程序是用来修改文本框中的字体属性,其运行窗口如图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*/
问答题要求执行该段程序后能弹出一个对话框,对话框中有“确定”和“取消”按钮,以及一个带问号的图标,并要求第一个按钮为默认按钮。
Private Sub Form_Load()
MsgBox"要重新输入吗?"______,"询问"
End Sub
问答题【说明】本应用程序是一个乘法计算器,其运行窗口如图2所示。在该界面中,“被乘数”、“乘数”以及“积”等文字为标签,相应的3个输入输出数据框为文本框,此外还有3个命令按钮。用户在“被乘数”和“乘数”相应的文本框内输入数据,再单击“运算”按钮,便能在“积”对应的文本框中看到相乘的结果;当用户单击“清除”按钮时,就会清除各文本框中的数据;当用户单击“关闭”按钮时就会关闭该窗口并退出应用程序。用户不能在“积”对应的文本框中输入数据。【属性设置】各个对象、有关的属性名以及需要修改的属性值设计如下:对象对象名属性名属性值窗体frmMultiplyCaption乘法计算器标签1Lbl1Caption被乘数:标签2Lbl2Caption乘数:标签3Lbl3Caption积:文本框1Txt1Text(空)文本框2Txt2Text(空)文本框3Txt3Text(空)Enabled (1) 按钮1 (2) Caption运算按钮2cmdClearCaption清空按钮3cmdCloseCaption退出【程序】PrivateSubcmdMultiply_Click()txt3.Text=Trim(Str$((3))'加法运算获得和数EndSubPrivateSub(4)(txt1.Text=""'空字符串赋值给文本框txt1的内容txt2.Text=""'空字符串赋值给文本框txt2的内容txt3.Text=""'空字符串赋值给文本框txt3的内容EndSubPrivateSubcmdClose_Click()(5)'退出应用程序EndSub
问答题【应用说明】某应用程序可选择打开用户指定的文本文件,将其内容显示在指定的文本框内供用户编辑,并将编辑后的结果保存在用户指定的文件中。运行时的窗口如图6-1所示,其中有6个标签、一个驱动器列表框、一个目录列表框、一个文件列表框、一个文件类型组合框、一个文件编辑文本框、一个文件名文本框以及两个命令按钮。该程序的开发要求如下。(1)通过驱动器列表框(Drivel)、目录列表框(Dirl)和文件列表框(Filel),选择文件。(2)文件类型组合框(Cmb_type)设置为下拉式列表框,其中有三个供选项,分别为“所有文件(*.*)”、“文本文件(*.txt)”和“可执行文件(*.exe)”。在文件列表框中列出的文件类型会自动与文件类型组合框中选择的文件类型相匹配。(3)在文件列表框中单击一个文件名时,该文件名会显示在文件名文本框(Txtfilename)中。(4)在文件列表框中双击一个文件名时,若是文本文件,则在文件编辑文本框(Txtfile)中显示该文件的内容并可进行编辑;若不是文本文件,则弹出一个对话框,提示“请选择文本文件!”。(5)对于编辑后的文本文件,可在文件名文本框中输入新的文件名,并单击命令按钮(Cmdsave)进行保存。【VisualBasic程序代码】PrivateSubForm_Load()Cmb_type.Addltem"所有文件(*.*)"Cmb_type.Addltem"文本文件(*.txt)"Cmb_type.Addltem"可执行文件(*.exe)"Cmb_type.ListIndex=0Filel.Pattern="*.*":Txt_filename.Text=""Txt_file.Text=""EndSubPrivateSubDirlChange()Filel.Path={{U}}(1){{/U}}EndSubPrivateSubDrivelChange()Dirl.Path=Drivel.DriveEndSubPrivateSubCmb_type_click()SelectCaseCmb_type.{{U}}(2){{/U}}Case0Filel.Pattern="*.*"Case1Filel.Pattern="*.txt"Case2Filel.Pattern="*.exe"EndSelectEndSubPrivateSubCmd_save_Click()usrFile=GetFileName()'函数GetFileName获得要保存的文件名OpenusrFileForOutputAs#1'定义usrFile为1号输出文件Print#1,Txtfile.Text'输出到1号文件Close#1EndSubPrivateSubFilel_DblClick()Ifright(Filel.FileName,3)<>{{U}}(3){{/U}}ThenMsgBox"请选择文本文件!"ExitSubEndIfusrFile=GetFileName()'函数GetFileName获得要打开的文件名OpenusrFileForInputAs#1'定义usrFile为1号输入文件Txt_file.Text=""DOWhile{{U}}(4){{/U}}EOF(1)LineInput#l,fContext'从1号文件读入一行Txt_file.Text;Txtfile.Text+{{U}}(5){{/U}}+vbCrLfLoopClose#1EndSub'其他代码略
问答题【说明】
某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件dial.txt,其数据格式如下:
拨入或拨出标记通话开始时间通话结束时间对方号码 注1:数据字段以一个空格作为分隔符。
注2:拨入和拨出标记均为小写字母。拨入标记为i,表示其他用户呼叫本机,本机用户不需付费:拨出标记为o,表示本机呼叫其他用户,此时本机用户需要付费。
注3:通话开始和结束时间的格式均为HH:MM:SS。其中HH表示小时,取值00~ 23;MM表示分钟,取值00~59;SS表示秒,取值00~59。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为1秒,最长不超过24小时。
注4:跨月的通话记录计入下个月的通话数据文件。
例如“o23:01:1200:12:15…”表示本次通话是本机呼叫其他用户,时间从23时01分12秒至次日的0时12分15秒,通话时间为71分03秒。
下面程序的功能是计算并输出该用户本月电话费(单位:元)。
通话计费规则为:
1.月通话费按每次通话费累加;
2.每次的通话费按通话时间每分钟0.08元计算,不足1分钟时按1分钟计费。
对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日0点0分0秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。
例如,若输入文件dial.txt的数据如下所示,则输出fee=7.44。
o 14:05:23 14:11:25 82346789
i 15:10:00 16:01:15 13890000000
o 10:53:12 11:07:05 63000123
o 23:01:12 00:12:15 13356789001
【C程序代码】
#include<stdio.h>
FILE *fin;
Int main()
{
char str[80];
int h1,h2,m1,m2,s1,s2;
long t_start,t_end,interval;
int c;
double fee=0;
fin=fopen("dial.txt","r");
if (!fin)
return-1;
while (!feof(fin)) {
if (!fgets(str,80,fin)) break;
if ({{U}} (1) {{/U}}) continue;
h1= (str[2] -48) *10+str[3] -48;
m1= (str[5] -48) *10+str[6] -48;
s1= (str[8] -48) *10+str[9] -48;
h2= (str[11] -48) *10+str[12] -48;
m2= (str[14] -48) *10+str[15] -48;
s2=(str[17]-48)*10+str[18]-48;
t_start=h1*60*60+m1*60+s1; /*通话开始时间*/
t_end=h2*60*60+m2.60+s2; /*通话结束时间*/
if({{U}} (2) {{/U}}) /*若通话开始和结束时间跨日*/
interval;{{U}} (3) {{/U}}-t_start+t_end;
else
interval=t_end-t_start;
c= {{U}}(4) {{/U}}; /*计算完整分钟数表示的通话时间*/
if (interval % 60)
{{U}} (5) {{/U}};
fee+=c*0.08;
}
fclose(fin);
printf("fee=%.2lf/n",fee);
return 0;
}
问答题试题三(共15分)阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。[说明]函数Insert_key(*root,key)的功能是将键值key插入到*root指向根结点的二叉查找树中(二叉查找树为空时*root为空指针)。若给定的二叉查找树中已经包含键值为key的结点,则不进行插入操作并返回0;否则申请新结点、存入key的值并将新结点加入树中,返回1。提示:二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树:·若它的左子树非空,则其左子树上所有结点的键值均小于根结点的键值;·若它的右子树非空,则其右子树上所有结点的键值均大于根结点的键值;·左、右子树本身就是二叉查找树。设二叉查找树采用二叉链表存储结构,链表结点类型定义如下:[C函数]
