if((i+1)%5==0)cout<<'\n';
}
}
MOVE:
:
~MOVE()
{
delete[]array;//
}
voidmain()
{
intb[]={21,65,43,87,12,84,44,97,32,55},n=10;
MOVEf(b,n);
f.exchange();
f.print();
}
(3)运行结果
(4)基本分析
1.要注意的函数:
构造函数中:
当要用到指针来操作数组时,要通过new运算符动态申请空间。
格式:
指针变量=new数据类型[数组大小],指针变量保存该空间的首地址
析构函数:
释放new分配的而动态内存,格式:
delete[]指针变量
2.相关算法:
定义指针变量p1、p2指向数组的首地址,这句话等价于p1=p2=&array[0];
遍历数组,p1指向最小值,p2指向最大值
交换*p1、*p2的值
3、第17题
(1)题目:
定义一个类SIN。
求sin(x)=x/1-x^3/3!
+x^5/5!
-x^7/7!
+……+(-1)^(n+1)x^(2n+1)/(2n+1)!
具体要求如下:
(1)私有成员数据。
①doublex:
输入公式中x的值,求sin(x)。
②intn:
输入公式中n的值。
(2)公有成员函数。
①SIN(intx,intn):
构造函数,用于初始化x和n的值。
②double power(intq):
求q!
的值。
③int mi(intm,intn):
求m^n的值。
fun():
用于求sin(x)的值。
void show():
输出求得的结果。
(3)在主程序中定义对象test,对该类进行测试。
(二)源程序:
#include
classSIN
{
doublex;
intn;
public:
SIN(doublex,intn);
doublepower(intq);
doublemi(intm,intn);
doublefun();
voidshow();
};
SIN:
:
SIN(doublex,intn)
{
this->x=x;
this->n=n;//
}
doubleSIN:
:
power(intq)
{
for(intm=1;mq*=m;//
returnq;
}
doubleSIN:
:
mi(intm,intn)
{
for(inti=1;im*=m;//
returnm;
}
doubleSIN:
:
fun()
{
doublesinx=0;
for(inti=1;i<=n;i++)
sinx+=mi(-1,i+1)*mi(x,2*i-1)/power(2*i-1);//
returnsinx;
}
voidSIN:
:
show()
{
cout<<"请输入x:
"<cout<<"sin("<}
voidmain()
{
doublex,n;
cout<<"请输入x和n的值:
"<cin>>x>>n;
SINtest(x,n);
test.show();
}
(3)运行结果:
(四)基本分析:
1.需要注意:
this指针指向本身对象的数据成员,避免因数据名相同而造成的混乱。
按题目要求,这一题只能用this指针加以区分。
2.相关算法:
求阶乘
求m^n。
i这个公式看起来比较繁琐,对应着公式调用相关函数写,不要弄错
4、第18题
(1)题目:
18.试建立一个类VAR,用于求n(n<=100)个数的均方差。
均方差的计算公式为
,其中平均值为
具体要求如下:
(1)私有成员数据。
double a[100]:
用于存放输入的n个数。
int n:
实际输入数的个数n。
(2)公有成员函数。
VAR(double x[], int n1):
构造函数,初始化成员数据a和个数n。
double average(double x[], int n):
求平均值,数组x具有n个元素。
void variance(double x[],int n):
求均方差,数组x具有n个元素。
void show():
输出求得的均方差。
(3)在主程序中定义一个对象test,对该类进行测试。
(2)源程序:
#include
classVAR
{
doublea[100];
intn;
public:
VAR(doublex[],intn1);
doubleaverage(doublex[],intn);
voidvariance(doublex[],intn);
voidshow();
};
VAR:
:
VAR(doublex[],intn1)
{
for(inti=0;ia[i]=x[i];
n=n1;
}
doubleVAR:
:
average(doublex[],intn)
{
doublea=0;
for(inti=0;ia+=x[i];
a/=n;
returna;
}
voidVAR:
:
variance(doublex[],intn)
{
doubled=0;//
for(inti=0;id=(x[i]-average(x,n))*(x[i]-average(x,n));
d/=n;
cout<<"方差为:
"<}
voidVAR:
:
show()
{
cout<<"平均值为:
"<variance(a,n);
}
voidmain()
{
doublex[100]={16,18,25,23,56,14};
intn1=6;
VARtest(x,n1);
test.show();
}
(3)运行结果:
(4)基本分析:
1.需要注意:
方差d最好定义成double型
2.此题不难,按照题目要求“堆”程序即可,没有复杂的算法,也没有特殊的结构。
5、第二十题
(1)题目:
4
8
12
16
3
7
11
15
2
6
10
14
1
5
9
13
20.定义一个方阵类Array,实现对方阵进行逆时针90度旋转。
如图所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
具体要求如下:
(1)私有数据成员
int a[4][4]:
用于存放方阵。
(2)公有成员函数
Array (int a1[][4],int n) :
构造函数,用给定的参数a1初始化数据成员a。
void xuanzhuan () :
实现对方阵a进行逆时针90度的旋转。
void show() :
在屏幕上显示数组元素。
(3)在主程序中定义数组
intb[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}作为原始数组。
定义一个Array类对象test,用b初始化test,完成对该类的测试。
(2)源程序:
#include
classArray
{
inta[4][4];
public:
Array(inta1[][4],intn);
voidxuanzhuan();
voidshow();
};
Array:
:
Array(inta1[][4],intn)
{
for(inti=0;ifor(intj=0;ja[i][j]=a1[i][j];
}
voidArray:
:
xuanzhuan()
{
inti;
inta2[4][4];
for(i=0;i<4;i++)
{
for(intj=0;j<4;j++)
a2[i][j]=a[j][3-i];//
}
for(i=0;i<4;i++)
for(intj=0;j<4;j++)
a[i][j]=a2[i][j];//
}
voidArray:
:
show()
{
cout<<"输出的数组为:
"<for(inti=0;i<4;i++)
{
for(intj=0;j<4;j++)
cout<cout<}
}
voidmain()
{
intb[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
intn=4;
Arraytest(b,n);
test.xuanzhuan();
test.show();
}
(3)运行结果:
(4)基本分析:
新建一个数组a2[4][4],用来存放旋转后的a1[4][4],逆时针旋转90度,其实就是列变成行,行变成列的同时左移三个。
把a2[4][4]赋值给a1[4][4],这样a1[4][4]就是旋转后的矩阵。
六、第三十题
(一)题目:
30.建立一个矩阵类Array,对二维数组中左下三角的全部元素(包括对角线上的元素)作如下变换。
(1)若该数不是素数则保持不变;
(2)若该数是素数,则用大于它的最小素数替换该数。
并统计二维数组中左下三角的全部元素(包括对角线上的元素)中的素数个数。
具体要求如下:
(1)私有数据成员
int x[4][4]:
存储需要处理的二维数组的各元素值。
int count:
存储左下三角元素中素数的个数。
(2)公有成员函数
构造函数:
进行初始化x数组和count的值。
intfun(int);判断一个数是否为素数的函数。
voidencode():
对x数组中左下三角的全部元素(包括对角线上的元素)逐一进行判断,若该数不是素数则保持不变,若该数是素数,则用大于它的最小素数替换该数。
void print():
按行输出矩阵的值。
(3)编写一个程序测试该类,说明(声明)Array对象A,将一个矩阵存入对象A中,并输出矩阵的值,使用以下测试数据。
3
6
4
17
8
5
9
10
12
19
7
20
4
14
21
23
5
6
4
17
8
7
9
10
12
23
11
20
4
14
21
29
(2)源程序:
#include
classarray
{
intx[4][4];
intcount;
public:
array(inta[4][4]);
intfun(int);
voidencode();
voidprint();
};
array:
:
array(inta[4][4])
{
for(inti=0;i<4;i++)
for(intj=0;j<4;j++)
x[i][j]=a[i][j];
count=0;
}
intarray:
:
fun(intnum)
{
intflag;
for(inti=2;iif(num%i==0)return0;
elsereturn1;//
}
voidarray:
:
encode()
{
inti,j,n;
for(i=0;i<4;i++)
{
for(j=0;j<=i;j++)//
{
if(fun(x[i][j]))//
{
for(intm=x[i][j]+1;;m++)
if(fun(m))//
{
x[i][j]=m;
break;//
}
count+=1;//
}
}
}
}
voidarray:
:
print()
{
inti,j;
cout<<"变换后的矩阵为:
"<for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
cout<cout<}
cout<<"左下角素数个数为:
"<}
voidmain()
{
inta[4][4]={3,6,4,17,8,5,9,10,12,19,7,20,4,14,21,23};
arraytest(a);
test.encode();
test.print();
}
(3)运行结果:
(4)基本分析:
判断是否为素数,运用条件语句,是就return1,否就return0,是很巧妙地方法。
如何表示一个方阵的左下角(包括对角线上)的数?
通过双循环,列不大于行数即可表示。
逐个判断左下角(包括对角线上)的数是否为素数,利用了上面定义的fun()函数实现,是就进入下面的循环。
如果是素数,就寻找下一个用来代替它的素数。
一旦找到就跳出循环,count计数
count加一计数