阅读以下说明和C++代码。
[说明]
类Stock的定义中有三处错误,分别在代码的第04、06、10行。请补齐下述代码中的空缺(1),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。
[C++代码]
01 include <iostream>
02 using namespace std;
03 class Stock{
04 protected:
05 Stock(){shares=0;share_val=0.0;Output();}
06 Stock(int n=0,double pr=3.5): (1) {//初始化shares值为n
07 share_val=pr;
08 Output();
09 };
10 void Stock(){};
11 void Output(){cout<<shares <<':'<<share_val<<end1;}
12 public:
13 //成员函数
14 private:
15 //成员变量
16 int shares;
17 double share_val;
18 };
19
20 void main(){ //构造三个Stock对象a,b,c
21 Stock a(1);
22 Stock b;
23 Stock c=Stock();
24 //其它代码省略,且代码五输出
25 }
程序运行后的输出结果为:
1:3.5
(2)
(3)
第1题
[说明]
类Stock的定义中有三处错误,分别在代码的第04、06、10行。请补齐下述代码中的空缺(1),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。
[C++代码]
01 include <iostream>
02 using namespace std;
03 class Stock{
04 protected:
05 Stock(){shares=0;share_val=0.0;Output();}
06 Stock(int n=0,double pr=3.5): (1) {//初始化shares值为n
07 share_val=pr;
08 Output();
09 };
10 void Stock(){};
11 void Output(){cout<<shares <<':'<<share_val<<end1;}
12 public:
13 //成员函数
14 private:
15 //成员变量
16 int shares;
17 double share_val;
18 };
19
20 void main(){ //构造三个Stock对象a,b,c
21 Stock a(1);
22 Stock b;
23 Stock c=Stock();
24 //其它代码省略,且代码五输出
25 }
程序运行后的输出结果为:
1:3.5
(2)
(3)
第2题
[说明]
基于管理的需要,每本正式出版的图书都有一个ISBN号。例如,某图书的ISBN号为“978-7-5606-2348-1”。
ISBN号由13位数字组成:前三位数字代表该出版物是图书(前缀号),中间的9个数字分为三组,分别表示组号、出版者号和书名号,最后一个数字是校验码。其中,前缀号由国际EAN提供,已经采用的前缀号为978和979;组号用以区别出版者国家、地区或者语言区,其长度可为1~5位;出版者号为各出版者的代码,其长度与出版者的计划出书量直接相关;书名号代表该出版者该出版物的特定版次;校验码采用模10加权的算法计算得出。
校验码的计算方法如下:
第一步:前12位数字中的奇数位数字用l相乘,偶数位数字用3相乘(位编号从左到右依次为13到2)。
第二步:将各乘积相加,求出总和S。
第三步:将总和S除以10,得出余数R。
第四步:将10减去余数R后即为校验码V。若相减后的数值为10,则校验码为0。
例如,对于ISBN号“978-7-5606-2348-1”,其校验码为1,计算过程为:
S=9×1+7×3+8×1+7×3+5×1+6×3+0×1+6×3+2×1+3×3+4×1+8×3=139
R=139mod 10=9
V=10-9=1
函数check(char code[])用来检查保存在code中的一个ISBN号的校验码是否正确,
若正确则返回true,否则返回false。例如,ISBN号“978-7-5606-2348-1”在code中的
存储布局如表3-1所示(书号的各组成部分之间用“-”分隔):
表3-1 数组code的内容示例
在函数check(char code[])中,先将13位ISBN号放在整型数组元素tarr[0]~tarr[12]中(如表3-2所示,对应ISBN号的位13~位1),由tarr[0]~tarr[11]计算出校验码放入变量V,再进行判断。
表3-2 数组tarr的内容示例
[C函数]
boo1 cheCk(char code[])
{
int i,k=0;
intS=0,temp=0;
int V;
int tarr[13]={0};
if (Strlen(code) <17} return falSe;
for(i=0; i<17; i++) /*将13位ISBN号存入tarr*/
if(code[i]!='-')
tarr (1)____ =code[i]-'0';
for(i=0; (2)_____ ; i++ ); {
if (i%2)
S+= (3)______ ;
else
S+= (4)______ ;
}
v=( (5)______ ==C)?0:10-s%10;
if(tart[12]==v)
return true ;
return false;
}
第3题
[说明]
本程序提供了三阶矩阵加、减及乘运算的功能。用户单击“生成操作数”按钮将随机生成两个矩阵(即操作数1和操作数2),再单击某一矩阵运算按钮后,程序将输出相应运算的结果。程序运行界面如下:
开发过程中,界面上从左至右三个文本框分别取名为Text1至Text3,“生成操作数”按钮名为 CmdNew,“+”、“-”和“*”构成按钮控件组,分别名为CmdOperate(0)、CmdOperate(1)和CmdOperate(2)。
已知n阶矩阵加、减法运算法则是对应位置的元素相加、减;n阶矩阵的乘法C=AB有公式:Cij=AilBij+AilBij+…+An1Bnj其中记号Xij表示矩阵X第i行第j列上的元素。程序使用的主要变量是三维数组matrix(3,3,3),其元素matrix(i,j,k)代表第i个矩阵j行k列上的元素,这里i,j,k均从0开始计数,第0、1、2个矩阵分别表示操作数1、操作数2和结果矩阵。
代码中用到的子过程及其功能说明如下:
(1) Sub newMatrices():随机产生矩阵运算的两个操作数;
(2) Sub printOut(txt As TextBox, i As Integcr):定义矩阵i向文本框txt的输出格式;
(3) Sub operate(operation As String):计算并输出矩阵运算结果。
[Visual Basic代码]
Dim matrix(3, 3, 3) As Integer
Sub newMatrices()
……… End Sub
Sub printOut(txt As TextBox, i As Integer)
……… End Sub
Sub operate(operation As String)
Dim i, j, k As Integer
For i = 0 To 2
For j = 0 To 2
(1)
Case"+": matrix(2, i, j) = matrix(0, i, j) + matrix(1, i, j)
Case"-": matrix(2, i, j) = matrix(0, i, j) - matrix(1, i, j)
Case"*"
matrix(2, i, j) = 0
For k = 0 To 2
matrix(2, i, j) = matrix(2, i, j) +(2)
Next
End Select
Next
Next
printOut (3)
End Sub
Private Sub CmdNew_Cliek() ’“生成操作数”按钮的单击事件响应代码
(4)
printout Text1,0
printout Text2,1
End Sub
Private Sub CmdOperale_Click(Index As Integer) ’矩阵运算按钮组的单击事件响应代码
operate CmdOperate(Index).(5)
End Sub
第4题
[说明]
本程序的功能是给公司的员工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);
}
}
第5题
【说明】
本程序通过移动滑动条修改颜色RGB值,从而控制颜色。程序中有一个面板、3个标签和3个滑动条,标签和滑动条一一对应,分别对应三原色红、绿、蓝,任意拖动其中的一个滑动条,所对应的颜色值就会发生变化,面板的颜色也会发生对应的变化,如下图所示,滑动条值的范围是0~255。
【Java代码】
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class simple extends JFrame. implements AdjustmentListener{
public simple(){
setTitle("simple");
setSize(300, 200);
addWindowListener(new WindowAdapter(){
public void windowClosing((1)){
System.exit(0);
}
});
Container contentPane=getContentPane();
JPanel p=(2);
p.setLayout(new GridLayout(3, 2));
p.add(redLabel=new JLabel("Red 0"));
p.add(red=new JScrollBar(Adjustable. HORIZONTAL, 0, 0, 0, 255));
red.setBlocklncrement(16);
red.addAdjustmentListener(this);
p.add(greenLabel=(3) ("Green 0"));
p.add(green=new JScrollBar(Adjustable.HORIZONTAL 0, 0, 0, 255));
green setBIocklncrement(16);
green.addAdjustmentListener(this);
p.add(blueLabel=new JLabel("Blue 0"));
p.add(btue=new JScrollBar(Adjustable. HORIZONTAL, 0, 0, 0, 255));
blue,setBIocklncrement(16);
blue.addAdjustmentListener(this);
contentPane.add(p, "South");
colorPanet=new JPanel();
colorPanet.setBackground(new Color(0, 0, 0));
contentPane.add((4),"Center");
} public void adjustmentValueChanged(AdjustmentEvent evt){
redLabel.setText("Red"+red.getValue());
greenLabel.setText("Green"+green.getValue());
blueLabel.setText("Blue"+blue.getValue());
coiorPanel.setBackground(new Color(red.getValue(), green.getValue(), blue.getValue()));
colorPanel.repaint();
}
public static void main(String[] args){
JFrame. f=(5);
f.show();
}
private JLabel redLabel;
private JLabel greenLabel;
private JLabel blueLabel;
private JScrollBar red;
private JScroilBar green;
private JScrollBar blue;
private JPanel colorPanel;
第6题
【说明】
设计希赛IT教育研发中心的工资管理系统,该中心主要有3类人员:经理、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪8000元;销售员拿固定工资1000元,然后再按当月销售额的4%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售总额的5‰。
按要求设计一个基类employee,销售员类salesman,经理类manager,销售经理类 salesmanager。
程序5-1是类employee的模块内容,程序5-2是类salesman的类模块内容,程序5-3是类manager的模块内容,程序5-4是类salesmanager的模块内容。在主测试程序中,输入张三所管部门月销售量10000后的输出结果如下:
张三所管部门月销售量:10000
销售经理:张三
编号:1001
本月工资:5050
include <iostream.h>
include <string.h>
class employee
{
protected:
int no;
char *name;
float salary;
public:
employee(int num,char *ch)
{ no=num;
name=ch;
salary=0; }
virtual void pay()=0;
virtual void display()
{ cout<<"编号:"<<no<<endl;
cout<<"本月工资:"<<salary<<endl; }
};
【程序5-2】
class salesman: (1)
{
protected:
float commrate, sales;
public:
salesman(int num,char *ch):employee(num,ch)
{ commrate=0.04; }
void pay()
{ cout<<name<<"本月销售额:";
cin>>saies;
salary=sales*commrate+1000; }
void display()
{ cout<<"销售员:"<<name<<endl;
employee::display(); }
};
【程序5-3】
class manager: (1)
{
protected:
float monthpay;
public:
manager(int num,char *ch):employee(num,ch)
{ monthpay=8000; }
void pay()
{ salary=monthpay; }
void display()
{ cout<<"经理:"<<name<<endl;
employee::display(); }
};
【程序5-4】
class salesmanager: (2)
{
public:
salesmanager(int num,char *ch): (3)
{ monthpay=5000;
commrate=0.005;}
void pay()
{ cout<<name<<"所管部门月销售量:";
cin>>sales;
(4) }
void display()
{ cout<<"销售经理:"<<name<<endl;
(5) }
};
void main() //主测试函数
{ salesmanager p1 (1001,"张三");
p1.pay();
p1.display();
}
第7题
阅读以下说明和Java代码,将解答写入答题纸的对应栏内。
【说明】
下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。
public (1) class cube_Root{
public static void (2) main(String args[]){
System.out.println("个、十、百位数字的立方和等于该数本身的三位数有:");
for(int n=100;n<1000;n++)
{
int a,b,c;
(3)
b=n/10%10;
(4)
if( (5) )
System.out.println(n);
}
}
}
第8题
[说明]
我国现行使用的公民身份证号码有两种,分别遵循两个国家标准:〖GB 11643-1989〗和〖GB 11643-1999〗。〖CB 11643-1989〗中规定的是15位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。〖GB 11643 -1999〗中规定的是18位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其中,校验码C由本体码按如下过程求得:
(1)计算校验码和S=a18W18+a17W17+…+a2W2,其中i表示18位身份证号,码每一位的序号,从右至左,最左侧为18,最右侧为1;ai表示身份证号码第i位上的号码;wi表示第i位上的权值,其值为2i-1模11的结果;
(2)计算校验码值R,其值为校验和模11的结果;
(3)根据下面对应关系找出校验码C:
由上述计算过程可以看出,18位身份证号码中可能包含非数字的字母X(代表数字10)。下面的应用程序基于这一算法实现了身份证号码的升位查询:
在开发过程中,显示新旧两种身份证号码的文本框(TextBox)分别名为Text1和Text2,“号码升位”按钮(CommandButton)名为Command1。
代码中使用到的字符串函数及功能说明如下:
(1)Len(s):获取字符串s的长度;
(2)Left(s,1):返回字符串s左端长度为1的子串;
(3)Right(s,1):返回字符串s右端长度为1的子串;
(4)Mid(s,p,1):返回字符串s从第P个字符开始长度为1的子串。
[Visual Basic代码]
’计算18位身份证号码
Private Sub Commandl_Click()
Dim code As String
Dim S As Integer
code = Textl. Text '提取15位身份证号码
If Len(code) < > 15 Then
MsgBox "ID 号码长度不正确,请检查!"
(1)
End If
code = Left(code, 6) + "19" + (2) (code, 9) '年份升位
S=0
For i = 18 To 2 Step -1 '计算校验码和
S = S + Clnf((3)) * (2 ^ (i - 1) Mod11)
Next i
(4) '计算校验码值
Select Case S '确定校验码
Case 0: code = code + "1"
Case 1: code = code + "0"
Case 2: code = code + "X"
Case Else: code = code + CStr((5))
End Select
Text2. Text = code '显示18位身份证号码
End Sub
第9题
[说明]
某单位组织一次职业技术考核比赛,由十名评委对选手的现场表现打分(0到100以内的数值)。本程序接收原始评分后,去掉一个最高分、一个最低分,最后计算并输出选手最后得分。在接收输入第i个评分时,若输入数据的类型、范围不正确,程序将给出相应提示,并等待下一次输入,直至正确接收第i个评分为止。程序的运行界面如下:
在开发过程中,文本框名为Text1,界面上有上至下三个按钮分别取名为CmdMark、CmdReresh和CmdExit。
[Visual Basic代码]
Private Sub CmdMark_Click() ’按钮“输入评分”的单击事件响应代码
Dim i As Integer,temp As Variant ’声明变量
Dim marks(1 To 10),maxMark,minMark,sumMark,mark As Single
sumMark=0
Text1.Text=“编号”&Chr(9)&“评分”& vbCrLf
For i=1 To 10 ’接收十个评分输入
Do While 1=1 ’验证并接收第i个评委的评分
temp=InputBox(“请输入”&i&“号评委的评分:”)
If (1) IsNumeric(temp)Then
Msg Box“数据类型错误,请重试!”
ElseIf CSng(temp)<0 Or CSng(temp)>100 Then
MsgBox“数值范围错误,请重试!”
Else:Exit Do
End If
Loop
marks(i)=CSng(temp)
If i=1 Then maxMark=(2):minMark=(2)
If marks(i)>maxMark Then maxMark=marks(i)
If minMark>marks(i)Then (3)
sumMark=sumMark+marks(i)
Text1.Text=Text1.Text & i & Chr(9) & marks(i) & vbCrLf输出第i个评委的评分
Next
mark=( (4))/8 ’计算选手最后得分
Text1.Text=Text1.Text &"去掉一个最高分:"&maxMark&vbCrLf&_
"去掉一个最低分:"&minMark&vbCrLf&_
"选手最后得分:"&mark
End Sub
Private Sub Command2_Click() ’按钮“刷新屏幕”的单击事件响应代码
(5).Text=“单击”输入评分“按钮,开始统分……”
End Sub
Private Sub Command3_Click() 按钮“退出程序”的单击事件响应代码
End
End Sub
第10题
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【说明】
某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am*n*Bn*p,需要m*n*p次乘法运算。
矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110*100,A2100*5,A35*50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。
矩阵链乘问题可描述为:给定n个矩阵<A1,A2,….An>,矩阵Ai的维数为pi-1*Pi,其中i = 1,2,….n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。
由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*….Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…An的一个最优计算顺序。据此构造递归式,
其中,cost[i][j]表示Ai+1*Ai+2*...Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
【C代码】
算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是算法的C语言实现。
(1)主要变量说明
n:矩阵数
seq[]:矩阵维数序列
cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*…Aj+1的最优计算的计算代价
trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2*Aj+1的最优计算对应的划分位置,即k
(2)函数cmm
define N 100
intcost[N][N];
inttrace[N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k,p;
int temp;
for( i=0;i<n;i++){ cost[i][i] =0;}
for(p=1;p<n;p++){
for(i=0; (1) ;i++){
(2);
tempCost = -1;
for(k = i;k<j;k++){
temp = (3) ;
if(tempCost==-1||tempCost>temp){
tempCost = temp;
(4) ;
}
}
cost[i][j] = tempCost;
trace[i][j] = tempTrace;
}
}
return cost[0][n-1];
}
【问题1】(8分)
根据以上说明和C代码,填充C代码中的空(1)~(4)。
【问题2】(4分)
根据以上说明和C代码,该问题采用了 (5) 算法设计策略,时间复杂度 (6) 。(用O符号表示)
【问题3】(3分)
考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5,A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为 (7) (用加括号方式表示计算顺序),所需要的乘法运算次数为 (8) 。
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!