矩阵文档.docx
- 文档编号:25500920
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:18
- 大小:253.38KB
矩阵文档.docx
《矩阵文档.docx》由会员分享,可在线阅读,更多相关《矩阵文档.docx(18页珍藏版)》请在冰豆网上搜索。
矩阵文档
成都信息工程学院
课程设计
题目:
魔方矩阵
作者姓名:
班级:
学号:
指导教师:
日期:
年月日
作者签名
摘要
我的实践题目是对C语言程序设计——魔方矩阵,主要的要求:
采用菜单形式,至少包含输入矩阵、保存矩阵、载入矩阵、退出;输入整数N,输出N*N的二阶矩阵;每一行,每一列以及两条对角线之和相等;程序中应能判断N的合法性及合理性;
N最大值不得小于20;并指定行的排序,排序方法不限,排序后且能按排序后的结果保存到文件中,并且能够下一次载入;每次输出一个矩阵,同时在下面输出素数、水仙花数。
此次的系统我还添加了一个注册模块。
本实践能够充分的考核我们对C语言的熟悉度以及实践能力,对我们更多学习与了解C语言有极大的帮助,因此这次实践是十分有必要的。
我的设计内容就是利用if条件语句、for循环语句以及条件判断语句等函数及指针的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方矩阵,文件,素数,水仙花数的算法进一步的了解掌握。
关键字:
C语言for循环if条件魔方矩阵素数水仙花数
目录
1引言3
1.1课题背景3
1.2本课题的主要工作3
2魔方矩阵系统需求分析及开发工具4
2.1系统应具备的基本功能4
2.2开发环境及工具4
2.2.1运行环境4
2.2.2c语言简介4
2.2.3for循环语句介绍4
2.2.4if条件语句介绍5
3系统总体结构设计6
3.1基本简介6
3.2算法设计6
3.3系统功能模块设计简介8
3.3.1魔方矩阵模块8
3.3.2文件的读与写13
4系统测试与分析15
4.1测试15
4.2测试过程中遇到的问题15
5结论16
6参考文献16
1引言
1.1课题背景
魔方又称幻方、纵横图、九宫图,最早记录于我国古代的洛书。
据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服。
后人称之为"洛书"或"河图",又叫河洛图。
N为奇数时
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放:
按45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3)如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样减1;
(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上的数关于大方阵中心作中心对称交换(注意是各各子矩阵对角线上面的数),即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
N为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:
首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶魔方给分解的4个子方阵对应赋值
上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v)
即4个子方阵对应元素相差v,其中v=n*n/4
1.2本课题的主要工作
采用菜单形式,至少包含输入矩阵、保存矩阵、载入矩阵、退出;输入整数N,输出N*N的二阶矩阵;每一行,每一列以及两条对角线之和相等;程序中应能判断N的合法性及合理性;N最大值不得小于20;并指定行的排序,排序方法不限,排序后且能按排序后的结果保存到文件中,并且能够下一次载入;每次输出一个矩阵,同时在下面输出素数、水仙花数。
2魔方矩阵系统需求分析及开发工具
2.1系统应具备的基本功能
实现每一行,每一列以及对角线的相加结果相同,并指定行的排序,排序方法不限,排序后且能按排序后的结果保存到文件中,并且能够下一次载入,每次输出一个矩阵,同时在下面输出素数、水仙花数。
2.2开发环境及工具
2.2.1运行环境
本课题在VC6.0下运行,在这个平台上进行程序的调试。
2.2.2c语言简介
C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。
具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序员中备受青睐。
最近25年是使用最为广泛的编程语言。
2.2.3for循环语句介绍
C语言中的For语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束的条件的情况下,它可以完全替代while语句。
for语句的一般表达式
for(<初始化>;<条件表达式>;<增量>)语句
For语句的执行过程如下:
(1)最先求解初始化.
(2)求解条件表达式,若其值为真,则执行for语句中指定的内嵌语句,然后执行下面第(3)步。
若为假,则结束循环。
(3)求解增量。
(4)转回上面第
(2)步骤继续执行。
(5)循环结束,执行for语句下面的一个语句。
2.2.4if条件语句介绍
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
C语言提供了3种形式的if语句。
if(表达式)语句
if(表达式)语句1else语句2
if(表达式1)语句1
elseif(表达式2)语句2
…
else语句n
3系统总体结构设计
3.1基本简介
就是使用模块化思维方法分析课题,画出模块结构图。
可采取自顶向下、逐层分析的方法,将课题分成若干的模块,然后对个模块重点和难点内容进行分析,最终各个击破。
3.2算法设计
在设计算法时采用了下面一些方法:
定义了一些函数。
使用二维数组来表示魔方矩阵。
使用if条件语句,for循环,switch选择语句。
魔方矩阵的算法分析:
先在矩阵第一行中间的位置上放1,然后把数字按照升序沿着左上角放置到矩阵中。
如果越界了,就假设周围还有一个矩阵,将数字放到那个位置上;如果那个位置已经被占据了,就跳过该位置放到下面的位置,然后重新按照原来的方法放。
例如:
在5×5的魔术矩阵中,放完1以后,就把2放到1的左上角,但是此时已经越界了。
假设,在原来的矩阵上面还有一个矩阵,则数字2所放的位置应该是在最后一行的第二个位置,接下去就要把数字3放到2的左上角,依次放下去,当放到6的时候,由于1已经将下一个位置占了,所以就放到5下面的位置。
依照这样的规律直到把数字都放完。
图1素数的设计思路
水仙花的设计思路:
水仙花数是指一个三位数,其各位上的数之立方和恰好等于该数自己。
Eg:
153=1x1x1+5x5x5+3x3x3;
图2水仙花数的设计算法
3.3系统功能模块设计简介
3.3.1魔方矩阵模块
voidmain()
{
intcmd;
intarray[NUM_MAX][NUM_MAX],N=0;
while
(1)
{
printf("1.输入魔方矩阵\n");
printf("2.载入魔方矩阵\n");
printf("3.保存魔方矩阵\n");
printf("4.打印矩阵及素数水仙数\n");
printf("0.退出程序\n");
printf("请输入对应数字:
");
scanf("%d",&cmd);
//登录和注册界面
if(cmd==0)
{
printf("再见!
");
return;
}
elseif(cmd==1)
{
printf("\n输入矩阵N[3-%d]:
",NUM_MAX/2);
scanf("%d",&N);
if(!
isValidN(N))
{
printf("N不符合要求。
");
continue;
}
placeMagicArray(N,array);
printf("矩阵生成成功。
");
}
elseif(cmd==2)
{
N=loadMagicArray(array);
if(!
isValidN(N))
{
printf("载入失败");
}
}
else
{
if(!
isValidN(N))
{
printf("矩阵不存在");
continue;
}
elseif(cmd==3)
{
saveMagicArray(N,array);
}
elseif(cmd==4)
{
printMagicArray(N,array);
printPrimeNumbers(N);
printNarcissisticNumbers(N);
}
}
}
}
//打印和输出魔方矩阵模块
start:
while
(1)
{
loop1:
printf("**************************************************\n");
printf("请输入魔方矩阵(奇数阶)N:
");
scanf("%d",&n);
printf("\n");
矩阵生成
/*魔方矩阵*/
voidplaceMagicArray(intN,int(*array)[NUM_MAX])
{
if(N%2==1)
{
placeMagicArrayOdd(N,array);
}
elseif(N%4==0)
{
placeMagicArray4N(N,array);
}
else
{
placeMagicArray2N(N,array);
}
}
//输出该矩阵中的素数
/*是否素数*/
intisPrimeNumber(intn)
{
inti=2;
if(n<=2)
{
return1;
}
while
(1)
{
if(n%i==0)
{
return0;
}
if(i*i>n)
{
return1;
}
++i;
}
return0;
}
/*打印素数*/
voidprintPrimeNumbers(intN)
{
inti,num=0;
printf("素数有:
");
N*=N;
for(i=1;i<=N;++i)
{
if(isPrimeNumber(i))
{
++num;
printf("%d",i);
}
}
printf("共%d个\n",num);
}
//输出该矩阵中所包含的水仙花数
/*是否水仙数*/
intisNarcissisticNumber(intn)
{
intn1,num=0,n0=n;
while(n0)
{
n1=n0%10;
n0=n0/10;
num+=n1*n1*n1;
}
returnnum==n?
1:
0;
}
/*打印水仙数*/
voidprintNarcissisticNumbers(intN)
{
inti,num=0;
printf("水仙数有:
");
N*=N;
for(i=1;i<=N;++i)
{
if(isNarcissisticNumber(i))
{
++num;
printf("%d",i);
}
}
printf("共%d个\n",num);
}
//界面中的选择程序
voidmain()
{
intcmd;
intarray[NUM_MAX][NUM_MAX],N=0;
while
(1)
{
printf("1.输入魔方矩阵\n");
printf("2.载入魔方矩阵\n");
printf("3.保存魔方矩阵\n");
printf("4.打印矩阵及素数水仙数\n");
printf("0.退出程序\n");
printf("请输入对应数字:
");
scanf("%d",&cmd);
运行效果图:
图3登陆注册界面
图4输出魔方矩阵
图5载入矩阵的效果图
3.3.2文件的读与写
//保存矩阵
intsaveMagicArray(intN,int(*array)[NUM_MAX])
{
FILE*fp;
if((fp=fopen("magicArray.txt","w"))==NULL)
{
printf("cannotopenfile\n");
return0;
}
fprintf(fp,"%d\n",N);
printOutMagicArray(fp,N,array);
fclose(fp);
return1;
}
//载入矩阵
/*载入魔方矩阵*/
intloadMagicArray(int(*array)[NUM_MAX])
{
inti,j,N;
FILE*fp;
if((fp=fopen("magicArray.txt","r"))==NULL)
{
printf("cannotopenfile\n");
return0;
}
fscanf(fp,"%d",&N);
if(!
isValidN(N))
{
N=0;
}
else
{
for(i=0;i { for(j=0;j { fscanf(fp,"%d",&array[i][j]); } } } fclose(fp); returnN; } 4系统测试与分析 4.1测试 代码使用C语言程序编写,工程编译环境为VisualC++6.0.代码编写过程中同步进行测试及调试,保证函数编写完整无错误发生,工程可以运行成功。 程序调试完毕后应抽样验证工程是否运行正常,异常情况处理是否合理等,并进一步对代码进行完善,以提高准确性。 测试效果图如图3~6所示测试结果 4.2测试过程中遇到的问题 (1)显示出的程序与所要求显示的有差别,个别功能代码未实现。 (2)调试过程中还会遇到很多不知名的错误,通过网上查询才能解决。 5结论 系统魔方矩阵代码编写可以更为简洁,某些循环可以合并编写。 以使代码更加方便理解。 附加代码编写时可以用多个函数来完成,这是一种实现多功能代码编写的通用方法,但同时也可以思考是否能用文件来达到此种目的。 并判断哪种方法更简单。 代码编写应该注意一些细节,在大功能完成后还要不断完善改进。 经过几天的设计与制作,让我对c语言知识有更加深刻的认识,把之前不是太清楚的知识又重新学习了一次,有了更深的认识。 通过做这次的魔方矩阵,我还向学长请教了一些我以前不明白的知识,通过他们的细心讲解,我又学到了很多,真的很感谢他们。 系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。 由于自己的所学知识的局限性,所以系统在设计上还会有很多的不足,希望各位老师给予指点,谢谢老师们。 6参考文献 【1】谭浩强c语言程序设计(第三版)北京: 清华大学出版社,2007。 【2】XX百科
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 文档