阅读以下说明和算法,完善算法并回答问题。
【说明】
假设以二维数组G[1..m,1..n)表示一幅图像各像素的颜色,则G[i,j]表示区域中点(i,j)处的颜色,颜色值为0~k的整数。
下面的算法将指定点(i0,j0)所在的同色邻接区域的颜色置换为给定的颜色值。约定所有与点(i0,j0)同色的上、下、左、右可连通的点组成同色邻接区域。
例如,一幅8×9像素的图像如图2-1所示。设用户指定点(3,5),其颜色值为0,此时其上方(2,5)、下方(4,5)、右方(3,6)邻接点的颜色值都为0,因此这些点属于点(3,5)所在的同色邻接区域,再从上、下、左、右四个方向进行扩展,可得出该同色邻接区域的其他点(见图2-1中的阴影部分)。将上述同色区域的颜色替换为颜色值7所得的新图像如图2-2所示。
【算法】
输入:矩阵G,点的坐标(i0,j0),新颜色值newcolor。
输出:点(i0,j0)所在同色邻接区域的颜色置换为newcolor之后的矩阵G。
算法步骤(为规范算法,规定该算法只在第七步后结束)如下。
第一步:若点(i0,j0)的颜色值与新颜色值newcolor相同,则(1);
第二步:点(i0,j0)的颜色值→oldcolon创建栈S,并将点坐标(i0,j0)入栈;
第三步;若(2),则转第七步;
第四步;栈顶元素出栈→(x,y),并(3);
第五步;1)若点(x,y-1)在图像中且G[x,y-1]等于oldcolor,则(x,y-1)入栈S;
2)若点(x,y+1)在图像中且GIx,y+1]等于oldeolor,则(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) 。
第1题
试题二(共15分)
阅读以下说明和C程序代码,将解答写在答题纸的对应栏内。
【说明】
下面是一个待修改的C程序,其应该完成的功能是:对于输入的一个整数num,计算其位数k,然后将其各位数字按逆序转换为字符串保存并输出。若num为负整数,则输出字符串应有前缀“-”。例如,将该程序修改正确后,运行时若输入“14251”,则输出“15241”;若输入“-6319870”,则输出“-0789136”。
下面给出的C程序代码中有五处错误,请指出错误代码所在的行号并给出修改正确后的完整代码行。
【C程序代码】
第2题
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。
[说明]
已知一棵二叉树用二叉链表存储,t指向根结点,p指向树中任一结点。下列算法为输出从t到P之间路径上的结点。
[C程序]
define Maxsize 1000
typedef struct node{
TelemType data;
struct node*1child,*rchild;
}BiNode,*BiTree;
void Path(BiTree t,BiNode*P)
{ BiTree*stack[Maxsize],*stackl[Maxsize],*q;
int tag[Maxsize],top=0,topl;
q=t;
/*通过先序遍历发现P*/
do(while(q!=NULL && q!=p)
/*扫描左孩子,且相应的结点不为P*/
{ (1);
stack[top]=q;
tag[top]=0;
(2);
}
if(top>0)
{ if(stack[top]==P) break; /*找到P,栈底到栈顶为t到P*/
if(tag[top]==1)top--;
else{q=stack[top];
q=q->rchild;
tag[top]=1;
}
}
} (3);
top--; topl=0;
while(top>0){
q=stack[top]; /*反向打印准备*/
topl++;
(4);
top--;
}
while((5)){ /*打印栈的内容*/
q=stackl[topl];
printf(q->data);
topl--;
}
}
第3题
阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。
[说明]
下面程序是为汽车市场编制的一个程序的一部分。其中automobile是基类。
[C++程序]
//Auto.h
ifndef AUTO_H
define AUTO_H
class automobile
{
(1):
int miles_per_gallon; //汽车每加仑行驶公里数
float fuel_capacity; //油箱容积
public:
void initialize(int in_mpg,int in_fuel);
int get_mpg(void);
float get_fuel(void);
float travel_distance(void);
}
endif
//Auto.cpp
include"auto.h"
void automobile::initialize(int in_mpg,float in fuel)
{
miles_per_gallon=in_mpg;
fuel_capacity=in_fuel;
)
int automobile::get_mpg() //提供一辆特定汽车每加仑公里数
{return miles per_gallon;}
float automobile::get_fuel() //提供油箱容积
{return fuel_capacity;}
float automobile::travel_distance()
{return (2) }
//car.h
ifndef CAR_H
define CAR_H
include"auto.h"
class car: (3)
{
int Total_doors;
public:
void initialize(int in_mpg,float in_fuel,int doors=4);
int doors(void);
};
endif
//car.cpp
include"car.h"
void car::initialize(int in_mpg,float in_fuel,int door)
{
Total_doors=door;
miles_per_galion=in_mpg;
fuel_capacity=in_fuel;
}
int car::doors(void)
{return Total doors;}
//Allauto.cpp
include
include"auto.h"
include"car.h"
int main()
{
car sedan;
sedan.initialize(24,20.0,4);
tout<<"The sedan can travel"<< (4) <<"miles.\n";
cout<<"The sedan has"<< (5) <<"doors.\n";
return 0;
}
第4题
阅读以下应用说明、Visual Basic开发说明以及程序代码,将应填入(n)的字句写在对应栏内。
【应用说明】
某交通灯演示程序启动后,其运行窗口中包括红绿灯标志以及当前红绿灯状态剩余秒数的动态显示(如下图)。红灯与绿灯持续的时间分别为30秒与40秒。持续时间结束时,立即变更红绿灯,并重新显示剩余秒数。
【Visual Basic开发说明】
在开发过程中,先在窗体内制作形状“红绿灯框架”(长方形,透明),在该框架中,上部制作形状“红灯”(ShpRed,圆形),默认属性为透明;下部制作形状“绿灯” (ShpGreen,圆形),初始设置其填充方式属性FillStyle为实心,填充颜色属性FillColor为绿色。
再设置两个图像框(Image1在左,Image2在右),使其能分别装入数字图像文件,以显示当前红绿灯状态剩余的秒数。10个数字图像文件N0.bmp~N9.bmp分别用于显示数字0、1、…、9,这些文件存放在该应用程序所在目录中,以便在程序运行时按需要选择装入这两个图像框。为使图像文件装入图像框时能自动改变大小以适应图像框,这些图像框的Stretch属性都应设置成(1)。为使这些数字能每秒变化一次,开发窗体中设置了计时器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应以相应的数字字符代替)。
【Visual Basic程序代码】
Public Light AS Integer, RedT As Integer, GreenT As Integer
Private Sub Form_Load()
Light = 1 : GreenT = 40 : RedT - 0 '初始化设置
End Sub
Private Sub Timer1_Timer() '计时器定时过程
If Light = 1 Then '绿灯状态时
(2)
If GreenT > 0 Then '绿灯持续时
Call LoadNumber (GreenT) '调用过程,显示数字GreenT
Else '绿灯转红灯时
ShpRed.FillStyle. = 0 '置红灯形状实心
ShpRed.FillColor = vbRed '为红灯形状填充红色
ShpGreen.FillStyle. = 1 '置绿灯形状透明
Call LoadNumber(30)
Light = 0 : RedT = 30
End If
Else '红灯状态时
RedT = RedT - 1
If RedT > 0 Then '红灯持续时
Call LoadNumber(RedT)
Else '红灯转绿灯时
ShpRed.FillStyle. = 1
ShpGreen.FillStyle. = 0
ShpGreen.FillColor = vbGreen
(3)
Light = 1 : GreenT = 40
End If
End If
End Sub
Sub LoadXumber (N As Integer) '根据剩余秒数N将数字图象装入图像框
Dim i As Integer, j As Integer
i = Int( (4) )
j = (5)
Image1.Picture = LoadPicture("N"&Trim(Str(i))&".bmp") '显示十位上的数字
Image2.Picture = LoadPicture("N"&Trim(Str(j))&".bmp") '显示个位上的数字
End Sub
第5题
阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。
【说明】
函数sort (NODE *head)的功能是;用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻结点中的元素,若较小的元素在前面,则交换这两个结点中的元素值。其中,head指向链表的头结点。排序时,为了避免每趟都扫描到链表的尾结点,设置一个指针endptr,使其指向下趟扫描需要到达的最后一个结点。例如,对于图4-1(a)的链表进行一趟冒泡排序后,得到图4-1(b)所示的链表。
链表的结点类型定义如下:
typedef struct Node {
int data;
struct Node *next;
} NODE;
【C语言函数】
void sort (NODE *head)
{ NODE *ptr,*preptr, *endptr;
int tempdata;
ptr = head -> next;
while ((1)) /*查找表尾结点*/
ptr = ptr -> next;
endptr = ptr; /*令endptr指向表尾结点*/
ptr =(2);
while(ptr != endptr) {
while((3)) {
if (ptr->data > ptr->next->data){
tempdata = ptr->data; /*交换相邻结点的数据*/
ptr->data = ptr->next->data;
ptr->next->data = tempdata;
}
preptr =(4); ptr = ptr -> next;
}
endptr =(5); ptr = head->next;
}
}
第6题
阅读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
本流程图采用“双向冒泡法”实现对数组a[n]的排序。双向冒泡法就是在逐步缩小的数组内,分别从数组的两端开始向内搜索,同时将大数往上浮,小数往下沉,每次交换一组数。flag是一个标志,发生过交换就置为1,当这个循环过程都不再发生交换时,则数组排序完成。
注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述;
定义swAP[a,b]为将a和b两数交换。
[问题]
将流程图的(1)~(5)处补充完整。
第7题
阅读以下说明和C程序,将应填入(n)处的字句写在对应栏内。
【说明】
下面的程序按照以下规则输出给定名词的复数形式。
a.若名词以“y”结尾,则删除y并添加“ies”;
b.若名词以“s”、“ch”或“sh”结尾,则添加“es”;
c.其他所有情况,直接添加“s”。
【C程序】
include <stdio.h>
include <string.h>
char*plural(char *word)
{
int n;
char *pstr;
n=strlen(word); /*求给定单词的长度*/
pstr=(char*)malloc(n+3);/*申请给定单词的复数形式存储空间*/
if (!pstr||n<2)
return NULL;
strcpy(pstr,word); /*复制给定单词*/
if ((1))
{
pstr[n-1]='i';pstr[n] ='e';pstr[n+1]='s';(2);
}
else
if(pstr[n-1]=='s'| |pstr[n-1]=='h'&&((3)))
{
pstr[n]='e';pstr[n+1]='s';pstr[n+2]='\0';
}
else
{ pstr[n]='s';pstr[n+1]='\0';)
(4);
}
main()
{ int i; char *ps;
char wc[9][10]=
{"chair","dairy","boss","circus","fly","dog","church","clue","dish");
for(i = 0;i<9; i++) {
ps= (5) ;
printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
system("pause");
}
第8题
阅读以下说明和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<figures.1ength;i++){
System.out.println(figures[i]+"area="+figures[i].getArea());
}
}
}
public abstract class Figure{
public abstract double SetAJea();
public class Rectangle extends (1) {
double height;
double width;
public Rectangle(double height,double width){
this.height=height;
this.width=width;
}
public String toString(){
return "Rectangle:height="+height+",width="+width+":";
}
public double getArea() { return (2);
} } public class Square extends (3) {
public Square(double width) {
(4);
}
public String toString() {
return "Square:width="+width+":";
} } public class Triangle extends (5). {
double la;
double lb;
double lc;
public Triangle(double la,double lb,double lc) {
this.la=la; this.lb=lb; this.lc=lc;
public String toString(){
return "Triangle: sides="+la+","+lb+","+lc+":";
public double getArea() {
double s=(la+lb+lc)/2.0;
return Math.sqrt(s*(s-la)*(s-lb)*(s?1c));
}
}
第9题
阅读以下应用说明及Visual Basic部分程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
应用说明
设一个简单的“通讯录”存储在一个ACCESS类型的数据库表中,包括姓名、电话和email三个字段。下面的应用程序实现对“通讯录”数据库表中的记录进行增加、删除及修改处理,其运行界面如下:
(1)数据控件(datal)与“通讯录”数据库表相连接,用户可通过“”和“”按钮指定表中的当前记录。
(2)文本框Txt name、Txt phone和Txt email分别与数据库表中的“姓名”、“电话”和“email”字段绑定,用于显示当前记录的内容。
(3)应用程序启动时,“确定”按钮(Cmd ok)和“取消”按钮(Cmd cancel)不可操作,文本框中显示表中的第一条记录,这时文本框处于不可操作状态。
(4)单击“增加”按钮(Cmd_add)或“修改”按钮(Cmd_modify)后,方可以编辑记录内容,同时“增加”、“删除”、“修改”和“退出”按钮变为不可操作状态。“增加”和“修改”操作需通过“确定”和“取消”按钮确认。
(5)单击“删除”按钮(Cmd del)后,弹出对话框,再单击“确定”按钮,当前记录被删除。
程序代码
Private Sub enableop(isEnabled As Boolean)
Txt_name.Enabled=isEnabled: Txt_phone.Enabled=isEnabled
Txt_email.Enabled=isEnabled
Cmd_ok.Enabled=isEnabled: Cmd_eancel.Enabled=isEnabled
Cmd_add.Enabled=Not isEnabled: Cmd_del.Enabled=Not isEnabled
Cmd_end.Enabled=Not isEnabled: Cmd_modify.Enabled=Not isEnabled
EndSub
Private Sub Form_Load()
Call enableop(False)
Data1.Refresh
If Data1 .Recordset. RecordCount = 0 Then
Cmd_del. Enabled= False: Cmd_modify. Enabled=(1)
End If End Sub Private Sub Cmd_add_Cliek() '单击“增加”按钮的代码
Call enableop( (2) )
Datal .Recordset. AddNew '在数据库表中添加一个新记录
Txt name. (3) End Sub Private Sub Crud_del_Click() '单击“删除”按钮的代码
On Error GoTo error3
arts = MsgBox("确定删除吗?", vbYesNo + vblnformafion, "操作提示!")
If (ans = vbYes) Then
Datal.Recordset. (4)
Datal .Recordset. MoveNext
If Datal .Recordset. EOF Then Data l.Refiesh
End If
Exit Sub error3:
MsgBox Err. Description, vbOKOnly, "错误提示!" End Sub Private Sub Cmd_ok_Click() '单击“确定”按钮的代码
On Error GoTo errorl
Datal.Recordset. (5)
Call enableop(False)
Exit Sub error 1:
MsgBox Err. Description, vbOKOnly, "错误提示!"
Datal.UpdateControls
Call enableop(False) End Sub '“修改”和“取消”按钮的程序代码(略)
第10题
内。
【应用4.1】
设应用程序的运行窗口内有一个文字标签(Label)以及一个框架,其中有三个复选框(chk1,chk2,chk3),各个复选框单击事件过程的程序代码如下:
Private Sub chkl_Click()
Label.fontBold=chkl.Value
End Sub
Private Sub chk2_Click()
Label.fontltalic=chk2.Value
End Sub
Private Sub chk3_Click()
Label.fontUnderLine=chk3.Value
End Sub
三个复选框chkl、chk2、chk3的功能分别是:(1)。
【应用4.2】
设应用程序的运行窗口内有两个文本框Txt1和Txt2,其初始内容为空。在Txt1文本框中输入一个数值,当光标离开此文本框(例如进入文本框Txt2)时,执行的程序代码如下:
Private Sub Txt1_LostFocus()
dim x aS double
x=Val(Txtl.Text)
工f x<0 Or x>100 Then
Txtl.Text =""
MsgBox$("请重新输入!")
Txtl.SetFocus
Else
Txt2.Text=Txt1.Text
End If
End Sub
该程序代码的功能是:若在文本框Txtl中输入的数值小于0或大于100,当光标离开此文本框时,(2);否则,将其值复制到文本框Txt2中。
【应用4.3】
在下面的应用中,当窗口内发生C1ick事件时,窗口内将显示如图2-4所示的杨辉三角(每一行都是二项式展开的系数)。请完善程序代码。
Private Sub Form. Click()
Dim i,j,c As Integer,StrTemp AS String
Dim a(9)As Integer
a(0)=0=a(1)=l:StrTemp=Str(a(1))+Space(3)
CurrentX=(ScaleWidth-TextWidth(StrTemp))/2
Print StrTemp
For j=2 TO 9
a(j)=1
For C=j-1 TO 2 Step-1
a(c) =(3)
Next
(4)=""
For c = 1 To j
StrTemp = StrTemp & Str((5)) & Space(5 - Len(Str(a(c))))
Next
CurrentX = (ScaleWidth - TextWidth(StrTemp)) / 2
Print StrTemp
Next End Sub
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!