问答题[说明] 本程序包含的函数及其功能说明如下: (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 = (1) ; NODE * reverse_copy( NODE * p) NODE * u; for(u=NULL; p!=NULL; p=p->next) first_insert( (2) ); return u; void printlink(NODE * p ) for(; (3) ) prinff("%d/t", p->val); printf(" /n");void free_link( NODE * p) NODE * u; while(p! =NULL) u=p->next;free(p); (4) ; void main( ) NODE * link1 , * link2; int i; link1 = NULL; for(i=1; i<= 10; i+ + )first_insert( link2 = reverse_copy(link1 ); (5) ; free_link( linkl ) ;free_link(link2);
问答题试题七(15分)阅读以下应用说明以及用VisualBasic编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]本应用程序的运行窗口中将显示一个简单的模拟时钟如下:该圆形钟面上有时针、分针和秒针在运动,不断显示系统的当前时间。在开发该应用时,首先建立一个圆形Shape控件作为钟面(背景为白色)。设圆心为象素坐标(X0,Y0),半径为940。再在圆心处建立一个小的实心圆Shape控件作为轴心。钟面上的刻度3,6,9,12为四个标签。时针、分针、秒针(红色)为线型控件,名称分别为LineH、LineM、LineS,线宽属性值分别为:3,2,1,线长属性值分别为500,700,900。这三个线型控件的起点坐标都固定在(X0,Y0),其终点坐标随转角θ而动态变化:设置定时器Timer1使该时钟能反映系统的当前时间,其定时间隔为0.5秒,该定时器的Interval属性值应设置为(1)。每隔0.5秒,秒针需要调整位置,但分针和时针只是在初始显示时以及在每次秒计数为0时才需要调整位置(可节省计算量)。[程序代码]ConstPi=3.1416ConstX0=1750ConstY0=1150ConstLH=500,LM=700,LS=900PublicfirstAsBooleanPrivateSubForm_Load()LineS.X1=X0'秒针的起点位置LineS.Y1=Y0LineM.X1=X0'分针的起点位置LineM.Y1=Y0LineH.X1=X0'时针的起点位置LineH.Y1=Y0first=TrueEndSubPrivateSubTimer1_Timer()S=Second(Time)S_seta=Pi*(2)'秒针的转角LineS.X2=X0+LS*Sin(S_seta)'秒针的终点位置LineS.Y2=Y0-LS*Cos(S_seta)If((3))ThenM=Minute(Time)LineM.X2=X0+LM*Sin(Pi*M/30)'分针的终点位置LineM.Y2=Y0-LM*Cos(Pi*M/30)H=Hour(Time)If(H>=12)ThenH=H-12H_seta=Pi*((4))'时针的转角LineH.X2=X0+LH*Sin(H_seta)'时针的终点位置LineH.Y2=Y0-LH*Cos(H_seta)first=(5)EndIfEndSub
问答题[说明]某银行新近开通外汇定期存款业务。为方便用户查询不同存款方式下的日利率、计算本利,特开发了日利率查询及本利计算程序,其运行窗口如下图所示。用户只要在界面上选择相应的存款方式(包括外汇币种、存期等),便可单击按钮一查询存款日利率。若输入一定数量的本金。程序还会根据所选择的存期计算并输出本利和。在开发过程中,选择币种和存期的组合框(ComboBox)名分别为Combo1和Combo2,单旋钮(CommandButton)“个人单位”和“金融机构”分别名为Option1和Option2,用于输入本金的文本框(TextBox)名为Price,“输出日利率”和“计算本利和”按钮(CommandButton)分别名为Command1和Command2。且已知,第i类币种、第j类存期之下,个人单位与金融机构的存款日利率分别存放于数组元素interestRate(i,j,0)和interestRate(i,j,1)中,其中i,j从0开始计数。[VisualBasic代码]DiminterestBate(50,10,2)AsSingle’通用声明PrivateSubForm_Load()……’为数组interestRate赋初值EndSub’根据所选择的币种、存期等信息确定日利率FunctiongetInterestRate()DimstrCurrency,strTimeAsString,i,j,k,intDaysAsIntegerstrCurrency=Combo1.TextstrTime=Combo2.TextFori=0ToCombol.ListCount-1IfCombol.List(i)=strCurrencyThen{{U}}(1){{/U}}NextForj=0ToCombo2.ListCount-1IfCombo2.List(j)=strTimeThen{{U}}(1){{/U}}NextIf{{U}}(2){{/U}}=TrueThenk=0Else:k=1EndIf{{U}}(3){{/U}}=interestRate(i,j,k)EndFunction’输出日利率PrivateSubCommund1_Click()MsgBox"日利率为"&getInterestRate()EndSub’输出本利和PrivateSubCommand2_Click()DimstrTimeAsString,intDaysAsInteger,sngCorpus,sngResultAsSinglestrTime=Combo2.TextsngCorpus=CSng(Text1.Text){{U}}(4){{/U}}’计算存款天数(以每月30天计)Case"一个月":intDays=30Case"三个月":intDays=90Case"六个月":intDays=120EndSelect’计算并输出本利和sngResult=sngCorpus+{{U}}(5){{/U}}MsgBox"本利之和为:"&sngResultEndSub
问答题【说明】已知对某载客车辆(Car)进行类建模,如图7-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。【Java代码】classBody{//此处代码省略);//车身类classPassenger{//此处代码省略)///乘客类classWheel{//此处代码省略);//车轮类classDriver{//司机类publicStringname;//表示第几路公交车司机publicDriver(StringdriverName){name=driverName/)//构造函数};classEngine{//引擎类publicStringengineNo;//引擎编号publicEngine(StringengineNo){this.engineNo=engineNo;)//构造函数};publicclassCar{//汽车类staticfinalint{{U}}(1){{/U}}=7;//定义最多载客数staticfinalintMAXWHEELS =5;//定义最多轮胎数protectedEngineengine;protectedDriverdriver;protectedBodybody=newBody();protectedWheel[]wheels;protectedPassenger[]passengers;publicCar(Driverdriver){//构造函数{{U}}(2){{/U}}.driver=driver;engine=newEngine("TX6536型号引擎");wheels=newWheel[MAXWHEELS];passengers=newPassenger[MAX_PASSENGERS];for(intindex=0;index<MAX_WHEELS;index++){wheels[index]=newWheel();}for(intindex=0;index<MAX_PASSENGERS;index++){passengers[index]=null;}}intgetPassengerNumber(){//获取车上乘客数量//此处代码省略}voidgetOnPassenger(PassengeraPassenger){//乘客上车//此处代码省略}voidrun(){//开车if({{U}}(3){{/U}}){System.out.println("司机尚未上车!");return;}//此处代码省略}publicstaticvoidmain(Stringargs[]){Driverdriver=newDriver("第五路公交车司机");Carcar=newCar({{U}}(4){{/U}});for(intindex=0;index<MAX_PASSENGERS;index++)car.getOnPassenger({{U}}(5){{/U}}Passenger());car.run();}}
问答题阅读以下说明和C++代码,将应填入{{U}} (n) {{/U}}处的字句写在答题纸的对应栏内。
{{B}}[{{/B}}说明{{B}}]{{/B}}
已知类LinkedList表示列表类,该类具有四个方法:addElement()、lastElement()、 numberOfElement()以及removeLastElement()。四个方法的含义分别为:
void addElement(Object):在列表尾部添加一个对象;
Object lastElement():返回列表尾部对象;
int numberOfElement():返回列表中对象个数;
void removeLastElement():删除列表尾部的对象。
现需要借助LinkedList来实现一个Stack栈类,C++代码1和C++代码2分别采用继承和组合的方式实现。
{{B}}[{{/B}}C++代码1{{B}}]{{/B}}
class Stack :public LinkedList {
public :
void push (Object o) {addElement (o); }; //压栈
Object peek() {return{{U}} (1) {{/U}};}; //获取栈顶元素
bool i sEmpty (){ //判断栈是否为空
return numberOfElement ( ) == 0;
);
Object pop () { //弹栈
Object o = lastElement();
{{U}} (2) {{/U}};
return o;
};
};
{{B}}[{{/B}}C++代码2{{B}}]{{/B}}
class Stack {
private:
{{U}} (3) {{/U}};
public:
void push (Object o) { //压栈
list. addElement (o);
};
Object peek() { //获取栈顶元素
return list.{{U}} (4) {{/U}};
};
bool isEmpty () { //判断栈是否为空
return list. numberOfElement ( ) = = 0;
Object pop() { //弹栈
Object o = list. lastElement ();
list. removeLastElement ( );
return o; };
}
{{B}}[{{/B}}问题{{B}}]{{/B}}
若类LinkedList新增加了一个公有的方法removeElement(int index),用于删除列表中第 index个元素,则在用继承和组合两种实现栈类Stack的方式中,哪种方式下Stack对象可访问方法removeElement(int index)?{{U}} (5) {{/U}}(A.继承 B.组合)
问答题(5)
问答题[说明]
下面的程序利用递归算法计算x和y的最大公约数。
[函数2.1]
main ( )
{ int x,y,k,t;
scanf(" % d% d" ,
if(x>y) { t=x;x=y; y=t;}
{{U}} (1) {{/U}};
while(k! =0){
y=x;
{{U}}(2) {{/U}};
k=y%x;
}
prinff( "% d" ,x); }
[函数2.2说明]
函数fun(char *str,char *substr的功能是计算子串sugbstr在串str中出现的次数。
[函数2.2]
fun(ehar * str, char * substr)
{ int x,y,z;
{{U}}(3) {{/U}};
for(x=0;str[ x] ! = '/O';x + + )
for(y=x,z=0;sabstr[z] = =str[y];{{U}} (4) {{/U}},y+ +)
if( (5) = ='/0') {
num + +;
break;
}
return(num);
}
问答题[说明]
本程序中预设了若干个用户名和口令。用户输入正确的用户名后,可以查找对应的口令,一旦输入结束标记“end”,程序结束。
[C++程序]
#include <iostream. h>
#include <string. h>
class User
{ protected:
char user[10];
char pass[7];
public:
User(char[ ],char[]);
{{U}}(1) {{/U}}{return user;}
{{U}}(2) {{/U}}{return pass;}
};
User::User(char u[],char p[])
{ strcpy(user,u);
strcpy(pass,p); }
void main()
{ User ua[]={User("Li","123456"),User("wang","654321"),User("Song","666666")
char name[10];
while(1)
cout< < "输入用户名:";
cin> >name;
if({{U}} (3) {{/U}}= =0) break;
for(int i=0;i<3;i+ +)
if(strcmp(name,ua[i].getuser()) = =0){
cout< <"密码:" < < ua[i].getpass() < <endl;
{{U}}(4) {{/U}};
if({{U}} (5) {{/U}})cout< <"该用户不存在!" < <endl;
}
}
问答题[函数2.1说明] 下面程序的功能是:将由键盘输入的某个十进制数转换成对应的R进制数并输出。这里R是 2到16的整数,由键盘输入。例如,输入n=128,base=13后的输出为9B。[函数2.1]#include <stdio.h>main() char b[16]='0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'; int c[64],n,i=0,base; printf("Enter a number:");scaaf("%d", printf("Enter new base:");scanf("%d", doc[i]= (1) ; i++; n=n/base; while( (2) ); printf("Transmit new base:"); for(- -i;i>=0;- -i)printf("%c", (3) );[函数2.2说明] 所谓回文字符中是指正序和逆序拼写相同的字符串,例如astrtsa,adgdtdgda等。下面函数int fun(char *str)的功能是判断字符串str是否是回文,当字符串是回文时,函数返回1,否则返回0。[函数2.2]int fun(char *str) int i,j,l; for(i=0;str[i]! ='/0';i++); l=i/2; for(j=0,i- -;j<=1; (4) ) if( (5) ) return 0; return 1;
问答题【说明】
给定函数fun的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。
【函数】
int fun(char *c,int status)
{
if({{U}} (1) {{/U}}=='')
return 1;
else
{
if({{U}} (2) {{/U}}
return 0;
}
}
main()
{
int flag=1;
char ch;
printf("请输入一字符串,用点号结束输入!/n");
do {
ch=getchar();
flag=fun(
putchar(ch);
}while(ch!='.');
printf("/n");
}
问答题[说明]下面的流程图描述了计算自然数1到N(N≥1)之和的过程。[流程图][问题1]将流程图中的(1)~(3)处补充完整。[问题2]为使流程图能计算并输出1*3+2*4+…+N*(N+2)的值,A框内应填写(4);为使流程图能计算并输出不大于N的全体奇数之和,B框内应填写(5)。
问答题【说明】主窗口有一个按钮、一个文本框和一个复选框,初始时窗口大小不能调整,选中复选框后窗口大小可以调整,如果撤销复选框的选择,则窗口的大小又不能调整,如下图所示。【Java代码】importjava.awt.*;importjava.awt.event.*;classMyFrameextendsFrameimplementsItemListener,ActionListenerCheckboxbox;TextAreatext;Buttonbutton;MyFrame((1))super(s);box=newCheckbox("设置窗口是否可调整大小");text=newTextArea(12,12);button=(2)("关闭窗口");button.addActionListener(this);box.addltemListener(this);setBounds(100,100,200,300);setVisible(true);add(text,BorderLayout.CENTER);add(box,BorderLayout.SOUTH);add(button,BorderLayout.NORTH);setResizable((3));validate();publicvoiditemStateChanged(ItemEvente)if(box.getState()==true)setResizable(true);elsesetResizable(false);publicvoidactionPerformed(ActionEvente)(4);classsimplepublicstaticvoidmain(Stringargs[])(5)("simple");
问答题[说明] 本程序的功能是给公司的员工Tom,Jack,Green增加薪水。三人的职位分别是programmer, Manager,CEO。 程序由6个类组成:WorkerTest是主类,programmer,Manager,CEO三个类,薪水增加的规则是 programmer的涨幅是5%;Manager的是10%;CEO也是Manager,但是它除了有Manager的涨幅,还有1000元的bonus。接口SalaryRaise提供了一个增加薪水的方法raise()。[java程序] public class WorkerTest public WorkerTest( ) public static void main( String[] args) Programmer programmer = new Programmer( "Tom" ,3000); Manager manager = new Manager( "Jack" ,4000); CEO ceo = new CEO( "Green" ,4000); Worker [] worker = new Worker[3]; programmer, raise( ); manager, raise( ); ceo. raise( ); worker[0] = programmer; worker [1] = manager; worker[2] = ceo; for ( int i = 0 ;i < worker, length; i + + ) System. out. prinfln (" Name:" + worker [i]. getName ( ) +" / tSalary:" + worker [i]. getSalary ());public interface SalaryRaise void raise( ); public class Worker public String name; public double (1) ; public Worker( ) public String getName( ) return name; public void setName( String name) this. name = name; public double getSalary( ) return salary; public void setSalary(double salary) this. salary = salary; public class Programmer extends Worker implements (2) public Programmer( ) public void raise( ) double pets=0.05; double sala = this. getSalary( ) * (1 + pers); this. setSalary (sala); public Programmer( Siring name, double salary) t this. name = name; this. salary = salary;public class Manager extends (3) implements SalaryRaise public Manager( ) public Manager(String name, double salary) this. name = name; this. salary = salary; public void raise( ) double pets = 0.1; double sala = this. getSalary() * (1 + pers); this. setSalary(sala); public class CEO extends Manager implements SalaryRaise public CEO() public CEO( String name,double salary) this. name = name; this. salary = salary; public void raise( ) double bonus = 1000; (4) ; double sala = this. getSalary( ); (5) ; this. setSalary(sala);
问答题阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明]函数GetListElemPtr(LinkListL,inti)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。函数DelListElem(LinkListL,inti,ElemType*e)的功能是删除含头结点单链表的第i个元素结点,若成功则返回SUCCESS,并由参数e带回被删除元素的值,否则返回ERROR。例如,某含头结点单链表L如下图(a)所示,删除第3个元素结点后的单链表如下图(b)所示。#defineSUCCESS0#defineERROR-1typedefintStatus;typedefintElemType;链表的结点类型定义如下:typedefstructNode{ElemTypedata;structNode*next;}Node,*LinkList;[C代码]LinkListGetListElemPtr(LinkListL,inti){/*L是含头结点的单链表的头指针,在该单链表中查找第i个元素结点;若找到,则返回该元素结点的指针,否则返回NULL*/LinkListp;intk;/*用于元素结点计数*/if(i<1||!L||!L->next)returnNULL;k=1;p=L->next;/*令p指向第1个元素所在结点*/while(p++k;}returnp;}StatusDelListElem(LinkListL,inti,ElemType*e){/*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/LinkListp,q;/*令P指向第i个元素的前驱结点*/if(i==1)______;elsep=GetListElemPtr(L,i-1);if(!P||!p->next)returnERROR;/*不存在第i个元素*/q=______;/*令q指向待删除的结点*/p->next=q->next;//从链表中删除结点*/______;/*通过参数e带回被删除结点的数据*/free(q);returnSUCCESS;}
问答题【说明】设学生(学生数少于50人)某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图用于读取该文件,并把全部成绩从高到低排序到数组B[50]中。【流程图】
问答题【说明】本应用程序的运行窗口如图2所示。只要用户单击“闪烁”按钮,文字“欢迎光临”就会以0.3秒消失、0.3秒显示反复进行闪烁;单击“停止”按钮时,闪烁停止,恢复图示的初态。在开发过程中,需要设置的属性如表1所示。表1属性设置对象对象名属性名属性值窗体FrmlCaption闪烁显示演示标签LabelCaption欢迎光临命令按钮CmdFCaption闪烁命令按钮CmdTCaption停止定时器TimerlEnabled (1) Interval (2) 在开发过程中,需要编写的程序代码如下:【程序】PrivateSubCmdF_Click()Timerl.(3)=TrueLabel.Visible=FalseEndSubPrivateSubTimerl_Timer()(4)=notLabel.VisibleEndSubPrivateSubCmdT_Click()Timer].Enabled=(5)LabelVisible=trueEndSub
问答题【说明】
下面是一个Applet程序,其功能是输出已定义好的两个变量x和chr。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。
注意:不改动程序的结构,不得增行或删行。
import java. awt.*;
{{U}} (1) {{/U}}
{{U}} (2) {{/U}}
{
int x=10;
{{U}} (3) {{/U}}
Label output1;
Label output2;
{{U}} (4) {{/U}}
}
output1 = new Label("定义int类型变量"+"x,的初值为"+x);
output2 = new Label("定义char类型变量"+"chr,的初值为"+chr);
add(output1);
add(output2);
}
}
<HTML>
<HEAD>
<TITLE> ex34_3 </TITLE>
</HEAD>
<BODY>
{{U}} (5) {{/U}}
width=400 height=400>
</applet>
</BODY>
</HTML>
问答题试题二(共15分)阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。[说明]如果矩阵A中的元素A[i,j]满足条件:A[i,j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。一个矩阵可能存在多个马鞍点,也可能不存在马鞍点。下面的函数求解并输出一个矩阵中的所有马鞍点,最后返回该矩阵中马鞍点的个数。[C函数]
问答题(5)
问答题【说明】请完成下列Java程序。程序的执行结果是生成一个具有一个TextField类型的对象in、Button类型的对象btn和Label类型的对象out图形用户界面,程序的功能是计算用户输入数的平方,如图3所示。注意:请勿改动main()主方法和其他已有的语句内容,仅在下划线处填入适当的语句。【程序】importjava.awt.*;importjava,awt.event.*;publicclasssquare{publicstaticvoidmain(Stringargs[]){{{U}}(1){{/U}}}}classAppFrameextendsFrame{TheAdapterTestlistener=newTheAdapterTest();TextFieldin=newTextField(5);Buttonbtn=newButton("计算");Labelout=newLabel("用于显示计算结果");publicAppFrame(){setLayout(newFlowLayout());add(in);add(btn)add(out);btn.addActionListener(newBtnActionAdapter());addWindowListener(listener);setSize(400,100);show();}classBtnActionAdapterimplements{{U}}(2){{/U}}{publicvoidactionPerformed({{U}}(3){{/U}}){Strings=in.getText();doubled={{U}}(4){{/U}}doublesq=d*d;out.setText(d+"的平方是:"+sq);}}classTheAdapterTestextendsWindowAdapter{publicvoidwindowCIosing({{U}}(5){{/U}}){System.exit(1)}}}