问答题试题八(共15分)阅读以下说明和Java代码,将解答写入答题纸的对应栏内。[说明]已知类Stock和类JavaMain都定义在JavaMain.java文件中,类Stock的定义中有四处错误,分别在代码的第01、02、06、07行。请修改错误并给出修改后该行的完整代码,并写出改正错误后程序运行的输出结果。[Java代码]
问答题[说明] 本程序中预设了若干个用户名和口令。用户输入正确的用户名后,可以查找对应的口令,一旦输入结束标记“end”,程序结束。[Java代码]import java. io. *:public class User public String user; public Siring pass; public User() public User( String u,String p) user=u; pass=p; public String (1) () return this. user; public String (2) () return this. pass; public static void main(String[] args) User ua[]=new User("Li","123456"), new User("wang","654321"), new User("Song","666666"); while(true) InputStreamReader reader = new InputStreamReader(System. in); BufferedReader inpul = new BnfferedReader(reader); System. out. print("Enter your name:"); String name = null; try name = input. readLine(); catch (IOException ex) if( (3) ) break; int i; for (i=0;i<3;i++) if (name. equals(ua[i]. getUser())) System. out. println("密码:"+ua[i].getPass()); (4) ; if ( (5) ) System. out. println("该用户不存在!");
问答题【说明】 本题中的函数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= (2) ; for(k=0; k<n;k++) *op++=c; else (3) ; *op++='_'; ip++; if(op>outstr)op--; (4) ; return op-outstr; 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( (5) )*op++='0'+n-1; *op++=c; if( (6) )ip++; *op='/0'; return op-outstr;
问答题【函数1.1说明】
函数strcpy(char*to,char*from)将字符串from复制到字符串to。
【函数1.1】
void strcpy(char*to,char*from)
{ while ({{U}} (1) {{/U}});}
【函数1.2说明】
函数merge(int a[],int n,int b[],int m,int*c)是将两个从小到大有序数组a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。
【函数1.2】
void merge(int a[ ],int n,int b[ ] ,int m,int * c)
{ int i,j;
for(i=j=0;i<n )
*c++=a[i] <b[j]?a[i++]:b[j++];
while({{U}} (2) {{/U}})*c++=a[i++];
while({{U}} (3) {{/U}})*c++=b[j++];
}
【函数1.3说明】
递归函数sum(int a[],int n)的返回值是数组a[]的前n个元素之和。
【函数1.3】
int sum(int a[] ,int n)
{ if( n >0) return {{U}}(4) {{/U}};
else {{U}}(5) {{/U}};
}
问答题试题二(共15 分)
阅读以下说明和C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
函数int find_Max_Min(int a[],int n)的功能是:找出n 个元素的数组a 中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值;再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;依此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。
[函数]
int find_Max_Min(int a[],int n)
{ /*找出n 个元素的数组a 的最大、最小元素并输出,返回查找过程元素中的比较次数*/
int i,Count = 0;
int temp,Maxnum,Minnum;
for(i = 0; i a[ (1) ])
{ /*数组元素交换代码略*/}
}
Maxnum = a[n-1]; Minnum = a[0];
for(i = 1; i < n/2 + n%2; i++) {
Count = (2) ; /*元素比较次数计数*/
Minnum = (3) ? a[i] : Minnum; /*找最小元素*/
Maxnum = (4) ? (5) : Maxnum; /*找最大元素*/
}
printf("Max=%d/n",Maxnum);
printf("Min=%d/n",Minnum);
return Count;
}
问答题【说明】以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。【C程序】#include<stdio.h>#defineM30#defineNLEN10typedefstructnode{intcur_s;/*最近输入成绩的科目*/Charno[NLEN];intscore;structnode*next;}NODE;ints[M],sp,ss,i,mark,order,C;FILE*fp;NODE*h,*U,*V,*p;Charfname[80],no[NLEN],ans;main(){for(h=NULL,sp=0;;){printf("输入科目成绩文件名(输入aaaa表示强行结束)。/n");while(1){scanf("%s",fname);if(strcmp(fname,"aaaa")==0)break;if((fp=fopen(fname,"r"))==NULL)printf("不能打开文件%s,请重新输入科目文件名。/n",fname);elsebreak;}if(strcmp(fname,"aaaa")==0)break;fscanf(fp,"%d",/*输入科目号*/s[sp]=s;for(i=0;s[i]!=ss;1++);if({{U}}(1){{/U}}){printf("该科目的成绩已输入,请输入别的科目成绩文件。/n");continue;}sp++;while(fscanf(fp,"%s%d",no,v!=NULLu=v,v=v->next);if(v!=NULL/*累计总成绩*/v->cur_s=ss;}/*同一科目成绩重复输入,后输入成绩被忽略*/}else{p=(NODE*)malloc(sizeof(NODE));/*一位新的学生*/strcpy(p->no,no);p->score=mark;p->cur_s=ss;p->next=v;if(v==h){{U}}(2){{/U}};else{{U}}(3){{/U}};}}fclose(fp);printf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",if(ans=='N'||ans=='n')break;}/*以下按总成绩和学号对链表排序*/v=(NODE*)malloc(sizeof(NODE));v->next=h;h=v;while(v->next!=NULL){/*在余下的部分链表中找总成绩高学号小的表元*/for(p=v,u=v->next;u->next!=NULL;u=u->next)if(u->next->score>p->next->score||u->next->score==p->next->scoreif(p!=v){u=p->next;p->next={{U}}(4){{/U}};{{U}}(5){{/U}}=v->next;v->next=u;}v=v->next;}v=h;h=h->next;free(v);printf("名次总成绩人数学号/n");/*以下按格式要求输出*/v=h;order=1;while(v!=NULL){for(c=1,u=v->next;u!=NULL{{U}}(6){{/U}};printf("%4d%7d%8d",order,v->score,c);for(order+=c,i=1;{{U}}(7){{/U}};v=v->next,i++){if(i>1printf("%s",v->no);}printf("/n");}}
问答题【说明】本程序用于评选优秀教师和学生。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出来。其类结构如下图所示:【程序】#include<iostream.h>#include<stdio.h>classbase{protected:charname[8];public:voidgetname(){cout<<"name:";cin>>name;}voidprintname(){cout<<"name:"<<name<<endl;}{{U}}(1){{/U}}};classstudent:{{U}}(2){{/U}}{intnum;public:voidgetnum(){cout<<"score:";cin>>num;}boolisgood(){return{{U}}(3){{/U}}}};classteacher:{{U}}(2){{/U}}{intnum;public:voidgetnum(){cout<<"paper:";cin>>num;}boolisgood(){return(num>3)?true:false;}voidmain(){base*p[50];student*pstud;teacher*ptech;charch;intcount=0;do{cout<<"inputteacher(t)orstudent(s):";cin>>ch;if(ch=='s'){pstud=newstudent;pstud->getname();pstud->getnum();p[count++]=pstud;}elseif(ch=='t'){{{U}}(4){{/U}}ptech->getname();ptech->getnum();p[count++]=ptech;}elsecout<<"inputiswrong"<<endl;cout<<"continuetoiput(y/n)?";cin>>ch;}while(ch=='y');for(inti=0;i<count;i++)if({{U}}(5){{/U}})p[i]->printname();}
问答题从下列3道试题(试题5至试题7)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。阅读以下应用说明及VisualBasic程序,根据要求回答问题1至问题2。[说明]某VisualBasic应用程序用于监测某种锅炉设备内液面高度(0~50cm),其运行窗口界面如图4-16所示。图4-16某锅炉设备液面高度显示界面在图4-16中,设计了一个高度计(矩形形状shpMeter)及其中指示当前液面高度的水银柱(矩形形状shpT),文字标签标记了液面高度的刻度;另有一个图片框picCurve,用于动态描述检测到的液面高度曲线(用户见到的曲线与水银柱等高变化);[开始](CmdStart)按钮用于启动液面高度检测,命令按钮“暂停”(CmdStop)用于暂停液面高度检测。液面高度计形状控件shpMeter是固定的,其属性FillsStyle默认为透明。矩形形状shpT(水银柱)的Visible属性初始设置为不可见,属性Filltype设置为Solid(实心),FillColor设置为红色;图片框picCurve的属性AutoRedraw设置为True;程序设计过程中,创建了一个定时器TimT,属性Enabled初始设置为False(不可用),属性Interval(定时间隔)的值应设置为{{U}}(1){{/U}}。为模拟锅炉设备液面高度的检测,程序中利用了(0,1)之间均匀分布的伪随机数获得[0,50]之间的随机液面高度WH。为便于在图片框picCurve中绘制曲线,程序中对该图片框建立了如下坐标系统:图片框的左上角定义为原点(0,0),水平向右方向为X轴,垂直向上方向为Y轴,右下角坐标为(50.200)。为了便于观察记录的液面高度值,图片框中从上到下创建了7条水平虚线Ls(i),i=0,1…6,并在程序中按等间隔排列进行位置设置。应用程序中每隔3秒算出曲线点(x,y),其中x=O,1,2……,再用直线段连接各相邻曲线点形成液面高度曲线。[VisualBasic程序代码]Dim{{U}}(2){{/U}}ASInteger'试题全局变量PrivateSubCmdStart_Click()TimT.Enabled={{U}}(3){{/U}}ShpT.Visible=TrueEndSubPrivateSubCmdStop_Click()TimT.Enabled=FalseEndSubPrivateSubForm_Load()Dimi,SAsIntegerPicCurve.Scale(0,0)-(50,200)'设置图片框坐标系:左上角-右下角S=25'H等于图片框高度的1/8Fori=0To6'设置7条水平线Ls(i)的位置Ls(i).X1=0'Ls(i)起点横坐标Ls(i).Y1={{U}}(4){{/U}}'Ls(i)起点纵坐标Ls(i).X2=50'Ls(i)终点横坐标Ls(i).Y2=Ls(i).Y1'Ls(i)终点纵坐标Ls(i).BorderColor=&H00FCFCFC'设置水平线颜色{{U}}(5){{/U}}x=0'设置曲线坐标初值EndSubPrivateSubtimT_Timer()DimWH,HAsInteger'WH为实时液面高度,H为图片框中液面高度点显示高度WH=Int(Rnd*51)'随机模拟产生锅炉内液面高度(0~50cm)H=ShpMeter.Height*{{U}}(6){{/U}}'算出水银柱的高度ShpT.Top={{U}}(7){{/U}}'设置水银柱顶部位置ShpT.Height=H'设置水银柱的高度'绘制液面高度曲线y={{U}}(8){{/U}}'算出曲上当前点的纵坐标Ifx=51Then'当超出图片框时PicCurve.Cls'清框图片框内以前画的曲线{{U}}(9){{/U}}ElseIfx>0Then'除左边点外PicCurve.Line(x-1,Lasty)-(x,y),vbRed'由前1点到当前点画红色线段EndIfx=x+1'准备下一点坐标Lasty=y'保存当前坐标供下次使用EndSub
问答题[说明]
以下程序的功能是统计学生成绩,包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对前百分之七十的学生定为合格(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 10
class 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,
{{U}}(1) {{/U}};
na[i].setdeg(tdeg);
}
}
void compute::sort()
{ int i,j,pick;
{{U}} (2) {{/U}};
for(i=0;i<ns-1;i+ +){
pick=i;
for(j=i+1;j<ns;j+ +)
if(na[j].getdeg()>na[pick].getdeg()){{U}} (3) {{/U}};
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",{{U}} (4) {{/U}});
if({{U}} (5) {{/U}}) printf("/tPASS/n");
else printf("/tFAIL/n");
void main()
{ compute obj;
obj.getdata();
obj.sort();
obj.disp();
}
问答题试题四(15分,每空3分)阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某单位举办了一场知识竞赛,参加竞赛的选手为300名,依次从1~300进行编号。竞赛时间为9:00~11:00。8道竞赛题目依次从‘A’~‘H’编号,选手可按任意次序答题,每完成一道题目,可立即提交答案。若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。选手提交答案的情况及判定结果由专人即时录入,录入的数据如下表1所示,对竞赛情况进行统计和排名的结果如表2所示。统计和排名的规则如下:1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间如下计算:解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时罚时=提交题目P错误解答的次数×20例如:表1中14号选手在10:27提交了题目A的正确解答,因此该选手正确解答该题目所用时间为87分钟,由于之前的两次提交错误解答,罚时为2×20=40分钟,所以14号选手解答题目A的用时=87+40=127(分钟)。2.已经提交正确答案的题目再次提交时不再计算。3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为0的选手不参加排名。函数voidStatistic()的功能是:读取输入数据,进行统计、排名并输出结果。#defineMAXN300typedefstruct{intno;/*选手编号*/intnum;/*完成的题目数量*/inttime;/*完成题目的总用时*/intd[8];/*d[i]用于记录提交第i个题目错误答案的次数*/inta[8];/*a[i]用于记录第i个题目是否已经提交正确答案*/}Info;【函数】voidStatistic(){charch,pass;inti,j,k,h,m,t,time,MaxIndex;InfoR[MAXN+1];for(i=1;iMaxIndex)MaxIndex=k;}/*while*/for(i=1;i0){if(R[i].num!=R[0].num||R[i].time!=R[0].time)k++;R[0]=(5);printf("%d:%3d%4d%5d\n",k,R[i].no,R[i].num,R[i].time);}/*if*/}/*Statistic*/
问答题【说明】 用创建Thread类的子类的方法实现多线程,判断一个数是否是素数。如果是,打印“是素数”,如果不是,则打印“不是素数”;如果没有参数输入,显示“请输入一个命令行参数”。【Java程序】 import java.io.* ;public class TestThread //Java Application主类 public static void main(Sting args[ ]) if (args length<l) //要求用户输入一个命令行,否则程序不能进行下去 system.out.println("请输入一个命令行参数"); system.exit(0) ; //创建用户Thread子类的对象实例,使其处于NewBorn状态 primeThread getPrimes = new primeThread (Integer.parseInt(args[0])); getPrimes.start () ; //启动用户线程,使其处于Runnable状态 while(getPrimes.isAlive() //说明主线程在运行 try Thread. sleep (500); //使主线程挂起指定毫秒数,以便用户线程取得控制权, //sleep是static的类方法 Catch(InterruptedException e) //sleep方法可能引起的异常,必须加以处理 return ; //while循环结束 System.out.println ("按任意键继续……") ; //保留屏幕,以便观察 try (1) ; Catch(IOException e) //main方法结束class primeThread extends Thread //创建用户自己的Thread子类run()中实现程序子线程操作 boolean m_bContinue=true; //标志本线程是继续 int m_nCircleNum ; /循环的上限 prime Thread(int Num) //构造函数 m_nCircleNum =Nam; boolean ReadyToGoOn () //判断本线程是否继续执行 return ( (2) ); public void run () //继承并重载父类Thread的run ()方法,在该线程被启动时自动执行 int number =3; boolean flag=true; while (true) //无限循环 for( (3) ; i++) //检查number是否为素数 if(number %i==0) (4) ; system, out. println (flag); if (flag) //打印该数是否为素数的信息 system,out.print in (number+ "是素数") ; else sys rem.out.print In (number+ "是素数") ; number++ ; //修改number的数值,为下一轮素数检查做准备 if (number> m_nCircleNum) //到达要求检查数值的上限 m_bCont inue= false ; //则准备结束此线程 return ; //结束run()方法,结束线程 (5) ; try //经过一轮检查之后,暂时休眠一段时间 sleep(500); //使主线程挂起指定毫秒数,以便父线程取得控制权 Catch(InterruptedException e) Return; //for循环结束 //while循环结束 //run()方法结束 //primeThread类定义结束
问答题【问题4】(1分)
该流程图共有多少条实际执行路径?
问答题阅读以下说明和C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。
【说明】
埃拉托斯特尼筛法求不超过自然数N的所有素数的做法是:先把N个自然数按次序排列起来,1不是素数,也不是合数,要划去;2是素数,取出2(输出),然后将2的倍数都划去;剩下的数中最小者为3,3是素数,取出3(输出),再把3的倍数都划去;剩下的数中最小者为5,5是素数(输出),再把5的倍数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,每次从序列中取出的最小数构成的序列就是不超过N的全部质数。
下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素sieve[i](i>0)的下标i对应自然数i,sieve[i]的值为1/0分别表示i在/不在序列中,也就是将i划去(去掉)时,就将sieve[i]设置为0。
【C程序】
#include<stdio.h>
#define N 10000
int main()
{
char sieve[N+1]={0);
int i=0,k;
/*初始时2~N都放入sieve数组*/
for(i=2;____(1)____;i++)
sieve[i]=1;
for(k=2;;){
/*找出剩下的数中最小者并用K表示*/
for(;k<N+1&&sieve[k]==0;____(2)____);
if(____(3)____)break;
print(“%d\t”,k);/*输出素数*/
/*从sieve中去掉k及其倍数*/
for(i=k;i<N+1;i=____(4)____)
____(5)____;
}
return 0;
} / *end of main* /
问答题[说明]下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数m和n,假定m大于等于n,算法的主要步骤为:(1)以n除m并令r为所得的余数;(2)若r等于0,算法结束;n即为所求;(3)将n和r分别赋给m和n,返回步骤(1)。[流程图][问题1]将流程图中的(1)~(4)处补充完整。[问题2]若输入的m和n分别为27和21,则A中循环体被执行的次数是(5)。
问答题[说明]函数intToplogical(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中,图G表示一个具有n个顶点的AOE-网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下。typedefstructGnode{/*邻接表的表节点类型*/intadjvex;/*邻接顶点编号*/intweight;/*弧上的权值*/structGonde*nextare;/*指示下一个弧的节点*/}Gnode;typedefstructAdjlist{/*邻接表的头节点类型*/charvdata;/*顶点的数据信息*/structGnode*Firstadj;/*指向邻接表的第一个表节点*/}Adjlist;typedefstructLinkedWDigraph{/*图的类型*/structAdjlisthead;/*指向图中第一个顶点的邻接表的头节点*/}LinkedWDigraph;例如,某AOE-网如图4-14所示,其邻接表存储结构如图4-15所示。图4-14某AOE-网图4-15邻接表存储结构图[函数]intToplogical(LinkedWDigraphG){Gnode*p;intj,w,top=0;intStack,*ve,*indegree;ve=(int*)mallloc(G.n+1)*sizeof(int));indegree=(int*)malloc((G.n+1)*sizeof(int));/*存储网中个顶点的入度*/Stack=(int*)malloc((G.n+1)*sizeof(int));/*存储入度为0的顶点的编号*/if(!ve||!indegree||!Stack)exit(0);for(j=1;j<=G.n;j++){ve[j]=0;indegree[j]=0;}/*for*/for(j=1;j<=G.n;j++){/*求网中各顶点的入度*/p=G.head[j].Firstadj;while(p){{{U}}(1){{/U}};p=p->nextarc;}/*while*/}/*for*/for(j=1;j<=G.n;j++)/*求网中入度为0的顶点并保存其编号*/if(!indegree[j])Stack[++top]=j;while(top>O){w={{U}}(2){{/U}};printf("%c",G.head[w].vdata);p=G.head[w].Firstadj;while(p){{{U}}(3){{/U}};if(!indegree[p->adjvex])Stack[++top]=p->adjvex;if({{U}}(4){{/U}})Ve[p->adjvex]=ve[w]+p->weight;P=p->nextarc;}/*while*/}/*while*/return{{U}}(5){{/U}};}/*Toplogical*/
问答题【应用说明】某电视台拟开发应用程序来显示戏曲大赛中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;
