问答题【应用说明】某电视台拟开发应用程序来显示戏曲大赛中1~4号四位选手决赛的现场投票情况。该程序从现场观众中(不超过2000人)每0.5秒收集一次对这四位选手的支持票数,并在屏幕上动态显示这四位选手的票柱(以高度反映票数)与累计得票数,如图2-3所示。投票过程限时30秒,每名观众最多为1名选手投票。投票结束后系统通过比较各位选手的累计得票数,显示决赛结果:“*号胜出”(如有单个冠军)或“继续进行PK”(如有多人获得相同的最高票数)。在开发该程序的过程中创建的主要控件及其初始属性值说明如下:控件名类型用途初始属性设置ShpM(1to4)形状数组显示各选手得票情况矩形,实心,高度0txtM(1to4)文本框数组显示各选手得票数0cmdStatr命令按钮启动计票标题:开始投票txtResult文本框显示决赛结果空Timl计时器每半秒收集处理一次间隔时间0.5秒,关闭状态 该程序中设置公共变量T动态记录投票时间。四个形状ShpM(1to4)动态增长的底线固定。 【VisualBasic程序代码】 DimTAsInteger'声明全局变量 PrivateSubForm_Load() Fori=1To4 ShpM(i).Top=2000:ShpM(i).Height=0'初始票柱高度为0 TxtM(i).Text=0 Nexti Timl.Enabled=False:Timl.Interval=500:T=0 EndSub PrivateSubCmdStartClick() Timl.Enabled=True '开始投票 CmdStart.Enabled=False EndSub PrivateSubTimlTimer() Dimn(1To4)AsInteger 'n(1to4)为每次收集的票数 DimiAsInteger,jAsInteger DimGAsInteger 'G用于计算最高票数 DimngAsInteger 'ng用于计算冠军个数 Fori=1To4 n(i)=... '收集i号选手的票数,此处省略 TxtM(i).Text=TxtM(i).Text+n(i) '累计票(VB能进行自动转换) ShpM(i).Top=ShpM(i).Top-n(i) ShpM(i).Height=ShpM(i).Height+{{U}}(1){{/U}} '算出票柱高度 Next i T=T+1 '计时 IfT=60Then '投票时间到 {{U}}(2){{/U}} '停止数据收集处理 ng=1 G=TxtM(1).Text Fori=2To4 IfG<TxtM(i).TextThen G=TxtM(i).Text ng={{U}}(3){{/U}} j=i Else IfG=TxtM(i).Text Thenng={{U}}(4){{/U}} '计算冠军个数 End If Next i Ifng=1Then txtResult.Text={{U}}(5){{/U}} '单个冠军结果 Else txtResult.Text="继续进行PK" EndIf EndIf EndSub
问答题【说明】
函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。
【函数】
void QuickSort( int A[ ],int s,int t)
{ int i=s,j=t+1,temp;
int x=A[s];
do{
do i ++ ;while {{U}}(1) {{/U}};
do j -- ;while(A[j]>x);
if(i<j){temp=A[i]; {{U}}(2) {{/U}}; {{U}}(3) {{/U}};}
}while(i<j);
A[a] =A[j];A[j] =x;
if(s<i-1){{U}} (4) {{/U}};
if(j+1<t){{U}} (5) {{/U}};
}
问答题阅读以下说明和Java代码,填补Java代码中的空缺(1)~(6),将解答写在答题纸的对应栏内。[说明]己知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算):另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。下面是实现该工资系统的Java代码,其中定义了四个类:工资系统类PayRoll,员工类Employee,正式工类Salaried和计时工类Hourly,Salaried和Hourly是Employee的子类。
问答题【说明】 实现矩阵(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; (1) ;i++) for(j=0; (2) ;j++) t=array[i][j]; (3) ; (4) ; 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( (5) ); printf("Converted array:/n"); for(i=0;i<3;i++) for(j=0;j<3;j++) printf("%7d",array[i][j]); printf("/n");
问答题【说明】 本程序的功能是根据矩形左上角和右下角顶点坐标生成一个矩形对象,然后输出该矩形4个顶点的坐标,计算并输出该矩形的面积。 【C++代码】 #include<iostream> using namespace std; class MyPoint( //表示平面坐标系中的点的类 double x; double y; public: MyPoint (double x,double y)this->x=x;this->y=y; double getX()const (1) ; double getY()const return y; void show()const cout<<'('<<x<<','<<y<<')'; ; class MyRectangle //表示矩形的类 MyPoint upleft; //矩形的左上角顶点 MyPoint down right; //矩形的右下角顶点 public: MyRectangle(MyPoint upleft,MyPoint downright); MyPoint getUpLeft()constreturn up_left; //返回左上角坐标 MyPoint getDownRight()constreturn down_right; //返回右下角坐标 MyPoint getUpRight()const; //返回右上角坐标 MyPoint getDownLeft()const; //返回左下角坐标 double area()const; //返回矩形的面积 ; MyRectangle:: MyRectangle( (2) ): up left(p1),down_right(p2) MyPoint MyRectangle::getUpRight()const return MyPoint(down_right.getX(),up_left.getY()); MyPoint MyRectangle::getDownLeft()const return MyPeint( (3) ); double (4) ::area()const return (getUpLeft(),getX()-getDownRight().getX())* (getDownRight().getY()-getUpLeft().getY()); int main( ) MyRectangle r(MyPoint(0,2),MyPoint(2,0)); r.getUpLeft(),show(); r.getUpRight().show(); r.getDown Right().show(); (5) ; cout<<r.area()<<end1; return 0;
问答题试题三(共15分)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示。图3-1稀疏矩阵M及其转置矩阵MT为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示,其转置矩阵MT的三元组顺序表如表3-2所示。函数TransposeMatrix(MatrixM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置:cpot[0]=0cpot[j]=cpot[j-1]+num[j-1]/*j为列号*/类型ElemType、Triple和Matrix定义如下:typedefintElemType;typedefstruct{/*三元组类型*/intr,c;/*矩阵元素的行号、列号*/ElemTypee;/*矩阵元素的值*/}Triple;typedefstruct{/*矩阵的三元组顺序表存储结构*/introws,cols,elements;/*矩阵的行数、列数和非零元素数目*/Tripledata[MAXSIZE];}Matrix;[C函数]intTransposeMatrix(MatrixM){intj,q,t;int*num,*cpot;MatrixMT;/*MT是M的转置矩阵*/num=(int*)malloc(M.cols*sizeof(int));cpot=(int*)malloc(M.cols*sizeof(int));if(!num||!cpot)returnERROR;MT.rows=(1);/*设置转置矩阵MT行数、列数和非零元数目*/MT.cols=(2);MT.elements=M.elements;if(M.elements>0){for(q=0;q
问答题【说明】已知对某载客车辆(Car)进行类建模,如图5-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。【C++代码】constint{{U}}(1){{/U}}=7;//定义最多载客数constintMAXWHEELS=5;//定义最多轮胎数classBody{//此处代码省略};//车身类classPassenger{//此处代码省略};//乘客类classWheel{//此处代码省略};//车轮类classDriver{//司机类public:stringname;//表示第几路公交车司机Driver(stringdriverName):name({{U}}(2){{/U}}){}///构造函数};classEngine{//引擎类public:stringengineNo;//引擎编号Engine(stringengineNo){{{U}}(3){{/U}}->engineNo=engineNo;}//构造函数};classCar{//汽车类protected:Engine*engine;Driver*driver;Bodybody;Wheel*wheels[MAX_WHEELS];Passenger*passengers[MAX_PASSENGERS];public:Car(Driver*driver){//构造函数this->driver=driver;engine=newEngine("TX6536型号引擎");for(intindex=0;index<MAXWHEELS;index++){wheels[index]=newWheel();}for(intindex=0;index<MAX_PASSENGERS;index++){passengers[index]=NULL;}}virtual~Car(){//析构函数for(intindex=0;index<MAX_WHEELS;index++)deletewheels[index];delete{{U}}(4){{/U}};}intgetPassengerNumber(){//获取车上乘客数量//此处代码省略}voidgetOnPassenger(Passenger*aPassenger){//乘客上车//此处代码省略}voidrun(){//开车if(driver==NULL){cout<<"司机尚未上车!";return;}//此处代码省略}};voidmain(){Driverdriver("第五路公交车司机");Carcar({{U}}(5){{/U}});Passengerpassengers[MAX_PASSENGERS];for(intindex=0;index<MAXPASSENGERS;index++)//乘客上车处理car.getOnPassenger(&passengers[index]);car.run();}
问答题
问答题[说明]
用链式存储结构实现的栈称为链栈。若链栈元素的数据类型为datatype,以LinkStack记链栈结构,其类型定义为:
typedef struct node
{ datatype data;
stmct node * next;
} StackNode, * LinkStack;
由于栈的主要操作都是在栈顶进行的,因此我们把链表的头部作为栈顶。设top为栈顶指针,即:LinkStack top。
下面各函数的功能说明如下:
(1)LinkStack Init_LinkStack():建立并返回空的链栈;
(2)int Empty_LinkStack(LinkStack top):判断top所指链栈是否空;
(3)LinkStack Push_LinkStack(LinkStacktop,datatypex):将数据x压人top所指链栈的栈顶,返回新栈指针;
(4)LinkStack Pop_LinkStack (LinkStacktop, datatype*x):弹出top所指链栈的栈顶元素x,返回新栈指针。
[函数]
LinkStaek Init_LinkStack( )
{ returnNULL;
int Empty_LinkStack ( LinkStaek top)
if(top = = NULL) return 1;
else return 0;
LinkStaek Push_LinkStaek( LinkStaektop, datatype X)
{ StaekNode *s;
s=malloc (sizeof(StaekNode) );
{{U}}(1) {{/U}}= x;
{{U}}(2) {{/U}}= top;
{{U}} (3) {{/U}};
return top;
}
LinkStaek Pop_LinkStack (LinkStacktop, datatype * x)
{ StaekNode *p;
if(top = = NULL) return NULL;
else{
* x ={{U}} (4) {{/U}};
p = top;
{{U}} (5) {{/U}};
free (p);
return top;
}
}
问答题【程序2.1说明】 求所有满足如下条件的三位数:它除以11得的商等于它各位数字的平方和。例如 550,除以11商为50,50=52+52+02。 【程序2.1】 void main() { int i, j,n,s; for(i=100;i<=999;i++) { n=i; j=n/11; s=0; while({{U}} (1) {{/U}}) { {{U}}(2) {{/U}} n/=10; } if({{U}} (3) {{/U}}) printf("%d/t",i); } } 【程序2.2说明】 本程序输入一字符串,将其中的大写字母改变成小写字母。 【程序2.2】 void main() { int i=0; char s[120]; scanf("%s",s); while({{U}} (4) {{/U}}) { if({{U}} (5) {{/U}}) s[i]=s[i]- 'A'+'a'; i++; } printf("%s/n",s); }
问答题【算法说明】某商务交流中心共有N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。程序流程图(见图2-11)所反映的算法是,根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求尺(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。1.【问题】在图2-11所示的程序流程图中,若要某个房间I被选中,则需要满足什么条件?
问答题【算法说明】
某英汉词典文件包含N个记录(N>1),每个记录有两个字段:一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。
本算法用于维护、更新该英汉词典文件。维护、更新的方法是:首先输入一个英文单词及其汉语解释,然后在该词典中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该词典的适当位置,使各记录仍按英文单词的词典顺序排列。
【算法】
第一步 读入英汉词典文件,并将读入的N个英文单词依次存放在字符串数组ENG中,将相应的汉语解释依次存放在字符串数组CN中。数组元素CN(i)给出了数组元素ENG(i)的解释。
第二步 输入英文单词及其汉语解释,将它们分别存放在字符串变量E和C中。若E为空串或都是空格,则转向第四步。
第三步 根据变量E的值,用二分法在数组ENG中查找。具体步骤如下:
1.1→L,N→H
2.INT((L+H)/2)→K
3.若E=ENG(K),则C→CN(K),转向第二步
若E<ENG(K),则K-1→{{U}} (1) {{/U}};若E>ENG(K),则K+1→{{U}} (2) {{/U}}
4.若H<L则
对I=N,L,-1(始值,终值,增量)循环执行:
ENG(I)→ENG(I+1)
CN(I)→CN(I+1)
然后,将E和C分别存入{{U}} (3) {{/U}}和{{U}} (4) {{/U}},N+1→N最后转向第二步
否则,转向{{U}} (5) {{/U}}
第四步 将数组ENG和CN输出,形成新的英汉词典文件,算法结束。
问答题【说明】
编写程序,生成一个新文本文件,它由一个已知文本文件的所有偶数行组成。要求已知文本文件名和新文本文件名均从键盘输入。请填空完善程序。
【C语言程序】
#include<stdio.h>
main()
{
FILE *oldf,*newf;
char ch,fname[20];
int i;
do{
printf("Enter name of existed text file to be read:");
scanf("%s",fname);
if((oldf=fopen(fname,"r"))==NULL)
printf("File %s can't open!/n",fname);
}while(oldf==NULL);
do{
printf("Enter mane of new text file to be written:");
scanf("%s",fname);
if(({{U}} (1) {{/U}}==NULL)
printf("File %s can't open!/n",fname);
}while({{U}} (2) {{/U}});
i=1;
while(!feof(oldf))
{
while((ch=fgetc(oldf))!={{U}} (3) {{/U}})
{
if(i%2=={{U}} (4) {{/U}})
fputc(ch,newf);
}
fputc('/n',newf);
{{U}} (5) {{/U}};
}
fclose(oldf);
fclose(newf);
}
问答题【说明】有数组A(4,4),把1到16个整数分别按顺序放入A(1,1),…,A(1,4),A(2,1),…,A(2,4),A(3,1),…,A(3,4),A(4,1),…,A(4,4)中,下面的流程图用来获取数据并求出两条对角线元素之积。【流程图】
问答题[说明]
本程序包含的函数及其功能说明如下:
(1)函数first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元;
(2)函数reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与
已知链表的表元链接顺序相反;
(3)函数Print_link()用来输出链表中各表元的值;
(4)函数free_link()用来释放链表全部表元空间。
[程序]
#include <stdio. h >
#include <malloe. h >
typodef struct node {
int val;
struct node * next;
} NODE;
void first_insert(NODE * * p,int v)
{ NODE *q = (NODE *) malloe(sizeof(NODE));
q->val = v; q->next = *p; /* 为新表元赋值*/
* p ={{U}} (1) {{/U}}; }
NODE * reverse_copy( NODE * p)
{ NODE * u;
for(u=NULL; p!=NULL; p=p->next) first_insert({{U}} (2) {{/U}});
return u;
}
void printlink(NODE * p )
{ for(;{{U}} (3) {{/U}}) prinff("%d/t", p->val);
printf(" /n");
}
void free_link( NODE * p)
{ NODE * u;
while(p! =NULL) { u=p->next;free(p);{{U}} (4) {{/U}}; }
void main( ) { NODE * link1 , * link2;
int i;
link1 = NULL;
for(i=1; i<= 10; i+ + )first_insert(
link2 = reverse_copy(link1 );
{{U}} (5) {{/U}};
free_link( linkl ) ;free_link(link2); }
问答题【说明】 设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。 【函数】 int StrCompare(SStrType s, SStrType t) int n=s.length, m= (1) , i,j,tag; i=0; j=0; while( (2) ) if( (3) ) i++; j++; else if(s.str[i]>t.str[j]) tag=1; return tag; else tag=-1; return tag; if(n==m) tag=0; else if( (4) ) tag=1; else if(n<m) tag=-1; (5) ;
问答题【说明】
将一正整数序列{K1,K2,…,K9}重新排列成一个新的序列,新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面),最后调用writeDat()函数的新序列输出到文件out.dat中。
在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
例:序列{6,8,9,1,2,5,4,7,3}
经重排后成为{3,4,5,2,1,6,8,9,7}
【函数】
#include < stdio. h >
#include < conio. h >
void jsValue( int a [10] [9] )
{ int i,j,k,n,temp;
int b[9];
for(i=0;i<10;i++)
{ temp=a[i] [0];
k=8;n=0;
for(j=8;j=0;j--)
{ if(temp < a[i] [j]){{U}} (1) {{/U}}=a[i][j];
if(temp >a[i] [j]){{U}} (2) {{/U}}=a[i][j];
if(temp =a[i] [j]){{U}} (3) {{/U}}= temp;
}
for(j=0;j<9;j++) a[i][j] =b[j];
}
}
void main( )
int a[10] [9] = {{6,8,9,1,2,5,4,7,3},{3,5,8,9,1,2,6,4,7},
{8,2,1,9,3,5,4,6,7}, {3,5,1,2,9,8,6,7,4},
{4,7,8,9,1,2,5,3,6}, {4,7,3,5,1,2,6,8,9},
{9,1,3,5,8,6,2,4,7}, {2,6,1,9,8,3,5,7,4},
{5,3,7,9,1,8,2,6,4}, {7,1,3,2,5,8,9,4,6}
};
int i,j;
{{U}} (4) {{/U}};
for(i=0;i<10;i++) {
for(j=0;j<9;j++) {
printf("%d",a[i] [j] );
if({{U}} (5) {{/U}})printf(",");
}
printf(" /n" );
}
getch( );
}
问答题[说明]本程序在3×3方格中填入1到10以内9个互不相等的整数,使所有相邻两个方格内的两个整数之和为质数。程序的输出是全部满足条件的方格。方格的序号如下图所示。程序采用试探法,从序号为0的方格开始,依次为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数;如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的填入整数;当序号为8的方格也填入合理的整数后,就找到了一个解。为检查当前方格所填整数的合理性,程序引入数组CheckMatrix,存放需要进行合理性检查的相邻方格的序号。事实上,CheckMatrix中只要求第i个方格中的数向前兼容,即填写第4个方格时,只检查在它之前、与之相邻的第1,3个方格是否满足和为素数的条件。[程序]#include<stdio.h>intpos,a[9],b[11];/*用于存储方格所填入的整数*/voidwrite(inta[])/*方格输出函数*/{……}intisPrime(intm)/*素数判断函数,若m为素数则返回1,否则返回0*/{……}intselectNum(intstart)/*找到start到10之间尚未使用过的最小的数,若没有则返回0*/{intj;for(j=start;j<=10;j++)if(b[j])returnj;return0;}intcheck()/*检查填入pos位置的整数是否合理*/{inti,jintcheckMatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};for(i=0;(j={{U}}(1){{/U}})>=0;i++)if(!isPrime({{U}}(2){{/U}}))return0;return1;}voidextend()/*为下一方格找一个尚未使用过的整数*/{{{U}}(3){{/U}}=selectNum(1);b[a[pos]]=0;}voidchange()/*为当前方格找下一个尚未使用过的整数,若找不到则回溯*/{intj;while(pos>=0if(pos<0)return;{{U}}(4){{/U}};a[pos]=j;b[j]=0;}voidfind(){intok=1;pos=0;a[pos]=1;b[a[pos]]=0;do{if(ok)if({{U}}(5){{/U}}){write(a);change();}elseextend();elsechange();ok=check(pos);}while(pos>=0);}voidmain(){inti;for(i=1;i<=10;i++)b[i]=1;find();}
问答题【说明】在一个矩阵中,如果其零元素的个数远远多于其非零元素的个数时,称这样的矩阵为稀疏矩阵。稀疏矩阵通常采用三元组数组表示。每个非零元素用一个三元组来表示,即非零元素的行号、列号和它的值。然后按某种顺序将全部非零元素的三元组存于一个数组中。例如,对于以下二维数组:intx[3][4]={{1,0,0,0},{0,5,0,0),{0,0,7,2}};可用以下数组a来表示:inta[][3]={{3,4,4},{0,0,1},{1,1,5),{2,2,7},{2,3,2}};其中三元数组a的第1行元素的值分别存储稀疏矩阵×的行数、列数和非零元素的个数。下面的流程图描述了稀疏矩阵转换的过程。【流程图】
问答题试题六(共15分)阅读以下说明和Java程序,填补代码中的空缺(1)~(6),将解答填入答题纸的对应栏内。[说明]很多依托扑克牌进行的游戏都要先洗牌。下面的Java代码运行时先生成一副扑克牌,洗牌后再按顺序打印每张牌的点数和花色。[java代码]
