问答题[说明] 有若干教师,每个教师只有姓名,一个教师可以指导多名研究生;每名研究生有姓名和研究方向,程序最后输出每个教师指导的所有研究生的姓名和研究方向。[Java程序]public class Teacher String name; int top=0; Student[] student=new Student[20]; public Teacher() public Teacher(String name) this.name=name; boolean add(Student stu) int len=this.student.length; if (top<len-1) this.student[top]=siu; (1) ; return true; else return (2) ; void disp() System.out.println(“指导老师"”+this.name); System.out.println(“研究生:”); for(int i=0;i< (3) ;i++) System.out.println(“姓名:”+this.student[i].name+“/t研究方向:”+this.student[i]. search); public static void main(String[] args) Teacher t[]=new Teacher(“李明”),new Teacher(“王华”); Student s1 = new Student(“孙强”,“数据库”); Student s2 = new Student(“陈文”,“软件工程”); Student s3 = new Student(“章锐”,“计算机网络”); if(! t[0].add(s1)) System.out.println(“每个老师最多只能指导20个学生!”); if(! t[0].add(a2)) System.out.println(“每个老师最多只能指导20个学生!”); if(! t[1].add(s3)) System.out.println(“每个老师最多只能指导20个学生!”); for(int i=0;i<2;i++) (4) ; class (5) String name; String search; public Student() public Student(String name,String search) this.name=name; this.search=search; String getName()return this.name; String getSearch()return this.search;
问答题【说明】函数sort(NODE*head)的功能是;用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻结点中的元素,若较小的元素在前面,则交换这两个结点中的元素值。其中,head指向链表的头结点。排序时,为了避免每趟都扫描到链表的尾结点,设置一个指针endptr,使其指向下趟扫描需要到达的最后一个结点。例如,对于图4-1(a)的链表进行一趟冒泡排序后,得到图4-1(b)所示的链表。链表的结点类型定义如下:typedefstructNode{intdata;structNode*next;}NODE;【C语言函数】voidsort(NODE*head){NODE*ptr,*preptr,*endptr;inttempdata;ptr=head->next;while({{U}}(1){{/U}})/*查找表尾结点*/ptr=ptr->next;endptr=ptr;/*令endptr指向表尾结点*/ptr={{U}}(2){{/U}};while(ptr!=endptr){while({{U}}(3){{/U}}){if(ptr->data>ptr->next->data){tempdata=ptr->data;/*交换相邻结点的数据*/ptr->data=ptr->next->data;ptr->next->data=tempdata;}preptr={{U}}(4){{/U}};ptr=ptr->next;}endptr={{U}}(5){{/U}};ptr=head->next;}}
问答题【程序2.1说明】
已知一个排好序的数组,现输入一个数,要求按原来的顺序规律,将它插入到数组中。
【程序2.1】
#include <stdioh>
#define N 100
void main()
{
float a[N+l],x;
int i,p;
printf("输入已经排好序的数列: ");
for(i=0; i<N; i++)
scanf(%f",
printf("输入要插入的数:");
scanf("%f",
for(i=0,p=N; i<N; i++)
if(x<a[i])
{
{{U}}(1) {{/U}}
break;
}
for(i=N-1; i>=p; i--)
{{U}} (2) {{/U}}
{{U}}(3) {{/U}}
for(i=0; i<=N; i++)
prinff("%f/t",a[i]);
}
【程序2.2说明】
本程序用变量count统计文件中字符的个数。
【程序2.2】
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
long count=0;
if((fp=fopen("letter.txt","r"))==NULL)
{
printf("can not open file/n");
exit(0);
}
while(!feof(fp))
{
{{U}} (4) {{/U}}
count++;
}
printf("count=%d/n",count);
{{U}} (5) {{/U}}
}
问答题[函数2.1说明] 函数void find(int *a, int n, int * max, int * min)的功能是在长度为n的整型数组a中,查找最大元素和最小元素的下标。main()中给出了调用find函数的一个实例。[函数2.1]#include<stdio.h>void find(int *a, int n,int *max,int * min) int i; *max =* min=0; for(i=1;i<n;i+ +) if(a[i]>a[* max]) (1) ; else if(a[i]<a[*min]) (2) ; return;main() int a[]=4,6,8,9,0,6,max,min; find(a,6, (3) ); printf("%5d%5d/n", max,min);[函数2.2说明] 以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串前端的公共部分。例如:输入的两个字符串分别是abcdefg和abceef,则输出为abc。[函数2.2]#include <stdio.h>main() char str1[100],str2[100],str[100],c; int i=0,s; printf("/nInput string 1:");gets(str1); printf("/nInput string 2:");gets(str2); while(( (4) ) i++; printf("%s/n",str);
问答题Dim{{U}} (2) {{/U}} '声明全局变量
Private Sub Form_Load()
Scale(0,0)-(20,6) '定义窗体的坐标系统
End Sub
Private Sub CmdStart_Click()
x=0
MMC.DevkeType=''WaveAudio'' '设置多媒体设备类型
MMC.FileName=''两只蝴蝶.wav'' '确定声音文件名
MMC.Cornmand=''Open'' '打开多媒体设备
MMC.Command=''P1ay'' '启动声音的播放
Timer1.Enabled=True '打开定时器
End Sub
Private Sub Timer1_Timer()
Ifx>20 Thenx=x-20 '蝴蝶飞到右边界后再回到左边界
Image1.Left=x '动态调整蝴蝶框的位置
Imagel.Top={{U}} (3) {{/U}}
Image2.Len=x
lmage2.Top= {{U}}(4) {{/U}}
x=x+0.1 '确定蝴蝶下一步飞行位置
End Sub
Private Sub CmdStop_Click()
{{U}} (5) {{/U}}
Image1.Left=0 '蝴蝶位置初始化
Image1.Top=2
Image2.Left=0
Imagc2.Top=3
MMlC.Command=''Stop'' '停止播放
MMC.Command=''Ciosc'' '关闭多媒体设备
End Sub
问答题【说明】
IC卡和200卡都是从电话卡派生的。下面的程序将电话卡定义为抽象类。其中 balance为双精度变量,代表电话卡中的余额;cardNumber是长整型变量,代表电话卡的卡号;password是整型变量,代表电话卡的密码;connectNumber是字符串变量,代表电话卡的接入号码;connected是布尔变量,代表电话是否接通。
performDial()实现各种电话接通后的扣除费用的操作。其中200卡每次通话扣除0.5元的通话费用和附加费用;IC卡每次通话扣除0.9元的通话费。TimeLeft()方法用于测试电话卡余额还可以拨打电话的次数。performConnection()用于电话接入操作,如果卡号和密码正确,则接通;否则,接不通。
【程序】
abstract class PhoneCard
{
doubte balace;
{{U}} (1) {{/U}}perfermDial();
double getBalance()
{ return balance; }
double TimeLeft()
{
double current=balance;
int times=0;
do
{
{{U}} (2) {{/U}}
times++;
}white(balance>=0);
balance=current;
return times-1;
}
}
abstract class Number_PhoneCard extends PhoneCard
{
long cardNumber:
int password;
String connectNumber;
Boolean connected;
Boolean performConnection(long cn, int pw)
{
if(cn==cardNumber
return true;
}
else return false;
}
}
class IC Card{{U}} (4) {{/U}}
{
boolean performDial()
{
if(balance>0.9)
{
balance-=0.9;
return true;
}
else return false;
}
}
class D200_Card{{U}} (4) {{/U}}
{
static double additoryFee;
static{ additoryFee=0.1; }
boolean performDial()
{
if(balance>(0,5+additeryFee))
{
{{U}} (5) {{/U}}
return true;
}
else return false;
}
}
问答题【说明】 以下【C程序】完成从指定数据文件中读入职工的工号和他完成产品个数的数据信息,对同一职工多次完成的产品个数进行累计,最后按如表5-11所示的格式输出职工完成产品数量的名次(ORDER),该名次是按每位职工完成的产品数量(QUANTITY)排序,之后是同一名次的职工人数(COUNT)和他们的职工号(NUMBER,同一名次的职工号以从小到大的顺序输出)。 {{B}}表5-11 职工完成产品数量名次输出格式表{{/B}}
ORDER
QUANTITY
COUNT
NUMBER
1
398
3
10
20
21
4
256
2
3
5
6
192
1
9
7
167
2
11
14
…
…
…
…
以下【C程序】采用链表结构存储有关信息,链表中的每个表元对应一位职工。在数据输入的同时,形成一个有序链表(按完成的产品数量和工号排序)。当一个职工有新的数据输入,在累计他的完成数量时会改变原来链表的有序性,为此应对链表进行删除、查找和插入等操作。 【C程序】 #include<stdio. h> typedef struct ele{ int no, q; struct ele * next; }elem; main(int argc, char ** argv){ FILE *fp; elem *h, *u, *proc(); if(argc==2 fclose(fp); output(h); while(h I=NULL){ u=h→*next; free(h); h=u; } } } elem * proc(FILE *fp){ int n, m; elem *u, *v, *p, *base; base=NULL; fscanf(fp, "%d', while(!feof(fp)){ fscanf(fp, '%d', for(v=base; v!=NULL u=v, v=v->next); if({{U}} (1) {{/U}}) if({{U}} (2) {{/U}}) base=v->next; else u->next=v-next; v->q+=m; else v=(elem *)malloc(Sizeof)elem)); v->no=n; v->q=m; p=base; while(p !=NULL) if({{U}} (3) {{/U}})break; else { u=p; p=p->next; } if({{U}} (4) {{/U}}) base=v; else u->next=v; {{U}} (5) {{/U}}; Fscanf(fp, "%d", } return base; } Output(elem *head){ int count, order; elem *u, *v; printf("ORDER QUANTITY COUNT NUMBER/n"); u=head; order=1; while(u !=NULL){ for(count=1, v=u->next; {{U}}(6) {{/U}};count++, v=v->next); printf("%4d%9d%6d", order, u->q, count); order+=count; for(;{{U}} (7) {{/U}};printf("%4d", u->no), u=u->next); printf("/n"); } }
问答题【说明】
在矩形类中重载关系运算符“>=”,采用友元,比较的依据是矩形面积的大小。重载算术运算符“+=”,采用成员函数,更新矩形对象的长与宽,分别加上形参矩形的长与宽。重载算术运算符+,利用构造函数,采用友元。
【代码】
class Crect
{
int length,witdth;
public;
CRect(int l,int w){
length=l;
width=w;
}
friend int operator>=(CRect//比较面积
}
void operator+=(CRect//求长
{{U}} (4) {{/U}};//求宽
}
friend operater+(CRect //利用构造函数
}
}
问答题试题六(15 分,每空3 分)
阅读以下说明和C++程序,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
以下程序的功能是计算三角形、矩形和正方形的面积并输出。
程序由4 个类组成:类Triangle、Rectangle 和Square 分别表示三角形、矩形和正方形;抽象类Figure 提供了一个纯虚拟函数getArea(),作为计算上述三种图形面积的通用接口。
【C++程序】
#include
#include
class Figure {
public:
virtual double getArea() = 0; // 纯虚拟函数
};
class Rectangle : (1) {
protected:
double height;
double width;
public:
Rectangle(){};
Rectangle(double height, double width) {
this->height = height;
this->width = width;
}
double getArea() {
return (2) ;
}
};
class Square : (3) {
public:
Square(double width){
(4) ;
}
};
class Triangle : (5) {
double la;
double lb;
double lc;
public:
Triangle(double la, double lb, double lc) {
this->la = la; this->lb = lb; this->lc = lc;
}
double getArea() {
double s = (la+lb+lc)/2.0;
return sqrt(s*(s-la)*(s-lb)*(s-lc));
}
};
void main() {
Figure* figures[3] = {
new Triangle(2,3,3), new Rectangle(5,8), new Square(5) };
for (int i = 0; i getArea() << endl;
}
}
问答题[说明]以下[C程序]是对某电码明文(原文)进行加密形成密文。其加密算法如下。假定原文为C1C2C3……Cn,加密后形成的密文为S1S2S3……Sn其中n为小于256的任意自然数。首先读入正整数Key(Key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,如图4-12所示。图4-12密文字符环示意图加密时从S1位置起顺时针计数,当数到第Key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起继续计数,当再次数到第Key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置;依此类推,直至n个原文字符全部放入密文环中。由此产生的S1S2……Sn即为原文的密文。例如,原文:OneWorldOneDream。当Key=5时,其密文为:meOnWlanDoOedrer;当Key=6时该原文的密文为:oeDnOedrrOnWmale。程序使用示例如图4-13所示。图4-13程序使用示例在[C程序]中,将电码的原文存入字符数组old[],加密钥匙存入在整数变量Key中。函数decode用于将原文old加密并返回密文字符数组的首指针。其中,函数采用一个双向循环链表CODE来表示密文环。函数strlen用于计算一个字符串中个数(不包括字符串结尾符'/0/)。为了简单起见,程序中假设内存容量足以满足动态存贮单元分配的要求。[C程序]#include<stdio.h>#include<alloc.h>#defineCR13typedefstructnodecharch;structnode*forward;/*Linktonextnode.*/structnode*backward;/*Linktopreviousnode.*/CODE;main()char(1),old[256];intstrlen(),key,num=0;printf("/nPleaseinputthetelegraph:/n")while(num<255old[(2)]='/0';doprintf("/nPleaseinputKey=?(Key>1):");scanf("%d",while(key<=1);printf("/nThedecodeoftelegraph:'%s'is:/n'%s'/n",old,decode(old,key));char*decode(old,key);char*old;intkey;char*new;intlength,count,i;CODE*loop,*p;length=strlen(old);loop=((3))malloc(length*sizeof(CODE));for(i=1;i<length-1;i++)loop[i].forward=loop[i].backward=loop[0].backward=loop[0].forward=loop[length-1].forward=loop;loop[length-1].backward=for(p=loop,i=0;i<length;i++)for(count=1;count<key;count++)p=(4);p->ch=*old++;p->backward->forward=(5);p->forward->backward=(6);p=p->forward;new=(char*)malloc((length+1*sizeof(char));for(i=0;i<length;i++)new[i]=loop[i].ch;new[length]='/0';return(new)intstrlen(s)char*s;intlen=0;while((7)!='/0')len++;return(len);
问答题[说明] 下面程序的功能是将多个文件的内容同时输出在屏幕上,文件名都作为参数传入,命令执行为:cat file1 file2 file3,即同时输出file1、file2、file3的内容。[程序]#include <stdio.h>#include <stdlib.h>void fileeopy(FILE * ifp, FILE *ofp) int c; while((c=getc( (1) ))!=EOF) pute(c, (2) ); int main(int arge, char *argv[]) FILE *fp; while( (3) >0) if((fp=fopen( (4) ,"r"))= =NULL) printf("Can't open file/n"); return 1; else filecopy(fp, stdout); fclose( (5) ); return 0;
问答题【说明】
下面的程序用DoleRob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。
a.在第一行的正中插入1。
b.新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。
c.若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。
例如,3阶魔方阵如下所示:
8 1 6
3 5 7
4 9 2
【C程序】
#include<stdio.h>
#include<stdlib.h>
#define SIZE 50
main( )
{ int row, col, n,value;
int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/
printf("请输入要输出魔方阵的阶数n(奇数,<%d):n=",SIZE);
scanf("%d",&n);
if (!(n % 2)||n < 1 ||{{U}} (1) {{/U}}) {
printf("输入数据有误!/n"); exit(0);
}
row=1; col = (n+1)/2; value=1;
while(value< ={{U}} (2) {{/U}}) {
a[row][col] = value;
/*计算下一位置*/
if(value%n !=0){
row--; {{U}} (3) {{/U}};
if(row<1) row=n;
if(col>n){{U}} (4) {{/U}};
}
else row++;
value = {{U}}(5) {{/U}};
}
printf("/n%d阶魔方阵如下所示:/n/n",n);
for(row = 1;row <= n; row++){
for(col = 1; col <=n; col++)
printf("%5d",a[row][col]);
printf("/n");
}
}
问答题[说明]以下[C程序]所完成的功能是在3X3方格中填入数字1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图3-18所示。图3-18系统的部分输出结果3×3方格从第1行左上角方格开始的序号分别为0、1、2,第2行左边方格开始的序号分别为3、4、5,第3行左下角方格开始的序号分别为6、7、8。以下[C程序]采用试探法,即从序号为0的方格(左上角)开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为8的方格(右下角)也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为8的方格所填的整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,C程序引入二维数组checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。[C程序]#include<stdio.h>#defineN12inta[9];/*用于存储方格所填入的整数*/intb[N+1];intpos;checkMatrix[][3]=-1,0,-1,1,-1,0,-1,1,3,-1,2,4,-1,3,-14,6,-1,5,7,-1;voidwrite(inta[])inti,j;for(i=0;i<3;i++)for(j=0;j<3;j++)printf("%3d",a[3*i+j]);printf("/n");intisPrime(intm)inti;if(m==2)return1;if(m==1||m%2==0)return0;for(i=3;i*i<=m;)if(m%i==O)return0;i+=2;return1;intselectNum(intstart)intj;for(j=start;j<=N;j++)if(b[j])returnj;return0;intcheck()/*检查填入pos位置的整数是否合理*/inti,j;for(i=0;(j=(1))>=0;i++)if(!isPrime(a[pos]+a[j]))(2);(3);extend()/*为下一方格找一个尚未使用过的整数*/a[(4)]=selectNum(1);b[a[pos]]=0;voidchange()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/intj;while(pos>=0if(pos<0)return;b[a[pos]]=1;a[pos]=j;b[j]=0;find()intok=1;pos=0;a[pos]=1;b[a[pos]]=0;deif(ok)if((7))write(a);change();elseextend();elsechange();ok=check(pos);while(pos>=0);main()inti;for(i=1;i<=N;i++)b[i]=1;find();
问答题阅读以下标准书号校验码的技术说明和程序流程图,根据要求回答问题1至问题3。[说明]为实现图书的国际统一编码,便于实现计算机化的图书管理,每本正式出版的图书都印有国际标准书号。标准书号由“ISBN”、10个数字(0-9)组成,其格式如下。ISBN组号-出版者号-书名号-校验码其中,校验码是根据前面9个数字计算得到的,用于计算机自动校验。假设标准书号的10个数字依次是a(1),a(2),…,a(10),则校验码a(10)的设置应使S=1O*a(1)+9*a(2)+8*a(3)+…+1*a(10)能被11整除。如果校验码a(10)应设置成10,则规定以“X”表示之。例如,《软件设计师考试考前冲刺预测卷及考点解析》的标准书号为:ISBN7-121-05027-5。第1段上的数字“7”是国际ISBN中心分配给中国ISBN中心管理的组号;第2段上的“121”表示电子工业出版社。标准书号的校验过程如图3-16所示,计算校验码的过程如图3-17所示。其中,Mod(S,11)表示S除以11得到的余数。图3-16标准书号的校验过程图3-17计算校验码的过程
问答题【说明】以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。【C程序】#include<stdio.h>#defineM30#defineNLEN10typedefstructnodeintcur_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((1))printf("该科目的成绩已输入,请输入别的科目成绩文件。/n");continue;sp++;while(fscanf(fp,"%s%d",no,v!=NULLu=v,v=v->next);if(v!=NULL/*累计总成绩*/v->cur_s=ss;/*同一科目成绩重复输入,后输入成绩被忽略*/elsep=(NODE*)malloc(sizeof(NODE));/*一位新的学生*/strcpy(p->no,no);p->score=mark;p->cur_s=ss;p->next=v;if(v==h)(2);else(3);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=(4);(5)=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(6);printf("%4d%7d%8d",order,v->score,c);for(order+=c,i=1;(7);v=v->next,i++)if(i>1printf("%s",v->no);printf("/n");
问答题【说明】设有3n+2个球互连,将自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数,如下图所示:其中填自然数的思想如下;(1)先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列;但若n为偶数,最后1次只排第1列中间一个数。(2)自右向左,先右第1列中间填数;若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。【程序】#include<stdio.h>#definesize10inta[3][size];voidmain()inti,k,m,n;printf("imputthen:");scanf("%d",k=1;for(i=0;i<=n/2;i++)a[1][2*i]=k;k++;if((i==n/2)k++;(2)k++;if(n%2==1)(3)k++;m=n;else(4)for(i=0;i<n/2;i++)a[1][m-2*i]=k;k++;(5)k++;a[2][m-2*i-1]=k;k++;a[1][1]=k;printf("/n");printf("");for(i=1;i<=n;i++)printf("%6d",a[0][i]);printf("/n/n");for(i=0;i<=n+1;i++)printf("%6d",a[1][i]);printf("/n/n");printf("");for(i=1;i<=n;i++)printf("%6d",a[2][i]);printf("/n");
问答题【算法说明】 某英汉词典文件包含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→ (1) ;若E>ENG(K),则K+1→ (2) 4.若H<L则 对I=N,L,-1(始值,终值,增量)循环执行: ENG(I)→ENG(I+1) CN(I)→CN(I+1) 然后,将E和C分别存入 (3) 和 (4) ,N+1→N最后转向第二步 否则,转向 (5) 第四步 将数组ENG和CN输出,形成新的英汉词典文件,算法结束。
问答题试题五(15分,每空3分)阅读以下应用说明及VisualBasic程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]某单位举办了一场知识竞赛,有300名选手参加竞赛,依次从1~300为选手编号。竞赛时间为9:00~11:00。8道竞赛题目依次从“A”~“H”编号,选手可按任意次序答题,每完成一道题目,可立即提交答案。若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。选手提交答案的情况及判定结果由专人即时录入,录入数据包括提交答案的时间、选手编号、题目编号(A~H)、是否正确(Y/N)。对竞赛情况进行统计和排名的规则如下:1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间如下计算:解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时罚时=提交题目P错误解答的次数×20例如:设14号选手在10:27提交了题目A的正确解答,则该选手正确解答该题目所用时间为87分钟,由于他在09:37和09:52两次提交了题目A的错误解答,因此罚时为2×20=40分钟,所以14号选手解答题目A的用时=87+40=127(分钟)。2.已经提交正确答案的题目再次提交时不作计算。3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为0的选手不参加排名。本应用程序的运行窗口如下图所示:窗口中的两个文本框为Txt_time和Txt_player,分别用于录入提交答案的时间和选手编号。组合列表框Combo1提供题目编号(A~H),录入时从中选择。检查框Chk_yn用于输入解答是否正确信息。当单击“确定”按钮(Cmd_comfirm)时,录入的提交信息加入列表框List1中,排名情况在列表框List2输出。单击“关闭”按钮时退出应用程序。在开发过程中,需要编写的部分程序代码如下:[程序代码]PrivateTypeInfonoAsInteger'选手编号numAsInteger'完成的题目数量timeAsInteger'完成题目的总用时d(8)AsInteger'd[i]用于记录提交第i个题目错误答案的次数a(8)AsBoolean'a[i]用于记录第i个题目是否已经提交正确答案EndTypeDimR(301)AsInfo'R[j]用于统计编号为j的选手提交答案的情况DimMaxIndexAsInteger'MaxIndex记录提交答案的选手中编号最大者PrivateSubForm_Load()Fori=1To8Combo1.AddItemChr((1))NextCombo1.Text=Combo1.List(0):Txt_time.Text="":Txt_player.Text=""Fori=1To300R(i).num=0:R(i).time=0:R(i).no=iForj=1To8R(i).d(j)=0:R(i).a(j)=FalseNextj,iEndSubPrivateSubCmd_confirm_Click()Dimh,m,k,timeAsInteger,ch,pass,s1AsStringk=InStr(Txt_time.Text,":"):Ifk11Orh=11Andm>0Orm>=60ThenGoToerror1time=(2)'计算答题时间,以分钟为单位IfTxt_player.Text300ThenGoToerror1ch=(3)'取题目编号pass=IIf(Chk_yn.(4)=0,"N","Y")s1=Txt_time.Text+Space(4)+Txt_player.Texts1=s1+Space(10-Len(Txt_player.Text))+ch+Space(8)+passList1.AddItems1k=Val(Txt_player.Text)'k为选手编号R(k).no=k'编号为k的选手的提交信息记录在下标为k的数组元素中Ifk>MaxIndexThenMaxIndex=km=Asc(ch)-Asc("A")Ifpass<>"Y"Then'编号为k的选手提交第m个题目的解答不正确R(k).d(m)=R(k).d(m)+1ElseIfR(k).a(m)<>TrueThen'已经提交正确的题目的解答不再计算R(k).a(m)=True:R(k).num=R(k).num+1R(k).time=R(k).time+(5)CallStatistic'调用过程Statistic进行实时排名和输出EndIfExitSuberror1:MsgBox"录入信息有误!",vbOKOnlyEndSub
问答题【说明】 为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置。(假设R[]中的元素互不相同) [算法] 1.变量声明 X: Data Type i,j,low, high,mid,r:0..n 2.每循环一次插入一个R[i] 循环:i以1为步长,从2到n,反复执行。 (1)准备 X←R[i]; (1) ; high←i-1; (2)找插入位置 循环:当 (2) 时,反复执行。 (3) 若X.key<R[mid].key 则high←mid-1; 否则 (4) (3)后移 循环:j以-1为步长,从 (5) ,反复执行。 R[j+1]←R[j] (4)插入 R[low]←X 3.算法结束
问答题【说明】本程序用于评选优秀教师和学生。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出来。其类结构如下图所示:【程序】#include<iostream.h>#include<stdio.h>classbaseprotected:charname[8];public:voidgetname()cout<<"name:";cin>>name;voidprintname()cout<<"name:"<<name<<endl;(1);classstudent:(2)intnum;public:voidgetnum()cout<<"score:";cin>>num;boolisgood()return(3);classteacher:(2)intnum;public:voidgetnum()cout<<"paper:";cin>>num;boolisgood()return(num>3)?true:false;voidmain()base*p[50];student*pstud;teacher*ptech;charch;intcount=0;docout<<"inputteacher(t)orstudent(s):";cin>>ch;if(ch=='s')pstud=newstudent;pstud->getname();pstud->getnum();p[count++]=pstud;elseif(ch=='t')(4)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((5))p[i]->printname();
