Project设计报告矩阵 1Word格式文档下载.docx
- 文档编号:22508683
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:29
- 大小:189.63KB
Project设计报告矩阵 1Word格式文档下载.docx
《Project设计报告矩阵 1Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Project设计报告矩阵 1Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
输入输出要求:
输入数据要按照预定的表格格式要求输入,对必填的项进行检验。
可维护性:
软件采用面向对象的分析与设计技术,设计合理、清晰,提供标准的文档,具有较强的可维护性。
1.3运行环境与接口
本软件所适用的具体设备必须是PentiumIII以上的CPU、内存128MB以上的计算机,硬盘容量在20GB以上。
支持Windows操作系统的软件环境。
用户接口:
本软件用户一般只需要通过终端进行操作,进入后就可进入窗口。
2概要设计
本课程设计运用继承的思想,从而把定义一矩阵的基类,然后分别定义三个子类,分别为:
矩阵翻转、矩阵卷动、矩阵旋转。
基类中要定义虚函数,以便子类中的成员函数很好的继承它。
矩阵可看成一个二维数组,利用二维数组的性质对其进行相应的操作。
因此,矩阵操作可转化为二维数组的操作。
2.1矩阵翻转
矩阵的翻转可进行沿某中心轴翻转,或垂直,或水平翻转。
翻转的实质是,矩阵的每行(或每列)元素进行倒叙排放,也就是矩阵的倒置。
二维数组的翻转就是将若干个一维数组进行倒置,也就是将数组的左右(或上下)对阵的元素互相交换
A.实现流程图
B.算法流程图
2.2矩阵卷动
矩阵卷动涉及到两个问题:
(1)卷动的方向,或左右卷动,或上下卷动。
(2)卷动的幅度T,如上下卷动的行数,左右卷动的列数。
所谓卷动就实质是将某行或某列的元素循环移位。
上下卷动时,是将每列的元素循环移位,左右卷动时就是将每行的元素进行循环移位卷动方向决定是上下移动还是左右移动。
一维数组的循环移位问题:
如,已知inttemp[10],将其循环右移一位。
显然移位后,temp[8]~temp[10]依次存入temp[9]~temp[1]而原来的temp[9]则返回数组起始部位,存入temp[0]。
那么,移动N位,就是将上面的操作循环N次。
了解一维数组循环移位问题后,显然,矩阵卷动无非是将多个一维数组进行循环移位,多次处理,只要在外层加个大循环就可以解决问题了。
2.3矩阵旋转
矩阵旋转问题应首先了解旋转矩阵的原理。
一位被誉为“彩票黑客”的美国人GailHoward创造的一种叫做“旋转矩阵”投注选号法。
据称在美国彩票史上,这位“彩票黑客”运用“旋转矩阵”法,流水般地中出了74个大奖。
这是一种基于“旋转矩阵”数学原理构造的选号法,其核心宗旨是:
以极低的成本实现复式投注的效果。
一些彩民由于未了解“旋转矩阵”的作用,都采取旧式的复式投注方式(即完全复式),完完整整地拿去打彩,一些对复式投注进行深入研究的彩民发现进行复式投注浪费了不少成本。
据研究者发现约有三分之一号码组合,实际上是不可能中奖或极难中奖的。
那末如何以极低的成本实现复式投注的最佳效果呢?
“旋转矩阵”法则有这些优点。
实际上,旋转矩阵不是教你去如何选号的,而是教你如何科学地组合号码。
相比于完全复式投注组合号码的方法,旋转矩阵有着投入低、中奖保证高的优点。
举个例子讲,10个号码的中6保5型的旋转矩阵的含义就是,你选择了10个号码,如果其中包含了6个中奖号码,那么运用该矩阵提供的14注号码,你至少有一注中对5个号码的奖。
本矩阵只要投入28元,而相应的复式投注需要投入420元。
大家知道,用10个号码,只购买其中的14注,如果你胡乱组合的话,即使这10个号码中包含有6个中奖号码,你也很可能只中得一些小奖。
而运用旋转矩阵的话,就可以得到一个对5个号码的奖的最低中奖保证。
选择矩阵前,首先你要做的事是选号。
有很多读者都曾给我们打过电话,希望在使用旋转矩阵时能跳过选号这一关,让笔者提供一个全部号码的矩阵。
这种矩阵不是不能提供,事实上,我们最多提供了多达32个号码的矩阵。
但是,我们想提醒读者的是,旋转矩阵的注数与你所选择的号码个数是呈级数相关的,也就是说,你最终的投入会因为你排除掉一些号码而大大地减小。
选定了号码之后,你要确定你可以接受的投入。
其实这两者是互相制约的,也就是说,你的投入与你能操作的号码个数及矩阵中奖保证是成正比的,你要想省钱就必须尽可能地精选号码并选择合适的矩阵。
这两者确定之后,你可以选择你的矩阵了。
有时,你会困惑于两个投入相近的选择,如上面所举的例子。
在这种情况下,你应该比较一下旋转矩阵中M保N的中奖结果分析。
红球(个)完全复式(注)旋转矩阵(注)
中6保5中6保4中5保5中5保4中4保4
828431237
984730312
1021014350720
114622251001032
129243861321441
13171661102452166
14300398143713180
15500514257941118
16800822480854152
1712376338121371188
1818564484154781236
现将“旋转矩阵”造号法介绍如下:
一个例子:
比如你选了10个号码,不妨设为1、2、3、4、5、6、7、8、9、10,你想把它们组合起来进行投注,那么组合号码的方法一般有以下2种:
1.复式投注
最简单的方法无疑是复式投注。
所需的注数是210注,成本是420元。
复式投注的好处是可以把这10个号码的所有组合一网打尽。
也就是说,如果你选了这10个号码中包含了开出的6个红球,你可以稳中6个红球。
但复式投注的缺点也是显而易见的,它的成本太高了,所以所选的号码个数很有限,如果你不想花那么大的成本的话,比如只想花30元以内,那么你可以选用其他的组合号码的办法-如下面的旋转矩阵法。
2.旋转矩阵
如果用旋转矩阵来进行投注的话,只要买14注,那么,开出的6个红球在你选的10个号码之内,你至少有一注对5个红球以上的号。
选10个号码,出6中5型旋转矩阵
010203040509,
010203040710,
010203070809,
010204050608,
010204060910,
010305060810,
010405070810,
010506070910,
020304050607,
020306070810,
020306080910,
020507080910,
030405080910,
030406070809
矩阵旋转(绕中心点)涉及两个方面的问题:
(1)旋转方向,顺时针还是逆时针。
(2)旋转角度,如90度、180度、270度、360度等。
本次实践中只考虑方阵的情况,即矩阵的行、列数相同。
旋转操作的实质就是数组的重新的组合,对应交换元素的值。
即将矩阵分成N层,每层分别进行对应交换元素的值的操作。
循环N次后就即可成功。
至于旋转的角度问题,可以看出要求的角度都是90度的倍数。
因此,设计时仅需要考虑90度的情况,其他的情况只需重复操作若干次即可。
以顺时针为例,如需旋转180度,只需将旋转90度操作连续执行两次即可实现。
3详细设计
3.1矩阵翻转
矩阵翻转是以矩阵的倒置为基础。
设于一矩阵为arr[i][j],则对其进行翻转操作的算法如下:
水平翻转,
for(i=0;
i<
5;
i++)
for(j=0;
j<
5/2;
j++)
{
temp=arr[i][j];
arr[i][j]=arr[i][4-j];
arr[i][4-j]=temp;
}
垂直翻转:
for(j=0;
for(i=0;
{
temp=arr[i][j];
arr[i][j]=arr[4-i][j];
arr[4-i][j]=temp;
}
以水平翻转为例,操作结果如下图:
3.2矩阵卷动
矩阵卷动的算法如下:
左右卷动:
for(k=0;
k<
a;
k++)//卷动a次
for(i=0;
=4;
i++)//矩阵各行进行循环移位,实现矩阵的卷动
temp=arr[i][0];
for(j=0;
4;
{
arr[i][j]=arr[i][j+1];
}
arr[i][4]=temp;
}
上下卷动:
for(k=0;
for(j=0;
j++)//矩阵各行进行循环移位,实现矩阵的卷动
{
temp=arr[0][j];
for(i=0;
{
arr[i][j]=arr[i+1][j];
}
arr[4][j]=temp;
以左右卷动,且卷动一位为例,操作结果如下:
3.3矩阵旋转
矩阵旋转的算法如下:
逆时针旋转:
for(k=1;
=a;
k++)
for(i=0;
=2;
i++)//进行矩阵旋转操作
for(j=i;
(4-i);
temp=arr[i][j];
arr[i][j]=arr[j][4-i];
arr[j][4-i]=arr[4-i][4-j];
arr[4-i][4-j]=arr[4-j][i];
arr[4-j][i]=temp;
顺时针旋转:
for(j=i;
arr[i][j]=arr[4-j][i];
arr[4-j][i]=arr[4-i][4-j];
arr[4-i][4-j]=arr[j][4-i];
arr[j][4-i]=temp;
以顺时针旋转90度为例,操作结果如下:
3.4程序源代码
#include<
iostream.h>
stdlib.h>
iomanip.h>
classsquare//基类
{
protected:
inti,j,arr[5][5];
public:
square();
//随机生成一个元素为三位正整数的5*5的矩阵
virtualvoidacceptArray();
//接收随机生成的矩阵
virtualvoidprocessingArray();
//进行矩阵操作
virtualvoiddisplayArray();
//显示生成的矩阵
};
square:
:
square()
for(i=0;
arr[i][j]=rand()%1000;
}
voidsquare:
acceptArray()
processingArray()
cout<
<
"
矩阵操作进行中!
!
endl;
displayArray()
{
cout<
setw(8)<
arr[i][j];
cout<
}
}//======================================================
classsquarefz:
publicsquare//矩阵翻转(fz)
voidacceptArray();
//显示待操作的矩阵
voidprocessingArray();
//进行矩阵的翻转操作
voiddisplayArray();
//显示翻转后的矩阵
voidsquarefz:
square:
acceptArray();
操作前的矩阵是:
"
displayArray();
processingArray();
intn,temp;
cout<
***********************"
*欢迎进入矩阵翻转操作!
*"
*=====================*"
*1.水平翻转*"
*2.垂直翻转*"
请按1或2选择操作!
cin>
>
n;
你选择的是:
n<
switch(n)
case1:
for(i=0;
i++)//将矩阵每行倒置,实现矩阵的水平转置
break;
case2:
arr[i][j]=arr[4-i][j];
arr[4-i][j]=temp;
default:
cout<
输入错误!
请重新输入!
squarefz:
操作后的矩阵为:
}//=========================================================cclasssquarejd:
publicsquare//矩阵卷动(jd)
//实现矩阵的卷动
//进行矩阵的卷动操作
//显示卷动后的矩阵
voidsquarejd:
intn,a,temp;
*欢迎进入矩阵卷动操作!
*1.左右卷动*"
*2.上下卷动*"
请输入要卷动的位数!
(提示:
输入的卷动位数需要小于5!
)"
a<
if(a>
5)
输入错误,请从重新输入(位数不能大于5!
squarejd:
else
switch(n)
case1:
intk;
for(k=0;
i++)//矩阵各行进行循环移位,
//实现矩阵的卷动
}break;
case2:
for(k=0;
for(j=0;
j++)//矩阵各行进行循环移位,
temp=arr[0][j];
for(i=0;
arr[i][j]=arr[i+1][j];
arr[4][j]=temp;
default:
squarejd:
}//=========================================================
classsquarexz:
publicsquare//矩阵旋转(xz)
//实现矩阵的旋转
//进行矩阵的旋转操作
//显示旋转后的矩阵
voidsquarexz:
*欢迎进入矩阵旋转操作!
*1.顺时针旋转*"
*2.逆时针旋转*"
本操作只提供90度倍数的旋转的操作!
请输入你所想要操作的90度的倍数:
;
cin>
intk;
for(k=1;
i++)//进行矩阵旋
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Project设计报告矩阵 Project 设计 报告 矩阵