C++上机题目复习及答案2.docx
《C++上机题目复习及答案2.docx》由会员分享,可在线阅读,更多相关《C++上机题目复习及答案2.docx(32页珍藏版)》请在冰豆网上搜索。
C++上机题目复习及答案2
第十周上机题目
题目:
1.建立一个矩阵类Array,存储一个n×n矩阵并能完成矩阵转置运算。
要求如下:
(1)私有成员数据
int*x:
指向存储一个n×n矩阵值的内存区域(二维数组作为一维数组存储)
intn:
存储矩阵行数
(2)公有成员函数
构造函数:
用参数指定的值或缺省值3初始化n,并用n的值为矩阵动态申请内存空间;
析构函数:
释放对象存储矩阵时占用的内存空间;
viodinput(int*a):
将一个矩阵赋值给对象中的数组。
voidprint():
按行输出矩阵的值。
voidchange():
转置矩阵。
编写一个程序测试该类。
定义对象A,将一个矩阵存入A中,并输出矩阵的值,转置对象A中的矩阵并输出,使用以下测试数据:
A=
A转置后的矩阵=
#include
#defineN3
classArray{
int*x;//指向存储一个n×n矩阵值的内存区域(二维数组作为一维数组存储)
intn;//存储矩阵行数
public:
Array(ints=3){
n=s;
x=newint[N*N];
}
voidinput(int*a);//将一个矩阵赋值给对象中的数组。
voidprint();//按行输出矩阵的值。
voidchange();//转置矩阵。
~Array(){
if(x)delete[]x;
}
};
voidmain(){
inta[N][3];
inti,j;
cout<<"请输入"<for(i=0;ifor(j=0;jcin>>a[i][j];
}
Arrayd(N);
d.input(a[0]);
cout<<"原始数组为:
\n";
d.print();
d.change();
cout<<"转置后的数组为:
\n";
d.print();
}
voidArray:
:
input(int*a){
for(inti=0;ix[i]=*a++;
}
voidArray:
:
print(){
for(inti=0;i((i+1)%3)?
cout<cout<}
voidArray:
:
change(){
inttemp;
for(inti=0;ifor(intj=0;j
temp=x[i*N+j];
x[i*N+j]=x[j*N+i];
x[j*N+i]=temp;
}
}
2.编程题
模拟人脑神经网络的神经元结构模型如下图所示:
其中,xi表示输入信号,wi表示输入信号的加权系数,y表示神经元的输出,它们的之间的关系为:
这里,∑表示各项的和,exp(z)为求z的自然指数值ex的函数,包含在头文件math.h中,其函数原型为doubleexp(doublez)。
试定义一个NN类实现上述模型。
具体要求如下:
1)私有成员
●floatx[5],dt:
数组x和数组w分别存放输入信号xi及其加权系数wi;dt存放非零参数σ。
●doubley:
神经元的突出。
2)公有成员:
●NN(floatt[],floatd)用数组t初始化加权系统wi,用d初始化dt。
●voidfun(floatt[]):
用数组t初始化xi,并根据上述公式计算y的值。
●voidprint():
输出输入信号和输出信号的值
在主函数中,用输入信号{1.2,3.5,2.3,3.2,2.8}以及加权系数{o.5,0.8,1.2,1.8,1.1}对该类进行测试。
#include
#include
classNN{
floatx[5],w[5],dt;
doubley;
public:
NN(floatt[],floatd);//用数组t初始化加权系统wi,用d初始化dt。
voidfun(floatt[]);//用数组t初始化xi,并根据上述公式计算y的值。
voidprint();//输出输入信号和输出信号的值
};
voidmain(){
floata[5]={1.2,3.5,2.3,3.2,2.8};
floatb[5]={0.5,0.8,1.2,1.8,1.1};
NNt(b,0.2);
t.fun(a);
t.print();
}
NN:
:
NN(floatt[],floatd){
for(inti=0;i<5;i++)
w[i]=t[i];
dt=d;
}
voidNN:
:
fun(floatt[]){
for(inti=0;i<5;i++)
x[i]=t[i];
doublen=0.0;
for(i=0;i<5;i++)
n+=(x[i]-w[i])*(x[i]-w[i]);
y=exp(-n/(2*dt*dt));
}
voidNN:
:
print(){
cout<<"x[i]=";
for(inti=0;i<5;i++)
cout<cout<cout<<"y="<}
附加题:
3.面向对象编程:
几何图形类
【要求】按以下描述和要求建立两个类:
基类Rectangle和派生类Cube:
Rectangle
私有成员:
doublex1,y1;//左下角的坐标
doublex2,y2;//右上角的坐标
公有成员
Rectangle(doublea=0,doubleb=0,doublec=0,doubled=0);
//带缺省值的构造函数
doublegetwidth();//计算并返回矩形的宽
doublegetlength();//计算并返回矩形的长
virtualvoiddisplay();//输出矩形的各坐标及长宽
注:
正立方体Cube的底面矩形从基类继承
Cube:
私有成员:
stringname;//立方体名称(字符串对象)
doubleh;//立方体高度
公有成员:
Cube(string="",double=0,……);//带缺省值的构造函数
voidset(string,double);//修改立方体标识符和高度值
voiddisplay();//输出立方体全部信息,并计算输出体积
Cubeadd(Cube&S);//将参数对象S的高度加到this对象上。
以上成员函数的参数名如有未给出的则自已命名。
头文件包含语句为:
#include
#include
主函数要求:
(1)定义Rectangle类对象A{坐标:
10,10,30,40};
定义Cube类对象B{坐标:
20,10,30,40;名称和高度:
Box,60}、C(C数据由B拷贝生成)和D(D数据暂无)。
(2)调用函数set修改对象C的名称和高度值。
数据为{Trunk,95}。
(3)调用函数display及相关函数输出对象A、B和C的全部数据,计算输出B和C的体积。
每个对象的信息占一行。
(4)调用add函数,计算D=B+C。
输出D的全部数据,计算并输出D的体积。
#include
#include
classRectangle{
doublex1,y1;//左下角的坐标
doublex2,y2;//右上角的坐标
public:
Rectangle(doublea=0,doubleb=0,doublec=0,doubled=0){
x1=a,y1=b;x2=c,y2=d;
}
doublegetwidth(){return(x2-x1);}//计算并返回矩形的宽
doublegetlength(){return(y2-y1);}//计算并返回矩形的长
voiddisplay();//输出矩形的各坐标及长宽
};
classCube:
publicRectangle{
charname[10];//立方体名称(字符串对象)
doubleh;//立方体高度
public:
Cube(doublea=0,doubleb=0,doublec=0,doubled=0,
char*s=0,doubleh1=0):
Rectangle(a,b,c,d){//带缺省值的构造函数
if(s)strcpy(name,s);
h=h1;
}
voidset(char*,double);//修改立方体标识符和高度值
voiddisplay();//输出立方体全部信息,并计算输出体积
Cubeadd(Cube&S);//将参数对象S的高度加到this对象上。
};
voidmain(){
RectangleA(10,10,30,40);
CubeB(20,10,30,40,"Box",60),C(B),D;
B.set("Trunk",95);
A.display();
B.display();
C.display();
D=B.add(C);
D.display();
}
voidRectangle:
:
display(){
cout<<"矩形:
";
cout<<"左下角的坐标:
"<"<cout<<"长:
"<<(x2-x1)<<",宽:
"<<(y2-y1)<}
voidCube:
:
set(char*s,doubleh1){
h=h1;
strcpy(name,s);
}
voidCube:
:
display(){
doublemj=getwidth()*getlength();
cout<<"长方体:
";
cout<<"底面积为:
"<cout<<"体积为:
"<}
CubeCube:
:
add(Cube&S){
h+=S.h;
return*this;
}
第十一周上机题目
题目:
1.建立一个类NUM,求指定范围内的所有素数(质数)。
具体要求如下:
1)私有数据成员。
●intdata[25];依次存放指定范围内的所有素数。
●intspanl,span2;存放要求计算的素数的范围。
●intnum;存放span1与span2之间的素数个数。
2)公有成员函数。
●构造函数NUM(inta,intb);初始化所要求的素数的范围span1、span2及num(值为0)。
●voidprocess():
求出指定范围内的所有素数,把它们依次存放在数组data中,并将求出的素数的个数赋给num。
●voidprint():
输出求出的所有素数。
3)在主程序中对该类进行测试。
使用测试数据span1=100,span2=200。
即求100~200之间的所有素数。
#include
#include
classNUM{
intdata[25];//依次存放指定范围内的所有素数。
intspan1,span2;//存放要求计算的素数的范围。
intnum;//存放span1与span2之间的素数个数。
public:
NUM(inta,intb);
voidprocess();
voidprint();
};
voidmain(){
NUMa(100,200);
a.process();
a.print();
}
NUM:
:
NUM(inta,intb){
span1=a;
span2=b;
num=0;
}
voidNUM:
:
process(){
inti,n,f=0;
for(i=span1;i<=span2;i++){
for(n=2,f=0;n<=sqrt(i);n++)
if(i%n==0){f=1;break;}
if(f==1)continue;
data[num++]=i;
}
}
voidNUM:
:
print(){
for(inti=0;icout<if(++i%6==0)cout<}
cout<}
2.编程题
已知由一个数组派生出另一个数组的派生规则如下:
假定原始数组为a[10],新数组为b[10],则b[i]的值为数组a中大于a[i]的元素的个数。
例如,对于说明“inta[]={1,2,3,4,5};intb[5];”,其中a[1]=2,数组a中有3个元素比a[1]大,则b[1]=3。
试建立一个实现此功能的类ARRAY。
具体要求如下:
1)私有数据成员。
●inta[10],b[10];a存放原始数组,b存放派生数组。
2)公有成员函数。
●构造函数ARRAY(intdata[10]);初始化成员数组a。
●voidprocess();由数组a根据上述派生类规则,用循环语句计算数组b的各元素。
●voidprint();屏幕显示数组a和b。
#include
classARRAY{
inta[10],b[10];
public:
ARRAY(intdata[10]);//初始化成员数组a。
voidprocess();//由数组a根据上述派生类规则,用循环语句计算数组b的各元素。
voidprint();//屏幕显示数组a和b。
};
voidmain(){
inta[]={7,4,9,23,56,44,18,33,21,17};
ARRAYarray(a);
array.process();
array.print();
}
ARRAY:
:
ARRAY(intdata[10]){
for(inti=0;i<10;i++){
a[i]=data[i];
b[i]=0;
}
}
voidARRAY:
:
process(){
for(inti=0;i<10;i++){
for(intk=0;k<10;k++)
if(a[k]>a[i])b[i]++;
}
}
voidARRAY:
:
print(){
cout<<"a[10]=";
for(inti=0;i<10;i++)
cout<cout<cout<<"b[10]=";
for(i=0;i<10;i++)
cout<
cout<}
附加题:
3.面向对象编程:
物品保管箱管理应用程序
【要求】按以下描述和要求建立一个类Boxes,执行主函数对其测试。
私有成员:
int*box;//指向保管箱数组,下标为箱号,元素值为0表示空箱;大于0表示该箱中存入的物品数量。
char*flag;//指向客户标识符数组(下标为箱号,与box数组配对使用)
staticintsum;//累计存入物品数量
intxh;//保管箱的个数
公有成员:
Boxes(intnum=10);//构造函数,动态分配box和flag数组空间,长度为num。
~Boxes();//析构函数,释放分配的内存
voidput(intn,charm);//选择一个空箱存入n件物品,填写客户标识符,并将物品数量累加到sum;若找不到空箱则输出提示信息。
voidget(charm);//根据客户标识符(元素下标)查找存储的物品,找到后取出并清空保管箱(置0)。
若找不到指定则输出提示信息。
voiddisplay();//输出保管箱类所有数据,统计占用箱个数和空闲箱个数。
最后输出存入物品数量
头文件包含语句为:
#include
在类定义外面对静态成员做定义性说明并赋初值为零:
intBoxes:
:
sum=0;
主函数要求:
1)定义Boxes类对象A,B
(2)。
数组元素初始值为零。
2)调用函数put为对象A和B做存储操作:
A.put(5,‘R’);B.put(9,’K’);
A.put(8,‘P’);
B.put(15,‘H’);
B.put(40,‘F’);
调用函数display输出对象A和B的全部数据。
3)调用函数put和get为对象A和B做存储和取出操作:
B.get(‘H’);
B.put(40,‘F’);
A.get(‘S’);
A.get(‘R’);
A.put(12,‘M’);
4)调用函数display输出对象A和B的全部数据。
#include
classBoxes{
int*box;//指向保管箱数组,下标为箱号,元素值为0表示空箱;大于0表示该箱中存入的物品数量。
char*flag;//指向客户标识符数组(下标为箱号,与box数组配对使用)
staticintsum;//累计存入物品数量
intxh;
public:
Boxes(intnum=10);//构造函数,动态分配box和flag数组空间,长度为num。
~Boxes();//析构函数,释放分配的内存
voidput(intn,charm);//选择一个空箱存入n件物品,填写客户标识符,并将物品数量累加到sum;若找不到空箱则输出提示信息。
voidget(charm);//根据客户标识符(元素下标)查找存储的物品,找到后取出并清空保管箱(置0)。
若找不到指定则输出提示信息。
voiddisplay();//输出保管箱类所有数据,统计占用箱个数和空闲箱个数。
最后输出存入物品数量
};
intBoxes:
:
sum=0;
voidmain(){
BoxesA,B
(2);//数组元素初始值为零。
A.put(5,'R');
B.put(9,'K');
A.put(8,'P');
B.put(15,'H');
B.put(40,'F');
cout<<"A库:
\n";A.display();
cout<<"B库:
\n";B.display();
B.get('H');
B.put(40,'F');
A.get('S');
A.get('R');
A.put(12,'M');
cout<<"A库:
\n";A.display();
cout<<"B库:
\n";B.display();
}
Boxes:
:
Boxes(intnum){
box=newint[num];
flag=newchar[num];
xh=num;
for(inti=0;ibox[i]=flag[i]=0;
}
Boxes:
:
~Boxes(){
delete[]box;
delete[]flag;
}
voidBoxes:
:
put(intn,charm){
inti=0;
while(box[i]!
=0&&i++if(ibox[i]=n;flag[i]=m;sum+=n;
}
elsecout<<"无空箱存放客户"<\n\n";
}
voidBoxes:
:
get(charm){
inti=0;
while(flag[i]!
=m&&iif(flag[i]!
=m)
cout<<"没有找到客户"<\n\n";
else
{
sum-=box[i];
box[i]=0;
}
}
voidBoxes:
:
display(){
intn=0;
for(inti=0;iif(box[i]>0)
cout<<"客户"<存放物品数量:
"<\n";
elsen++;
cout<<"占用箱个数:
"<"<\n存入物品总数量有:
"<}
第十二周上机题目
一.编程题
【程序功能】找出给定范围内的和亲数。
对于两个正整数,如果其中的一个整数是另一个整数的全部真因子之和,反之亦然,则称这两个数为“和亲数”。
例如,220有真因子“1,2,4,5,10,11,20,22,44,55,110”,其和为284,而284有真因子“1,2,4,71,142”,其和为220,因此220和284就是一对和亲数。
【编程要求】
1.试建立一个类NNM
●私有数据成员
intn1,n2;//查找数据的范围
inta[10][2];//存储m~n(mintnum;//统计和亲数对的个数
●公有成员函数
1)缺省构造函数:
初始化数据成员n1,n2为0。
2)带参构造函数NNM(intm,intn):
用参数初始化数据成员n1,n2。
3)voidfind()函数用于查找n1~n2之间的所有和亲数对并存储到数组中
4)打印函数voidprint(),将结果输出到屏幕
#include
classNNM{
intn1,n2;
inta[10][2];
intnum;
public:
NNM(){n1=0;n2=0;num=0;}
NNM(inta,intb){
n1=a,n2=b,num=0;
}
voidfind();
voidprint();
};
voidmain(){
NNMa(2,500);
a.find();
a.print();
}
voidNNM:
:
find(){
intsum1=0,