数结构
课程设计报告
设计题目: n维矩阵法:A B-1
专 业 计算机科学技术
班 级 计
学 生
学 号
指导教师
起止时间 2007X32007X11
学年第 I 学期
具体务
功:
设计矩阵相程序首先键盘输入两矩阵ab容输出两矩阵输出ab-1结果
分步实施:
1初步完成总体设计搭框架确定机话界面确定函数数
2完成低求:建立文件完成2维矩阵情况
3进步求:通键盘输入维数n兴趣学扩充系统功
求:
1界面友函数功划分
2总体设计应画流程图
3程序加必注释
4提供程序测试方案
5程序定起测试宁功少运行起运行程序没价值
二 软件环境
Microsoft Visual C++ 60
三 问题需求分析
程序二维数组作矩阵存储结构通键盘输入矩阵维数n动态分配存空间创建n维矩阵矩阵建立通键盘输入矩阵元素值通文件读入矩阵项数(维数元素值)
矩阵作进步操作(A*BA*B^(1))时先判断存中否已相关数存未数存提示户先输入相关数
矩阵进行求逆时先利矩阵逆充条件:|A| 0 判断矩阵否逆矩阵行列式 |A| 0 提示该矩阵逆 |A| 0 求逆矩阵终端显示逆矩阵
四 算法设计思想流程图
1.抽象数类型
ADT MatrixMulti{
数象:D {a(Ij)|i 123…nj 12…na(ij)∈ElemSetn矩阵维数}
数关系 R {RowCol}
Row {| 1 < i < n 1 < j < n1}
Col {| 1 < i < n1 1 < j < n}
基操作
Swap(&a&b)
初始条件:记录ab已存
操作结果:交换记录ab值
CreateMatrix(n)
操作结果:创建n维矩阵返回该矩阵
Input(&M)
初始条件:矩阵M已存
操作结果:终端读入矩阵M元素值
Print(&M)
初始条件:矩阵M已存
操作结果:终端显示矩阵M元素值
ReadFromFile()
操作结果:文件读入矩阵相关数
Menu_Select()
操作结果:返回菜单选项
MultMatrix(&M1&M2&R)
初始条件:矩阵M1M2R已存
操作结果:矩阵M1M2作法运算结果放R中
DinV(&M&V)
初始条件:矩阵MV已存
操作结果:求矩阵M逆矩阵结果放入矩阵V中
MatrixDeterm(&Mn)
初始条件:矩阵M已存
操作结果:求矩阵M行列式值
} ADT MatrixMulti
2.矩阵求逆算法设计思想
算法采高斯约旦法(全选元)求逆思想:
首先k0n1作步:
① 第k行第k列开始右角子阵中选取绝值元素记住元素行号列号通行交换列交换交换元素位置步称全选元
② 元求倒:M(kk) 1 M(kk)
③ M(kj) M(kj) * M(kk)j 01…n1j k
④ M(ij) M(ij) – M(ik) * M(kj)ij 01…n1ijk
⑤ M(ik) M(ik) * M(kk)i 01…n1i k
根全选元程中记录行列交换信息进行恢复恢复原:
全选元程中先交换行(列)进行恢复原行(列)交换列(行)交换恢复
3矩阵行列式求值运算算法设计思想
利行列式性质:行列式等行(列)元素应代数余子式积
D ∑a(ik)*A(ik) k 12…n
D ∑a(kj)*A(kj) k 12…n
利函数递调法实现求值
4.函数间调关系
Main()
ReadFromFile()
DinV()
Swap ()
Print()
Menu_Select()
MatrixDeterm()
CreateMatrix()
MultMatrix()
Input()
5流程图
否
否
否
否
否
否
开始
switch(Menu_Select())
case 1
case 3
case 2
n > 0
输入矩阵维数n
输入矩阵AB
输出矩阵维数n
system(pause)
通键盘输入需矩阵求逆求出相应该逆阵显示求逆阵system(pause)矩阵逆返回菜单
case 4
RA*B显示矩阵R system(pause)
case 5
否
RA*B^(1)显示矩阵R
system(pause)B逆返回菜单
case 6
指定文件中读入矩阵数
case 0
exit(0)
结果
否
五 源代码
#include
#include
#include
#include
#include
#include
#define YES 1
#define NO 0
typedef float ElemType
ElemType **A 矩阵A
ElemType **B 矩阵B
ElemType **R 矩阵R存放运算结果
ElemType **V 矩阵V存放逆矩阵
int n0 矩阵维数
int flag1 标记
void swap(ElemType *aElemType *b) 交换记录ab值
{
ElemType c
c*a
*a*b
*bc
}
ElemType **CreateMatrix(int n) 创建n维矩阵返回该矩阵
{
int ij
ElemType **M
M (ElemType **)malloc(sizeof(ElemType *)*n)
if(M NULL)
exit(1)
for(i0i
*(M+i) (ElemType *)malloc(sizeof(ElemType)*n)
for(j0j
}
return M
}
ElemType MatrixDeterm(ElemType **Mint n)
*递法求n维矩阵行列式值返回运算结果*
{
int ijkls
ElemType **T1
ElemType **T2
T1CreateMatrix(n)
T2CreateMatrix(n)
ElemType u
ElemType value0 运算结果
for(i0i
for(j0j
T1[i][j]M[i][j]
T2[i][j]M[i][j]
}
}
if(n2) 2维矩阵直接运算返回运算结果
{
valueT2[0][0]*T2[1][1]T2[0][1]*T2[1][0]
return value
}
else
{
for(j0j
uT1[0][j]
for(i1l0i
for(k0s0k
if(kj)
continue
else
{
T2[l][s]T1[i][k]
s++
}
}
l++
}
valuevalue+u*((int)pow(1j))*MatrixDeterm(T2n1)
*行列式等某行元素代数余子式积*
}
return value
}
}
int DinV(ElemType **MElemType **V)
*全选元法求矩阵M逆矩阵结果存入矩阵V中*
{
int ijk
ElemType d
ElemType u
int *JS*IS
JS(int *)malloc(sizeof(int)*n)
IS(int *)malloc(sizeof(int)*n)
uMatrixDeterm(Mn) 返回矩阵A行列式值
if(u0)
return 1
for(i0i
for(k0k
d0
for(iki
for(jkj
if(fabs(V[i][j])>d)
{
dfabs(V[i][j]) d记录绝值元素值
*绝值元素数组中行列坐标分存入IS[K]JS[K]*
IS[k]i
JS[k]j
}
}
}
if(d+10 10)
return 0 元素0
if(IS[k] k)
*绝值元素第k行矩阵IS[K]行元素k行元素相交换*
for(j0j
if(JS[k]k)
*绝值元素第k列矩阵JS[K]列元素k列元素相交换*
for(i0i
V[k][k]1V[k][k] 绝值元素求倒
for(j0j
*矩阵M第k行元素M[k][k]身外M[k][k]*
if(jk)
V[k][j]V[k][j]*V[k][k]
for(i0i
if(ik)
for(j0j
V[i][j]V[i][j]V[i][k]*V[k][j]
for(i0i
if(ik)
V[i][k]V[i][k]*V[k][k]
}
for(kn1k>0k)
*根面记录行IS[k]列JS[k]信息恢复元素*
{
for(j0j
swap(&V[k][j]&V[JS[k]][j])
for(i0i
swap(&V[i][k]&V[i][IS[k]])
}
free(IS)
free(JS)
return 0
}
void MultMatrix(ElemType **M1ElemType **M2ElemType **R)
*矩阵M1M2 结果存入矩阵R*
{
int ijk
for(i0i
for(j0j
R[i][j]0
}
}
for(i0i
for(j0j
{
for(k0k
R[i][j]R[i][j]+M1[i][k]*M2[k][j]
}
}
}
}
void Input(ElemType **M) 输入矩阵M元素值
{
int ij
char str[10]
char c'A'
if(flag1)
c'B'
system(cls)
printf(\n\n输入矩阵c(d*d)\ncnn)
for(i0i
for(j0j
scanf(f*(M+i)+j)
}
}
flag1
gets(str) 吸收余字符
}
void Print(ElemType **M) 显示矩阵M元素值
{
int ij
printf(\t)
for(i0i
for(j0j
printf( 3fM[i][j])
}
puts()
printf(\t\t)
}
}
int Menu_Select()
{
char c
do{
system(cls)
puts(\t\t*************n维矩阵法器*************)
puts(\t\t| 1 通键盘输入项数 |)
puts(\t\t| 2 显示矩阵AB |)
puts(\t\t| 3 矩阵求逆显示逆矩阵 |)
puts(\t\t| 4 求矩阵运算A*B显示运算结果 |)
puts(\t\t| 5 求矩阵运算A*B^(1)显示运算结果|)
puts(\t\t| 6 文件读入矩阵AB维数n |)
puts(\t\t| 0 退出 |)
puts(\t\t***************************************)
printf(\t\t请选择(06))
cgetchar()
}while(c<'0'||c>'6')
return (c'0')
}
void ReadFromFile() 指定文件读入矩阵维数矩阵元素值
{
int ij
FILE *fp
if((fpfopen(txtxtr))NULL)
{
puts(法开文件)
system(pause)
exit(0)
}
fscanf(fpd&n) 读入矩阵维数
ACreateMatrix(n) 创建矩阵A B V R
BCreateMatrix(n)
VCreateMatrix(n)
RCreateMatrix(n)
for(i0i
for(j0j
fscanf(fpf&A[i][j])
}
}
for(i0i
for(j0j
fscanf(fpf&B[i][j])
}
}
puts(\n\n读文件成功)
fclose(fp)
flag1
}
int main()
{
int i
char ch
char str[10]
for()
{
switch(Menu_Select())
{
case 1 flag1
for()
{
system(cls)
printf(\n\n\t矩阵维数n)
scanf(d&n)
gets(str)
if(n>0)
break
else
{
printf(\n\t输入误请重新输入\n)
puts()
system(pause)
}
}
ACreateMatrix(n)
BCreateMatrix(n)
VCreateMatrix(n)
RCreateMatrix(n)
Input(A)
Input(B)
break
case 2 system(cls)
if(flag1)
{
puts(\n\n\t存矩阵数请先输入数)
system(pause)
break
}
puts(\n)
printf(\tA )
Print(A)
puts(\n)
printf(\tB )
Print(B)
puts()
system(pause)
break
case 3 system(cls)
if(flag1)
{
puts(\n\n\t存矩阵数请先输入数)
system(pause)
break
}
for()
{
printf(\n\n\t输入需求逆矩阵(AB))
hgetchar()
cgetchar()
hgetchar()
if(c'A'||c'a')
{
iDinV(AV)
if(i1)
{
puts(\n\n\t矩阵A行列式等0逆)
system(pause)
break
}
printf(\tA )
Print(A)
puts(\n)
printf(A^(1) )
Print(V)
puts()
system(pause)
break
}
else if(c'B'||c'b')
{
iDinV(BV)
if(i1)
{
puts(\n\n\t矩阵B行列式等0逆)
system(pause)
break
}
printf(\tB )
Print(B)
puts(\n)
printf(B^(1) )
Print(V)
puts()
system(pause)
break
}
else
puts(\n\n\t输入误请重新输入\n)
}
break
case 4 system(cls)
if(flag1)
{
puts(\n\n\t存矩阵数请先输入数)
system(pause)
break
}
MultMatrix(ABR)
printf(\n\n\tA*B )
Print(R)
puts()
system(pause)
break
case 5 system(cls)
if(flag1)
{
puts(\n\n\t存矩阵数请先输入数)
system(pause)
break
}
iDinV(BV)
if(i1)
{
puts(\n\n\t矩阵B行列式等0逆)
system(pause)
break
}
MultMatrix(AVR)
printf(\n\nA*B^(1) )
Print(R)
puts()
system(pause)
break
case 6 system(cls)
ReadFromFile()
puts()
system(pause)
break
case 0 puts(\t\t正常退出)
exit(0)
break
}
}
return 0
}
六 运行结果
1.界面:
2.输入6回车文文件txtxt中读入矩阵数:
3.回车回菜单界面输入2回车显示文件读入矩阵数:
4.回车回菜单界面输入3回车指定矩阵求逆:(里矩阵A逆仅矩阵B例)
5.回车回菜单界面输入4回车求矩阵运算A*B:
6.回车回菜单界面输入5回车求A*B^(1)值:
7.回车回菜单界面输入0回车退出程序果需定矩阵维数元素值请利菜单里1号功行输入数进行种运算操作
七 收获体会
通次课程设计次复线性代数里矩阵相关知识n维矩阵求逆矩阵逆充分必条件(|A| 0)矩阵矩阵法运算行列式求值方法等样复量C语言里关数组重概念维数组动态分配问题数组指针关系等
记学期新开设单片机基础课吴涛老师次强调定常锻炼编程力常说:编程思维体操方面力
实力非常限远远班学通次课程设计充分体会句话精华
电脑程序作体脑思维延伸程序功会脑思维断完善变更加强决定加强方面锻炼学激励断前进
八 参考文献
数结构(C语言版) 严蔚敏吴伟民 编著 清华学出版社
C语言程序设计 洪维恩 编著 中国铁道出版社
C语言程序设计教程 谭浩强 张基温 唐永炎 编著 高等教育出版社
工程数学——线性代数 第四版 济学应数学系 编 高等教育出版社
计
200712
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档